教程

A 股大宗交易怎么看:折价率与机构席位

大宗交易是大额股份的场外协议转让——它不体现在盘中分时图上,但往往先于股价变化透露资金意图。本文讲清三件事:字段怎么读、折价率说明什么、怎么用 Python 批量扫(附 2026-09-29 真实数据)。

一、大宗交易是什么(30 秒)

大宗交易 = 买卖双方在场外协商一致、通过交易所大宗交易系统成交的大额转让。它不走盘中连续竞价:分时图上看不到这笔成交,但成交信息次日(T+1)会公开披露。

含义:能看到"谁以什么价格、从谁手里、拿走了多少筹码" —— 这是普通盘口数据给不了的信息。

  • 想减持的大股东 → 走大宗(不砸盘、快速出清)
  • 想建仓的机构 → 接大宗(比盘中慢慢买更快拿到量)
  • 折价成交 = 卖方让利换速度(常见);溢价成交 = 买方急(少见,信号更强)

二、一行请求拿到数据

`/v1/block-trade` 是付费端点(需 Key)。参数只有两个:`code`(股票代码,可留空)与 `date`(日期,留空=最近)。

Python:查单只股票的大宗交易
import requests

BASE = "https://api.ashareapi.com/v1"
H = {"Authorization": "Bearer ct-你的Key"}

r = requests.get(f"{BASE}/block-trade",
                 params={"code": "sh600519"},     # 贵州茅台
                 headers=H, timeout=30)
body = r.json()

# ⚠️ 关键:data 是「数组」时直接用;不要写 body["structured"](会 KeyError)
rows = body.get("data") if isinstance(body.get("data"), list) else body.get("structured")
if not body.get("ok"):
    print("当天没有大宗交易(不是接口坏了)")     # 见第四节
else:
    for x in rows:
        print(x["TurnoverPrice"], x["CloseDiscountRate"],
              x["BuySalesDepartment"], x["SellSalesDepartment"])
  • `data` 可能是数组也可能是 Markdown —— 程序化处理用 `isinstance` 判断(或用 `body.get("structured")` 兜底)
  • `ok:false` + 空数组 = 当天没有大宗交易(正常运行结果,不是故障)—— 详见第四节

三、字段怎么读(7 个字段)

TurnoverPrice
成交价
元
与当日收盘价比较,看折溢价
TurnoverValue
成交金额
元
> 1 亿 = 大额;看量级判断影响
CloseDiscountRate
折溢价率
%
正=溢价 / 负=折价 / 0=平价(见下节)
BuySalesDepartment
买方营业部
-
机构专用 / 具体营业部名
SellSalesDepartment
卖方营业部
-
谁在卖
TradingType
交易类型
-
协议交易 / 盘后定价等
SerialNumber
序号
-
同一交易日的第几笔

总量口径提醒:`TurnoverValue` 是单笔金额。看"当天总成交"要把同日的多笔相加 —— 上游对"发生多少次大宗交易"与"总笔数"是两个口径,统计时要说清楚用的是哪个。

四、折价率是最有价值的字段

`CloseDiscountRate` 相对当日收盘价计算:

正值(溢价)
买方出价高于市价
买方急(少见)—— 信号相对强
0(平价)
按市价成交
常见,中性
负值(折价)
卖方让利求快
常见 —— 折价越深,卖方越急

关键理解:折价成交是常态,因为大额减持本就难在市价卖掉 —— 不能把"折价"直接当利空。更有信息量的是:折价幅度是否异常大(如 -8%)+ 买方是谁(机构专用 vs 普通营业部)。

五、真实数据(2026-09-29 实跑)

sh600519 贵州茅台
1299.52
9096.6 万
0.00
广发证券北京鲁谷路
sh600276 恒瑞医药
49.75
2.52 亿
-8.01
华泰证券上海分公司
sh601899 紫金矿业
29.42
1206.2 万
0.00
兴业证券上海世博馆路
sz300750 宁德时代
286.80
315.5 万
0.00
机构专用
sh601318 中国平安
56.63
311.5 万
0.00
中信证券总部(非营业场所)

读法示例:恒瑞医药那笔 2.52 亿、折价 8.01% —— 卖方让利幅度明显(想快速出清),买方是券商的分公司席位。这类"大额 + 深折价"的组合值得单独关注(不代表方向结论,只是说明卖方急切)。

六、怎么批量扫(找出大额与深折价)

Python:扫一批股票,挑出大额 / 深折价的
CODES = ["sh600519", "sh600276", "sh601899", "sz300750",
         "sh601318", "sh600036", "sz000858", "sh600030"]

hits = []
for code in CODES:
    b = requests.get(f"{BASE}/block-trade", params={"code": code},
                     headers=H, timeout=30).json()
    if not b.get("ok"):
        continue                                   # 当天无大宗
    rows = b.get("data") or b.get("structured") or []
    for x in rows:
        amt = float(x.get("TurnoverValue") or 0)
        dis = float(x.get("CloseDiscountRate") or 0)
        if amt >= 1e8 or dis <= -5:                # 大额 或 深折价
            hits.append((code, amt / 1e8, dis, x.get("BuySalesDepartment", "")))

for code, amt, dis, buyer in sorted(hits, key=lambda z: -z[1]):
    print("%-10s %.2f 亿  折溢价 %+.2f%%  %s" % (code, amt, dis, buyer[:24]))
  • 筛"大额":成交额 ≥ 1 亿(量级足够影响筹码结构)
  • 筛"深折价":折溢价 ≤ -5%(卖方让利明显)
  • 组合看:"大额 + 深折价 + 买方是机构专用" 是相对少见且有信息量的组合

七、date 参数:查历史某天

`date=YYYY-MM-DD` 可以查指定日期 —— 非交易日会自动回退到最近交易日(实测:`2026-09-26` 是周六 → 返回 `2026-09-24` 的数据)。

Python:查指定日期
b = requests.get(f"{BASE}/block-trade",
                 params={"code": "sh600276", "date": "2026-09-26"},
                 headers=H, timeout=30).json()
print(b["ok"], b.get("data"))
  • 实测观察:返回的第 1 张表(日期 / 收盘价等元信息)会跟随 date 变化,非交易日回退到最近交易日
  • 明细表的行为:实测中多次查询返回的成交明细相同 —— 可能该股期间只有一笔大宗,也可能是明细只给最近一笔。要用连续多日差异明显的样本自行核对,不要默认"多日历史明细"

八、两个常见误判(重要)

  • ① `ok:false` 不等于接口坏了 —— 它表示那一天该股没有大宗交易(正常结果)。很多股票大部分交易日都没有大宗成交。判断方法:换一只活跃的大盘股(如 `sh600519`)试,能返回数据就说明接口正常
  • ② 折价不代表利空 —— 大额减持天然要折价才能快速成交。"有折价"是常态,"折价异常深 + 买方是机构"才值得单独看

常见问题

返回 ok:false、data 是空数组,是接口坏了吗?

不是。这表示当天该股没有大宗交易。大宗交易本身就不是每只股票每天都有 —— 换一只活跃的大盘股(如 sh600519 贵州茅台)试,能返回数据即说明接口正常。

数据是实时的吗?

大宗交易成交信息按 T+1 披露。本文实测返回的是最近已披露的交易日数据(返回的 date 字段会标明属于哪一天)。

折价率是相对什么算的?

相对当日收盘价。正值 = 溢价成交(买方出价高于市价),负值 = 折价成交(卖方让利),0 = 平价。折价成交是常态,不能直接当利空。

为什么 structured 是 null?

structured / tables 是条件字段 —— 只在 data 是 Markdown 文本时才附。block-trade 的 data 直接就是数组(本身就是结构化的),所以不需要这一层。代码里请用 body.get("structured") 或先判断 data 类型。

最后更新: 2026-09-29

字段语义取自接口文档与实测返回;示例数据为 ashareapi /v1/block-trade 线上真实返回(2026-09-29 实跑:贵州茅台 / 恒瑞医药 / 紫金矿业 / 宁德时代 / 中国平安);date 参数行为经多日期实测(含非交易日回退)。