隐马尔可夫模型(状态过滤器)
隐马尔可夫模型(hidden Markov model,HMM)是一种统计模型:它假设市场在少数几个观察不到的状态之间移动,例如空头、震荡和多头,而每个状态都以自己的分布产生观测值(比如 K 线收益率)。把它拟合到一段 K 线窗口上,就能为每根 K 线给出最可能的状态以及一个概率。
Senzoukria · 术语表 · 更新于 2026 年 9 月
模型假设了什么
两样东西定义了一个 HMM。转移矩阵给出下一根 K 线上停留在当前状态或转到另一个状态的概率;发射分布则给出每个状态下观测值是如何散布的。在高斯版本里,每个状态都有自己的收益率均值和方差。状态和转移都不能被直接观测,它们是从 K 线序列中推断出来的。
拟合模型,就是找出让观测序列最有可能出现的那组转移矩阵和发射参数。解码则是:给定一个已拟合的模型,为每根 K 线计算各个状态的概率。概率最高的那个状态被上报为当前状态,而那个概率就是模型的置信度。
它可以观测两样东西
- 收益率:K 线的对数收益率。这是经典的量化状态模型,得到的状态描述的是价格行为:下行趋势、震荡、上行趋势。
- Delta:K 线的订单流失衡,即 delta 除以成交量,其中 delta 等于主动买量减主动卖量。此时隐藏状态描述的是攻击性,而不是价格。两根 K 线可以打出相同的收益率却有相反的流向,这个观测源能把它们区分开。
- 状态按均值排序,所以无论用哪种观测源,状态 0 永远最偏空,最后一个状态永远最偏多。
把它当过滤器来读
状态过滤器不产生入场点。它回答的是:策略当初为之设计的条件此刻是否具备。举例来说,一条均值回归规则可以被限制在震荡状态里,在方向性很强的状态里关掉。由「继续停留在该状态的概率」推出的预期剩余持续时间,是模型假设之下的一个估计,而不是对下一根 K 线的预测。
- 在状态切换附近置信度偏低是正常的。模型恰恰在状态正在转向时最不确定。
- 拟合结果取决于窗口。500 根 K 线的拟合和 2000 根的拟合,可能给同一根 K 线贴上不同标签。
- 每一跳都重新拟合会让标签乱跳;稳妥的实现是在 K 线收盘时重新拟合,并用冻结的模型去解码当前这根实时 K 线。
在 Senzoukria 里
这个叠加层在足迹图指标里名为 HMM Regime (quant),描述为在 K 线上拟合出的空头 / 震荡 / 多头状态,并附带模型的置信度。它的设置项包括 States(2 到 4)、Observes(收益率或 delta)、以 K 线根数计的 Fit window,以及色带和可选列着色的外观选项。脚本编辑器另外附带一个 Python 模板 Mean reversion under regime (HMM + Hurst):它先用 HMM 排除危机状态,再做 z 分数入场和赫斯特确认;该模板只有 Python 版本且需要 numpy,和其他模板一样,除非手动给自动驾驶布防,否则它只在模拟账户或回放里运行。
常见错误
- 把状态标签当成预测来读,而它其实是对已经看到的那些 K 线的最可能描述。
- 在很短的窗口上选四个状态,然后把多出来的状态当成洞见,实际上它们多半只是在拟合噪声。
- 不断调整拟合窗口,直到标签和你早已中意的那张图吻合,再把这个结果视为已验证。
- 忽略 delta 观测源需要成交的买卖方向量;在没有方向分类的数据源上,模型根本没有有意义的东西可观测。
相关内容
其他语言版本
常见问题
- HMM 状态和均线趋势过滤器有什么不同?
- 均线过滤器是对价格套用一条固定规则,它没有「不确定性」这个概念。HMM 则从收益率或流向的分布中推断状态,通过转移概率容纳状态的持续性,并报告自己有多确信。它更灵活,同时也对窗口长度和你要求它找出的状态个数更敏感。
- 那个置信度数字是什么意思?
- 它是在给定已拟合模型和观测值的条件下,该根 K 线所报状态的后验概率。接近 1 说明模型认为其他状态对这根 K 线都不合理;接近「1 除以状态个数」则说明它根本分不清。它陈述的是关于模型的事情,而不是某笔交易会成功的概率。
- 状态过滤器能自己下单或拦单吗?
- 不能。它是一个叠加层,也是脚本策略的一个组件。任何委托仍然要经过一条策略,在模拟账户、回放,或者可选的自动驾驶中执行;而自动驾驶必须在兼容账户上显式布防,并带有它自己的限额。