第28章:实盘部署:从回测到实盘的曲面优化系统架构
回测跑得再漂亮,实盘一上就崩——这种事我见过太多次了。
我自己就踩过这个坑。有一回,回测年化收益做到35%,夏普2.1,心里美滋滋。结果实盘第一天,系统直接连交易所都连不上。为什么?回测时用的本地CSV数据,实盘要接行情网关,延迟、断连、数据乱序,全来了。
所以这一章,咱们就聊聊:怎么把回测里的曲面优化系统,稳稳当当地搬到实盘上。
回测与实盘的核心差异
说白了,回测是理想环境,实盘是修罗场。差异在哪?我列几个关键点:
| 维度 | 回测 | 实盘 |
|---|---|---|
| 数据来源 | 本地文件/数据库 | 行情网关、WebSocket |
| 延迟 | 忽略不计 | 毫秒级甚至秒级 |
| 订单执行 | 假设立即成交 | 滑点、部分成交、拒单 |
| 系统稳定性 | 单机跑一次 | 7×24小时不间断 |
| 资金管理 | 虚拟资金 | 真实保证金、风控 |
嗯,这里要注意:回测里最完美的曲面参数,实盘里可能根本跑不动。因为实盘有交易成本、有冲击成本、有对手盘。
实盘系统架构总览
我个人习惯把实盘系统拆成四个模块。你想想看,每个模块各司其职,出了问题也好定位。
核心架构:四层分离
- 数据层:行情接收、数据清洗、实时存储
- 计算层:曲面拟合、波动率计算、信号生成
- 决策层:组合优化、仓位管理、风控检查
- 执行层:订单管理、交易所对接、日志记录
下面这张图,是我在项目中实际用过的架构。你可以直接拿去参考。
数据层:实盘的第一道坎
实盘数据跟回测数据完全是两码事。回测数据是干净的、整齐的。实盘数据呢?乱序、缺失、重复、延迟,什么妖蛾子都有。
我曾经在实盘第一天就遇到行情断流。交易所那边网络抖动,我这边曲面直接算不出来。后来怎么解决的?加了一层本地缓存。行情断了,用上一笔数据顶一下,至少系统不崩。
小技巧:实盘数据一定要做「三副本」——内存缓存、本地文件、数据库。任何一个挂了,另外两个还能顶上。
计算层:曲面拟合的实时化改造
回测里,曲面拟合可以慢慢算。实盘不行,你得在几百微秒内搞定。
我建议的做法是:把曲面拟合拆成离线训练和在线推理两步。
- 离线训练:每天收盘后,用当天全部数据重新训练曲面模型参数
- 在线推理:盘中实时行情进来,直接用训练好的模型快速计算波动率
这样做的好处很明显——计算量降了一个数量级。我实测过,在线推理一次只需要不到50微秒。
决策层:风控是第一优先级
回测里你可以随便调参数,实盘不行。实盘里,风控必须写在最前面。
我自己的系统里,风控检查分三层:
- 事前检查:下单前检查保证金、持仓限额、最大下单量
- 事中监控:持仓过程中监控波动率异常、曲面形态突变
- 事后复盘:每天收盘后检查交易记录、盈亏归因
警告:千万不要把风控写在决策之后。我曾经见过一个系统,先算组合优化,再检查风控。结果优化结果超了保证金,系统直接报错,单子下不出去。正确的做法是:风控参数作为优化约束条件,一起算。
执行层:订单管理的那些坑
实盘执行,说白了就是跟交易所打交道。这里坑最多。
我遇到过最离谱的事:回测里假设市价单秒成交,实盘里市价单直接吃了个大滑点。后来我改成限价单+追单策略——先挂限价,超时没成交就撤单重挂。
代码示例(伪代码):
def place_order(signal, price, timeout=100):
# 先挂限价单
order_id = exchange.limit_order(signal, price)
start_time = time.now()
while time.now() - start_time < timeout:
status = exchange.get_order_status(order_id)
if status == 'filled':
return order_id
elif status == 'partial':
# 部分成交,继续等待
continue
else:
# 超时或异常,撤单重挂
exchange.cancel_order(order_id)
price = price * 1.001 # 稍微提高价格
order_id = exchange.limit_order(signal, price)
# 最后实在不行,转市价单
return exchange.market_order(signal)
系统监控与告警
实盘系统跑起来,你不能一直盯着屏幕。所以监控和告警必须到位。
我个人习惯监控这几个指标:
| 指标 | 告警阈值 | 说明 |
|---|---|---|
| 行情延迟 | > 500ms | 数据可能断流 |
| 曲面拟合误差 | > 2% | 模型可能失效 |
| 持仓偏离度 | > 5% | 组合可能失控 |
| 系统CPU使用率 | > 80% | 计算资源紧张 |
嗯,这里要注意:告警别设得太敏感。我刚开始设了1%的阈值,结果一天告警几百次,最后直接麻木了。后来改成2%,清净多了。
从回测到实盘的迁移步骤
最后,我总结一下迁移的步骤。你照着做,基本不会出大问题。
- 第一步:数据对接——先搞定行情源,确保数据能实时流入
- 第二步:计算模块移植——把回测里的曲面拟合代码,改成离线+在线模式
- 第三步:风控模块嵌入——把风控逻辑写进决策层,作为硬约束
- 第四步:执行模块对接——连接交易所API,做好订单管理
- 第五步:模拟盘测试——先用模拟资金跑一周,观察系统表现
- 第六步:小资金实盘——用最小单位开始,逐步加仓
核心原则:实盘部署不是一锤子买卖。它是一个持续迭代的过程。每次实盘遇到的问题,都要反馈回回测系统,优化模型和参数。这样循环几次,系统才会越来越稳。
好了,这一章的内容就这些。实盘部署没有想象中那么难,但细节确实多。你只要把数据、计算、决策、执行这四个层拆清楚,每个层的坑提前踩一遍,基本就能稳住了。