跳到正文

马尔可夫切换模型:Hamilton 的状态模型

牛市和熊市不共享同一套参数,但状态本身看不见。讲 Hamilton (1989) 的状态切换模型、滤波与平滑概率的推导、EM 估计,以及为什么实时可用的信号总比历史图上显示的来得晚。

第 3 篇 · 共 12 篇 约 12 分钟

只要你注意到经济关系在衰退和扩张里表现不同、波动率会分档、相关性会在危机里换一副面孔,你就已经撞上了马尔可夫切换模型要处理的问题:一套参数描述不了两种世界。模型的想法本身很简单——参数随一个未观测的状态变化,状态走马尔可夫链。麻烦全在”未观测”三个字上:状态看不见,整个方法论的核心就是从数据里把它的概率推出来。这个推断有两个版本——只用截至今天的数据(滤波),和用上全部样本(平滑)——两者的区别会贯穿这篇文章:估计靠它、交易信号的真实滞后靠它、事后诸葛亮和实时可用之间的鸿沟也是它。

这篇文章推导 Hamilton (1989) 的马尔可夫切换模型,讲滤波与平滑递推、EM 估计和状态概率的使用。参考 Hamilton (1994, 第 22 章)、Krolzig (1997)、Tsay (2010, 第 5 章)。

基本设置

两状态马尔可夫切换 AR(pp) 模型:

yt=cSt+ϕ1,Styt−1+ϕ2,Styt−2+⋯+ϕp,Styt−p+σStεty_t = c_{S_t} + \phi_{1, S_t} y_{t-1} + \phi_{2, S_t} y_{t-2} + \cdots + \phi_{p, S_t} y_{t-p} + \sigma_{S_t} \varepsilon_t

其中 St∈{1,2}S_t \in \{1, 2\} 是未观测状态,εt∼iid(0,1)\varepsilon_t \sim \text{iid}(0, 1)。截距、AR 系数、波动率都可以随状态换——实际建模时你可以只让其中一部分切换,比如只切均值或只切方差。

状态按马尔可夫链演化,转移矩阵为

P=(p11p12p21p22)\mathbf{P} = \begin{pmatrix} p_{11} & p_{12} \\ p_{21} & p_{22} \end{pmatrix}

其中 pij=P(St=j∣St−1=i)p_{ij} = P(S_t = j \mid S_{t-1} = i)。金融数据上典型的读法是:状态 1 低波动、“正常”,状态 2 高波动、“危机”。估出来的 p11p_{11}、p22p_{22} 通常都接近 1——状态是持续的,进了一个状态平均要待 1/(1−pii)1/(1 - p_{ii}) 期才出来。这个持续性正是模型区别于”每天独立掷硬币选分布”的混合模型的地方,也是它能产生可用预测的地方。

动手之前先处理一个不起眼但会咬人的问题:不加约束,这个模型不可识别。把标签 1 和 2 整体互换,似然一模一样,优化器没有理由停在哪一个上,甚至可以在迭代中途换标签。解决办法是定一个约定打破对称,比如规定状态 1 方差更小(σ1<σ2\sigma_1 < \sigma_2)或均值更低;多数软件实现用的是数值技巧——每步按某个准则给状态排序。这不是理论洁癖,是不处理就会让 EM 输出无法解读的实际坑。

Hamilton 的 1989 模型

Hamilton 的原始应用是美国季度实际 GNP 增长率。他的设定比上面的一般形式更克制:两个状态,只有均值切换,AR 系数和方差不随状态变。用去均值形式写,y~t=yt−μSt\tilde{y}_t = y_t - \mu_{S_t},然后

y~t=∑j=14ϕjy~t−j+σεt\tilde{y}_t = \sum_{j=1}^4 \phi_j \tilde{y}_{t-j} + \sigma \varepsilon_t

状态 1 是扩张(μ1>0\mu_1 > 0),状态 2 是衰退(μ2<0\mu_2 < 0)。注意均值通过 y~t−j=yt−j−μSt−j\tilde{y}_{t-j} = y_{t-j} - \mu_{S_{t-j}} 出现在滞后项里,所以似然依赖当期和过去共 5 期的状态组合——滤波时要跟踪的复合状态有 25=322^5 = 32 个。这是这个模型计算上比表面看起来重的原因。

结果是这篇论文出名的原因:完全不看 NBER 的任何信息,纯从 GNP 数据估出来的衰退状态概率,和 NBER 事后划定的衰退区间高度吻合。两个状态都很持续(piip_{ii} 接近 1),衰退状态的均值增长显著为负。这件事的方法论含义比数字本身大——它表明商业周期更像离散的状态切换,而不是线性模型里对称的涨落;“衰退”从一个委员会的事后判断,变成了一个可以实时估计概率的统计对象。

滤波:把状态概率算出来

状态看不见,能算的是它的条件概率。向前一遍的递推叫 Hamilton 滤波。记预测概率 ξt∣t−1(j)=P(St=j∣yt−1,…,y1)\xi_{t|t-1}(j) = P(S_t = j \mid y_{t-1}, \ldots, y_1),滤波概率 ξt∣t(j)=P(St=j∣yt,…,y1)\xi_{t|t}(j) = P(S_t = j \mid y_t, \ldots, y_1)——差别只在有没有看到当期观测。

递推每一步做两件事。先用马尔可夫转移把上期的滤波概率推到本期:

ξt∣t−1(j)=∑i=1Mpij ξt−1∣t−1(i)\xi_{t|t-1}(j) = \sum_{i=1}^M p_{ij} \, \xi_{t-1|t-1}(i)

再用当期观测更新。状态 jj 下的观测密度是

f(yt∣St=j,yt−1,…,y1)=ϕ(yt;μj,t,σj2)f(y_t \mid S_t = j, y_{t-1}, \ldots, y_1) = \phi(y_t; \mu_{j,t}, \sigma_j^2)

其中 μj,t\mu_{j,t} 是用状态 jj 的参数从 AR(pp) 算出的条件均值,ϕ(⋅;μ,σ2)\phi(\cdot; \mu, \sigma^2) 是正态密度。于是

ξt∣t(j)=f(yt∣St=j) ξt∣t−1(j)∑i=1Mf(yt∣St=i) ξt∣t−1(i)\xi_{t|t}(j) = \frac{f(y_t \mid S_t = j) \, \xi_{t|t-1}(j)}{\sum_{i=1}^M f(y_t \mid S_t = i) \, \xi_{t|t-1}(i)}

这就是一次标准的贝叶斯更新:先验 ξt∣t−1(j)\xi_{t|t-1}(j) 乘似然、归一化。整个滤波就是”转移、更新”交替着从 t=1t=1 跑到 TT。

似然函数是滤波的免费副产品。每期的积分密度——把状态积掉之后 yty_t 的预测密度——正是滤波更新式的分母:

f(yt∣yt−1,…,y1)=∑j=1Mf(yt∣St=j) ξt∣t−1(j)f(y_t \mid y_{t-1}, \ldots, y_1) = \sum_{j=1}^M f(y_t \mid S_t = j) \, \xi_{t|t-1}(j)

样本似然就是它们的乘积:

L=∏t=1Tf(yt∣yt−1,…,y1)L = \prod_{t=1}^T f(y_t \mid y_{t-1}, \ldots, y_1)

取对数求和:

ℓ=∑t=1Tlog⁡f(yt∣yt−1,…,y1)\ell = \sum_{t=1}^T \log f(y_t \mid y_{t-1}, \ldots, y_1)

跑一遍滤波,状态概率和似然同时到手。

平滑:用全样本回头看

滤波概率只用到截至 tt 的数据。事后分析时你有整个样本,问的应该是 ξt∣T(j)=P(St=j∣yT,…,y1)\xi_{t|T}(j) = P(S_t = j \mid y_T, \ldots, y_1)——平滑概率。Kim 平滑器(Kim, 1994)在滤波之后从 TT 向 11 倒着跑一遍:

ξt∣T(i)=ξt∣t(i)∑j=1Mpij ξt+1∣T(j)ξt+1∣t(j)\xi_{t|T}(i) = \xi_{t|t}(i) \sum_{j=1}^M \frac{p_{ij} \, \xi_{t+1|T}(j)}{\xi_{t+1|t}(j)}

直觉:未来的观测对”当时处在哪个状态”也有话说——如果 t+1t+1 之后市场崩了,那 tt 期已经身处危机状态的概率就该被上调。平滑概率画出来比滤波概率干净得多、状态区间的边缘更利落,正因为它偷看了未来。这个”偷看”后面算账时会回来。

EM 估计

参数怎么估?直接对 ℓ\ell 做数值优化可行但难受:曲面多峰,状态一多尤其严重。EM 算法(Dempster, Laird & Rubin, 1977)在这类隐变量模型上更稳健,而且它的两步在这里都有闭式解。

E 步:拿当前参数跑滤波和平滑,得到 ξt∣T(j)\xi_{t|T}(j),以及相邻两期的平滑联合概率 P(St=i,St+1=j∣yT,…,y1)P(S_t = i, S_{t+1} = j \mid y_T, \ldots, y_1)。后者用滤波和平滑的产出直接拼出来:

P(St=i,St+1=j∣yT,…,y1)=ξt∣t(i) pij ξt+1∣T(j)ξt+1∣t(j)P(S_t = i, S_{t+1} = j \mid y_T, \ldots, y_1) = \frac{\xi_{t|t}(i) \, p_{ij} \, \xi_{t+1|T}(j)}{\xi_{t+1|t}(j)}

M 步:把平滑概率当权重,更新参数。状态 jj 的 AR 系数是一个加权最小二乘:

ϕ^j=(∑t=p+1Tξt∣T(j) xt−1xt−1′)−1(∑t=p+1Tξt∣T(j) xt−1yt)\hat{\phi}_j = \left( \sum_{t=p+1}^T \xi_{t|T}(j) \, \mathbf{x}_{t-1} \mathbf{x}_{t-1}' \right)^{-1} \left( \sum_{t=p+1}^T \xi_{t|T}(j) \, \mathbf{x}_{t-1} y_t \right)

其中 xt−1=(1,yt−1,…,yt−p)′\mathbf{x}_{t-1} = (1, y_{t-1}, \ldots, y_{t-p})'。方差是加权残差平方和:

σ^j2=∑t=p+1Tξt∣T(j) (yt−xt−1′ϕ^j)2∑t=p+1Tξt∣T(j)\hat{\sigma}_j^2 = \frac{\sum_{t=p+1}^T \xi_{t|T}(j) \, (y_t - \mathbf{x}_{t-1}' \hat{\phi}_j)^2}{\sum_{t=p+1}^T \xi_{t|T}(j)}

转移概率是”从 ii 转到 jj 的期望次数”除以”处在 ii 的期望次数”:

p^ij=∑t=1T−1P(St=i,St+1=j∣yT,…,y1)∑t=1T−1ξt∣T(i)\hat{p}_{ij} = \frac{\sum_{t=1}^{T-1} P(S_t = i, S_{t+1} = j \mid y_T, \ldots, y_1)}{\sum_{t=1}^{T-1} \xi_{t|T}(i)}

每个公式都是”如果状态可见你会怎么算”的软化版:状态可见时按状态分组回归,状态不可见就按状态概率加权。E 步和 M 步交替到收敛。EM 单调——似然每步不降——但单调不等于到顶,它照样会停在局部极大上。

所以初始化是实打实的工程问题。标准做法是多个随机起点:跑 50-100 组随机初始化,留似然最高的那个。也可以先按简单统计量(均值、方差)做 K 均值聚类来初始化状态参数,或者从 2 状态模型开始逐个加状态、用上一轮的拟合热启动。计算上每次 EM 迭代是 O(TM2p)O(T M^2 p),对 TT 线性、对状态数 MM 平方——M=4M = 4、T=1000T = 1000 转瞬即逝,M=10M = 10、T=106T = 10^6 就要等了。

几个状态才对

理论上 AIC/BIC 都能用(BIC 更节俭),但先算清楚参数增长有多快:全切换的 MM 状态 MS-AR(pp),每个状态有截距、pp 个 AR 系数和方差共 p+2p + 2 个参数,转移矩阵再贡献 M(M−1)M(M-1) 个自由参数,总计 M(p+2)+M(M−1)M(p+2) + M(M-1)。四状态 AR(4) 就是 4×6+12=364 \times 6 + 12 = 36 个参数——不算天文数字,但足够过拟合了。

更该依赖的其实是经济纪律而不是信息准则。金融应用从 M=2M = 2(低波/高波)起步,这是最常见也最稳的设定;只有当额外状态既有清晰的经济解读、数据又强烈支持时才加。当心”虚假状态”——样本内被挑出来、样本外不再出现的状态,它们通常在吸收某一段独特历史(一次石油危机、一次疫情),而不是在刻画会重复的结构。判断办法很朴素:把平滑状态概率画出来,每个状态的高概率时段应该对应认得出来的经济事件;状态间的参数差异应该讲得出经济故事;1/(1−p^ii)1/(1-\hat{p}_{ii}) 算出的平均持续期应该和已知事实同量级——比如衰退状态的持续期应该落在美国战后衰退平均约 10 个月的附近。状态讲不出故事,就退回更简单的设定。

预测

预测未来状态就是把转移矩阵往前迭代:ξT+h∣T(j)=∑iξT+h−1∣T(i) pij\xi_{T+h|T}(j) = \sum_i \xi_{T+h-1|T}(i) \, p_{ij},h→∞h \to \infty 时收敛到马尔可夫链的平稳分布——预测得越远,模型知道的越少,最后只剩无条件的状态占比。yT+hy_{T+h} 的点预测按预测状态概率对各状态的条件均值加权:

y^T+h=E[yT+h∣yT,…,y1]=∑j=1MξT+h∣T(j)⋅μj,T+h\hat{y}_{T+h} = E[y_{T+h} \mid y_T, \ldots, y_1] = \sum_{j=1}^M \xi_{T+h|T}(j) \cdot \mu_{j, T+h}

这个预测自动带着状态不确定性。但也要清楚它的脆弱之处:预测对最近的状态概率高度敏感,而状态变化往往事后一目了然、实时模糊不清——模型正处在换状态的当口时,滤波概率恰恰最摇摆。

代码:statsmodels 里的马尔可夫切换

import pandas as pd
from statsmodels.tsa.regime_switching.markov_regression import MarkovRegression


model = MarkovRegression(y, k_regimes=2, trend='c', switching_ar=False)
result = model.fit()
print(result.summary())

# 平滑状态概率
print(result.smoothed_marginal_probabilities.head())

# 状态特定参数
for i in range(2):
    print(f"Regime {i}: mean={result.params[f'const[{i}]']:.3f}, "
          f"variance={result.params[f'sigma2[{i}]']:.3f}")

# 预测
forecast = result.forecast(steps=12)

statsmodels 对基本的马尔可夫切换模型支持良好;更复杂的形式(因子切换、时变转移概率)多半要自己写。

一个股票例子,以及滤波和平滑的账

拿长样本的月度股指收益拟合一个 2 状态的均值-方差切换模型(MS-AR(0)):

rt=cSt+σStεtr_t = c_{S_t} + \sigma_{S_t} \varepsilon_t

典型的估计形态是:一个状态均值为正、波动率低——牛市;另一个状态均值为负、波动率大约翻倍——熊市;两个状态的持续概率都在 0.9 以上,牛市状态平均待得比熊市久。具体数字随样本期和市场变化,别把任何一组估计当常数背。画出平滑概率,熊市状态的高概率时段会落在历史上认得出的大跌区间(70 年代中、80 年代初、2000-02、2008-09、2020 附近),这是模型在正常工作的样子。

到这里很容易顺手设计一条规则:熊市状态的概率超过某个阈值就减仓,降回去就加回来。可以做,但先把开头埋的那笔账算清楚:你回测里看到的漂亮状态划分是平滑概率,用了未来数据;实时交易只能用滤波概率。滤波概率对状态变化的反应系统性地晚于平滑概率——市场转熊的头几个月,滤波概率往往还在犹豫。所以基于历史平滑概率评估的信号质量,是实盘拿不到的上界;老老实实用滤波概率重跑一遍,信号来得更晚、效果打折是常态。这不是这个模型的缺陷,是所有隐状态模型共同的账,只是马尔可夫切换的图特别容易骗人——平滑概率的状态边缘太干净了。

同样的框架换个变量就是另一个应用:短期利率上两状态对应宽松与紧缩,对固定收益配置有信息;通胀上对应大缓和与高波动通胀期,结构变化下做通胀预测有用;波动率上配合 MS-GARCH(每个状态一套 (ω,α,β)(\omega, \alpha, \beta),Hamilton & Susmel, 1994)用于风险管理——危机状态概率高时提高资本要求。所有这些应用共享同一条纪律:实时决策用滤波概率,事后叙事才用平滑概率。

变种和边界

围绕基本模型有一圈值得知道名字的变种。时变转移概率(Diebold, Lee & Weinbach, 1994)让 pijp_{ij} 依赖可观测变量,状态变化与商业周期指标相关时有用。马尔可夫切换 VAR(Krolzig, 1997)把整套东西搬到多变量系统上,用于多宏观变量的商业周期分析;再配上因子结构就是马尔可夫切换动态因子模型。往更一般处看,马尔可夫切换模型本身就是一个隐马尔可夫模型(HMM)——发射分布恰好是条件高斯的那种;一般的 HMM 允许任意发射分布,比如计数数据用泊松。往更简单处看有两个近亲:门槛 AR(TAR)用过去值的确定性规则定状态(yt−1>0y_{t-1} > 0 算状态 1 之类),好估但硬;平滑转换 AR(STAR)把状态权重做成过去值的光滑函数,算是马尔可夫切换的连续类比。区别的关键在状态是否由可观测量决定:TAR/STAR 的状态看得见,马尔可夫切换的状态永远只能推断。

估计这边还有一条贝叶斯路线(Kim & Nelson, 1999 是标准参考)。MCMC 给出参数和状态概率的完整后验:不确定性自然量化、标签切换可以靠先验约束处理、小样本推断更可靠——代价是算得慢,而且结果对先验设定敏感。实践里 EM 的极大似然是默认,需要认真对待模型不确定性时(比如风险管理)再上贝叶斯。

拟合之后:验证

模型拟合完不是终点。至少做这几件事:留出最后一段样本(比如 20%)做真正的样本外一步预测,和实际值对账;把模型在留出样本上的预测似然和朴素基准(常数均值、普通 AR)比,赢不了基准的状态模型不值得部署;有外部状态分类可对照时(NBER 衰退日期是现成的)算命中率;在滚动窗口上重估,看状态参数稳不稳——大幅漂移提示结构突变,而结构突变正是这类模型自己也躲不开的软肋;最后看标准化残差是否接近 iid,不是就说明设定错了。这套验证里最重要的还是那条老原则:一切样本外评估用滤波概率,别让平滑概率的后见之明混进来。

参考文献

  • Dempster, A. P., Laird, N. M., & Rubin, D. B. (1977). Maximum likelihood from incomplete data via the EM algorithm. Journal of the Royal Statistical Society B, 39(1), 1-38.
  • Diebold, F. X., Lee, J.-H., & Weinbach, G. C. (1994). Regime switching with time-varying transition probabilities. In C. Hargreaves (Ed.), Nonstationary Time Series Analysis and Cointegration. Oxford University Press.
  • Hamilton, J. D. (1989). A new approach to the economic analysis of nonstationary time series and the business cycle. Econometrica, 57(2), 357-384.
  • Hamilton, J. D. (1994). Time Series Analysis. Princeton University Press. Ch. 22.
  • Hamilton, J. D., & Susmel, R. (1994). Autoregressive conditional heteroskedasticity and changes in regime. Journal of Econometrics, 64(1-2), 307-333.
  • Kim, C.-J. (1994). Dynamic linear models with Markov-switching. Journal of Econometrics, 60(1-2), 1-22.
  • Kim, C.-J., & Nelson, C. R. (1999). State-Space Models with Regime Switching: Classical and Gibbs-Sampling Approaches with Applications. MIT Press.
  • Krolzig, H.-M. (1997). Markov-Switching Vector Autoregressions: Modelling, Statistical Inference, and Application to Business Cycle Analysis. Springer.
  • Tsay, R. S. (2010). Analysis of Financial Time Series (3rd ed.). Wiley. Ch. 5.