前言
国内期货量化从研究到上线,通常会经历:历史回测(用过去 K 线验证规则)→ 模拟盘(交易所规则下的假资金或快期模拟)→ 实盘(真资金)。若为三阶段各拷一份.py,很快会出现“回测有某个 if、实盘忘了改”的分叉。更可维护的做法是:策略逻辑只有一份,仅TqApi的创建方式随环境变化。
天勤TqSdk用同一套get_kline_serial、wait_update、is_changing、TargetPosTask接口,通过传入TqBacktest、TqSim、TqKq、TqAccount切换环境。本文解释各环境在期货场景里代表什么、如何写make_api()、策略层必须统一哪些规则(含 K 线datetime触发),不默认你已做过回测。
一、四种环境在期货里各干什么
| 模式 | 天勤构造 | 典型用途 |
|---|---|---|
| 回测 | TqApi(backtest=TqBacktest(start_dt, end_dt), auth=...) | 历史区间验证,时间走完抛BacktestFinished |
| 本地模拟 | TqApi(TqSim(), auth=...) | 本机快速调试,进程结束记录常消失 |
| 快期模拟 | TqApi(TqKq(), auth=...) | 团队可见、可与 APP 对持仓 |
| 实盘 | TqApi(TqAccount("期货公司",账号,密码), auth=...) | 真资金,需开通程序化 |
回测的 K 线datetime仍来自回放数据,触发逻辑应与实盘一致:用is_changing(kl.iloc[-1], "datetime")与iloc[-2],不要在回测里单独用[-1]。
二、环境层工厂函数(策略文件不碰 if live)
importosfromdatetimeimportdatefromtqsdkimportTqApi,TqAuth,TqSim,TqKq,TqAccount,TqBacktest,BacktestFinisheddefmake_api():auth=TqAuth(os.environ["TQ_USER"],os.environ["TQ_PASS"])mode=os.environ.get("TQ_MODE","sim")ifmode=="backtest":returnTqApi(backtest=TqBacktest(start_dt=date.fromisoformat(os.environ["TQ_BT_START"]),end_dt=date.fromisoformat(os.environ["TQ_BT_END"]),),auth=auth,)ifmode=="kq":returnTqApi(TqKq(),auth=auth)ifmode=="live":returnTqApi(TqAccount(os.environ["BROKER"],os.environ["ACCOUNT"],os.environ["ACCOUNT_PASS"]),auth=auth,)returnTqApi(TqSim(),auth=auth)run_strategy(api)内只有期货合约订阅、循环、信号、下单,不出现if mode == "live"。
三、主程序与回测结束
api=make_api()try:run_strategy(api)exceptBacktestFinished:pass# 可在此导出回测统计finally:api.close()回测结束后继续wait_update无意义;实盘与模拟则长期循环。
四、策略层必须三统一
- K 线触发:
datetime字段变化 +iloc[-2]信号。 - 合约列表:来自 config,回测/实盘同一 symbol 规则(具体月或主连策略写清)。
- 执行方式:
TargetPosTask与insert_order二选一,不混用。
手续费、滑点在回测侧配置,不要写在信号 if 里。
五、切换环境检查清单
- 打印当前 MODE,防止误连实盘
- 快期模拟/实盘后
get_trade与日志对一笔 - 换环境重启进程,勿热换 Api
总结
量化程序同时支持回测和实盘,核心是环境层make_api()+ 单一run_strategy,期货 K 线仍靠表内datetime(行情服务写入)判断新 bar。天勤四种构造覆盖国内期货从研究到上线;绩效差异来自成交模型,不是代码分叉。
把环境变量与密码管理做好,比复制策略文件更省心。
FAQ
1)一进程先回测再实盘?
分两次进程,防状态残留。
2)回测要 TqAuth 吗?
按你使用的数据服务配置。
3)绩效为何不同?
回测成交理想化,需模拟与小资金实盘验证执行。
4)多策略?
每策略独立进程与 Api。
风险提示
本文讨论工程实践,不构成投资建议。