两天从 MRD 到上线:一个新策略引擎的研发闭环
背景:某量化交易系统需要新增一个网格反转策略(Grid Reversal),利用 orderbook depth 数据在价格剧烈波动时做短线 scalping。从 MRD 定稿到全量上线,两天内完成。
本文不是炫耀速度,是复盘这个流程里做对了什么、做错了什么。
时间线
07-10 02:05 MRD + 详设定稿
07-10 02:47 核心引擎 + 65 个测试
07-10 02:50 Bug fix: watchlist 数据源 + PnL 单位错误
07-10 02:55 Shadow 模式部署上线
07-10 09:07 Bug fix: 数据库字段名不匹配
07-10 15:06 扩展到全量标的(数百个) + 异步队列
07-10 19:18 Bug fix: shadow 模式下 riskGate 绕过失效
07-11 下午 与另一个策略正交组合,形成 VS × L-Combo
关键节点:凌晨 2 点 MRD 定稿,凌晨 3 点代码写完加 65 个测试,凌晨 3 点部署 shadow。 不是卷,是 flow。
做对了什么
1. MRD 先于代码
不是看了行情一拍脑袋就写。MRD 里明确了:
- 触发条件:depth spread baseline 偏离几倍标准差
- 网格密度:每层多少 bp
- 退出条件:反向信号 or 利润目标
- 对标已有策略的数据分析(某个已有策略在类似行情下的表现)
写代码之前先把”做什么”写清楚,跟广告系统的 MRD 一样——你要上线一个 OCPC 出价策略,不是先改模型,是先写清楚”在什么场景下,出价调整的幅度是多少,预期 CTR 提升多少”。
2. 65 个测试先跑通
核心引擎写完,65 个测试全部 green 才进入下一步。
测试覆盖了什么?
- 正常触发 → 下单 → 止盈退出
- 边界条件:depth 数据缺失、spread 为 0、单边行情
- 异常路径:partial fill、order reject、WS 断线重连
- 多标的并发不互相干扰
有一个教训来自之前的并发编辑事故:测试通过 ≠ 代码在 jar 里。 所以这次部署后立刻验证了 shadow 日志是否正常写入。
3. Shadow 模式首发
新策略不直接上实盘,先跑 shadow mode——只记录信号和虚拟 PnL,不下真实订单。等跑几天确认:
- 信号质量符合预期
- 无异常报错
- PnL 曲线合理
再切到真实交易。
这跟广告系统的灰度发布一模一样:新策略先在 1% 流量上跑,看 CTR 没跌再扩量。shadow mode 就是 0% 流量但全量信号——比灰度更安全,因为零风险。
4. 先单标的后全量
第一版只在少数几个标的上跑。确认稳定后,15:06 的 commit 扩展到数百个标的。扩展时加了异步队列和 metrics API——因为标的数量 ×100 后,同步处理会阻塞。
先验证小规模,再考虑规模化。 这是广告系统索引构建的标准操作:先在几个广告主上跑增量索引,确认性能 ok 再全量。
做错了什么
1. 凌晨 2-3 点写核心逻辑
虽然 flow 到了,但这个时间点写核心交易逻辑是有风险的。一个类型错误可能导致白天线上事故。
2. Shadow bypass 修了两次
10:07 修了数据库字段名,19:18 又修了 shadow riskGate bypass 失效。后者是多 Agent 并发编辑的遗毒——同一个文件的改动被另一个 session 覆盖了(这件事单独写了文章复盘)。
3. PnL 单位错误
recordPnl 用的百分比但实际应该是 USD。这个 bug 如果在实盘环境下会导致风险敞口计算错误。好在 shadow 模式下发现的。
元结构映射:广告系统的策略上线流程
| 步骤 | 广告系统 | 本次策略上线 |
|---|---|---|
| 1. 需求 | MRD:在什么场景下调整出价 | MRD:在什么行情下触发网格 |
| 2. 数据验证 | 历史日志回放,验证出价策略 | 历史行情回测 + 对标策略分析 |
| 3. 离线测试 | 单元测试 + 集成测试 | 65 个测试 |
| 4. 灰度 | 1% 流量 | Shadow mode |
| 5. 扩量 | 10% → 50% → 100% | 单标的 → 数百标的 |
| 6. 组合 | 与其它策略叠加(CTR + CVR) | VS × L-Combo 正交组合 |
本质相同:新策略上线 = 小范围验证 → 扩量 → 与其他策略叠加。跳过任何一步都是在赌。
教训
- MRD 先于代码,测试先于部署。 65 个测试是 2 小时开发的安全网——没有它们,凌晨 3 点上线就是纯粹赌博。
- Shadow mode 是新策略最好的朋友。 零风险验证信号质量,发现 PnL 单位错误这种在实盘会炸的 bug。
- 单标的验证完再扩全量。 规模问题(异步队列、metrics API)在小规模时看不出来,但全量会炸。
一句话:两天从 MRD 到上线不是靠卷,是靠 MRD→测试→Shadow→单标的→全量的流程——每一步都有前一步的安全网兜底。