第28章:实盘部署:从回测到实盘的曲面优化系统架构

回测跑得再漂亮,实盘一上就崩——这种事我见过太多次了。

我自己就踩过这个坑。有一回,回测年化收益做到35%,夏普2.1,心里美滋滋。结果实盘第一天,系统直接连交易所都连不上。为什么?回测时用的本地CSV数据,实盘要接行情网关,延迟、断连、数据乱序,全来了。

所以这一章,咱们就聊聊:怎么把回测里的曲面优化系统,稳稳当当地搬到实盘上

回测与实盘的核心差异

说白了,回测是理想环境,实盘是修罗场。差异在哪?我列几个关键点:

维度 回测 实盘
数据来源 本地文件/数据库 行情网关、WebSocket
延迟 忽略不计 毫秒级甚至秒级
订单执行 假设立即成交 滑点、部分成交、拒单
系统稳定性 单机跑一次 7×24小时不间断
资金管理 虚拟资金 真实保证金、风控

嗯,这里要注意:回测里最完美的曲面参数,实盘里可能根本跑不动。因为实盘有交易成本、有冲击成本、有对手盘。

实盘系统架构总览

我个人习惯把实盘系统拆成四个模块。你想想看,每个模块各司其职,出了问题也好定位。

核心架构:四层分离

  • 数据层:行情接收、数据清洗、实时存储
  • 计算层:曲面拟合、波动率计算、信号生成
  • 决策层:组合优化、仓位管理、风控检查
  • 执行层:订单管理、交易所对接、日志记录

下面这张图,是我在项目中实际用过的架构。你可以直接拿去参考。

数据层 行情网关 数据清洗 实时存储 计算层 曲面拟合 波动率计算 信号生成 决策层 组合优化 仓位管理 风控检查 执行层 订单管理 交易所对接 日志记录

数据层:实盘的第一道坎

实盘数据跟回测数据完全是两码事。回测数据是干净的、整齐的。实盘数据呢?乱序、缺失、重复、延迟,什么妖蛾子都有。

我曾经在实盘第一天就遇到行情断流。交易所那边网络抖动,我这边曲面直接算不出来。后来怎么解决的?加了一层本地缓存。行情断了,用上一笔数据顶一下,至少系统不崩。

小技巧:实盘数据一定要做「三副本」——内存缓存、本地文件、数据库。任何一个挂了,另外两个还能顶上。

计算层:曲面拟合的实时化改造

回测里,曲面拟合可以慢慢算。实盘不行,你得在几百微秒内搞定。

我建议的做法是:把曲面拟合拆成离线训练和在线推理两步

  • 离线训练:每天收盘后,用当天全部数据重新训练曲面模型参数
  • 在线推理:盘中实时行情进来,直接用训练好的模型快速计算波动率

这样做的好处很明显——计算量降了一个数量级。我实测过,在线推理一次只需要不到50微秒。

决策层:风控是第一优先级

回测里你可以随便调参数,实盘不行。实盘里,风控必须写在最前面

我自己的系统里,风控检查分三层:

  1. 事前检查:下单前检查保证金、持仓限额、最大下单量
  2. 事中监控:持仓过程中监控波动率异常、曲面形态突变
  3. 事后复盘:每天收盘后检查交易记录、盈亏归因

警告:千万不要把风控写在决策之后。我曾经见过一个系统,先算组合优化,再检查风控。结果优化结果超了保证金,系统直接报错,单子下不出去。正确的做法是:风控参数作为优化约束条件,一起算。

执行层:订单管理的那些坑

实盘执行,说白了就是跟交易所打交道。这里坑最多。

我遇到过最离谱的事:回测里假设市价单秒成交,实盘里市价单直接吃了个大滑点。后来我改成限价单+追单策略——先挂限价,超时没成交就撤单重挂。

代码示例(伪代码):

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%,清净多了。

从回测到实盘的迁移步骤

最后,我总结一下迁移的步骤。你照着做,基本不会出大问题。

  1. 第一步:数据对接——先搞定行情源,确保数据能实时流入
  2. 第二步:计算模块移植——把回测里的曲面拟合代码,改成离线+在线模式
  3. 第三步:风控模块嵌入——把风控逻辑写进决策层,作为硬约束
  4. 第四步:执行模块对接——连接交易所API,做好订单管理
  5. 第五步:模拟盘测试——先用模拟资金跑一周,观察系统表现
  6. 第六步:小资金实盘——用最小单位开始,逐步加仓

核心原则:实盘部署不是一锤子买卖。它是一个持续迭代的过程。每次实盘遇到的问题,都要反馈回回测系统,优化模型和参数。这样循环几次,系统才会越来越稳。

好了,这一章的内容就这些。实盘部署没有想象中那么难,但细节确实多。你只要把数据、计算、决策、执行这四个层拆清楚,每个层的坑提前踩一遍,基本就能稳住了。

公众号:蓝海资料掘金营,微信deep3321