期货量化策略部署上线全流程_从回测到实盘的关键步骤
这两年做期货量化的人越来越多,但真正能把自己策略从回测搬到实盘的,比例其实低得吓人。我见过太多人卡在某个环节,有的是回测做得天衣无缝、一上模拟盘就变形,有的是参数明明在历史数据上漂亮得不行、进了实盘账户却连续打脸,还有的干脆连服务器、API、断线重连这些基础设施都没搞清楚,策略再牛也白搭。
这篇我不准备讲某个具体策略的写法,而是把“期货量化策略从回测到实盘部署”这条完整链路拆开揉碎,聊清楚到底有哪些关键步骤、每一步有哪些坑、怎么做才能减少从“纸面富贵”到“真实盈亏”之间的损耗。无论你用的是Python + backtrader、vn.py、还是自研框架,这篇的思路都适用。
1. 项目整体设计与前期准备
1.1 先把目标定清楚:你到底要部署一套什么样的系统
很多人一上来就写策略、跑回测,这其实把顺序搞反了。期货量化部署不是单纯写一段策略代码,它是一套完整系统,至少包含行情接入、信号生成、资金与仓位管理、下单执行、风控与监控、日志与复盘这几大模块。你要先想清楚:
- 你的策略是日线级别还是分钟级别?这直接决定你对行情延迟和服务器稳定性的要求。
- 你打算跑几个品种、几套策略?单品种单策略和多品种组合的架构复杂度完全不是一个量级。
- 你的资金量处在什么位置?资金量决定了你能接受的滑点、手续费占比,也决定了你是否有必要做算法拆单。
我遇到过不少朋友,策略是日线趋势跟踪,持仓周期三五天,却花大价钱买极低延迟的服务器和行情源,这完全是浪费。反过来,有人做的是秒级高频,却把策略跑在共享云主机上,还时不时断线,这种本末倒置的配置,上线第一天就会被市场教训。
先做减法,把系统边界画清楚。你可以从最简单的版本起步:一个品种、一套策略、单周期、日线级别信号、每天收盘后或者开盘前计算一次信号、手动或者半自动下单。等这个流程稳定了,再逐步加品种、缩短周期、做成全自动。
1.2 技术栈选型:Python为主力,但要清楚它的边界
国内做期货量化,Python基本是事实标准,靠的是生态成熟、调试方便、社区资料多。backtrader、vn.py、聚宽、米筐这些框架我都用过,各有取舍。
- backtrader:上手快、文档全,适合个人研究和策略验证。它的回测引擎做得比较细,佣金、滑点、多品种组合都能模拟,但实盘接口相对弱一些,一般要自己接CTP或者通过其他网关转发。
- vn.py:国内期货量化圈用得最多的开源框架之一,CTP接口封装得比较完善,回测、模拟、实盘可以共用一套策略代码,这对线上线下的逻辑一致性很有帮助。
- 自研轻量框架:如果你对系统掌控力要求高、或者策略逻辑比较特殊,自己封装一层行情处理和信号计算也不难。像我自己的核心引擎就是一套基于Python的事件驱动框架,行情来了触发信号计算,信号触发后走独立的交易执行模块。
选型的核心逻辑在于:回测环境和实盘执行环境尽量保持一致。这句话值得说三遍。很多人的回测是在一个框架里写的,实盘又换了一套系统重写,结果策略逻辑在翻译过程中出现偏差,回测明明赚的钱,实盘却亏了。如果你用vn.py,策略类继承自同一个基类,回测和实盘都调用相同的方法,就能最大程度避免这种“翻译误差”。
Python的性能边界也要有清醒认识。对秒级甚至tick级策略,Python事件循环可能会成为瓶颈,尤其是同时跑十几个品种的时候。解决方案无非几条:用C++/Rust写核心执行模块、用多进程/多线程/异步IO优化、或者干脆把策略信号频率降到秒级以上。我个人的经验是,分钟级别以上的策略,纯Python足够;如果要做tick级别,至少要把行情处理和订单管理用更低级的语言去实现。
1.3 数据基础设施:没有干净的数据,一切策略都是空中楼阁
做部署之前,数据问题必须提前解决。期货数据源我常用的有几类:免费的tushare、akshare,付费的米筐、聚宽、万得,还有直接通过CTP接口录制的tick数据。免费数据拿来做策略研究没问题,但要做实盘级回测,你需要仔细检查数据的完整性和准确性。
几个常见的数据坑:
- 复权问题:期货没有股票那种分红送股,但存在换月。主力连续合约和指数合约的价格序列需要自己拼接,拼法不同,信号差异会非常大。我通常的做法是,用成交量最大的合约作为当前主力,换月时做价格跳跃修正,或者干脆在同一策略里只交易当前主力合约,不人为构造连续性。
- 涨跌停和熔断:期货有涨跌停限制,涨跌停时价格封板、成交量急剧缩小,你的回测系统必须能模拟这种情况,否则会高估策略的成交能力。
- 夜盘:国内商品期货有夜盘,不同品种的夜盘时间还不一样。回测时如果忽略夜盘,日线策略影响不算大,但分钟级策略就会产生隔夜跳空的假象。
- 时区与时间戳:不同数据源的行情时间戳格式不一致,有的用本地时间,有的用UTC,有的还有毫秒/微秒精度差异,合并数据的时候如果处理不当,会出现未来函数。
我的建议是,在自己的数据存储里统一做成标准化格式:datetime统一用北京时间带时区,价格字段统一用浮点数,成交量、持仓量用整数,数据落库后定期做完整性校验。数据这块看着不起眼,但真正上线以后,绝大多数奇奇怪怪的策略表现问题,追根溯源都是数据质量出了问题。
2. 核心细节解析与回测实操要点
2.1 回测框架的三个关键参数:手续费、滑点和资金占用
回测里越是细节的地方,越能拉开差距。手续费和滑点是两个最常见的“美化器”。很多人回测时把手续费设得很低、滑点设为零,结果实盘一跑,利润直接被摩擦成本吃掉大半。
期货的手续费结构比股票复杂:有的是按成交金额比例,有的是按手数固定收费,还有的是平今仓翻倍。比如股指期货平今仓手续费比平昨仓高很多,如果你做的是日内高频,这个费用必须精确模拟。建议在回测框架中把手续费参数做成可配置的,不同品种、不同合约月份、开仓平仓分别设置。
滑点怎么估?我习惯在回测中对每笔成交加上固定滑点,比如一跳到两三跳,同时还可以加入部分成交比例模拟。这里要记住,滑点不是恒定值,它取决于流动性、市场波动率和你的下单量。回测时用保守值,宁可少赚,也别把虚高的收益当真。
资金占用这块,期货是保证金交易,不是全款买卖。每笔开仓占用的保证金 = 开仓价格 × 合约乘数 × 手数 × 保证金比例。不同品种的保证金比例不一样,交易所会在节假日或特殊行情时临时调高。回测里如果忽略了这一点,你的资金曲线和真实账户会有很大偏差,尤其是杠杆高的策略,严重的还会触发强平。
我自己的做法是,在回测中除了模拟保证金占用,还会加一个“可变杠杆上限”的概念——永远不让某一笔策略的保证金占用超过总资金的一定比例(比如30%),这样即使遇到连续亏损或极端行情,账户也不会爆仓。回测中把风控阈值写进去,才能在实盘中真正执行到位。
2.2 回测结果怎么看:别只盯着年化收益率
看回测报告时,多数新手第一眼永远看总收益率、年化收益率,然后心里一乐觉得捡到宝了。但实际上,一份回测报告里最重要的指标是这么几个:
- 最大回撤:从资金曲线最高点到后续最低点的最大跌幅。这个数据直接决定你能不能拿住策略。我个人能接受的最大回撤一般不超过20%,超过这个阈值,实盘的心理压力会大到影响执行。
- 盈亏比与胜率:两者结合着看。高胜率低盈亏比和低胜率高盈亏比都可以赚钱,但对应的心理感受完全不同。你要清楚自己策略坐标系中的位置。
- 夏普比率:收益相对于波动率的性价比。年化10%但波动巨大的策略,和年化8%但曲线平稳的策略,我肯定选后者。
- 最大连续亏损次数:这决定你资金曲线最难看的时候有多难看,也决定你需要准备多少心理缓冲带。
还有一个常被忽略的点:样本外测试和稳健性检验。历史数据上表现再好,也不代表未来能复制。我通常会把历史数据切分成几段,一段做参数优化,另一段做样本外验证。如果一个策略在样本外表现明显劣化,说明参数过拟合了。另一种做法是参数敏感性分析——如果你把参数从20调到22,回测结果从年化30%直接变成亏损,那这个参数就是“悬崖参数”,实盘里必然失效。
2.3 未来函数与过拟合防范:回测里最隐秘的三个坑
未来函数是回测算不准的头号元凶。最常见的有三种:
- 使用未来数据计算当前信号:比如用当天收盘后才知道的结算价来做盘中决策,或者用了未复权的数据进行除权处理。
- 偷看行情:在回测中假设当前K线收盘后立刻能成交,但实际上你是在K线运行过程中或者收盘瞬间才拿到的信号,价格已经走过了。
- 换月机制漏洞:回测中使用主力连续合约,假设你始终能持有流动性最好的主力合约,但实盘换月时会有冲击成本和价差,回测里完全没有体现。
我排查未来函数的经验是,在策略代码中强制约束:信号计算只能使用已收盘的K线数据,当日开仓信号只能在下一根K线开盘时执行。同时用日志把每次信号触发的时间戳、使用的数据截止时间、实际成交价格都记录下来,人工抽样核对,能检查出绝大多数问题。
过拟合更隐蔽。它是参数优化过程中“拟合噪声”导致的假象。我见过一个策略,在优化器里跑了几千组参数组合,选了一组资金曲线最漂亮的,结果实盘一跑,几个月就被市场打回原形。避免过拟合的方法没有捷径:减少优化参数数量、限制优化范围、增加样本外验证、做多市场环境下的压力测试。说白了,策略的“简单性”本身就是一种风控。
3. 从回测到模拟盘的过渡:策略验证的第二道关卡
3.1 为什么必须做模拟盘:回测和实盘之间隔着一道“执行鸿沟”
回测通过后,不少人直接上实盘,这是个危险动作。回测和实盘之间存在巨大的“执行鸿沟”,具体包括:
- 回测假设你的信号一产生就能按理想价格成交,但实盘要经历行情推送延迟、策略计算延迟、下单传输、交易所撮合排队这些环节,成交价格可能比回测差好几个跳。
- 实盘会出现滑点、拒单、断线、网络延迟、交易所撤单,回测系统根本不会告诉你这些情况会对你的策略产生多大影响。
- 实盘的账户资金是真实在波动,你会恐惧、会贪婪、会犹豫,这些心理因素在回测中完全不存在,但它们会影响你的执行力。
模拟盘的意义,就是让你用尽量接近真实的流程去运行你的策略,把执行层面的bug、延迟问题、以及自身心态问题先暴露出来。
3.2 模拟盘的配置与运行周期:到底要跑多久才算出师
我用模拟盘验证策略,一般会走这么几步:
- 选择支持模拟撮合的期货公司仿真环境。国内期货公司基本都有仿真交易系统,CTP仿真接口和实盘接口格式一致,策略代码可以无缝切换。
- 模拟盘账号的资金、手续费、保证金比例,尽量设置成和实盘一致或更严格。有人觉得模拟盘不就是随便跑跑吗?我建议把模拟盘当实盘来对待,包括下单量、频率、风控阈值全部按实盘标准执行。
- 运行周期至少覆盖一个完整的策略信号周期。如果你的策略平均持仓5天,那模拟盘至少跑一个月,覆盖四五次完整开平仓;如果策略持仓三个月,那模拟盘就得跑季度级别。跑得太短,很多问题还没暴露就出师了,后面实盘就得交学费。
模拟盘阶段我重点盯几件事:策略信号生成是否稳定、实际成交价和信号价的偏差有多大、连续亏损时自己心态撑不撑得住、以及系统在异常行情下是否会出现拒单或延迟。这些信息都会成为后面实盘参数调整的重要依据。
3.3 模拟盘常见问题:为什么模拟盘能赚钱,实盘却不一定
模拟盘和实盘之间永远有偏差。有些偏差是可以接受的(比如成交价的微小差异),有些则是系统性风险,必须重视:
- 撮合机制差异:仿真环境的撮合规则和真实市场不同,模拟盘成交可能过于乐观。我试过,同一个策略在仿真环境里滑点几乎为零,但实盘平均每笔滑点超过一跳。
- 对手盘与市场冲击:模拟盘你的单子不会真正影响市场价格,但实盘如果你下单量够大,会推动价格朝不利方向移动。这个问题在流动性较差的品种上尤其严重。
- 手续费和保证金差异:有些模拟盘的手续费设置比实盘低,保证金比例也比实盘宽,导致模拟盘里的仓位计算比实盘激进,实际可承载的仓位被高估。
如果你在模拟盘阶段发现策略收益和回测差距过大,先别急着调参数,先仔细核查是不是执行环节的问题。找到问题根源,调整系统逻辑,再重新验证,这才是模拟盘存在的意义。
4. 实盘部署的关键环节:架构、风控与运维
4.1 部署架构:服务器、操作系统与中间件怎么搭
从模拟盘到实盘,最核心的差别是你需要一套7×24小时稳定运行的自动化系统。我目前的部署架构大概是这样:
- 服务器:使用独立云服务器,选择离期货交易所机房网络延迟比较近的地域。对分钟级策略,普通双核4G内存的实例就够用;对秒级策略,建议至少4核8G起步,磁盘用SSD。有人为了省几十块钱用最低配,结果行情数据一密集,系统卡顿,信号延迟,这是最亏的选型。
- 操作系统:我自己用的是Ubuntu LTS版本,稳定、社区资料多、各种依赖库好装。线上服务器不要装图形界面,纯命令行操作,减少不必要的进程占用和攻击面。
- 部署方式:目前最常用的是Docker容器化部署,把行情模块、策略引擎、风控模块、监控模块分别打包成容器,用docker-compose统一编排。这样做有几个好处:环境隔离、版本可控、迁移方便、回滚容易。
Docker部署踩过的坑也很多。有一个我得重点提一下:容器的时钟和宿主机的时区/时间同步问题。如果容器时间不同步,日志时间戳和行情时间对不上,排查问题会非常痛苦。解决方案是在Dockerfile启动时强制同步时区到Asia/Shanghai,并安装ntp服务定期校准时间。
4.2 实盘接入:CTP接口与行情/交易分离设计
国内期货实盘最主流的通道是CTP(综合交易平台)接口。CTP分成行情接口和交易接口两个部分,在架构设计上要严格分离。
行情模块负责连接行情服务器,订阅你需要的合约,并把tick数据推送给策略引擎。交易模块负责连接交易服务器,处理策略引擎下发的订单、回报、持仓查询。两个模块独立运行,即使交易模块出现问题,行情模块还能继续工作,策略日志也不会中断。
CTP接口使用中要注意:
- CTP是长连接,网络波动会导致断开。必须设计断线自动重连机制,并且重连成功之后要做一次全量查询(持仓、资金、委托),确保本地状态和柜台状态一致。
- CTP的报单是有频率限制的,大量撤单或者报单可能触发流控,导致被拒单。策略下单频率要提前评估,必要时在本地做订单合并和缓存。
- 交易时间之外(比如夜盘结束到第二天日盘开始),CTP部分接口可能不可用,系统要有状态切换机制,不能把非交易时段的行情数据当成实时数据去触发信号。
有一段时间,我的系统在上线早期频繁出现“本地有持仓但柜台没查到”的尴尬状况,后来排查了很久才发现是断线重连后没有做全量查询,本地状态和实际持仓在长时间运行中悄悄发生了偏移。从那以后,我要求交易模块在每次重连成功、每天开盘前、以及每次异常恢复后,都强制做一次全量同步。
4.3 风控模块:这是实盘系统最重要的部分,没有之一
如果只让我保留实盘系统里的一个模块,我选风控。策略可以失效,代码可以有bug,但风控模块如果失灵,整个账户都可能清零。我的风控模块至少包含以下规则:
- 单笔止损:每笔交易如果亏损超过一定比例,强制执行平仓。
- 单日亏损限额:单日整体亏损达到阈值,停止开新仓,并考虑是否清仓已有持仓。
- 最大回撤熔断:策略账户从阶段高点的回撤超过设定值,暂停该策略的交易,切换到观察模式。
- 仓位上限:单品种单策略的保证金占用不得超过总资金的固定比例;所有策略合计占用的保证金不超过总资金的某个上限(比如50%)。
- 异常行情保护:市场出现极端波动、流动性枯竭、连续涨跌停时,策略自动降低仓位或暂停开仓。
风控的触发逻辑必须是独立的。也就是说,风控模块不能依赖策略引擎的健康状态,即使策略死机、数据库卡住、甚至服务器负载跑满,风控判断也要独立运行,并能直接发撤单指令。我采用的是“双进程”思路:策略引擎和风控进程分开部署,风控进程通过心跳检查策略引擎状态,一旦发现策略引擎无响应,直接接管账户管理权。
很多初学者会把止损逻辑直接写在策略代码里,这是一个重大隐患。如果你的策略代码在某个极端行情下抛异常、或者进入了死循环,止损逻辑也会跟着失效。把风控从策略中剥离开,让它在更高层级独立运行,才是实盘系统该有的设计。
4.4 监控与告警:系统盲跑是最可怕的事
实盘系统最怕的不是亏钱,而是出了问题你不知道。所以我强烈建议,在系统上线第一天就部署好监控与告警。
监控维度包括:
- 系统层:CPU、内存、磁盘、网络流量,用Prometheus + Grafana这类组合做看板。
- 业务层:策略是否按时生成信号、订单是否正常成交、持仓是否和预期一致、资金是否正常变动。
- 异常告警:策略进程退出、断线重连超过N次、订单长时间未成交、连续触发风控规则、系统时间偏差过大等。
告警通道最常用的是企业微信机器人、钉钉机器人或者Telegram Bot。我个人的经验是,告警消息需要分级:严重级别(比如系统崩溃、订单异常)必须即时通知;一般级别(比如滑点偏大、成交延迟)可以每N分钟汇总一次;温馨提示级别(比如策略今日无信号)一天一条就够了。如果所有事件都即时推送,人很快就麻痹了,反而会忽视真正重要的告警。
最近我把监控也接上了大模型做初步的日志归类,让机器人每天生成一份简要的复盘日报。刚开始觉得很酷,但用了一阵子发现,它对日志格式的规范性和标注的完整性要求很高,初期还不如直接上规则过滤。不过趋势是明确的,AI辅助运维以后会越来越普遍。
4.5 部署上线流程:灰度发布与回滚预案
实盘上线不能跟赌命一样。我第一次上线时,直接在周五收盘前把策略部署上去,结果周一开盘前发现参数配置文件读取有问题,系统完全没运行,幸好当天信号本来就是空仓,不然后果不堪设想。后来我总结了一套上线流程:
- 先在模拟盘环境部署新版本代码,跑通全流程。
- 实盘环境先跑第一个交易日,但把仓位限制调为最小手数,比如每次只开1手,验证系统信号、成交、持仓查询、风控触发都正常。
- 观察一周,确认稳定后逐步加仓到正常参数。
- 每次修改策略参数或代码,都保留上一个版本的配置文件、代码仓库tag、docker镜像。万一新版本出问题,一条命令就可以回滚。
部署工具的选型上,可以用GitLab CI/CD配合Ansible,或者直接用GitHub Actions触发远程部署脚本。对个人量化来说,不用搞太复杂,一个简单的部署脚本 + Docker镜像标签管理已经足够。关键是每次部署要有记录,线上运行的是哪个版本、用的什么参数,必须能随时查清楚。
5. 常见问题与排查技巧实录
5.1 信号延迟和成交滑点超预期,怎么办
这是从模拟盘过渡到实盘后最常见的落差。排查顺序是:
- 看行情源本身是否延迟过高。用TCP/UDP连接质量测试工具检查到行情服务器的网络延迟,如果延迟超过几十毫秒,考虑更换更近的机房或者使用专线。
- 看策略计算时间是否过长。如果行情数据到达后,策略引擎花了超过几百毫秒才产生信号,说明计算逻辑需要优化。可以考虑用缓存、向量化计算、或者只对最新tick做增量计算。
- 看订单执行链路。从策略信号产生到报单发出之间的耗时,如果超过100毫秒,就得检查交易模块的处理效率,以及是否因为使用Python的全局锁导致线程阻塞。
滑点问题的解决,一部分靠技术(降低延迟、用小单量试水、在流动性好的时段交易),一部分靠策略设计(止盈止损价位预留滑点空间、不追求精确成交价)。如果实盘滑点长期显著高于回测假设,就要回去修正回测模型,而不是继续麻痹自己说“下次会好”。
5.2 策略实盘表现和回测差异太大,排查从哪里入手
很多时候差异不是策略逻辑变坏了,而是运行环境或参数发生了变化。建议按这个顺序排查:
- 先看数据源是否一致。实盘用的行情源和回测用的历史数据源,价格序列是否对齐?有没有用不同的复权方式或换月合约?
- 再看撮合机制是否一致。回测是按时点撮合、按K线收盘价撮合还是按tick撮合?实盘的成交是即时成交、排队成交还是有部分滑点?
- 然后看手续费、保证金、滑点参数是否和回测一致。
- 最后才怀疑策略逻辑本身是否因为实盘环境产生了偏差,比如是否因使用未来数据导致回测收益虚高、是否因为仓位计算方式不同导致杠杆过高。
我回忆过最刻骨铭心的一次:策略在回测里年化50%,实盘第一个月却亏损了8%。排查到最后,发现回测数据的复权和换月处理与实盘主力合约切换的规则不一致,导致信号出现系统性偏移。从那以后,我所有策略必须同时用交易所真实行情数据源做验证,不再依赖第三方合成数据。
5.3 系统不稳定、断线、拒单如何处理
系统不稳定是实盘部署绕不开的课题。我整理过一份速查表,遇到问题时能快速定位:
| 症状 | 可能原因 | 排查思路 |
|---|---|---|
| 行情长时间不更新 | 行情源断开、网络拥堵、行情源服务器故障 | 检查TCP连接状态,查看日志最后更新时间戳,重启行情模块并测试连接质量 |
| 订单一直处于已报未成交 | 市场波动剧烈、价格变动过快、委托价格偏离当前价过远 | 查询当前盘口价格,确认订单状态,必要时撤单重发 |
| 报单被拒 | 资金不足、超过持仓限额、CTP流控限制、非法参数 | 查看CTP回报中的错误码,逐项排查资金、权限、频率 |
| 策略引擎无响应 | 死循环、内存泄漏、数据库查询阻塞、第三方接口超时 | 查看进程CPU/内存占用,开启耗时统计日志,必要时加超时保护 |
| 本地持仓与柜台不一致 | 断线重连后未做全量查询、本地状态更新失败 | 触发强制全量查询,重启交易模块并重新同步 |
| 时间戳混乱 | 容器时区未设置、系统时间偏差大、NTP未配置 | 统一设置为Asia/Shanghai时区,启用NTP定时校时 |
实盘环境里,稳定第一、功能第二。一个简单但稳定的系统,远远好过一个功能强大但经常出问题的系统。所以在架构设计上,我一直坚持“能不加复杂度就不加”,所有非核心功能都可以先砍掉,等核心链路稳定了再逐步回补。
5.4 极端行情下的风险处理:一字板、连续停板、流动性枯竭
极端行情是对实盘系统最大的压力测试。期货涨停跌停时,封单量巨大但没人接盘,你的市价单可能无法成交,而限价单要么挂在涨停价上买不进,要么挂在跌停价上卖不出。这种情况下,风控模块的“保证可以成交”逻辑可能失效。
我处理极端行情的原则是:提前识别,宁可放弃机会,也不能陷进去。具体做法是,策略在临近涨跌停板位置自动取消开仓信号;如果已有持仓,盘中监控到价格接近涨跌停,立刻尝试减仓,而不是等待止损价格触发。因为一旦封板,你连止损的机会都没有。这算是我用真金白银换来的教训。
另外一个容易被忽略的场景是节假日前后的保证金和涨跌停幅度调整。国内交易所会在长假前上调保证金比例,涨跌停板幅度也会调整,导致策略的仓位计算和风险暴露发生突变。系统必须能读取交易所公告中的参数变化,并自动调整仓位上限,而不是等到真实风险发生时才反应。
5.5 策略失效的识别:什么时候该停掉一个策略
不要迷信任何一个策略能永远赚钱。市场结构在变,波动率在变,交易者在变,策略必然有生命周期。我的止损逻辑不只适用于单笔交易,也适用于策略本身:
- 当策略连续触发多次止损,且回撤超过其历史最大回撤的50%时,进入观察状态。
- 观察期内,如果策略收益继续低于预期、或者信号质量明显下降,就手动暂停。
- 暂停后做完整诊断分析:是市场环境变了,还是参数失效了,还是执行环节出了问题。
- 如果确认是市场环境变化导致,保留策略代码,等市场风格匹配时再重新启用;如果是执行环节问题,修完bug再上线。
从实际操作来看,我见过太多人因为“舍不得之前的收益”而迟迟不肯停掉一个已经失效的策略,最终把前期利润全部回吐。该止损的时候要果断止损,这与策略逻辑无关,而是交易纪律的问题。
6. 上线后的持续优化与个人复盘心得
6.1 建立策略运行档案,沉淀一份自己的数据库
实盘部署完成后,工作并没有结束。我一直强调要对自己的策略建立一套持续优化的档案体系。每次模拟、回测、实盘运行的参数、资金曲线、信号记录、交易日志、遇到问题的时间点、解决方案,都要有统一格式的记录。这样做的价值在于,当未来策略表现异常时,你能迅速定位到问题发生的节点,而不是凭记忆去推测。
我自己会用SQLite或者轻量级的文档数据库,把每次运行的关键指标都存起来,配合Grafana做可视化。这个工作看似繁琐,但在策略迭代优化时帮了大忙。没有数据积累,一切都是拍脑袋。
6.2 自动化与人的分工:什么时候该信任系统
我经常被问到一个问题:“实盘部署了以后,你还需要盯盘吗?”我的回答是:系统负责执行、人负责监督。
自动化系统擅长的是快速、准确、无情绪地执行既定规则;但人的价值在于判断规则是否依然适用、系统是否出现异常、市场环境是否发生了本质变化。所以我即使在系统全自动运行时,每天也会花一段时间看看日志、看看持仓、看看系统告警。不盯分时波动,但一定要盯系统运行状态。
人的介入必须是“有规则”的。任意修改参数、手动干预交易,都是自动化系统的大忌。我给自己定了一条铁律:任何手动干预,必须写清原因、结果、后续预防措施,并归档到策略档案里。做不到这一点的干预,都是情绪化操作,不做也罢。
6.3 关于大模型与量化部署的一些新尝试
最近业内讨论比较多的是把大模型用在策略信号生成、舆情分析、自动复盘这些环节上。我自己也尝试过用本地部署的模型做新闻事件对商品期货影响的分析,发现它对长周期逻辑的梳理有参考价值,但还不能直接生成稳定盈利的交易信号。模型幻觉问题依然严重,而且从信号到策略执行的链条太长,任何一个环节的失真都会放大风险。
对个人量化者来说,大模型更适合做辅助工具,比如日志分析、异常检测、复盘总结,而不是把真金白银的交易直接交给它。真正决定策略成败的,仍然是数据质量、执行稳定性、风控纪律和迭代方法论。这些基本功不扎实,用再花哨的模型也救不了整个系统。
7. 实盘上线流程图与部署清单(拿来即用)
实盘部署虽然有诸多细节,但真正落地时核心链路并不复杂。我整理了一份部署清单,适合上线前几天逐项核对:
| 阶段 | 关键检查项 | 完成状态 |
|---|---|---|
| 回测阶段 | 数据完整性校验、未来函数排查、过拟合测试、手续费滑点参数合理 | |
| 模拟阶段 | 至少运行一个完整信号周期,记录实际滑点与成交偏差,核对风控触发逻辑 | |
| 基础设施 | 云服务器配置、Docker环境、时区同步、监控部署、日志记录规范 | |
| 实盘接口 | CTP账号权限、流控配置、断线重连测试、全量查询机制验证 | |
| 风控模块 | 单笔止损、单日亏损限额、最大回撤熔断、仓位上限、极端行情保护 | |
| 上线执行 | 最小手数试运行一周、参数灰度、备份与回滚预案、告警测试 | |
| 持续运维 | 每日日志检查、每周绩效复盘、每月策略档案更新 |
把这张表打印出来,一条条打勾,能覆盖掉绝大多数上线初期的初级问题。真实的实盘上线,表面上是技术工作,本质上是一次严苛的自我纪律检验。
我个人在多次上线后的体会是,部署成功那一刻不是结束,而是一段新旅程的开始。市场永远在变,系统永远有可以优化的地方,心态也需要持续修整。很多人在实盘部署成功后,反而变得更加焦虑,因为回测里的曲线变成了账户上的真金白银,心理压力陡然增大。应对这种压力的唯一办法,就是把一切都“规则化” —— 什么时候入场、什么时候出场、什么时候停手,都由事先定好的规则说了算,而不是盘中的情绪说了算。这套规则,既适用于策略,也适用于你自己。