ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

GiveWin中MS-VAR建模实战:马尔科夫区制转移全流程解析

GiveWin中MS-VAR建模实战:马尔科夫区制转移全流程解析

1. 为什么偏偏是MS-VAR,以及为什么偏偏是GiveWin

做宏观计量的人,十有八九都遇到过这样的尴尬:明明理论模型说得头头是道,说经济变量在不同状态下应该有完全不同的动态关系,结果你拿着线性VAR过去一估,显著性倒是出来了,但脉冲响应把你带向了一个“平均状态”——就好比你问一个人“你跑步和睡觉时的心率分别是多少”,他回你一个全天平均心率,道理没错,但根本没法用来做任何决策。

MS-VAR(马尔科夫区制转移向量自回归)解决的就是这个问题。它允许模型在不同“区制”(regime)之间切换,每个区制有自己的截距项、自回归系数、甚至方差,切换过程由一个不可观测的马尔科夫链驱动。放在宏观场景里,这就是把“经济处于扩张期”和“经济处于收缩期”当成两个独立状态来分别建模。相对区间转移和未知断点检测这类结构性突变方法,马尔科夫区制转移的优点在于:不需要提前指定断点位置,区制转移概率由数据自己估计,而且能给出“当前处于哪个区制”的平滑概率——这个东西做经济周期测度、金融压力指数构建、通胀动态分析时非常好用。

但实话实说,MS-VAR的上手门槛不低。方程要矩阵化建模,区制转移概率要做数值优化,还要处理识别约束和收敛性判断。市面上能直接做MS-VAR的软件不少,比如OxMetrics里就有专门的MSVAR模块。不过我还是想重点说说GiveWin——因为它是OxMetrics的宿主壳,不依赖复杂的脚本环境配置,数据读写、画图、结果输出全都在一个窗口里搞定,对于很多要做定期更新报告、时间紧任务重的人来说,这个工作流比纯脚本舒服得多。

这篇东西适合谁看?两类人。第一类,已经在用EViews或Stata做VAR,但觉得线性VAR解释不了“状态切换”的人;第二类,被导师或者客户问到“你这个模型能不能算一下经济处在什么状态的概率”的人。文章不会绕到推导的每个细节,重点放在“在GiveWin里到底怎么一步步落地”,以及那些说明书里不会写的坑。

2. 动手之前先搞清楚模型在做什么

2.1 一个例子快速理解区制转移逻辑

假设你研究的是利率对通胀的传导。线性VAR估计出来的结果是一个“平均传导强度”,但它很可能忽略了两个完全不同的事实:

  • 经济平稳期:利率上调对通胀的压制效果温和、滞后时间长;
  • 经济过热期:同样幅度的加息,会迅速改变市场预期,传导路径明显不同。

MS-VAR把这两种情况分别建模。模型本身不告诉你哪几个月是过热期,它通过数据估计一个“转移概率矩阵”,比如:

  • 从平稳期转移到过热期的概率;
  • 从过热期转移到平稳期的概率。

然后反推每一个时点分别有多大概率处在哪种状态。这就是“平滑概率”的用途——你可以画出一条状态概率曲线,直接在图上看出哪些时间段属于哪个区制。

2.2 MS-VAR与VAR、STAR、TVP-VAR的区别

这里容易乱,尤其是做汇报的时候被人追问“你这个跟STAR有什么区别”。我做了个表,方便直观对比:

模型状态切换方式转移规则适合场景
线性VAR无切换始终同一机制变量关系稳定
MS-VAR不可观测离散状态马尔科夫链概率转移经济周期、制度切换
STAR(平滑转移)可观测阈值变量驱动平滑函数连续过渡阈值效应明显
TVP-VAR参数时变状态方程平滑漂移长期结构性变化

核心区别在于:MS-VAR的状态是“隐变量”,你事后用概率去推断;STAR的转移变量是外生可观测的;TVP-VAR则是参数连续变化,没有“离散区制”这个概念。如果你只是想描述“危机期和正常期有区别”,MS-VAR是更自然的选择。

2.3 MS-VAR的两种常见设定,别选错

在实际建模里,最常见的两种设定是:

  • 均值区制转移,即MS(M)-VAR:切换只影响截距项或均值,系数稳定。优点是参数少、容易收敛,适合状态划分清晰、但不强调动态乘数差异的场景。
  • 系数区制转移,即MS(M)-VAR的扩展(有的叫MSIAH):截距、自回归系数、方差都随区制变化。表达能力最强,但参数暴涨,极易遇收敛困难。

我的建议是:如果样本量不到几百个观测值,先别急着上系数区制转移。否则大概率陷入“局部最优出不来”的尴尬。先从均值转移做起,把区制个数的选择(通常是2或3)放在模型比较阶段再定。

注意:GiveWin里的相应模块操作路径很直观,但背后对参数初值非常敏感。后面第4节会详细讲怎么处理初值问题——这是所有MS-VAR实操里最容易被低估的一环。

3. GiveWin环境下的模型搭建与数据准备

3.1 GiveWin里跑MS-VAR的整体思路

GiveWin本身是一个宿主窗口程序,主要任务是管理数据、查看图形、输出表格。你真正跑的估计引擎是Ox,但你不必像用纯Ox那样从头写估计代码——通过GiveWin的菜单化界面和批处理文件配合,能在图形界面里完成大部分操作。

整体步骤拆开看:

  1. 准备数据文件,导入GiveWin;
  2. 根据变量特征做平稳性检验、差分处理;
  3. 设定MS-VAR模型(区制数、滞后阶数、转移设定);
  4. 运行估计,检查结果文件;
  5. 提取平滑概率、区制划分、脉冲响应等结果;
  6. 输出图表和表格,整理到报告里。

这套流程的核心优势是:数据和图形在同一个界面里联动,你改一处理论设定,马上能看到数据窗口和图形窗口的变化,不用来回切换脚本编辑器。

3.2 数据导入与格式需要注意的细节

GiveWin支持的数据文件格式比较友好,常用的有文本文件(.txt/.csv)、Excel导出的数据、以及一些特有格式。但我强烈建议统一用文本文件导入,原因很简单:避免Excel自动改格式的坑。

举个我实际遇到的例子。某次做市场利率数据,Excel里明明看着是“0.0425”,导入GiveWin后却变成“0.042500001”——精度问题直接导致后续协整检验报出奇怪的统计量。后来排查了一圈,才发现是Excel源文件的单元格格式问题。从那以后,我的标准流程就是:在Excel或任意工具里整理好数据,另存为带分隔符的文本文件,再导入GiveWin。

数据文件的第一行通常是变量名,下面是从早期到后期的观测值。注意一点:GiveWin的默认时间频率设置要和数据实际频率一致。月度数据就别设成季度周期,否则滞后阶数的定义会错位,脉冲响应的横轴会莫名其妙。

3.3 平稳性检验与变量的预处理顺序

MS-VAR和VAR一样,要求变量体系平稳。但由于区制转移建模会涉及状态划分,多了一个“结构性断点不影响单位根检验”的特殊视角。我的实操习惯是:

  • 先对每个变量做单位根检验;
  • 若是非平稳,优先考虑差分;
  • 但差分后要意识到:差分变量会损失长期信息,如果论文或报告需要解释长期均衡关系,要谨慎对待。

有一种情况需要特别注意:如果变量本身有明显的区制切换行为(比如利率在某些时段剧烈波动,某些时段非常平稳),常规单位根检验很可能误判。这种情况下,我一般会同时报告线性单位根检验和分段检验结果,作为稳健性参考。

提示:如果你拿不准“到底要不要差分”,一个实用的办法是:先用水平值跑一个初步的MS-VAR,再看残差是否平稳。如果残差基本平稳,说明水平值建模问题不大;如果残差有明显趋势,再考虑差分。这比纯粹按规范流程操作要高效得多——毕竟规范的尽头是“模型残差要干净”。

4. 在GiveWin中完成MS-VAR估计的关键步骤实战

4.1 区制数量与滞后阶数的确定

这是整个操作中最影响结果的部分。

区制数量的选择,在GiveWin里通常可以设定为2或3。2区制是最常见的选择,对应“扩张/收缩”或“高波动/低波动”。你要是设定3区制,往往会出现第三个区制样本量太少、参数估计不稳定、概率图三条线纠缠在一起难以解释的局面。我个人的经验是:先跑2区制,看平滑概率是否能把样本清楚分成两块;如果2区制的对数似然值明显偏低,或者区制划分在经济含义上有硬伤,再考虑3区制。

滞后阶数按信息准则来定,AIC和HQ在GiveWin输出里都能看到。但因MS-VAR需要同时估计转移概率矩阵,参数比线性VAR多不少,所以滞后阶数宁小勿大。月度数据常用1到2阶,季度数据常用1阶。你报模型的时候多用几个滞后阶数做敏感性分析就够了,不必追求信息准则给出的“最优”而引入不必要的参数。

4.2 参数初值处理:新手最常栽的坑

MS-VAR的极大似然估计本质上是一个非线性最优化问题。如果你把初值随便一给,大概率会陷入一个“局部极大值”——表面上迭代收敛了,但实际估计结果缺乏经济合理性。

具体表现为:转移概率矩阵极不均匀(比如永远停留在某一区制),或者区制1和区制2的参数几乎相同(等于白切)。

GiveWin模块里的处理逻辑是对初值有一定依赖的。我自己常用的笨办法是:

  • 先把模型当成线性VAR估计一遍,把得到的系数作为区制1的初值;
  • 区制2的初值在区制1基础上做小幅偏移;
  • 转移概率矩阵初值用对称设定,比如0.85和0.15。

这套做法的好处在于:从一个经济意义上合理的点出发,让优化算法在附近寻找更好的参数组合,而不是从随机位置漫无目的地搜索。

注意:如果估计完成后发现“某个区制的概率始终接近1”,先别急着怀疑数据,大概率是你初值没给好、或者转移概率矩阵的初始对角线值太高,导致算法根本不会尝试离开初始区制。

4.3 识别约束与方差设定的选择

MS-VAR在使用中还有一个识别层面的问题:区制的标签(哪个是区制1,哪个是区制2)本身是任意的。你如果不加约束,算法可能第一次估计时把高波动状态叫区制1,第二次同样的数据却把高波动状态叫区制2。这就是“标签切换问题”(label switching)。

GiveWin场景下最常见的处理方式:

  • 通过对方差或截距项施加不等式约束来固定区制含义。例如约定区制1的方差更小,区制2的方差更大;
  • 或者在事后根据估计结果手动调整区制编号,让输出逻辑统一。

我更推荐前者,因为事后调整还需要同步修改概率图的图例和文字说明,容易在报告中出错。

4.4 一次完整的估计流程示例

假设我们有两个变量:产出增速(g)和通胀(pi),月度数据,120个观测值,想用2区制MS-VAR(均值转移形式)分析区制转换。

具体操作我会这样走:

  1. 在GiveWin中导入数据集,命名为example.in7;
  2. 双击变量名,画出时间序列图,确认没有明显趋势或异常跳点;
  3. 对g和pi分别做单位根检验,两者均平稳;
  4. 进入MS-VAR设定面板,内生变量选择g和pi;
  5. 设定区制数为2,选择均值转移形式;
  6. 滞后阶数先放1,后续做2阶稳健性备选;
  7. 参数初值按上一节方法设定,方差约束设为“区制1方差 < 区制2方差”;
  8. 点击估计,等待输出。

输出结果一般包含几个核心模块:参数估计表(各区制的截距、自回归系数、方差)、转移概率矩阵、区制平滑概率序列、对数似然值。你要最先看的不是系数的显著性,而是:

  • 转移概率矩阵的对角线是否明显高于非对角线(说明区制持续性合理);
  • 两个区制的截距或方差是否明显不同;
  • 平滑概率图中是否存在多次跨区制转换。

如果这三项都合理,模型基本就立住了。如果有一项不合理,优先回去调初值或者换设定形式,而不是硬着头皮解释。

4.5 从输出结果中提炼“经济故事”

拿到估计结果后,我通常按这样的顺序提取核心信息:

  • 区制划分的时点和时长。找平滑概率跨越0.5的时间点,这些就是模型识别出的“状态切换时点”,在报告里可以直接写“模型识别出X年到Y年为高波动区制”;
  • 各区制的参数差异。重点看截距和方差差异,这是经济含义最直接的体现;
  • 转移概率矩阵的持久性。对角线接近0.9以上说明状态非常“黏”,切换不频繁,区制间差异值得信。

一种比较有意思的应用是:用平滑概率做扩张/收缩的概率指数。比如月度平滑概率低于0.5视为收缩期,高于0.5视为扩张期,那么你可以构造一个“经济景气概率曲线”,比单纯看增长率本身直观得多。

5. 常见报错与估计异常的排查技巧

5.1 数值收敛失败:别只盯算法,先看你的初值

这是出现频率最高的问题。GiveWin的估计窗口显示“收敛失败”时,很多人第一反应是调最大迭代次数。实际上,如果初值距离最优解太远,加大迭代次数只会让程序在一个错误方向上反复横跳。

排查顺序建议:

  1. 先检查数据是否标准化。如果两个变量的数量级差太多(比如一个是0.01级别,另一个是1000级别),建议先做标准化。这不是为了让估计结果改变,而是为了让数值优化过程更平稳;
  2. 换初值。把区制2的初值偏移调大一点,逼算法探索更远的位置;
  3. 换设定。从均值转移换成同方差设定,减少参数规模,先跑通再扩。

5.2 区制概率出现“频繁切换”

有些模型估计出来以后,平滑概率在0.5附近来回穿越几十次,画出来跟锯齿一样。这种情况往往不是因为真的存在那么多状态切换,而是因为你把方差和均值分开建模后,模型用“频繁变化”去拟合噪声。

处理办法:

  • 减少区制数,从3降到2;
  • 增加转移概率矩阵的持续性偏好——在初值设定上把对角线概率调更高,比如0.95,让模型更倾向于“黏住”当前状态;
  • 检查是否存在异常值,极端值会拉出一个短命区制。

5.3 转移概率矩阵对角线接近1或接近0

对角线接近1,意思是状态几乎从不切换。这时你要确认是否真的存在区制转移,很可能数据本身没有明显的状态分离,是模型强行切了两块。一个快速判断方式:看两个区制的参数差异大不大,如果差异很小,说明MS-VAR相对于线性VAR没有带来额外解释力。

对角线接近0则是另一个极端,意味着系统在两个状态间疯狂跳转,没有持续性。这个场景通常意味着你设定的区制个数太多,或者某个区制对应的参数在经济与实际逻辑上说不通。

5.4 典型问题速查表

症状常见原因优先排查方向
估计不收敛初值太差/变量量级差异大标准化、换初值
平滑概率锯齿状区制过多/数据含异常值减少区制数、检查数据
区制1和区制2参数几乎相同数据本身状态分离不明显换变量组合、改用其他模型
转移概率矩阵对角线约1模型过度设定检查是否真的有区制转移
概率图区制标签混乱未加识别约束设定方差或截距大小顺序

6. 结果的可视化与报告呈现

6.1 概率图、区制划分图和脉冲响应

GiveWin的图形模块可以直接生成时间序列图,如果要从估计结果中提取平滑概率序列并自行绘图,建议导出数据后在Python或Excel中完成。

我自己比较常用的画图组合是:

  • 第一张:原始序列与区制阴影图。把平滑概率大于0.5的时期用阴影标识出来,直接叠在变量序列图上,观众一眼就能看出“哪个时段处于高波动状态”;
  • 第二张:平滑概率折线图。两条或三条概率线,加一个0.5的参考线,简洁清晰;
  • 第三张:不同区制下的脉冲响应图。这是模型解释力的最佳体现——展示同一个冲击在不同区制下的差异化传导路径,也是MS-VAR相对于线性VAR最有说服力的地方。

脉冲响应图建议不要一张图塞三条线,排成上下两格或左右并排,每格一个区制,标注清楚,否则非专业读者容易混淆。

6.2 参数表在报告中的整理规范

报告中的参数表,建议用两套表格来呈现:

  • 主表:各区制截距、自回归系数、方差,加星号标注显著性;
  • 辅表:转移概率矩阵和期望持续期(expected duration)。

期望持续期是一个很容易被忽视但很有信息量的指标。它的计算公式是1除以(1减去对应状态的对角线概率),表示“一旦进入某一区制,平均会停留多少期”。比如对角线是0.9,期望持续期就是10期(月度数据就是10个月)。这个指标比单纯报转移概率直观得多,适合直接写进报告结论。

7. 我的几点实操体会与建议

说实话,MS-VAR这个模型用熟练之后,真正费时间的往往不是估计本身,而是前期的设定选择和后期的结果解释。以下几个经验我认为值得分享:

第一,不要一上来就用最复杂的设定。先用2区制均值转移跑通全流程,再逐步往系数转移和异方差方向扩展,每一步都要确认模型输出在经济含义上站得住脚。

第二,初值一定要花时间。GiveWin的图形界面会让你产生一种“点击即可得到结果”的错觉,但MS-VAR的本质还是非线性优化,初值决定了你最终是得到合理的区制划分还是得到一个垃圾结果。

第三,结果解释要有经济故事。平滑概率图形再漂亮,如果你说不清“为什么这两个区制应该有区别”,模型的价值就会大打折扣。建议每设定一个模型,都先问自己:我预期的区制差异是什么?数据是否支持这个预期?

第四,多模型对比是必须的。至少跑一个线性VAR作为基准,再跑2区制和3区制的MS-VAR,用对数似然值、信息准则、区制划分稳定性这三项做综合判断。纯粹依赖单一模型的输出,风险太大。

第五,Quandt-Likelihood Ratio统计量(或叫LR型区制检验,来自在原假设线性模型下对转移参数不可识别约束的检验)在正式报告里建议一并给出,它能在一定程度上为“模型是否真的需要区制转移”提供统计佐证。虽然这类检验的零分布是非标准的,但在实际汇报中作为一个参考指标很有说服力。

最后再分享一个小技巧:做区制划分的时候,不要只依赖平滑概率0.5这个绝对阈值。把平滑概率画出来以后,观察那些“长时间稳定在0.7以上”和“突然从0.9跌到0.2”的形态差异——后者才是真正的结构变化信号。很多短促的“类锯齿形”概率波动,本质上只是模型在拟合噪声。

所有模型背后的本质都是同一件事:在信号和噪声之间找到一个经济含义清晰、统计上稳得住的分界线。MS-VAR只是把这个任务形式化了,而你作为建模的人,既要有技术判断,也要有经济直觉。两者缺一不可。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进