期货量化成交回报漏记:天勤 get_trade 与 trade_records 对账

前言

国内期货量化实盘里,程序通过天勤 TqSdk(Python 期货量化 SDK)连上期货公司账户:主循环不断调用 api.wait_update() 收行情和交易回报;当 5 分钟 K 线均线等信号触发时,用 TargetPosTask.set_target_volume(n) 表达目标净持仓,天勤在后续 wait_update 里向交易所报单,真实成交由柜台回报写入内存。

除程序自动交易外,团队往往还维护一份本地「成交台账」------每笔成交的价格、手数、对应哪根 K 线信号------用来复盘滑点、对账和合规留痕。常见事故是:台账记今天开了 7 笔、合计 7 手,快期客户端和 get_position().pos 却显示 10 手,价格和成交号对不上。漏记多发生在:只在 insert_orderset_target_volume 当下 print 一笔、没监听成交回报;主循环里 time.sleep 或同步 HTTP 阻塞期间成交到了却没处理;进程重启后内存里的 known 集合丢失,旧成交被跳过或重复记。

天勤在 api.get_trade() 里给出账户成交全集,委托对象上还有 trade_records 属性。下面说明如何用柜台真相实时回灌台账、日终如何对账。

一、成交数据从哪来

来源 说明
api.get_trade() 账户成交全集,key 为成交号
order.trade_records 该委托下的成交 dict
get_position().pos 净持仓真相

Trade 对象含 pricevolumedatetimeorder_id 等(见 objs.py)。

二、实时监听写法

python 复制代码
trades = api.get_trade()
known = set()

while True:
    api.wait_update()
    for tid, t in api.get_trade().items():
        if tid in known:
            continue
        known.add(tid)
        log_trade(
            trade_id=tid,
            symbol=t.instrument_id,
            price=t.price,
            volume=t.volume,
            order_id=t.order_id,
            dt=t.datetime,
        )

不要假设成交发生在 set_target_volume 同一行;TargetPosTask 的成交在后续 wait_update 里陆续到达。

三、日终对账流程

  1. wait_update() 收齐尾包。
  2. 导出 get_trade() 当日成交,按 datetime 过滤。
  3. 与本地 jsonl 按 trade_id 外连接,找 only_in_ctp / only_in_local。
  4. get_position 与成交汇总推理论净仓,与 pos 比较。
python 复制代码
def reconcile_trades(api, local_ids):
    ctp_ids = set(api.get_trade().keys())
    missing_local = ctp_ids - local_ids
    missing_ctp = local_ids - ctp_ids
    return missing_local, missing_ctp

漏记补进本地账,重复记删 duplicate。

四、与 order 状态配合

order.status == FINISHEDvolume_left == 0 时,应用 trade_records 核对总成交量是否等于 volume_orign - volume_left。部分成交长期 ALIVE 时,以 trade_records 累加为准更新本地进度。

五、多账户

TqMultiAccount 下成交归属不同 account,筛选时按 trade 对象上的账户字段或分账户调用 get_trade(以你本地 API 文档为准)。

六、重启后如何不重不漏

进程重启时 known 清空,不能对 get_trade() 全量再记一遍。启动后第一轮应:

  1. 加载本地已有 trade_id 集合。
  2. get_trade() 里已存在的 id 只标记为 known,不写新日志。
  3. 仅对 diff 出的新 id 追加。
python 复制代码
known = load_trade_ids_from_disk()
for tid in api.get_trade().keys():
    known.add(tid)  # 启动快照,不记日志

while True:
    api.wait_update()
    for tid, t in api.get_trade().items():
        if tid not in known:
            known.add(tid)
            persist_trade(t)
            append_trade_id(tid)

七、与滑点记账衔接

每笔成交日志建议同时写 signal_price(若当时有)与 trade.price,日终算滑点分布。漏记成交会直接污染滑点统计,导致回测校准偏乐观。trade_records 里多笔 partial fill 要按时间排序再与信号 join。

八、监管留痕最低字段

成交行建议含:trade_idorder_idinstrument_iddirectionoffsetpricevolumedatetimestrategy_version。与委托留痕里的 last_msg 分开存,纠纷时能还原「报单---成交」链条。

总结

成交回报漏记会让日志仓位与柜台分叉,重启后还可能重复开仓。天勤 get_tradeorder.trade_records 提供成交全集,应在每次 wait_update 后 diff 新 trade_id 写日志,日终再与本地台账对账。以 get_position().pos 为最终真相,成交日志为解释路径,这套习惯对监管留痕和纠纷复盘都管用。

FAQ

1)get_trade 会清空吗?

进程内累积;重启后重新拉全量。

2)模拟盘 trade_id 格式?

与实盘同类字段,可对账练手。

3)一笔委托多笔成交?

trade_records 多 key,volume 求和。

4)影子模式没 trade?

正常;只有 live/sim 有成交。


本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。

相关推荐
用户83562907805111 小时前
Python 实现 PDF 文件加密与解密方法
后端·python
用户83562907805111 小时前
使用 Python 冻结与拆分 Excel 窗格教程
后端·python
你好潘先生19 小时前
别再记命令了,用 yeero do 说句人话就能跑脚本,而且不烧 token
服务器·python·命令行
Agent_大师20 小时前
WebSocket 行情重连成功,K线缺口不会自动消失
python
荣码20 小时前
LLM结构化输出:让AI返回JSON而不是废话,我踩了4个坑
java·python
copyer_xyf20 小时前
FastAPI 如何连接 MySQL
后端·python
apocelipes1 天前
常用编程语言和库的正则表达式性能对比
c语言·c++·python·性能优化·golang·开发工具和环境
用户8356290780511 天前
使用 Python 在 PDF 中创建与管理书签
后端·python
MeixianAgent2 天前
Python 回测数据入口怎么验?历史 K 线入库前先做 5 个检查
后端·python
咕白m6252 天前
用 Python 实现一键批量查找与替换 Excel 数据
后端·python