> Source: https://ashareapi.com/docs/guides/block-trade-signals/  ·  Markdown version for LLMs / AI agents

教程

# 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 | 序号 | - | 同一交易日的第几笔

 TurnoverPrice
 成交价
 元
 与当日收盘价比较，看折溢价

 TurnoverValue
 成交金额
 元
 > 1 亿 = 大额；看量级判断影响

 CloseDiscountRate
 折溢价率
 %
 正=溢价 / 负=折价 / 0=平价（见下节）

 BuySalesDepartment
 买方营业部
 -
 机构专用 / 具体营业部名

 SellSalesDepartment
 卖方营业部
 -
 谁在卖

 TradingType
 交易类型
 -
 协议交易 / 盘后定价等

 SerialNumber
 序号
 -
 同一交易日的第几笔

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

## 四、折价率是最有价值的字段
 `CloseDiscountRate` 相对**当日收盘价**计算：
 |
| | 折溢价率 | 含义 | 通常解读

| | 正值（溢价） | 买方出价高于市价 | 买方急（少见）—— 信号相对强

| | 0（平价） | 按市价成交 | 常见，中性

| | 负值（折价） | 卖方让利求快 | 常见 —— 折价越深，卖方越急

 正值（溢价）
 买方出价高于市价
 买方急（少见）—— 信号相对强

 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 | 中信证券总部(非营业场所)

 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 参数行为经多日期实测（含非交易日回退）。

 相关

-
[端点参考（block-trade）](/docs/endpoints/block-trade)

-
[资金面一网打尽：fund 端点怎么用](/docs/endpoints/fund)

-
[因子选股入门（含数据体检）](/docs/guides/factor-screening)

-
[错误码与限流](/docs/errors)

 [← 全部教程](/docs/guides)
