前言
国内期货量化策略上线通常走三步:先用天勤TqBacktest在历史 K 线上回测双均线等信号,净值曲线往往很好看;再用TqSim或TqKq接实时行情做模拟盘;最后才挂TqAccount实盘。很多人卡在第二步:回测净值翻倍,模拟盘跑一个月却几乎横盘,怀疑策略坏了,其实常见原因是模拟成本设得太美——手续费按默认值、对价成交太理想,而实盘螺纹钢每手手续费、平今优惠、滑点都会吃掉边缘利润。
天勤本地模拟TqSim提供set_commission/get_commission按合约设每手手续费;源码里没有名为 slippage 的全局参数,滑点要靠TargetPosTask的ACTIVE/PASSIVE或实盘日志反推。下面说明怎么把模拟成本校准到接近实盘。
一、TqSim 手续费 API
见tradeable/sim/tqsim.py:
fromtqsdkimportTqApi,TqSim,TqAuth sim=TqSim()api=TqApi(sim,auth=TqAuth("账户","密码"))sim.set_commission("SHFE.rb2510",5.0)# 每手 5 元,数值按期货公司标准填print(sim.get_commission("SHFE.rb2510"))未设置时用内置规则_get_commission推算,可能与你的期货公司标准有差。多品种策略应对每个交易 symbol 设一遍,或启动时读配置表循环set_commission。
账户层get_account().commission可累计验证当日手续费是否与预期同量级。
二、天勤没有内置滑点参数意味着什么
不能指望调一个slippage=2就完事。可选做法:
TargetPosTask用PASSIVE模拟排队成交,比ACTIVE保守。- 手写
insert_order限价,故意偏离last_price若干 tick。 - 实盘记录信号价与
get_trade成交价差,统计均值写入模拟假设。 TqBacktest与TqSim成交机制不同,分别校准。
三、校准流程建议
- 在
TqKq或小额实盘跑两周,日志记signal_price、trade_price、commission。 - 算每品种平均每手滑点(元)与手续费。
- 回测与
TqSim统一set_commission;滑点用保守限价或后处理扣减。 - 再跑同样区间模拟,净值曲线应与实盘同向、幅度接近。
四、与 TqBacktest 的关系
回测模块有独立成交假设,上线前应在TqSim/TqKq再验证一层。三环境配置文件(回测/模拟/实盘)里分开commission表,避免复制粘贴忘记改。
五、平今优惠与股指
股指、国债平今手续费高,应用真实平今率填 commission,并结合offset_priority控制平今频率,否则模拟利润虚高。
六、按成交日志反推滑点
实盘两周样本:
# 日志字段 signal_price, trade_price, volume, symbolslip=(trade_price-signal_price)*direction_sign按品种求平均每手滑点(元),在TqSim里用更保守的price="PASSIVE"或限价偏移模拟。天勤无 slippage 参数时,这是务实做法。
七、三环境 commission 配置
| 环境 | 配置位置 |
|---|---|
| TqBacktest | 回测 sim 实例 |
| TqSim/TqKq | set_commission 表 |
| 实盘 | 不模拟,只记账 |
同一张 YAML 维护,发版时 diff 佣金表是否变更。
八、验收标准
模拟盘两周后:实盘与模拟的「每笔手续费之和」误差在 5% 以内;净值曲线方向一致,最大回撤差距可解释(滑点+未成交)。达不到则继续调 commission 与 price 模式,而不是加指标。
总结
回测太理想,往往是因为成本假设太美。天勤TqSim用set_commission精确到合约,但滑点需通过对价方式、限价偏移或实盘统计自行补齐,SDK 未提供统一 slippage 开关。按实盘日志反推手续费与滑点,再跑一轮模拟盘权益曲线,比反复调均线参数更能判断策略有没有实盘价值。
FAQ
1)get_commission 返回 nan?
该 symbol 尚未 set 且行情未加载,先 wait_update 再 set。
2)按金额比例收费怎么设?
set_commission参数为每手固定值,比例费需折算或成交后手工校验。
3)TqKq 手续费谁定?
跟随快期模拟规则,与TqSim设置独立。
4)回测能自动读 set_commission 吗?
在回测构造里传入同一TqSim实例或等价配置。
本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。