前言
做趋势回测时我用主连很顺手,上模拟却忘了换成具体月份,持仓和信号对不上,收益曲线完全两回事。天勤 TqSdk 里主力连续 KQ.m@、指数 KQ.i@ 与具体 SHFE.rb2510 并存,研究链和交易链要分清。
下面说明主连/指数在行情里的角色、回测与实盘如何映射、换月时策略要注意什么。合约代码写法、移仓执行流程宜分开对照,一起看更完整。
一、主连、指数、具体合约各干什么
| 类型 | 符号形态(示意) | 典型用途 |
|---|---|---|
| 主力连续 KQ.m@ | 如 KQ.m@SHFE.rb | 长历史回测、信号研究 |
| 指数 KQ.i@ | 如 KQ.i@SHFE.rb | 平滑价格、指标研究 |
| 具体合约 | SHFE.rb2510 | 模拟、实盘下单 |
主连把历史主力拼接,方便看长期趋势,但成交价不是历史上每一刻真实可成交的单一合约价。指数类似,更平滑。实盘报单必须落到有流动性的具体合约。
二、研究用主连、执行用具体月
常见分工:
- 在
KQ.m@上算信号(均线、突破等) - 信号触发时,查当前主力对应的具体合约(通过 quote 的
underlying_symbol等字段,以文档为准) insert_order或TargetPosTask只对具体合约操作
若全程只订主连、又对主连下单,模拟成交规则可能与真实交易差异很大。
python
from tqsdk import TqApi, TqAuth, TqSim
api = TqApi(TqSim(), auth=TqAuth("账户", "密码"))
cont = "KQ.m@SHFE.rb"
q_cont = api.get_quote(cont)
api.wait_update()
# 具体交易合约以 quote 字段为准,下例名需按 wait_update 后实际值替换
trade_sym = q_cont.underlying_symbol
q_trade = api.get_quote(trade_sym)
不同版本字段名可能为 underlying_symbol 或文档中的其它名,以你打印 q_cont 对象为准。
三、回测与实盘收益对不上的常见原因
- 回测全程主连,实盘交易 2505 却仍在看 2501 的行情
- 换月日主力切换,信号仍用旧合约持仓
- 手续费、滑点按主连手数算,实际开在远月
对策:回测末期用具体合约复跑一段;或回测里就用「主力映射表」记录每日交易合约(工作量大,但更贴近实盘)。
四、换月检测思路
工程上可每日比较 underlying_symbol 是否变化,变化时触发移仓逻辑(平仓旧月、开新月),移仓顺序要单独写进策略。不要假设主连 symbol 不变就不用管换月。
五、和 get_kline_serial 一起用
get_kline_serial("KQ.m@SHFE.rb", 60) 做信号,get_kline_serial(trade_sym, 60) 做执行层价格参考时,要保证时间戳对齐意识:两根 K 线来自不同合约序列,合并信号要谨慎。
入门可先「信号与交易同一具体合约」,主连只用于离线研究,减少阶段混用。
总结
主连和指数适合研究与回测连续性,具体合约适合模拟和实盘。天勤同时支持几类符号,选型关键是链条上哪一段用哪类 code,并在换月时有显式处理。
建议团队写进规范:回测默认用什么、模拟改什么、换月谁负责改配置,避免每人一套习惯导致收益无法复现。
FAQ
1)能否只对主连做 TargetPosTask?
不建议作为实盘方案;模拟规则也可能与具体合约不一致。
2)指数和主连选哪个?
趋势信号常用主连;需要更平滑曲线可看指数。
3)foreign 品种呢?
以 TqSdk 当前支持列表为准。
4)回测主连后如何找对应实盘月?
用主力 quote 的映射字段,或维护换月日历表。
风险提示
本文用于合约与数据使用技术说明,不构成投资建议。