7709-历史成交明细¶
作用¶
分页查询指定日期的成交明细增强数据。返回记录中可能包含普通成交、集合竞价过程快照和 09:25 正式撮合,解析器通过 event_kind 区分语义。需要只取其中一种记录时,请使用对应的筛选接口文档。
| 项目 | 内容 |
|---|---|
| 主要调用 · 单页 | client.trades.history(code, trading_date, ...) → TradePage |
| 完整分页 | client.trades.all_history(code, trading_date, ...) → TradePage |
| 可选批量返回 | 下面分别说明单页和完整分页的 TradeBatch 调用 |
| 批量字段 · 单页 | client.trades.history_batch(code, trading_date, ...) → TradeBatch |
| 批量字段 · 完整分页 | client.trades.all_history_batch(code, trading_date, ...) → TradeBatch |
| 底层接口 | 0x0fc6 |
这 4 个入口分成两组:history() / all_history() 返回原来的 TradePage(逐条 TradeTick 对象),history_batch() / all_history_batch() 返回 TradeBatch(按列保存数据,避免下载时逐条创建对象)。4 个入口的 code 都支持单个股票或代码列表;传列表时返回 {完整代码: 对应结果}。
示例¶
from eltdx import TdxClient
with TdxClient(timeout=3) as client:
page = client.trades.history("sz000001", "2026-05-20", start=0, count=1800)
all_ticks = client.trades.all_history("sz000001", "2026-05-20")
pages = client.trades.all_history(
["sz000001", "sh600000"], "2026-05-20"
)
print(page.ticks[:3])
print(page.actual_trades[:3])
print(page.after_hours_trades[:3])
print(len(all_ticks.ticks))
历史查询必须使用 client.trades.history(code, date);client.trades.today(code) 固定调用当日 0x0fc5,协议请求本身不传交易日期。
真实返回样本¶
Python 实际返回 TradePage。下面用公开属性整理成紧凑 JSON,分别保留 status=8 竞价快照、09:25 正式撮合、15:00 收盘撮合和 status=5 盘后固定价格成交各一条。
真实返回 JSON · TradePage(4 类记录节选)
真实采样;完整分页共 4428 条原始记录,JSON 只展示四类代表性记录。
{
"exchange": "sz",
"market_id": 0,
"code": "000001",
"trading_date": "2026-08-14",
"price_base_raw_f32": 11.25,
"count": 4428,
"actual_trade_count": 4353,
"auction_snapshot_count": 75,
"after_hours_trade_count": 8,
"representative_ticks": [
{
"time_label": "14:57",
"price": 11.11,
"volume": 0,
"status_raw": 8,
"side": "status_8",
"event_kind": "auction_snapshot",
"is_actual_trade": false
},
{
"time_label": "09:25",
"price": 11.22,
"volume": 2852,
"order_count": 143,
"status_raw": 2,
"side": "neutral",
"event_kind": "opening_match",
"is_actual_trade": true,
"trade_amount_yuan": 3199944.0
},
{
"time_label": "15:00",
"price": 11.11,
"volume": 11639,
"order_count": 447,
"status_raw": 2,
"event_kind": "trade",
"is_actual_trade": true,
"trade_amount_yuan": 12930929.0
},
{
"time_label": "15:05",
"price": 11.11,
"volume": 423,
"order_count": 17,
"status_raw": 5,
"side": "status_5",
"event_kind": "trade",
"is_actual_trade": true,
"is_after_hours_fixed_price": true,
"trade_amount_yuan": 469953.0
}
]
}
参数¶
| 参数 | 含义 |
|---|---|
code |
单个证券代码或代码列表;支持完整代码或六位代码 |
trading_date |
交易日,支持 YYYY-MM-DD、YYYYMMDD、date / datetime |
start |
起始位置,从 0 开始 |
count |
本页条数,便捷方法默认 1800,服务端单页上限也是 1800 |
include_raw |
是否保留原始 payload,默认 False |
batch_size |
代码列表输入时的同时查询数,默认自动跟随连接池大小;代码列表没有总数量上限,超出并发数的代码排队等待。 |
page_size |
all_history() 自动翻页时的每页条数,默认 1800,范围 1..1800 |
max_pages |
all_history() 最大页数,默认 100;传 None 表示不设上限 |
all_history(code, trading_date, page_size=1800, max_pages=100, include_raw=False) 会自动翻页直到主站返回空页;page_size 必须在 1..1800,max_pages 传 None 表示不设页数上限。
history() 和 all_history() 的 code 可传单个代码或代码列表;传列表时返回以规范化完整代码为键的字典,超出并发数的代码自动排队。
可选批量数据返回¶
history_batch() 返回一页 TradeBatch,all_history_batch() 自动翻页到空页后返回完整 TradeBatch。两者的 code 都可以传单个股票或代码列表;传列表返回 {完整代码: TradeBatch},并发数仍由 batch_size 控制、默认跟随连接池。这里的“批量”指数据返回形式,与代码列表并发是两件事。
新入口复用 0x0fc6 和原连接池,保留完整字段及原有分页顺序,避免在下载时为每条记录创建 TradeTick。原来的 history() / all_history() 默认行为和 TradePage 返回类型不变。
from eltdx import TdxClient, to_json
with TdxClient() as client:
data = client.trades.all_history_batch("sz000001", "2026-09-11")
several = client.trades.all_history_batch(
["sz000001", "sh600487"], "2026-09-11"
)
# 读取列、筛选和汇总均不需要创建全部 TradeTick。
volumes = data.column("volume")
events = data.column("event_kind")
selected = data.select(
i for i, (volume, event) in enumerate(zip(volumes, events))
if event != "auction_snapshot" and volume > 1000
)
print(selected.to_columns(["time_label", "price", "volume"]))
print(sum(selected.column("volume")))
# 需要对象用法时,显式转换选中的记录。
if selected.count:
print(selected.tick(0).price)
page = selected.to_page()
print(to_json(selected)) # 与 to_json(page) 相同;会转换所选的全部对象
| 操作 | 返回 / 行为 |
|---|---|
data.count / len(data) |
记录数,包括服务端竞价快照等记录 |
data.columns |
与 TradeTick 的 19 个存储字段同名的列名;不包含计算属性 |
data.column("volume") |
该列的值元组,顺序与记录一致 |
data.column("trade_datetime") |
按需转换该列的 Python 时间对象 |
data.to_columns(names=None) |
所选列的字典;省略参数导出全部列 |
data.select(indices) |
选取下标对应记录,支持负下标、重复下标并保留给定顺序;不创建 TradeTick |
data.tick(index) |
将一条记录转换为 TradeTick;支持负下标 |
data.to_page() |
转换为原来的 TradePage,创建全部 TradeTick |
to_json(data) / to_jsonable(data) |
与 data.to_page() 的序列化内容一致,不暴露内部存储格式 |
单页批量入口的 start、count、include_raw 和完整批量入口的 page_size、max_pages、include_raw 与原入口含义相同。仍默认每页 1800 条、最多 100 页;max_pages=None 不限页数,达到上限而未见空页会报错。完整分页保留每页内部顺序并反转页顺序。
select() 结果的 start=0、request_count=count,保留每条记录原来的 index / absolute_index,清空不再对应所选记录的整页 raw_payload;record_hex 等逐条字段保留。未筛选的完整分页结果,与 all_history() 一样,只在 raw_payload 保留第一请求页的原始数据。
批量结果是不可变的字段块,不是 pandas / NumPy 对象。读取列会分配该列的元组,筛选会复制所选字段引用,反复取同一行会重复转换。全部调用 to_page() 或逐行 JSON 导出仍需支付全部对象构造成本;批量速度优势适用于直接按列处理或只转换部分结果,不保证所有旧用法获得相同提速。下载大量代码会在返回字典中保留所有结果,应按可用内存分组调用。
内置池化、单连接和 pin transport 支持直接批量转换;只实现旧 execute() 的自定义 transport 可返回 TradePage,新入口会兼容转换,但不能省去其已经发生的对象构造开销。
解析字段¶
TradePage 字段 |
含义 |
|---|---|
exchange / market_id / code / full_code |
市场和代码 |
start / request_count |
请求起点 / 请求条数 |
trading_date |
成交日期 |
price_base_raw_f32 |
价格基数原始字段 |
ticks |
原始记录,包含 trade、auction_snapshot、opening_match |
actual_trades |
排除 status=8 后的真实成交,保留 09:25、15:00 和盘后固定价格成交 |
after_hours_trades |
15:05-15:30、status=5 的盘后固定价格成交 |
auction_snapshots |
从本页筛出的 status=8 集合竞价快照 |
opening_matches |
从本页筛出的 09:25 正式撮合记录 |
count |
混合记录条数 |
has_more |
单页结果非空时为 True,表示仍可能有下一页;空页才确认结束 |
raw_payload |
原始 payload |
TradeTick 字段 |
含义 |
|---|---|
index |
本页内序号 |
absolute_index |
全局序号 |
time_minutes |
当日分钟数 |
time_label / trade_datetime |
成交时间 |
price / price_milli |
成交价 / 毫厘价 |
volume |
原始数量字段;真实成交时是成交量,status=8 时不赋予竞价数量语义 |
order_count |
原始笔数字段;status=8 时不赋予竞价未匹配量语义 |
event_kind |
trade、auction_snapshot 或 opening_match |
is_auction_snapshot / is_opening_match / is_trade |
事件类型判断属性 |
is_actual_trade |
是否为真实成交;仅 status=8 返回 False |
is_after_hours_fixed_price |
是否为 15:05-15:30、status=5 的盘后固定价格成交 |
auction_matched_volume |
成交明细不推断竞价数量,固定为 None |
auction_unmatched_signed_volume / auction_unmatched_volume |
成交明细不推断竞价未匹配量,固定为 None |
status_raw |
方向 / 状态原始值 |
side |
方向,buy、sell、neutral 或状态名 |
price_delta_raw |
成交价差分原始值 |
price_acc_raw |
成交价差分累计值 |
unknown_tail_raw |
当日成交明细尾部原始字段;历史记录通常为 None |
reserved_zero |
历史成交明细尾部保留字段 |
record_hex |
单条原始十六进制 |
trade_amount_yuan |
按原始数量计算的金额;只应对真实成交作为成交额使用 |
翻页规则¶
| 项目 | 说明 |
|---|---|
| 起始页 | start=0 |
| 下一页 | start += 当前页实际返回数量 |
| 单页结果可能还有数据 | page.has_more 为 True |
| 拉某日全部成交明细 | 用 client.trades.all_history(code, date) |
history() 保留服务器当前页的原始顺序。all_history() 会把服务器返回的分页按时间顺序重新合并:start=0 是较新的页面,后续 start 页面更早,因此完整结果按页倒序展开,但保留每页内部顺序。TradeTick.absolute_index 仍表示服务器原始分页位置,不是合并后列表的下标。
status_raw == 8 的记录不是实际成交,因此不会进入 actual_trades;时间为 09:25 且不是 status=8 的记录是正式开盘撮合,15:00 的非 status=8 记录是正式收盘撮合,两者都会保留。15:05-15:30 的 status=5 是盘后固定价格真实成交,同时出现在 actual_trades 和 after_hours_trades 中。
自 2026 年 7 月 6 日起,盘后固定价格交易由科创板、创业板扩展至全部 A 股及沪深 ETF。查询更早日期时,并非所有股票都会出现 status=5;没有发生盘后成交时,after_hours_trades 为空。
成交明细中的 status=8 主要用于保留竞价时间和价格。其数量原始字段可能为零,不能替代 0x056a;完整秒级过程、虚拟匹配量和未匹配量请使用集合竞价过程快照并传入日期。
需要完整历史集合竞价过程时使用集合竞价过程快照并传入日期;只取 09:25 正式撮合时使用历史 09:25 正式撮合。