前言
策略逻辑没问题,get_quote 却一直 nan,我排查时十有八九是合约代码写错:交易所前缀大小写、郑商所三位年月、新交易所 GFEX 符号不熟。天勤 TqSdk 要求合约带交易所代码,格式为 交易所.合约,写错不会给友好提示,只是没有行情。
下面整理国内期货常见写法、易错点和验证方法,并说明和 get_kline_serial、insert_order 要用同一字符串。代码示例用活跃品种示意,你换成自己交易的合约即可。
一、基本格式:交易所.合约
统一形式:
text
SHFE.rb2510
DCE.i2509
CZCE.MA509
CFFEX.IF2506
INE.sc2510
GFEX.si2508
第一段的交易所 CODE 必须与官方一致,通常全大写。第二段合约代码规则因交易所而异,郑商所品种代码常全大写、年月三位,上期所、大商所多为小写品种加四位年月。
二、各所易错点
| 交易所 | 前缀 | 常见错误 |
|---|---|---|
| 上海 SHFE | SHFE | 写成 shfe;品种大小写写反 |
| 大连 DCE | DCE | 数字年月位数错 |
| 郑州 CZCE | CZCE | 用四位年月;品种未大写 |
| 中金 CFFEX | CFFEX | 股指期货月份搞错 |
| 能源 INE | INE | 与 SHFE 混淆 |
| 广期 GFEX | GFEX | 新所符号不熟 |
郑商所示例:CZCE.MA509 表示甲醇 2025 年 09 月附近合约(具体以交易所挂牌为准),不要写成 CZCE.ma2509 这类四位年月除非文档明确支持。
三、写完后如何立刻验证
python
from tqsdk import TqApi, TqAuth, TqSim
api = TqApi(TqSim(), auth=TqAuth("账户", "密码"))
symbol = "CZCE.MA509" # 改成你要测的
q = api.get_quote(symbol)
for _ in range(30):
api.wait_update()
if q.last_price == q.last_price: # 非 nan
print("订阅成功", symbol, q.last_price)
break
else:
print("仍无有效价,检查代码", symbol)
api.close()
也可在快期客户端查「合约代码」字段,复制到脚本,比手打少错。
四、K 线、下单必须用同一 symbol
get_kline_serial(symbol, ...)、get_position(symbol)、insert_order 的第一个参数,都应与 get_quote 完全一致。换月时只改一处常量或配置文件,避免行情订 A、下单 B。
主力连续、指数合约另有 KQ.m@、KQ.i@ 前缀规则,研究链与交易链要分开;实盘下单一般仍用具体月份合约。
五、组合合约与特殊代码
跨期 SP、SPD 等组合合约代码更长,订阅前在客户端确认完整字符串。写错时同样无行情,排查方式与单合约相同。
总结
订不到行情,先怀疑合约代码而不是怀疑策略。天勤按完整 交易所.合约 订阅,大小写和年月位数都要与交易所挂牌一致。
建议维护一份「当前交易合约表」CSV,脚本只读表内代码;换月时改表、先跑最小连通脚本,再跑策略。
FAQ
1)主连代码怎么写?
研究可用 KQ.m@ 主连;实盘执行用具体月份。
2)大小写不敏感吗?
敏感,以官方及客户端显示为准。
3)股票期权能用同样格式吗?
期权有独立代码规则,见官方期权交易文档。
4)回测里 symbol 和实盘不一致?
回测结果无法对照,应统一命名。
风险提示
本文用于合约代码技术说明,不构成投资建议。挂牌合约以交易所公告为准。