跳转至

← 返回接口目录

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 类记录节选)

采样标的sz000001
交易日期2026-08-14
返回类型TradePage

真实采样;完整分页共 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-DDYYYYMMDDdate / 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..1800max_pagesNone 表示不设页数上限。

history()all_history()code 可传单个代码或代码列表;传列表时返回以规范化完整代码为键的字典,超出并发数的代码自动排队。

可选批量数据返回

history_batch() 返回一页 TradeBatchall_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() 的序列化内容一致,不暴露内部存储格式

单页批量入口的 startcountinclude_raw 和完整批量入口的 page_sizemax_pagesinclude_raw 与原入口含义相同。仍默认每页 1800 条、最多 100 页;max_pages=None 不限页数,达到上限而未见空页会报错。完整分页保留每页内部顺序并反转页顺序。

select() 结果的 start=0request_count=count,保留每条记录原来的 index / absolute_index,清空不再对应所选记录的整页 raw_payloadrecord_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 原始记录,包含 tradeauction_snapshotopening_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 tradeauction_snapshotopening_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 方向,buysellneutral 或状态名
price_delta_raw 成交价差分原始值
price_acc_raw 成交价差分累计值
unknown_tail_raw 当日成交明细尾部原始字段;历史记录通常为 None
reserved_zero 历史成交明细尾部保留字段
record_hex 单条原始十六进制
trade_amount_yuan 按原始数量计算的金额;只应对真实成交作为成交额使用

翻页规则

项目 说明
起始页 start=0
下一页 start += 当前页实际返回数量
单页结果可能还有数据 page.has_moreTrue
拉某日全部成交明细 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_tradesafter_hours_trades 中。

自 2026 年 7 月 6 日起,盘后固定价格交易由科创板、创业板扩展至全部 A 股及沪深 ETF。查询更早日期时,并非所有股票都会出现 status=5;没有发生盘后成交时,after_hours_trades 为空。

成交明细中的 status=8 主要用于保留竞价时间和价格。其数量原始字段可能为零,不能替代 0x056a;完整秒级过程、虚拟匹配量和未匹配量请使用集合竞价过程快照并传入日期。

需要完整历史集合竞价过程时使用集合竞价过程快照并传入日期;只取 09:25 正式撮合时使用历史 09:25 正式撮合