halo 的技术博客

返回

问题:行情『变脸』只有事后才看得清#

打开任何一张长周期 K 线图,regime 切换点一目了然:2018 年初的牛转熊、2019 年初的 V 形反转、2024 年 9 月底的暴力拉升。事后诸葛人人都会当。

难的是事中。身处其中时,你面对的问题是:

  • 今天跌 2%,是牛市正常回调,还是趋势反转的第一天?
  • 连跌三天了,均值回复策略该继续加仓摊低成本,还是该认输止损?
  • 我的动量模型是在旧 regime 上训练的,新 regime 到了吗,该重训了吗?

这三个问题本质是同一个:收益序列的漂移(均值)是否发生了统计上显著的变化。单看某一天的涨跌回答不了——日收益的信噪比太低,一天 -2% 在 σ=1.5% 的市场里连 1.5 个标准差都不到。你需要一个能积累证据的机制。

这正是 CUSUM(Cumulative Sum,Page 1954)被发明出来的目的。它最初用于工业质量控制——监控生产线什么时候开始批量出次品——七十年后被 López de Prado 在《Advances in Financial Machine Learning》里重新包装成金融 ML 的事件采样器。

机制:让噪声互相抵消,让漂移线性积累#

对称 CUSUM 滤波器维护两个累积量。设 (x_t) 是去均值后的收益(减掉长期均值或期望值):

St+=max(0,  St1++xt),St=min(0,  St1+xt)S^+_t = \max(0,\; S^+_{t-1} + x_t), \qquad S^-_t = \min(0,\; S^-_{t-1} + x_t)

规则只有两条:

  1. (S^+_t > h):报警「上行突变」,(S^+) 归零重新积累;
  2. (S^-_t < -h):报警「下行突变」,(S^-) 归零。

这个设计的巧妙之处全在 max(0, ·) 这一步:

  • 无漂移时:正负收益交替出现,(S^+) 涨一点又被负收益拉回,频繁触底归零,像一个不断被重置的随机游走——很难爬到阈值 (h);
  • 出现正漂移 (\mu > 0) 时:每天期望多贡献 (\mu),(S^+) 获得线性增长趋势,以 (O(h/\mu)) 的时间确定性触阈。

一句话:噪声是零和的,漂移是单向的;累加让前者抵消、让后者放大。这和上一篇失衡棒追踪签名流 θ 是同一个数学直觉(随机游走 (O(\sqrt{T})) vs 带漂移 (O(T)) 的触阈速度差),只是 CUSUM 加了『触底归零』让它专注于最近的漂移而不被遥远的历史稀释。

核心实现十几行:

注意触阈后归零重启——这让 CUSUM 天然输出的是事件流而不是单次判决,一段持续的强趋势会触发一连串同向事件,事件密度本身就携带信息。

实验:三段 regime 的合成行情#

构造 1000 个交易日的合成价格,漂移和波动率分三段切换:

交易日日漂移日波动语义
10–399+0.02%1.0%慢牛
2400–699-0.15%1.8%急熊
3700–999+0.10%1.2%修复牛

真实突变点在第 400 和 700 天。阈值取 (h = 5\sigma)(σ 用全局波动率 1.2% 近似)。

CUSUM 机制:价格、突变点与触发事件

上图是价格与事件标记,下图是 (S^+)(红)和 (S^-)(绿)的实时轨迹。几个值得盯着看的细节:

  • 慢牛段(前 400 天):漂移弱,(S^+) 偶尔爬升触阈,产生稀疏的上行事件——CUSUM 没有失明,只是按证据强度节流;
  • 第 400 天牛转熊:(S^-) 几乎立刻开始单调下坠,9 个交易日后触发第一个下行事件。此后熊市段下行事件密集成串——事件流的方向和密度清楚地告诉你 regime 变了;
  • 第 700 天熊转牛:延迟 23 天才检出。为什么比第一次慢?因为熊市段波动率高(1.8%),修复段的正漂移(+0.10%)要在更吵的背景里积累证据,信噪比更低。检测延迟反比于漂移强度、正比于波动率——这是 CUSUM 的基本物理。

阈值 h:灵敏度与误报的完整权衡#

h 是 CUSUM 唯一的超参数,它同时控制两个互相打架的量:

阈值扫描:事件数与检测延迟

  • 事件数(蓝柱):h 从 1σ 到 12σ,事件数从 438 断崖式跌到 17。h=1σ 时几乎天天报警,事件毫无信息量;h=12σ 时一年触发不了几次;
  • 检测延迟(红线):h=3σ 时第一个突变 2 天检出,h=8σ 以上稳定在 10~11 天。延迟随 h 增长得远比事件数下降得慢——这是 CUSUM 对使用者友好的一面:把 h 从 3σ 提到 8σ,误报大幅减少,真实突变的检出只多等一周。

误报率值得单独量化。在纯随机游走(无任何突变)上跑 300 次蒙特卡洛:

随机游走上的误报次数

1000 天的无突变序列,h=3σ 平均触发 114.9 次,h=5σ 触发 52.3 次,h=8σ 仍有 23.2 次。这张图是全文最重要的一盆冷水:CUSUM 事件 ≠ 真实结构突变。随机游走靠运气也能积累出局部漂移,CUSUM 忠实地报告『这段漂移在统计上不小』,但它不知道也不关心漂移背后有没有经济原因。它是漂移显著性探测器,不是因果检测器。

实务上的含义:不要把单个 CUSUM 事件当交易信号,把它当采样时刻审查触发器——这正是 AFML 的用法。

AFML 用法:CUSUM 作为 ML 事件采样器#

López de Prado 给 CUSUM 的现代定位不是『突变检测器』而是事件驱动采样器:训练 ML 模型时,不要在每个 bar 上都打标签(相邻样本高度重叠、大部分时段什么都没发生),而是只在 CUSUM 触发处采样——那里刚刚积累了一段显著的单向行情,是『市场正在发生什么』的时刻。

用本文的合成序列做对照实验:CUSUM 事件采样 vs 等间隔采样(样本数对齐),比较采样点之后 20 日的已实现波动:

CUSUM 采样 vs 固定间隔采样

CUSUM 采样点的前瞻已实现波动均值 0.0682,固定间隔采样 0.0571——高 19.5%。机制不神秘:CUSUM 触发处大概率位于漂移段内部,而漂移与波动 regime 相关(本实验的熊市段既有强漂移也有高波动),采样自然偏向『有戏』的时段。对三重障碍标注(止盈/止损/超时)来说,样本更快触碰障碍、标签更少是噪声,下游模型学到的东西更干净。

配合三重障碍的完整流水线是:

# 1. CUSUM 采样事件时刻
events = sym_cusum(returns - returns.mean(), h=5 * vol)
t_events = [i for i, side in events]

# 2. 每个事件时刻用三重障碍打标签
#    (止盈 = +2σ、止损 = -2σ、超时 = 20 日)
# 3. 特征只用事件时刻之前的信息,喂给分类器
python

三盆冷水#

第一盆:随机游走也报警,且不少。 上文已量化:h=5σ 时 1000 天误报 52 次。CUSUM 回答的是『最近的累积漂移是否超过 h』,不回答『市场是否真的换了 regime』。想要后者,需要更重的统计工具(SADF、Bai-Perron、Markov 切换模型),CUSUM 是它们的轻量前哨,不是替代品。

第二盆:h 必须以波动率计价并动态更新。 本文用全局 σ 是合成实验的偷懒。真实市场波动率本身就在切换——2015 年的 5σ 和 2017 年的 5σ 差好几倍。固定绝对阈值的 CUSUM 在高波动期天天报警、低波动期集体失声。实务标准做法是 h = k × EWMA 波动率,且 k 的选择要用类似上文的误报-延迟扫描在自己的标的上校准。副作用是引入了第二个参数(EWMA 半衰期),没有免费午餐。

第三盆:检测延迟意味着报警时行情已经走掉一段。 h=5σ 的 9 天延迟,在日漂移 -0.15% 的熊市里意味着报警时价格已跌 ~4%(还不算波动贡献)。CUSUM 事件天然滞后于突变点——它需要时间积累证据,这是所有序贯检测的宿命(快速检测理论里的 detection delay 下界)。所以它适合的下游是『重训模型』『切换风控档位』『触发人工审查』这类对几天延迟不敏感的动作,直接当反转交易信号则是在为延迟买单。

在工具链中的位置#

CUSUM 与本专栏此前几篇的关系值得摆清楚:

  • 失衡棒在 tick/bar 级用签名流累积检测知情交易,CUSUM 在日线级用收益累积检测漂移突变——同一个『累积和触阈』骨架,不同的监控对象;
  • 趋势扫描标注回答『这段行情是不是趋势』(回望式打标签),CUSUM 回答『趋势是不是刚刚变了』(在线式报警),前者供训练、后者供监控;
  • 对严肃的结构突变检验(带 p 值的那种),CUSUM 之后接 SADF 或 Bai-Perron 做确认。

一句话总结:CUSUM 是量化工具箱里的烟雾报警器——便宜、灵敏、偶尔误报,你不会因为它响了就断定房子着火,但你一定会起身去看一眼。

参考文献#

  • Page, E. S. (1954). Continuous Inspection Schemes. Biometrika, 41(1/2), 100–115.
  • López de Prado, M. (2018). Advances in Financial Machine Learning. Wiley. Chapter 2 (The CUSUM Filter).
  • Lam, K., & Yam, H. C. (1997). CUSUM Techniques for Technical Trading in Financial Markets. Financial Engineering and the Japanese Markets, 4, 257–274.
CUSUM 结构突变检测:用累积和滤波器抓住行情的『变脸』时刻
https://blog.halo26812.eu.org/blog/cusum-structural-breaks
Author halo
Published at 2026年7月30日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨