ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

MSVAR模型详解:从状态切换到区制转换的完整实践指南

2026/10/3 3:29:42 拓冰建站 浏览量
MSVAR模型详解:从状态切换到区制转换的完整实践指南 做时间序列分析的人基本都经历过这么一幕跑了一个线性VAR模型残差图出来之后你发现方差不是均匀的而是明显分成几段——有一段时期波动特别大有一段时期又特别平缓。如果你处理的是宏观经济或金融数据这种情况几乎避不开。政策周期、市场情绪、外部冲击都会让变量之间的关系发生结构性改变。传统VAR假设系数和方差在整个样本期内不变在突变面前就显得很僵硬。马尔可夫向量自回归模型MSVAR就是奔着这个问题去的。这篇文章写的是我学习和使用MSVAR过程中的完整探索记录包括模型的数学机制、估计方法、软件工具的取舍以及在真实数据上踩过的坑适合正在研究区制转换模型、准备用MSVAR做实证分析的经济金融方向研究生和量化从业者参考。1. 线性VAR的一个尴尬时刻残差里有明显的块状结构1.1 一次跑VAR回归的现场复盘我最早接触MSVAR的动机特别朴素。当时在分析一组宏观月度数据GDP增速、通胀和利率三个变量样本跨度二十多年滞后阶数按AIC选了2跑完VAR之后一切看起来正常系数显著、脉冲响应方向符合直觉稳定性检验也通过了。但当我画出残差序列的滚动标准差时问题就出来了。这组残差的标准差明显不是一条水平的线而是分成好几个平台期。90年代末的一段波动率较高2000年代初进入一个相对平稳的区间随后又出现一次剧烈的跳跃。这种结构很明显不是白噪声的随机波动而是数据生成过程本身就跟着某个外部状态在切换。更麻烦的是把样本切成两段分别估计VAR得到的系数差异极大。这说明变量之间的动态关系并不是稳定的用一个全局系数矩阵去描述整个样本期本质上是一种平均化的妥协。这时候有两条路可以走。一条是用邹检验Chow test找到结构突变点然后做分段回归把样本切成几段分别估计。但分段回归有个先天缺陷突变点要人为指定而且样本切碎之后每个子区间样本量骤减估计精度会大幅下降。另一条路就是引入MSVAR让模型自己去判断当前处于哪个状态并且允许系统在不同状态之间按照一定的概率规则切换。1.2 从分段回归到状态切换MSVAR的出发点分段回归相当于假设历史上有几个界限明确的时代而MSVAR的哲学完全不同。它假设存在一个不可观测的状态变量S_t这个变量服从马尔可夫链状态之间的切换不是一次性事件而是持续存在的可能性。模型不需要人为指定突变点而是在每个时间点上同时估计当前处于状态1的概率和当前处于状态2的概率。更关键的是MSVAR的功能不只替代分段回归。它可以把状态切换本身当成分析对象。比如你想知道经济从衰退切换到扩张的概率有多大、一个高波动状态平均持续多久这些在传统VAR框架里根本没法回答在MSVAR框架下却可以直接从转移概率矩阵里读出来。这也是为什么Hamilton在1989年研究美国实际GNP时提出的马尔可夫切换模型会引起那么大反响。他用的还是单方程的马尔可夫切换模型后来Krolzig等人把它扩展到多变量的VAR体系才形成了我们现在常说的MSVAR。简单说MSVAR就是把马尔可夫切换这个机制嫁接到了VAR的骨架上每个状态不仅有自己的均值结构还可以有自己的自回归系数和方差协方差矩阵。2. MSVAR的状态机制到底在做什么2.1 一个隐藏的状态变量接管了所有系数MSVAR的方程写出来并不复杂。假设被解释变量向量是y_t存在K种状态状态变量S_t ∈ {1, 2, ..., K}那么p阶滞后的MSVAR模型可以写成y_t c(S_t) A_1(S_t)·y_{t-1} A_2(S_t)·y_{t-2} ... A_p(S_t)·y_{t-p} ε_t这里的重点在于从截距项c到滞后系数矩阵全部依赖于当期状态S_t的取值。也就是说每一种状态就是一个独立的VAR模型模型之间共享的只有同一个马尔可夫状态过程。误差项也需要特别说明一下。很多初学者会忽略这一点只让均值和自回归系数切换让方差保持不变。这种做法在数学上简化了估计但违背了引入MSVAR的初衷。因为现实里高波动状态和平稳状态往往最直观地体现在方差上。你去看股票市场的日收益率指数水平差不多的两个区间标准差别可能是一倍以上。所以比较完整的MSVAR设定是让协方差矩阵也随状态切换即ε_t ~ N(0, Σ(S_t))在模型里加入方差切换等于同时捕捉了均值回归结构的变化和风险水平的变化这比单纯的分段回归信息量高很多。2.2 转移概率矩阵状态之间的惯性状态变量S_t服从马尔可夫链意味着未来的状态只和当前状态有关和更远的历史无关。这个无记忆性在经济学直觉上通常说得通市场今天的情绪和昨天的情绪高度相关但和三天前情绪的关联都已经被今天的信息消化掉了。模型用转移概率矩阵来描述这种规则P [p_11 p_12 ... p_1K; p_21 p_22 ... p_2K; ... p_K1 p_K2 ... p_KK]其中p_ij表示从状态i转移到状态j的概率每行之和等于1。对角线元素p_ii通常最大表示状态有惯性也就是说系统倾向于维持在当前状态。这个惯性在现实中很好理解经济一旦陷入衰退通常不会一个月就反弹市场一旦进入高波动状态也会持续一段时间。转移概率矩阵的用处非常大。你可以用它计算状态的平均持续时间公式是1 / (1 - p_ii)。举个例子如果p_11 0.9那么状态1的平均持续期就是1 / 0.1 10期。另一个经典应用是判断状态的稳定性。真实宏观数据估计出来的转移概率矩阵通常是对角线占优的如果出现大量非对角线上很高的概率说明状态之间的区分度不高模型可能设定了过多的状态。2.3 方差协方差也随状态变化这一点经常被忽略先明确一个误区有的论文在报告MSVAR结果时只写均值和系数的状态切换不提方差切换。不是因为这些论文故意省事而是因为如果只在均值上做切换、方差保持不变模型收敛起来会简单不少。但要警惕的是如果数据里真正区分状态的其实是波动率比如金融高频数据而你只让均值切换那么估计结果可能把所有样本都分到某一个状态里去了因为此时模型没法靠方差差异把状态分开。我个人的经验是除非有很强的理论理由否则一开始应该让方差协方差矩阵也随状态变化先跑一个K2的全切换模型看到识别结果之后再做约束。全切换模型虽然参数多但能同时观察状态切换是否显著改善了方差的拟合。如果你发现加入方差切换之后对数似然值大幅上升那基本可以断言这个数据存在明显的波动率区制效应保留方差切换是必要的。参数数量是另一个关注点。假设你有3个变量滞后1阶2个状态并且方差协方差矩阵也切换那么每个状态里的均值项有3个参数滞后系数矩阵有9个参数协方差矩阵6个参数每个状态18个两个状态一共36个加上转移概率矩阵里2个独立的概率参数总计38个。这个数量级在月度或季度数据上还能接受但换成日频数据且滞后阶数提到3以上参数会迅速膨胀到一百多估计稳定性会被严重削弱。归根结底MSVAR是一个数据餍足的模型它要求你对样本量有清醒的认知。3. 估计MSVAR的两种主流路线EM与MCMC3.1 Hamilton滤波与平滑概率整个估计的地基MSVAR的估计难点不在于似然函数本身而在于状态变量S_t不可观测。要对参数求极大似然你必须处理状态在当前时点上无法直接观测这个麻烦。Hamilton在1989年的论文里给出了一个经典解决方案思路很像卡尔曼滤波的逻辑。滤波的过程分两步。第一步是预测利用上一期的全部信息结合转移概率矩阵计算出当前处于各个状态的预测概率P(S_t j | 信息到t-1)。第二步是更新用当期观测值y_t带来的新信息修正这个预测概率得到滤波概率P(S_t j | 信息到t)。这个过程从t1递推到tT每一步都是标准的高斯密度计算加上概率归一化。在滤波的终点你还可以往前走一遍把未来的信息考虑进来得到所谓的平滑概率。平滑概率P(S_t j | 全部样本信息)比你只利用t时刻之前信息得到的滤波概率稳定得多因为它同时参考了这个时间段前后发生了什么。实际研究中对某个时点处于哪个状态做出判断用的几乎全是平滑概率而不是滤波概率。3.2 EM算法的三个核心步骤与收敛判别极大似然的直接估计之所以困难是因为对数似然函数中存在隐状态的对数求和直接取对数并没有简化问题。EM算法绕开了这个障碍。它的核心思想是我没有状态数据那我就猜状态然后用猜出来的状态更新参数更新完参数再去重新猜状态反复迭代直到参数稳定。整个过程分成E步和M步交替进行。E步做的事情是在给定当前参数初值的前提下用Hamilton滤波和平滑计算出每个时点处于每个状态的概率。这些概率被称为责任值可以理解为这个时点有多大程度归状态1来负责。M步的目标是在固定这些责任值的情况下最大化期望的完整数据对数似然。因为责任值相当于补齐了状态变量原本复杂的联合似然函数变成了加权最小二乘问题只需要按责任值加权做回归就可以更新系数按责任值加权做加权平均就可以更新方差协方差矩阵和截距项。E步和M步循环迭代通常在一个收敛准则下停止比如相邻两轮对数似然之差小于某个阈值或者参数的相对变化足够小。这里有一个不大不小的坑似然函数等于是对状态路径做了边际化处理多个状态可能对应相近的似然值EM算法不定能稳定收敛到全局最优。实操中必须用多组不同初值反复估计比如随机生成10组初值取对数似然最高的那组结果作为最终报告值。注意初值对MSVAR的影响比其他很多模型都要明显这是这个模型的固有特征。3.3 MCMC路线与标签切换问题的处理EM算法之外贝叶斯MCMC是另一种主流的估计路径。MCMC的思路是把参数看作随机变量结合先验分布和数据通过采样得到后验分布。你不需要求最大值只需要不断从后验中抽取样本然后看参数的抽样分布集中在什么区间。MCMC一个很常见的副产品是标签切换问题。由于模型中的状态标号是人为设定的状态1和状态2互换之后似然值完全不变。也就是说后验分布会出现两个对称的峰一个对应状态1高均值、状态2低均值另一个对应状态1低均值、状态2高均值。MCMC采样时链可能在两个峰之间跳来跳去导致状态1均值序列的后验分布同时包含高值和低值看起来极不稳定。处理标签切换最常用也最简单的办法是给状态加排序约束。比如事先设定状态1的均值向量第一项小于状态2的均值向量第一项然后每次采样完做排序检查不满足排序就交换标签。这种做法在实际中很有效但要注意它本质上是把先验信息强加进模型了。如果你理论上预期状态划分与这个排序不一致结果会被扭曲。EM和MCMC哪个更合适我的判断是如果你的目标是快速得到一个参数估计值和一个状态划分EM算法更顺手如果你想细致分析参数的不确定性比如报告参数置信区间或者状态划分的不确定性MCMC更合适。两者在估计结果接近的情况下报告的实证结论通常不会有本质差别。4. 在真实数据上跑MSVAR要注意的细节4.1 状态数量K不是拍脑袋定的K2是最常见的选择因为两区制天然对应扩张/衰退高波/低波这种二元对立结构也最容易解释。但K2在有些情况下只是权宜之计。如果你处理的变量系统中明显存在三种状态比如繁荣、正常、衰退或者股市里牛市、震荡、熊市那么强行用K2可能会让其中一个状态承担过多异质性估计出来的转移概率和对参数都不好解释。判断K该取多少常规做法是用BIC或对数似然进行模型比较。先估计K2、K3甚至K4的模型比较它们的信息准则值。需要注意K增加带来的参数数量增长是状态的平方级别。K从2变到3多出来的不是一个VAR模型的参数而是整整多了一个状态的VAR系统参数 一整列转移概率。所以BIC这类惩罚大的准则通常更可靠AIC有时候会倾向于选中过大的K。还有一类更隐蔽的问题来自伪状态。我见过一些结果K4估计出来的4个状态里有2个状态的均值参数接近区别几乎只体现在方差上。这很可能是数据生成过程实际只有2-3个状态另外的状态只是为了吸收异常值才被估出来。对伪状态的识别方法很简单检查模型的状态概率是否出现了频繁而碎片的切换如果平滑概率出现大量快速跳动的片段大概率是过度设定了状态数量。4.2 滞后阶数p、参数总量与样本量的三角关系MSVAR的滞后阶数选择不能只盯着AIC和BIC。一定记得把不同状态下滞后系数是否切换这个设定纳入考虑。同样是滞后2阶全切换模型系数也随状态变比只切换截距的模型参数多出一大截。可以用一个经验来衡量样本量是否足够每个状态里用于估计方差协方差矩阵的有效观测数至少不能低于变量数量。如果状态1持续期平均只有10期而你的VAR系统包含5个变量那么状态1的协方差矩阵会估计得很糟糕。这是一个常见的失败模式——模型跑出来转移概率异常状态概率几乎摇摆不定最后发现是因为样本容量撑不起参数体量。处理这类问题通常的招是减少变量数量、降低滞后阶数或者在模型结构上做约束。比如让自回归系数在各状态间相同只让截距和方差切换。这种设定有个专门的名字叫马尔可夫切换截距或MSIMarkov-Switching Intercept模型参数负担比全切换小得多在宏观应用里非常常见。4.3 状态标签反转看似结果漂亮实际镜像我之前说MCMC有标签切换问题其实EM算法在直接用数值优化时同样会碰到。区别是MCMC下它会显式地在样本序列里暴露出来而数值优化时它表现为你换了初值就得到状态1高波动/状态2平稳和状态1平稳/状态2高波动两套结果参数大小一样、符号方向相反似然函数值完全相同。这不是模型出错了而是模型的不可识别性。关键是你要在写报告或写代码时主动处理它。最常见的办法是给某个参数加约束。比如你有明确的预期平稳状态的平均收益率高、高波动状态的平均收益率低那就设置约束让状态1的均值小于状态2的均值并且在每次估计完再检查估计结果是否满足这个约束。也可以用更稳健的做法估计完所有候选初值之后按照某些参数的大小或符号统一把标签调整到同一含义。如果你对状态的解释方向没有先验那也得明确写清楚状态1对应什么、状态2对应什么是事后依据估计结果赋予的性质而不是事先指定的假设。否则读者看到你的结果表格时完全有理由质疑你把标签对应关系写反了。4.4 转移概率对角线偏好与僵化状态MSVAR的估计结果里有个现象很常见转移概率矩阵的对角线元素估计值接近1非对角线元素接近0。这意味着状态切换的发生概率非常低两个状态实际上几乎不流动。从概率角度看这叫高持久性状态但经济直觉上却未必合理。如果十年样本里只发生了一次状态切换那么平滑概率序列看起来就更像一次永久的分段结构而不是连续的区制切换。这种情况的根源往往是数据中存在结构突变而MSVAR用一个几乎吸收态的马尔可夫链去拟合这个突变。你自己要判断模型能接受吗如果你的研究目的就是识别样本期内是否存在结构性断点那这种结果并无大碍。但如果你的研究目的是估计各状态的持续时间和切换频率那么这种结果说明状态太少或者某些状态被强制赋予了过高的惯性。我常用的修正思路是在MCMC方法下给转移概率对角线加一个温和的先验收缩在0.7到0.9之间避免它极端地趋近1。这种做法能显著改善状态间的流动性估计也让模型更容易捕捉到短期的状态切换。5. 一次完整的MSVAR实践从数据准备到结果解读5.1 数据准备哪些变量适合进VAR方程先给一个最直接的建议变量之间的状态切换要有经济学上的可解读性不要什么都往模型里塞。我自己习惯把MSVAR用在两类数据上。第一类是宏观总量的同比增长率或环比增长率比如GDP、工业增加值、CPI的同比增速。增长率的均值在不同状态下有明显差异方差也随周期波动结构很自然地吻合MSVAR的设定。第二类是金融资产的收益率序列或信用利差这类数据的高波动和低波动状态区分极其明显。时间频率和样本长度也要注意。最好用季度或者月度的数据并且保证整个样本期至少跨越了两次完整的状态切换。如果一个样本只有8年而你的状态平均持续期是5年那实际上你只有不到两次切换对转移概率的估计会很难收敛。反过来高频数据虽然样本量大但噪声也大滞后阶数稍微多一点就会参数爆炸。5.2 模型选择流程与工具选择一个比较稳妥的实践流程是先用单方程马尔可夫切换模型跑你要关心的核心变量确认该变量确实存在明显的区制效应再扩展到多变量的MSVAR。这样能先在一个相对简单的环境里检验你的状态设定是否站得住脚也更容易为MSVAR提供好的初值。工具方面我梳理一下可以选用的工具箱方便你根据自己的语言习惯来选工具/语言功能特点适用场景R的MSwM包基于EM估计支持多变量MSVAR和方差切换快速探索、经典实证R的MSBVAR包贝叶斯MCMC支持先验设定和后验分析处理标签切换、参数不确定性分析Matlab的MS_Regress工具箱功能全面支持多种切换设定和结果输出教学和常规实证研究Python statsmodels内置MarkovRegression但多变量版本有限单方程机制转换或自定义开发Python的原生生态在MSVAR方面相对薄弱statsmodels里带的是MarkovRegression主要用于单方程。如果你坚持用Python做多变量MSVAR通常得用Em算法手写或者通过rpy2调R的包。5.3 结果解读的实际案例如何读区制、如何看转移概率假设你跑了两个状态、滞后1阶的MSVAR变量是GDP增长率和通胀率估计出来的平滑概率是状态1在前半段接近1后半段接近0状态2反过来同时状态1的截距项是负的、状态2是正的。可以初步判断状态1对应衰退期、状态2对应扩张期。注意不要只看截距趋势来判断。你要同时检查方差矩阵差异和均值差异。如果两个状态的主要区别在于方差而不在均值那你应该把状态命名为低波状态高波状态而不是衰退状态扩张状态。状态命名必须和实际估计出来的特征保持一致这写论文时要特别注意。转移概率矩阵怎么读比如p_11 0.95、p_22 0.92说明状态持续性强平均持续期分别是1 / 0.05 20个季度和1 / 0.08 12.5个季度。如果p_12 0.05、p_21 0.08很低说明两个状态的切换速率很慢。你还可以计算状态的无条件概率也就是长期平均处于各状态的时间比例这个值可以直接表征整个样本期里扩张期与衰退期的占比。6. 我的取舍经验MSVAR的适用边界与替代方案6.1 什么时候应该坚持用MSVAR我判断一个场景是否适合MSVAR核心问题只有一个你要研究的机制是否天然包含状态依赖。如果答案是肯定的线性VAR再平滑也很难解释你观察到的突变那么MSVAR就是合适的工具。举几个例子。货币政策研究经常考察高通胀期和低通胀期中政策利率对通胀的响应是否不同这种政策机制切换用MSVAR很自然。金融领域里低波动期和高波动期的资产相关性结构往往显著不同MSVAR能捕捉到这种相关性切换。汇率研究里钉住制度与浮动制度下的汇率动态完全不同MSVAR就是用来刻画这种制度跳变的标杆工具。在这些场景里MSVAR给出的不仅是参数估计的差异更重要的是一个可以量化的状态转移概率它本身就构成经济学解释的一部分。6.2 什么情况下不如老老实实用其他模型如果你的数据样本很短估计出的状态概率几乎被边界吸收那MSVAR就不合适换成马尔可夫切换的简化版或者干脆用普通VAR加控制变量可靠性会更高。如果针对矩阵或因子模型的需求状态切换应该在潜因子结构里实现而不是在原始观测变量上直接做VAR此时MSVAR反而会因为变量过多导致估计效率低下。一定要记住模型只是工具。MSVAR的复杂性注定了它需要足够的数据量和明确的状态解释作为支撑。没有这两点再漂亮的估计结果在理论上也站不住脚。6.3 一个可以复用的实践框架最后分享一个我每次做MSVAR实证都会照着走的检查清单算是我个人的经验总结希望对你减少试错成本有点帮助。先用模拟数据跑通流程。生成一个已知参数的两状态VAR数据用同样方法估计检验能否恢复真实参数。这个步骤能帮你提前发现估计代码里的逻辑bug而不是等到真实数据上才暴露。给估计设置多个初值。不要只跑一组初值就信结果至少随机初始化五组保留似然值最高的结果并且确认其他收敛结果不冲突。对比不同设定下的模型并记录信息准则。留好K2、3和方差切换与否的对照表推导报告里为什么选这个设定才有力气回答。检查平滑概率序列的实际行为。应该出现明显的区间特征平滑概率接近0或1而不是大量停留在0.4到0.6之间。用状态转移矩阵解释你的故事。报告里至少要有一个段落专门解读状态持续期、切换时间点与宏观经济事件的对应关系否则模型只是跑完了没有完成从统计到经济的解释。我在实际使用中还发现一个高频出现的细节如果不做方差切换到模型的BIC值作为参考容易高估模型整体的拟合优度导致最终报告与审稿人意见相左。所以对MSVAR结果的检查不能只看拟合指标要主动寻找状态的分布特征和切换概率是否和经济直觉一致。用MSVAR做研究最忌讳的就是只把模型当黑盒跑完就收工。理解了状态切换机制你才能真正驾驭它。