三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

量化程序如何同时支持回测、模拟盘和实盘

量化程序如何同时支持回测、模拟盘和实盘

前言

策略写到一半,最常见的问题是:回测一套代码、模拟又 copy 一份改账户、实盘再改第三份,三周后三份已经对不上。能同时支撑回测、模拟、实盘的程序,核心不是“多写几个 if”,而是把环境差异压在 TqApi 构造层,信号与执行层共用

天勤TqSdk用同一套get_kline_serialwait_updateTargetPosTask接口,通过构造参数切换TqBacktestTqSimTqKqTqAccount。下面给一套可落地的分层方式和切换检查表。

一、三层分离模型

内容是否随环境变化
环境层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()

实盘账户参数以你开户信息为准;模拟勿连实盘配置(团队常做环境变量隔离专题)。

四、回测结束与主循环

回测时间走完会抛BacktestFinishedtqsdk.exceptions)。主循环应捕获并关闭 API,导出统计或trade_log

try:run_strategy(api)# 内部 while True: wait_update ...exceptBacktestFinished:passfinally:api.close()

不要在回测结束后继续wait_update,否则逻辑无意义。

五、策略层必须统一的细节

  1. K 线触发:统一is_changing(..., "datetime")+iloc[-2]规则
  2. 手续费与滑点:回测在TqSim/ 回测参数里配置,实盘无法“回测同款理想成交”
  3. 合约代码:回测用具体月份或主连规则要写进 config,换月逻辑三环境共用
  4. 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,注意同一实盘账户别多进程抢单。

风险提示

本文讨论工程实践,不构成投资建议。实盘前请完成模拟验证。

← 返回列表