量化程序如何同时支持回测、模拟盘和实盘
前言
策略写到一半,最常见的问题是:回测一套代码、模拟又 copy 一份改账户、实盘再改第三份,三周后三份已经对不上。能同时支撑回测、模拟、实盘的程序,核心不是“多写几个 if”,而是把环境差异压在 TqApi 构造层,信号与执行层共用。
天勤TqSdk用同一套get_kline_serial、wait_update、TargetPosTask接口,通过构造参数切换TqBacktest、TqSim、TqKq、TqAccount。下面给一套可落地的分层方式和切换检查表。
一、三层分离模型
| 层 | 内容 | 是否随环境变化 |
|---|---|---|
| 环境层 | TqApi(...)的 account、backtest、auth | 是 |
| 策略层 | 指标、信号、目标仓 | 否 |
| 运维层 | 日志路径、告警、配置 | 少量 |
策略层禁止写死“我是回测”,禁止在信号里读环境变量分支两套均线逻辑。
二、环境层四种构造(对照表)
| 模式 | 典型构造 | 用途 |
|---|---|---|
| 回测 | TqApi(backtest=TqBacktest(start_dt=..., end_dt=...), auth=...) | 历史验证 |
| 本地临时模拟 | TqApi(TqSim(), auth=...)或仅auth(默认进程内 TqSim) | 本机调试,结束即丢 |
| 快期模拟 | TqApi(TqKq(), auth=...) | 团队可见、APP 可核对 |
| 实盘 | TqApi(TqAccount(...), auth=...) | 真资金 |
回测与实盘不要在同一进程里随意切换构造而不重启;换环境应重启进程并清状态。
三、统一入口示例
importosfromdatetimeimportdatefromtqsdkimportTqApi,TqAuth,TqSim,TqKq,TqAccount,TqBacktest,BacktestFinished MODE=os.getenv("TQ_MODE","sim")# backtest | sim | kq | liveAUTH=TqAuth(os.getenv("TQ_USER"),os.getenv("TQ_PASS"))defmake_api():ifMODE=="backtest":returnTqApi(backtest=TqBacktest(start_dt=date(2024,1,1),end_dt=date(2024,6,1)),auth=AUTH,)ifMODE=="sim":returnTqApi(TqSim(),auth=AUTH)ifMODE=="kq":returnTqApi(TqKq(),auth=AUTH)ifMODE=="live":returnTqApi(TqAccount("期货公司","资金账号","密码"),auth=AUTH)raiseValueError(MODE)api=make_api()实盘账户参数以你开户信息为准;模拟勿连实盘配置(团队常做环境变量隔离专题)。
四、回测结束与主循环
回测时间走完会抛BacktestFinished(tqsdk.exceptions)。主循环应捕获并关闭 API,导出统计或trade_log:
try:run_strategy(api)# 内部 while True: wait_update ...exceptBacktestFinished:passfinally:api.close()不要在回测结束后继续wait_update,否则逻辑无意义。
五、策略层必须统一的细节
- K 线触发:统一
is_changing(..., "datetime")+iloc[-2]规则 - 手续费与滑点:回测在
TqSim/ 回测参数里配置,实盘无法“回测同款理想成交” - 合约代码:回测用具体月份或主连规则要写进 config,换月逻辑三环境共用
- TargetPosTask:三环境同一调用方式,
set_target_volume后继续wait_update
六、切换环境时的验证清单
MODE环境变量与运维文档一致- 快期模拟/实盘能在 APP 或柜台核对持仓
- 回测样本外区间再跑一遍,与模拟方向一致
- 日志里打印当前
MODE和合约列表 api.close()在进程退出时执行,避免连接泄漏
七、不要指望“自动一模一样”
三环境共用代码,不等于绩效一致。回测无排队成交、模拟有滑点模拟、实盘还有拒单与流控。设计目标是逻辑一致、可复现,然后在各环境单独做执行质量评估。
总结
同时支持回测、模拟、实盘:环境差异收敛到make_api()一类工厂函数,策略主体只依赖TqApi通用接口。回测用TqBacktest并捕获BacktestFinished;调试可用TqSim;团队模拟用TqKq;实盘用TqAccount。
切换环境用配置而非复制策略文件;统一 K 线触发与目标仓逻辑;换模式后按清单验证账户与合约。接受执行层差异,用日志和 trade 记录评估而非强求回测曲线等于实盘。
FAQ
1)能否一个进程先回测再实盘?
不建议;应分进程、分配置,避免状态残留。
2)回测需要 auth 吗?
官方示例通常仍传TqAuth,按你使用的数据权限配置。
3)TqSim 和默认 TqApi(auth) 区别?
不传交易单元时也是进程内临时模拟;显式TqSim()语义更清晰,与TqKq不同。
4)多策略多进程怎么部署?
每进程一个TqApi,注意同一实盘账户别多进程抢单。
风险提示
本文讨论工程实践,不构成投资建议。实盘前请完成模拟验证。
