工程与管理交易系统架构工程教训

两天从 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 正交组合

本质相同:新策略上线 = 小范围验证 → 扩量 → 与其他策略叠加。跳过任何一步都是在赌。


教训

  1. MRD 先于代码,测试先于部署。 65 个测试是 2 小时开发的安全网——没有它们,凌晨 3 点上线就是纯粹赌博。
  2. Shadow mode 是新策略最好的朋友。 零风险验证信号质量,发现 PnL 单位错误这种在实盘会炸的 bug。
  3. 单标的验证完再扩全量。 规模问题(异步队列、metrics API)在小规模时看不出来,但全量会炸。

一句话:两天从 MRD 到上线不是靠卷,是靠 MRD→测试→Shadow→单标的→全量的流程——每一步都有前一步的安全网兜底。