ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MSVAR模型实战:马尔可夫区制转移与时间序列状态识别建模

MSVAR模型实战:马尔可夫区制转移与时间序列状态识别建模 做时间序列分析这些年我一直绕不开一个问题手里的数据到底是不是“一条道走到黑”的普通VAR模型默认全样本期内系数不变、方差不变但真实的经济系统和金融市场很少这么听话。牛熊切换、景气扩张与收缩、政策基调调整都可能让底层数据生成过程在某个时点突然换了“运行模式”。马尔可夫向量自回归模型MSVAR就是拿来处理这种问题的它把样本划分成若干个不可直接观测的“状态”每个状态下允许有不同的截距、自回归系数甚至协方差矩阵状态之间的切换则由一个马尔可夫转移概率矩阵控制。这篇文章我从实际使用者的角度把MSVAR的建模思路、工具选型、估计流程和踩过的坑完整过一遍适合刚接触区制转移模型的同学也适合想用MSVAR做宏观周期识别、金融资产状态划分的人参考。1. 为什么普通VAR不够用MSVAR到底在做什么1.1 参数恒定的假设在真实数据里经常站不住先看一个最简单的两变量VAR(1)模型$$ y_t c A y_{t-1} \varepsilon_t, \quad \varepsilon_t \sim N(0, \Sigma) $$这个模型假设截距向量c、自回归系数矩阵A、协方差矩阵Σ在整个样本期内都保持不变。实际做数据时你会发现整个样本期用一个VAR去拟合残差经常出现明显的异方差滚动估计的系数也忽高忽低。比如股市收益率数据牛市的均值可能为正、波动率偏低熊市的均值为负、波动率飙升这种差异不是靠增加滞后阶数就能吸收的因为它是“状态依赖”的。传统做法是用邹检验或Bai-Perron方法专门检测结构突变点但这些方法一般假设突变点是确定性的、次数有限的而经济和金融状态的切换更像是随机的这期在扩张下期可能衰退概率性地来回切换。马尔可夫区制转移模型正好把这种“随机切换”的结构写进了模型里。1.2 核心方程状态变量、转移矩阵与模型变体MSVAR的基本设定可以写成$$ y_t \mu(s_t) \sum_{i1}^{p} A_i(s_t) y_{t-i} \varepsilon_t, \quad \varepsilon_t \sim N(0, \Sigma(s_t)) $$其中状态变量s_t是一个不可直接观测的离散变量取值1到K并且服从一阶马尔可夫链。从状态i到状态j的转移概率记为$$ p_{ij} P(s_t j \mid s_{t-1} i) $$把这些概率收集起来得到K×K的转移概率矩阵P矩阵每行和为1。状态变量不可观测意味着我们不能直接说“第3期到第8期是状态1”只能通过观测到的y_t序列反推每个时期处于每个状态的概率这就是后面要讲的滤波概率和平滑概率。模型的变体命名也很容易把人绕晕。字母I代表截距项随状态切换A代表自回归系数随状态切换H代表方差协方差随状态切换所以常见的有MSI、MSM、MSA、MSH、MSIAH等写法。比如MSIAH-VAR(p)表示截距、自回归系数、协方差矩阵全部随状态变化这是最灵活也最耗参数的。实际项目里很少一上来就用最复杂的MSIAH多数情况是先判断“你关心的到底是均值状态的切换还是波动状态的切换”再从简单变体开始试。1.3 生活化类比与典型应用场景理解MSVAR最简单的类比是听一个人说话同一个人心情好的时候语速快、音量高心情差的时候语速慢、音量低。你听得到的是语速和音量看不到的是心情状态本身。马尔可夫转移刻画的是心情状态在时间上的切换规律每个心情下的语速音量分布就是模型里不同状态的条件均值和方差。你通过语速音量反推“他现在心情好不好”就像我们用y_t反推s_t的状态概率。MSVAR在实际项目里最常见的应用场景包括商业周期识别利用GDP增长率、工业生产、失业率等宏观序列区分扩张和收缩状态并估算当前处于哪个区制、距离状态切换还有多远。金融市场牛熊识别用股票收益率序列建模识别牛熊两种状态同时捕捉高波动和低波动的聚集现象。政策传导差异分析在通胀高企和通胀温和两种状态下货币政策的利率冲击对产出和价格的影响路径可能完全不同MSIAH类模型能刻画这种差异性。汇率与大宗商品价格分析很多商品价格在“强势趋势”和“震荡整理”之间切换MSVAR的状态概率可以作为风险预警指标。2. 建模准备工具、数据与关键设定2.1 工具选型R、EViews、Ox三选一我见过不少人一上来就问“MSVAR用Python怎么写”然后陷入自己手推EM算法的泥潭。坦白讲Python在标准库层面目前还没有一个很成熟的完整MSVAR估计器虽然可以自己写EM或者做贝叶斯MCMC但对大多数业务场景来说性价比不高。比较成熟的方案有三条路R语言单方程的马尔可夫转移模型用MSwM包就很方便它可以对lm对象做区制切换拟合适合快速验证状态数、观察滤波概率。缺点是完整的多变量MSVAR支持相对有限真要做多变量系统估计需要一些额外功夫。EViews内置了马尔可夫切换估计功能界面操作门槛低可以估计带区制切换的VAR模型适合做宏观数据快速建模和教学演示。Ox语言Krolzig当年的MSVAR工具箱是很多经典论文的标准工具功能完整支持各种变体但需要Ox环境上手成本高一些。我的建议是如果只是做宏观周期识别和状态分类先用R的MSwM或者EViews把逻辑跑通如果研究要做正式的MSVAR多变量系统估计直接上Ox的MSVAR工具箱省去自己造轮子。需要说明的是MSwM在网上的资料比较零散接口在不同版本也有变化跑示例代码时遇到报错先检查包版本不要一上来就怀疑模型有问题。2.2 数据准备与平稳性检查MSVAR对数据频率和变量数量比较敏感。宏观数据一般用季度GDP增速、月度CPI、月度工业增加值这类序列金融数据可以用日度或周度收益率。变量数量一定要克制状态数K乘滞后阶数p再乘变量个数n参数数量是成倍增长的。举个直观例子3个内生变量、2个状态、1阶滞后的MSIAH变体每个状态要估计的截距向量3个、自回归系数矩阵9个、协方差矩阵6个合计18个参数两个状态就是36个再加上转移概率的自由参数2个一共38个参数。如果样本只有100期平均每个参数只有不到3个观测支撑估计结果基本不可信。所以变量宁少勿多宏观模型通常2到3个内生变量就够了。平稳性方面MSVAR一般要求内生变量是平稳的。实际操作中对GDP这类有趋势的序列通常取对数差分得到增长率对价格类序列取同比或环比变化率。也有人用滤波后的产出缺口序列建模但要注意滤波方法本身会引入端点修正问题解释时要谨慎。MSVAR虽然可以容纳趋势项或漂移项但非平稳序列带来的伪推断问题不会因为加了状态切换就自动消失。2.3 滞后阶数p和状态数K怎么定滞后阶数p可以先用普通VAR的信息准则定阶AIC、BIC、HQ准则滚动比较一下取一个相对简约的阶数再在固定K的条件下比较MSVAR的SC值做微调。状态数K的选择要更谨慎因为这里有个统计上的老问题在“K1”的原假设下转移概率矩阵是不可识别的常规LR检验统计量不服从标准卡方分布直接查表会过度拒绝原假设。所以我不建议只看LR检验的p值而是把信息准则和经济学解释结合起来。具体做法是分别估计K2和K3看对数似然提高是否明显同时看估计出来的各个状态是否经济可解释。如果某个状态的样本占比极低、或者状态概率长期在0.5附近徘徊那就是过度区制的信号乖乖退回K2。3. 实操过程从模拟数据到结果解读3.1 先用已知参数的模拟数据跑通流程直接拿真实数据建模一旦结果不合理你很难判断是模型写错了还是数据本身的问题。我习惯先用已知参数的模拟数据验证工具和代码。下面是一段基于R的示意脚本生成一个两状态、一阶滞后的切换回归数据再用MSwM包做估计library(MSwM) set.seed(2024) T - 300 mu - c(0.5, -0.4) # 两个状态的截距 phi - c(0.6, 0.2) # 两个状态的自回归系数 P - matrix(c(0.95, 0.05, 0.08, 0.92), 2, 2, byrow TRUE) s - numeric(T) s[1] - 1 for (t in 2:T) { s[t] - sample(1:2, size 1, prob P[s[t-1], ]) } y - numeric(T) y[1] - mu[s[1]] / (1 - phi[s[1]]) for (t in 2:T) { y[t] - mu[s[t]] phi[s[t]] * y[t-1] rnorm(1, 0, 1) } mod - lm(y ~ 1) ms_res - msmFit(mod, k 2, p 1, sw rep(TRUE, 2)) summary(ms_res)注意这段代码里的sw rep(TRUE, 2)表示截距和自回归系数都允许随状态切换对应MSIAH变体中I和A切换的一部分。不同版本的MSwM接口略有差异如果报参数名不匹配先?msmFit查一下当前版本的参数说明。估计完成之后第一件要看的不是系数表而是转移概率矩阵。用transProb(ms_res)可以直接提取。模拟时我设的状态1转状态1概率是0.95状态2转状态2概率是0.92好的估计结果应该回复出非常接近这两个值的数字。如果转移概率矩阵对角线元素明显偏离说明状态分类没有收敛到真实结构需要重新审视初始值或模型设定。3.2 滤波概率、平滑概率与状态识别MSVAR估计输出里有两类概率最容易混淆滤波概率和平滑概率。滤波概率是利用t期及以前的信息对当期状态的推断平滑概率则是利用全部样本信息对每一期状态的事后推断。两者在状态切换点附近的差异特别明显真实切换发生时滤波概率往往要滞后几期才反应过来平滑概率则能更准确地回指切换点。因此实时监测用滤波概率事后识别拐点用平滑概率。实际操作中很多人习惯以状态概率是否超过0.5来判定当期属于哪个状态这个规则简单直观但遇到状态概率在0.45到0.55之间反复震荡时会很纠结。我的处理办法是除概率阈值外结合各状态的条件均值符号和波动率大小做综合判断。比如一个状态的截距为正、方差较小另一个截距为负、方差较大那么“状态1是稳定增长期、状态2是危机震荡期”的经济含义就清晰得多。3.3 转移概率矩阵与期望持续期的解读转移概率矩阵本身就能提供很多信息。状态i的期望持续期可以简单计算为$$ E(D_i) \frac{1}{1 - p_{ii}} $$比如状态1转状态1的概率p110.95期望持续期就是20期状态2转状态2的概率p220.92期望持续期就是12.5期。如果用的是季度数据这意味着平均扩张期约持续20个季度平均收缩期约12.5个季度。再对照平滑概率图看历史上几个明显的持续期长短如果模型估计的持续期和数据中观察到的状态簇长度大体匹配说明模型整体可信度不错。转移概率矩阵非对角线元素的不对称性也值得留意。有时从扩张转到收缩的概率很低但从收缩转回扩张的概率相对较高这对应经济周期里“扩张缓慢、收缩剧烈”的不对称特征。反过来如果收缩状态特别顽固就要警惕模型是否把某种长期低增长阶段错误地识别为周期性收缩了。3.4 状态内脉冲响应与预测的延伸如果模型设定是MSIAH自回归系数矩阵随状态变化那么每个状态内可以分别计算脉冲响应函数。做法是先根据状态概率最大的时点把样本划分成不同状态下期或者直接使用每个状态的系数矩阵做Cholesky分解得到该状态下的脉冲响应。不同状态下对同一冲击的响应差异往往是政策分析里最有价值的部分比如在收缩状态下某类冲击的影响可能更大、衰减更慢。预测方面MSVAR的一步前条件预测是把每个状态的VAR预测值按状态预测概率加权平均。这个思路比普通VAR更贴合“当前状态可能马上切换”的现实不过要记住预测的不确定性也来自状态概率本身区间预测会明显宽于普通VAR。我不太建议拿MSVAR做太长期的确定性预测它的强项是在中期状态识别和情景分析。4. 常见问题与排查技巧实录4.1 收敛失败EM算法与局部最优MSVAR的参数估计通常用EM算法但EM对初始值很敏感很容易陷入局部最优。我自己最常用的办法是多重随机初始值随机生成若干组初始均值、初始转移概率和初始系数分头跑EM最后保留对数似然最大的一组结果。如果不同初始值跑出来的状态标签完全对不上或者对数似然差异很大说明识别强度不够要么减少参数要么给截距加排序约束。序列的数值尺度也会影响收敛。收益率数据以小数形式表示时数值通常在0.01量级此时对数似然计算容易溢出到NaNEM迭代直接卡死。我一般会把收益率乘以100换算成百分点后再建模估计完成后再把截距和系数按比例换算回来。这一步虽然简单但能省掉大量排查时间。4.2 标签切换状态1和状态2的“身份互换”标签切换是区制转移模型里最烦人的问题之一。模型只识别出“有两个状态”但并不知道哪个状态应该叫“扩张”哪个应该叫“收缩”。不同初始值下估计结果可能把原本的状态1完全标记成状态2均值、方差、转移概率全部跟着互换。解决思路是施加识别约束最常用的是对截距或均值做排序约束比如强制μ1 μ2让编码器把低均值状态固定为状态1。如果经济含义是“高波动状态”和“低波动状态”也可以对协方差矩阵的对角元素做排序约束。需要说明的是某些估计工具不会自动处理标签切换你手动施加约束时一定要先确认当前估计结果的参数分布再决定排序约束的方向否则约束加反了会把原本正确的估计又翻回去。4.3 过度参数化K和p的选择陷阱参数数量超过样本容量的三分之一时模型基本就在“背数据”而不是“学规律”了。前面算过3变量、2状态、1阶滞后的MSIAH已经有38个参数如果样本只有100期结果必然不稳定。信息准则会对参数多施加惩罚所以当不同K值的BIC比较接近时果断选参数更少的那个。经验法则是状态数宁少勿多滞后阶数宁小勿大先把一个简朴但稳定的模型跑出来再逐步扩展。另一个常见误区是看到某个状态的参数不显著就想删掉该状态。状态是否保留应该看整体模型的经济意义和状态概率的清晰度而不是单个截距的t值。一个状态的样本占比如果很低t值天然不会高但这不代表这个状态不重要。4.4 解读误区状态概率、平滑概率与“真实状态”最后说一个我在各种报告里见过的通病把MSVAR识别的状态直接等同于真实的经济状态。MSVAR本质上是给数据提供了一个更灵活的分段线性近似状态本身是模型构造的潜在变量不等于现实世界里存在某个可以观察到的“扩张/收缩开关”。所以报告里最好写“模型识别出的两个状态对应……”而不是“经济确实处于……”这类绝对化表述。还有一点滤波概率和平滑概率在拐点附近的差异很大业务上做实时判断用滤波概率没问题但写复盘报告时如果还拿滤波概率回推历史拐点就会出现系统性滞后偏差。务必要区分清楚你用的是哪种概率回测和评价也不要混着用。5. 实操之后想多说几句这套东西我反复用下来最大的感受是MSVAR模型的统计结果必须放到业务常识里做一遍“交叉验证”。如果模型识别出的高低波动状态跟宏观环境的基本直觉完全相反多半不是数据有问题而是初始值、状态数或者变量选择出了问题。别急着给模型找理由先回头检查建模环节。一个小技巧对新人特别有用先对核心单变量做马尔可夫切换回归比如直接对GDP增速做两状态切换AR(1)拿到状态概率序列之后再带入多变量MSVAR做正式估计。这样能先把状态数量、切换频率大致摸清也方便给多变量模型设定合理的初始状态大幅降低后续收敛失败的概率。如果后续想在这个方向上深入贝叶斯MSVAR是一个很好的升级方向MCMC框架下标签切换问题可以通过后验约束自然处理。转移概率本身随时间变化的外生变量扩展模型TVTP也值得研究。先把手头的两状态模型做扎实比急着套复杂变体稳妥得多。
返回列表