Skip to content

你的回测曲线漂亮但实盘崩?多半是这里出了问题

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

文中示例仅用于技术讨论,不构成任何操作建议。
量化策略开发应以学习和技术交流为目的。
本号不荐股、不卖课、不承诺收益。
市场有风险,请合法合规投资。

本文约 2800 字 | 预计阅读 5 分钟

· · ·

做金融 ML 模型,很多人卡在”特征工程”这一关。指标堆了一堆,模型跑得也很复杂,回测曲线看着漂亮,一上实盘就崩。

原因往往是同一个:喂给模型的特征噪声太大,模型学到的不是市场结构,是随机扰动。

今天就聊这个问题的解法:在隐马尔可夫模型(HMM)做市场状态识别之前,先用一层卡尔曼滤波做噪声控制。思路不复杂,但效果扎实,值得做量化 ML 的朋友细看。

一、HMM 为什么怕噪声

先说 HMM(Hidden Markov Model,隐马尔可夫模型)在这个场景里干什么用。

它不是直接给出下一根 K 线的方向,是回答一个更工程化的问题:

当前市场看起来处在什么状态?

比如:低波动均值回归、状态过渡期、高波动趋势。三种 regime(市场状态)。HMM 通过观察到的市场数据,反推背后隐藏的状态序列。

我们给 HMM 喂的特征很克制,就四个:

特征含义
一日对数收益率(log return)当天的方向性变动
已实现波动率(realized vol)近期波动的绝对水平
动量(momentum)方向性压力的强度
成交量比率(volume ratio)成交相对均量的偏离

就这四个,没有 RSI、MACD、布林带、多个均线、各种 lag 变体。

原因是:这些指标大部分都从同一根收盘价曲线派生出来,叠多了就是冗余噪声。HMM 会基于冗余特征切出一些虚假的 state 边界,导致 regime 频繁切换。

设计原则一:克制。特征空间要小,相关性高的别都塞进去。

设计原则二:噪声控制。把那些不该对每日波动敏感的信号先平滑掉。

二、为什么用卡尔曼滤波做这一层

卡尔曼滤波的适用场景:

你相信存在一个潜在的、不可直接观测的状态变量,而你看到的所有测量值都是这个状态加上噪声的产物。

这个假设套在金融特征上,刚好合适。

已实现波动率不会真的从某个稳定水平一天跳到一个完全不相关的水平。动量通常在几天内演化,不太会瞬移。成交量压力可能变化快,但一个孤立的放量尖峰也不该被模型识别为 regime 切换。

加一层卡尔曼滤波之后,整个数据流变成两件事:

  • 观测值(observed feature value): 你从市场数据直接算出来的
  • 平滑后的潜变量(smoother latent signal): 喂给 HMM 的”干净”信号

这样 HMM 拿到的就是更稳定的输入,模型复杂度不用加,效果往往比堆特征还稳。

图1:原始信号 vs 卡尔曼平滑后的潜变量

三、不同特征,速度应该不同

这是最容易踩坑的地方:很多教程告诉你”对特征做平滑”就完了,但平滑动得太狠,反而把真信号也抹掉了。

关键在于:每个特征应该被允许以多快的速度变化,应该分开设置。

特征应该的速度原因
对数收益率方向性压力变化快,过度平滑会让模型反应迟钝
已实现波动率波动水平演化有惯性,过度敏感会误判 regime
动量动量通常在数日内形成,一天波动不算动量变化
成交量比率中等(谨慎)突发的放量尖峰有信息量,但孤立的尖峰不应重定义整个市场状态

所以一个全局平滑参数基本都太粗暴。更稳的设计是按特征分组:

  • 类收益率信号:响应快
  • 类波动/动量信号:响应慢
  • 成交量信号:单独处理,留意尖峰

目标不是把风险藏起来,是阻止噪声测量去主导潜变量估计。

四、生产部署的工程问题:因果性边界

很多团队量化模型做不实盘,问题就出在因果性上。

卡尔曼层不能只在回测里是个”研究技巧”,它必须在实盘 serving 路径里也跑得通,而且必须可复现。

完整的因果路径应该是这样的:

  1. 加载训练好的 scaler 和模型状态;
  2. 接收最新一行市场数据(OHLCV);
  3. 计算只用到 t 时刻及之前数据的因果特征向量;
  4. 用这些特征更新卡尔曼状态(只用 t 时刻及之前的信息);
  5. 把平滑后的特征向量送入单向(forward-only)HMM 推理。

最后一条特别关键:

如果平滑这一步用到了未来观测(比如整个回测窗口一次跑完),HMM 输入的特征就已经泄露了未来数据。这时候哪怕 HMM 本身的推理路径再干净,都救不回来。

把这条原则归纳成一个简洁的表述:

只有 t 时刻及之前的信息,能影响 t 时刻的特征向量。

我们做策略团队的时候特别容易踩这个坑。回测里”全量数据跑一遍卡尔曼”和实盘里”逐根 K 线更新”出来的特征,分布差得不是一点半点。第一次把这个对上了,实盘表现和回测表现才真正开始接近。

图2:实盘因果性 pipeline(只有历史数据可用于推断)

五、这套架构真正改善的是什么

卡尔曼不会让一个交易系统自动赚钱,它改善的是信号链路上的工程纪律:

  • regime 切换更少乱跳
  • HMM 输入更干净
  • 状态概率更稳定
  • 回测和实盘推理结果更容易对齐
  • 原始数据、特征状态、模型状态、信号逻辑之间有清晰的边界

最后一条对生产 ML 来说最重要。

当模型输出看着不对,你希望能分层检查:

原始 OHLCV 行有效吗?因果特征算对了吗?卡尔曼状态更新符合预期吗?HMM 概率加起来等于 1 吗?信号逻辑用对了 regime 和阈值吗?

如果这些层混在一个 notebook cell 里,调试就变成猜谜游戏。

图3:模型异常时的分层排查路径

六、金融 ML 的特征工程

特征工程不是”加更多指标”。

对金融 ML 来说,特征工程是决定三件事:

1) 模型应该被允许看到什么信息?

2) 这些信息应该有多大的噪声?

3) 实盘能不能复现同样的计算,不引入未来数据泄露?

这三点是真正决定模型能不能落地的分水岭。指标库是死的,工程纪律是活的。

这也是为什么我喜欢在 HMM 之前放一层卡尔曼平滑:它不大、不花哨、容易讲清楚,但会逼着你回答对的问题:

  • 哪些市场特征应该变化快?
  • 哪些应该变化慢?
  • 什么是噪声?
  • 什么是结构?
  • 回测和实盘能不能算出同样的状态?

这些问题比再加一根指标线重要得多。

七、观点总结

做金融 ML 这几年,我自己最深的体会就是:最后决定模型能不能实盘跑起来的,不是花式算法,是工程纪律。

数据清洗、特征因果性、状态可复现、分层可调试。这些”无聊”的事,比调超参数重要十倍。

如果你做股票、期货、加密的 ML 策略,遇到”回测漂亮实盘崩”的问题,建议回头看看自己的特征层是不是有这两类毛病:

  • 特征太多、太相关,模型学到的是冗余噪声
  • 特征里偷偷引入了未来数据,HMM/transformer 跑得再干净都救不回来

补一层卡尔曼,再加一组”按特征设平滑速度”的工程纪律,能解决一大半。

你对金融 ML 特征工程有什么心得?评论区聊聊。


#卡尔曼滤波 #HMM #隐马尔可夫 #金融ML #量化策略 #特征工程 #状态识别 #噪声控制 #机器学习 #时间序列

Published inAI&Invest专栏

Be First to Comment

    发表回复