当前位置: 首页 > news >正文

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

前言

策略写到一半,最常见的问题是:回测一套代码、模拟又 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,注意同一实盘账户别多进程抢单。

风险提示

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

http://www.jsqmd.com/news/952005/

相关文章:

  • Prompt工程入门:让AI按你的要求工作(1)--prompt概述与设计
  • 2026年硅胶密封圈供应商排名,哪家口碑好 - mypinpai
  • AI内容工作流会成为品牌基础设施
  • 避坑指南:MATLAB读取MDF和BLF文件时,你可能会遇到的5个常见错误及解决方法
  • 5个实用技巧:用marked.js打造高效Markdown处理方案
  • 别再只盯着CCF了!手把手教你用CORE Ranking和CCF中文期刊目录,精准定位你的投稿目标
  • YOLOv11城市道路路面病害目标检测数据集-2722张-Pothole-detection-1
  • 新手小牛--组合逻辑集成电路(译码器2)
  • 如何将闲置电视盒子变身高性能Linux服务器?amlogic-s9xxx-armbian项目深度解析
  • YOLO26 数据清洗自动化:基于聚类的噪声样本过滤——从特征提取到综合流水线的完整工程实践
  • 训练Mask-RCNN时,那个神秘的events文件怎么用TensorBoard打开看损失曲线?
  • IPO材料智能生成系统崩溃事件复盘(附证监会反馈原文+AI修正日志),仅限本周开放下载
  • Spring Boot + MyBatis项目里,Integer参数传0为啥被当成空字符串?
  • AI赋能转正决策:从数据采集、能力建模到自动评估(2024最新Gartner验证框架)
  • 089、农业病虫害检测:复杂背景下小目标农业害虫检测的数据增强与模型改进
  • 图片:数字化时代的视觉语言
  • 如何遗忘比如何记忆更重要——AI Agent框架的一些总结
  • 舍饲环境下母羊产前典型行为识别方法解析【附代码】
  • P16353 「Diligent-OI R3 A」说好不哭 题解
  • Moneta Markets亿汇:“量子芯片点燃科技预期”
  • 从Push到Pull:搞懂Prometheus监控数据流的两种姿势,附Shell/Python推送实战
  • 如何免费实现游戏控制器虚拟化:ViGEmBus驱动完整指南
  • 2026云浮市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 手把手教你用STM32F072C8T6自制一个带串口的J-Link OB(附全套资料)
  • 高级实时动漫视频超分辨率技术深度解析:Anime4K开源项目架构设计与性能优化实战指南
  • 087、零售货架商品检测:密集排列、遮挡严重、类别极多的 SKU 检测方案
  • 3分钟实现智能图像分层:layerdivider让复杂插画秒变可编辑图层
  • ctf show web入门99
  • 为什么有些影视网站越用越顺手?一次实际体验后的分析
  • Codex中文网 | Codex CLI 中文指南