前言
国内期货量化策略,本质上是一个长时间运行的 Python 程序:根据 K 线或 tick 算出「目标持仓几手」,再通过天勤量化(TqSdk)连到期货公司或模拟账户去执行。策略不会一写好就永远不变——你会改均线周期、换交易合约月份、调风控阈值、修 bug。这种「换一版程序」叫发版。有人希望像网站一样「热更新」:程序不停机,改一行配置就生效;有人习惯夜盘结束或周末停机,替换代码后再开盘。
天勤的程序结构和普通脚本不同:核心是TqApi长连接,每个交易合约通常只有一个TargetPosTask实例负责调仓,K 线订阅缓冲绑在进程里。不是所有改动都能在持仓运行时在线生效;不懂这一点,可能在还有持仓时改了offset_priority,行为混乱,或叠了两个TqApi连接。下面按改动类型说明什么必须重启进程、发版时持仓怎么处理。
一、先弄清几个名词
| 名称 | 是什么 | 和发版的关系 |
|---|---|---|
| 发版 | 部署新一版 Python 代码或配置 | 可能需停机 |
TqApi | 天勤主连接,订阅与交易入口 | 一个进程宜一个实例,换版常close()后重建 |
api.close() | 释放连接 | 发版前正常退出用 |
TargetPosTask | 自动把净仓调到目标的工具 | 创建时定price、offset_priority等,事后难改 |
get_kline_serial | K 线订阅 | 改合约或 data_length 常需重订 |
| state 文件 | 自建 JSON,记 last_bar 等 | 新进程可读,但与内存变量要一致 |
| systemd/supervisor | Linux 进程守护 | 崩溃可拉起;换代码应 stop→替换→start |
| VERSION | 策略版本号 | 日志里标记哪版逻辑下的单 |
二、为何天勤策略多数要「停机发版」
| 绑在进程上的内容 | 为何难热更新 |
|---|---|
TargetPosTask单例 | 同一 symbol 不能事后改 price、offset_priority、min_volume/max_volume |
TqApi连接状态 | 改环境常需 close 重建 |
| K 线订阅 | 改 symbol、周期、data_length 需重新订阅 |
| 内存里的变量 | 新逻辑与旧 state 可能矛盾 |
官方文档:同一合约勿用不同参数重复创建TargetPosTask,否则会抛异常。
三、改动分类:什么可以什么不可以
| 改动内容 | 建议方式 |
|---|---|
| 均线周期、信号阈值、日亏线 | 停机;或代码实现「每根新 K 线重新读 config」,且不改 task 构造参数 |
| 交易合约月份(如 rb2510→rb2511) | 停机,并走移仓:平旧月、对新月建 task |
ACTIVE/PASSIVE、offset_priority | 必须停机,新建TargetPosTask |
| 日志路径、钉钉 webhook | 若写了 reload_config 可热更,否则停机 |
| 信号逻辑 bug 修复 | 停机,回测和模拟验证后再上实盘 |
「热更新」在期货实盘里风险高:持仓还在、旧 task 还在发单,新逻辑已算出新目标,容易乱。
四、推荐发版流程(有持仓时尤其要遵守)
- 选成交清淡时段(如白盘午休、夜盘结束后)。
- 记录当前各品种
get_position().pos、在途ALIVE委托。 - 程序内
api.close()正常退出,或由 systemdstop。 - 替换代码与配置文件,检查
.env中合约月份、MODE 是否正确。 - 守护进程
start拉起新进程。 - 启动后先多次
wait_update(),读 position、order、account 全量对账,再恢复自动交易。
勿在复杂持仓时kill -9且不对账,否则新进程可能带着错误假设set_target_volume。
五、VERSION 与守护进程的区别
日志第一行写VERSION=1.2.3;state JSON 里也写version,事后复盘能对应「这笔单是哪个版本的逻辑」。Restart=always适合进程崩溃自动拉起,不等于「不停机换代码」;换代码应明确 stop → 部署 → start。
总结
期货量化策略发版,在国内实盘环境下多数应视为停机发版:凡涉及TargetPosTask创建参数、订阅合约、核心信号逻辑的改动,都不适合在持仓运行中在线替换。天勤靠wait_update驱动交易,进程边界就是一致执行边界。把发版窗口、对账步骤、VERSION 标记写进运维习惯,需要明确的是:不是改完 py 文件就立即生效,而是 close、部署、拉起、对账的完整闭环。
FAQ
1)只改一个均线数字要重启吗?
若只改 config 且程序每 bar 重读、且不涉及 task 参数,可能不必;若改的是 task 的 price/offset 等,必须重启。
2)Docker 换镜像算啥?
等同停机,state 文件用数据卷挂载保留。
3)在 Jupyter 里改策略?
须 restart kernel 并api.close(),否则会叠连接。
4)双机热备两台同时跑?
同一资金账户不能两个进程同时自动报单。
风险提示
以上内容用于发版流程参考,不构成投资建议。