做宏观实证或者金融时间序列的人,十有八九会遇到同一个尴尬:样本区间明明横跨了高波动期和低波动期、政策扩张期和收缩期,却还要硬着头皮用一套固定参数的VAR去“代表”整个时期。结果往往是残差方差忽大忽小,系数不稳定,经济学解释要么牵强要么自相矛盾。马尔科夫区制转移向量自回归模型(MS-VAR)就是为这个场景准备的——它让模型在不同区制(状态)之间切换,区制内的均值、截距、自回归系数甚至协方差矩阵都可以不一样,同时用一组转移概率刻画区制之间的轮换机制。这篇文章不准备堆矩阵公式,而是把MS-VAR在GiveWin环境下的完整实操路径讲清楚:数据怎么整理、模型怎么设定、估计选项怎么选、输出结果怎么读,以及我前后换过几轮操作后踩坑换来的经验。适合正在做非线性时间序列、准备把区制转移写进论文但还没落地过代码的研究生和产业分析人员。
1. 先用一张直觉图理解MS-VAR:它到底“转移”了什么
1.1 固定参数模型的短处,正是区制转移建模的长处
普通VAR的标准写法是 y_t = c + Φ1 y_{t-1} + ... + Φp y_{t-p} + ε_t,ε_t ~ N(0, Σ)。这里的关键是:无论样本区间怎么延长,模型的截距、系数、残差方差都默认保持不变。问题在于宏观金融数据在大多数时候并不支持这个假设。比如某个货币政策的紧缩期,利率上行、波动率放大,变量间的传导强度明显高于平稳期——固定参数VAR会把这种差异平均掉,估计出来一个“四不像”的中间状态,既无法反映紧缩期的紧张,也无法反映平稳期的松弛。
MS-VAR的处理方式很直接:引入一个离散的隐状态变量 s_t,取值范围是1到M(M为区制个数),s_t不可直接观测,但控制着当前的模型参数。假设有2个区制,模型就可能写成:
当 s_t = 1 时,y_t = ν1 + Φ1_1 y_{t-1} + ε_t,ε_t ~ N(0, Σ1); 当 s_t = 2 时,y_t = ν2 + Φ2_1 y_{t-1} + ε_t,ε_t ~ N(0, Σ2)。
换句话说,“转移”的是回归函数的形态和残差的分布。这套思想最早用于刻画经济周期扩张期与收缩期的非对称性,后来被大量用于股市牛熊状态、通胀高低切换、利率政策体制这类问题。实际应用中,区制不一定只有两个,三区制也常见,比如“低波动-中波动-高波动”的结构。
1.2 转移概率矩阵和“这个区制会持续多久”
区制之间的切换由一个马尔科夫链控制,转移概率写成 p_ij = P(s_t = j | s_{t-1} = i),即上一期为i状态下本期跳到j状态的概率,所有概率构成M×M的转移矩阵。每个区制的持续时间可以算一个很直观的指标——期望持续期 d_i = 1 / (1 - p_ii)。这个值在解读结果时非常有用:比如某个高波动区制的对角概率 p_ii = 0.9,说明它平均持续 1/(1-0.9) = 10 期,如果数据是季度数据,就是平均持续两年半。写论文的时候,这个数字比单纯报一个参数更能讲成故事。
1.3 MS-VAR、普通VAR和门槛VAR(TVAR)的差异
很多人会纠结MS-VAR和VAR、TVAR的关系,我列一张表直接说明:
| 模型 | 区制切换方式 | 区制是否已知 | 估计方法 | 典型适用场景 |
|---|---|---|---|---|
| 固定参数VAR | 无切换 | 不涉及 | OLS/极大似然 | 平稳单一的样本期 |
| TVAR(门槛VAR) | 按某个可观测基准变量是否超过阈值 | 切换时点已知 | 条件极大似然 | 明确存在规则性阈值,如通胀目标区间 |
| MS-VAR | 由隐状态分布驱动,按转移概率轮换 | 切换时点未知,靠估计推断 | 极大似然+滤波/平滑 | 扩张收缩交替、牛熊市切换、波动率体制变化 |
选择时要搞清楚一个问题:你知不知道样本里“什么时候换了状态”?如果知道,用门槛确实方便;如果不知道,只能靠模型从数据里反推,这就是MS-VAR的用武之地。GiveWin环境里同时支持这些模型的估计,但实际流程差异很大,建议把MS-VAR当作一套独立的工具链来配置,下面就从环境搭建开始讲。
2. 别把GiveWin工具用反:环境搭建与建模数据组织
2.1 GiveWin在MS-VAR实操中的真实角色
先说一个容易被刚上手的同学误解的地方:MS-VAR并不是点击GiveWin某个菜单按钮就直接出结果的。GiveWin是OxMetrics套件中的数据管理、绘图与批处理界面,它的强项是看数据、整理数据、画图,以及把结果可视化;而MS-VAR的估计算法,是由Ox环境中的MSVAR统计程序包实现的。正确的工作方式是用GiveWin完成数据加载、变量转换、图形初步检查,再借助Ox编程调用MSVAR程序包完成估计。理解这个分工,后面出了问题才不至于在界面里瞎找。
一个常见的环境验证方法是:打开OxMetrics安装目录下自带的示例数据和工作文件,运行一次线上自带的MSVAR示例程序,如果输出正常生成平滑概率序列和参数表,说明GiveWin、Ox、程序包三者的协作已经打通。我见过不少人在这一步卡住,原因是只装了界面软件,却没装Ox组件或程序包不完整。
2.2 环境搭建清单与路径检查要点
按下面这个顺序走,基本能规避一半以上的环境问题:
- 安装OxMetrics套件,确保安装过程中把Ox语言组件一并装上;
- 确认默认程序包存放目录存在,并且MSVAR程序包已经复制到该目录下,路径中不要出现中文和空格;
- 启动GiveWin,打开一个现有数据文件,确认能正常读取和绘图;
- 运行MSVAR自带的练习示例,观察命令窗口是否报错;
- 检查保留工作路径,保证后续代码和数据文件能互相找到。
这里有个细节:Ox程序包版本和Ox语言版本需要匹配,否则会出现“函数未定义”“程序包版本过旧”一类的错误。升级软件时不要只升级界面,最好连Ox和程序包一起更新。
2.3 用GiveWin构建标准建模数据集
数据格式是MS-VAR建模最容易栽跟头的环节。推荐的做法是:把分析所需的内生变量放在同一个数据文件中,格式为第一列时间、后续列变量数值,时间列用文字或数值都可以,但必须连续且没有缺行。如果数据中有缺失值,用空值占位,避免用0代替,否则模型会把0当成真实观测。
文本变量命名建议使用y1、y2、y3这类短名称,或者与含义对应的英文缩写。模型中需要用到的变量可能包括:经济增长率、失业率、利率、通胀率、股市收益等。在GiveWin中打开后,建议做两件事:一是看原始的时间序列图,确认是否有明显趋势段、突变段;二是做基础的描述统计,初步判断哪些变量可能存在单位根。单位根处理通常用对数差分完成,比如价格类指标取对数后再一阶差分得到近似的增长率。这里强调一点,利率、失业率这类本身在合理区间波动的比率变量,很多情况下可以直接进入模型,不必强行差分,否则反而会丢失水平值中包含的信息。
3. 在GiveWin中跑通第一个MS-VAR:从数据导入到参数输出
3.1 以一组宏观变量为例完成数据转换
假设我的研究问题是“某个经济体的增长和通胀之间是否存在区制转移”,内生变量选择 y1(实际GDP对数差分,近似增长率)和 y2(通胀率或CPI对数差分)。数据是季度频率,给出一段约30年、上百个观测的样本。在GiveWin中完成加载后,我通常先生成差分变量,再画两条序列的叠图,确认样本区间覆盖了几轮明显的扩张收缩,才继续往下走。
需要特别提醒的是:给后期模型识别提供足够的“事件样本”。如果一个数据文件里只有一轮高波动期,只有十几个观测停留在这个区制,估计出来的区制概率往往不稳定。条件允许时,尽可能把样本区间拉长,至少覆盖三次以上的“切换事件”,模型才能比较稳定地“看到”区制全貌。样本量不足时,不建议强行设定3个区制,2个区制反而是更稳妥的起点。
3.2 区制数M与滞后阶数p怎么定
这两个参数决定整个模型的规格,我建议用两阶段策略。第一阶段,先用普通VAR估计数据,用AIC/BIC选择滞后阶数。这一步在GiveWin或统计软件里都很容易完成,不必急着上非线性模型。第二阶段,结合经济直觉确定区制数M。如果主题是牛熊市,M=2足够;如果主题是政策周期的细分,可以考虑M=3,但三区制的参数数量增长很快,需要更长的样本支撑。
模型类型的选择也很关键。MS-VAR常见的变化形式包括:
| 记号 | 切换内容 | 含义 |
|---|---|---|
| MSM | 均值切换 | 平稳变量均值随区制变化 |
| MSI | 截距切换 | 条件均值随区制变化,适合非平稳多变量 |
| MSH | 异方差切换 | 仅残差协方差随区制变化 |
| MSIAH | 截距+系数+方差全切换 | 设定最灵活,参数最多 |
| MSMH | 均值+方差切换 | 波动区制识别常用 |
经验法则:优先尝试MSIH或MSI,除非经济理论明确要求系数跨区制改变,否则不要一上来就上MSIAH。参数越多,收敛越难,解释越复杂。我的实际操作中,MSIH带VAR(2)两变量两区制是一个相当稳的起点。
3.3 Ox代码估计MS-VAR:一个可复制的程序框架
在GiveWin中,估计环节的载体是Ox代码。下面给出一个程序框架,具体函数名称和参数顺序必须以自己安装的MSVAR程序包说明为准,但代码结构是通用的:
#include <oxstd.h> #import <packages/msvar/msvar> main() { decl vY, iM, iP, iModelType, mResults; // 加载数据:示例中的y变量矩阵 vY = loadmat("mydata.xls"); // 读取数据 // 也可以从GiveWin工作文件直接读入 iM = 2; // 区制数 iP = 2; // 滞后阶数 iModelType = 4; // 对应MSIH类模型 // 调用估计函数,基于EM算法/极大似然 // 结果中包含转移概率矩阵、区制平滑概率、VAR系数等 }程序的关键点在于三处:一是数据读取要确认行数、列数与设定一致;二是模型类型参数与你的设定一致;三是输出的结果对象要能提取出平滑概率序列。很多示例文件的末尾会画出平滑概率图,这就是检验估计是否成功最直观的标准。
3.4 输出参数表怎么读:先看两块
估计结束后,GiveWin或Ox输出窗口会列出完整参数表。不要被大堆数字吓到,我建议按两个层次看。第一层是转移概率矩阵和区制持续时间,看区制是否足够“可分离”——如果一个区制的持续期只有两三个季度,说明它可能只是罕见冲击,而不是稳定的区制。第二层是VAR系数表按区制分块,先看截距项和方差项是否有明显差异,如果两个区制的方差几乎一样,那不如退回固定参数的VAR。
再补充一个判断标准:对数似然值和信息准则。将相同数据下线性VAR的对数似然值同MS-VAR对比,差值近似服从卡方分布,自由度等于两模型参数个数之差,可以做一个LR检验。这个检验在论文中非常常用,但要注意样本量不足时LR统计量可能偏大,要谨慎解读。
4. 结果解读与论文级输出:平滑概率、转移矩阵、MS脉冲响应
4.1 转移概率矩阵的两种读法
读转移矩阵时,行代表当前期所在区制,列代表下一期转移到的区制。例如2×2矩阵中第一行第二列元素 p_12 就是从区制1转移到区制2的概率。行元素之和应为1。除了看转移概率本身,还建议计算矩阵的稳态分布(非条件概率),方法是对转移矩阵求特征值1对应的左特征向量,也可以通过长时间模拟近似得到。稳态分布在对比区制“长期占比”时非常直观,比直接看平滑概率更合适。
期望持续期在前面已经讲过,这里补充一个写作技巧:把持续期换算成自然单位。如果是季度数据,4期就是一年;如果高波动区制期望持续期是8期,就等于2年,翻译成文字结论才是“平均每两年切换一次高波动状态”。
4.2 平滑概率图:锁定区制时间段
平滑概率 P(s_t = i | 全部样本) 是在利用全部信息后,估计的每个时点落入某个区制的概率,这是MS-VAR最核心的输出。GiveWin中可以把平滑概率保存为序列,再打开折线图,叠加0.5参考线。约定大于0.5视为处于该区制,就能比较客观地把整个样本区间切成一段一段的区制状态。
实操中一个很方便的做法:把两个区制的平滑概率曲线画在同一张图里,再用竖线把“大概率处于区制1”和“大概率处于区制2”的区间分开,最后把某核心变量的实际走势图放在下方。这样论文审稿人一眼就能看出区制识别和经济直觉是否吻合。这里有个判断经验:如果平滑概率频繁剧烈抖动、在0.4到0.6之间来回穿梭,说明区制识别并不稳定,这可能意味着区制数太多、变量选择不好或滞后阶数不合适。
4.3 区制脉冲响应的两个误用雷区
MS-VAR的脉冲响应比普通VAR复杂得多,新手最容易踩雷。首先,普通VAR的正交脉冲响应隐含“变量冲击发生后,模型参数保持不变”的假设,这在MS-VAR里是不成立的——因为区制本身会随时间按转移概率变化。因此在解读时,不能直接拿普通VAR的脉冲响应思维套用。
常见的做法有两种。一种是区制特定的脉冲响应(regime-specific IRF),它以当前区制为条件,计算对该区制给定冲击变量一个标准差冲击后,未来各期响应变量的期望变化;另一种是广义脉冲响应,它对区制转移路径作了平均。在GiveWin和MSVAR输出中,两种结果可能以不同命令给出。建议写论文时明确说明用的是哪一种,并在脚注中补充“计算过程中是否考虑了区制转移路径的不确定性”。我个人的习惯是以广义脉冲响应的结果为主,辅以区制特定结果作为稳健性检验。
4.4 论文中常见的一套标准化输出
把结果组织成写作素材,我建议固定输出以下五样东西:
- 平滑概率图(两区制叠加+参考线);
- 主要变量实际序列与识别出的区制区间叠图;
- 转移概率矩阵表格,包含稳态概率和期望持续期;
- 分区制的参数估计表(截距、系数、方差);
- 线性原假设下LR检验的结果。
这五样东西基本能满足论文实证部分的需要。如果审稿人要求稳健性检验,再补充不同区制数(如M=3)、不同滞后阶数(p=1或p=3)的结果,并在文章中讨论差异。
5. 实操踩坑记录:估计不收敛、概率边界、样本量不足
5.1 估计不收敛或频繁遇到局部最大
这是使用MS-VAR最常见的问题。现象是迭代很多次后对数似然值仍然没有稳定,或者每次从不同初始值出发得到不同的参数。原因是极大似然函数在区制混合模型下是非凸的,存在多个局部极大点。
我的处理顺序是从简单到复杂。先设置多个初始值,比如把线性VAR估计出的系数作为起点,加入轻微的扰动后再启动EM算法。其次,尝试更换优化器,MSVAR包里通常提供多种数值优化方法,可以逐个测试。如果还是不收敛,降低模型复杂度,把MSIAH改成MSIH,把三区制改成两区制,往往立刻见效。还有一种“接力”技巧:先用约束较少的模型估计得到参数,再把这些参数当作更复杂模型的初始值,这样能明显加快收敛速度。
5.2 转移概率估计值粘在0或1边界
当某个转移概率被估计成0.000或1.000时,表面上看是“永远不会转移”,但这是典型的边界问题,应该引起警惕。出现这种情况通常有两种原因:一是样本期内某个区制的发生次数极少,数据无法给出可靠的转移估计;二是两个区制实际上差别不大,模型强迫它们分离。
应对办法:优先检查样本期间区制的观测数是否足够;如果某个区制只出现了十几次,就要谨慎地承认数据信息不足。其次,考虑减少区制数量或给转移概率施加约束(比如约束对角线概率的最小值),避免估计值停在边界。在报告时也要注明:某区制样本过少,转移概率的估计结果不意味着对未来的长期预测推断应当保守。
5.3 自由度不够、样本量不足怎么破
MS-VAR的参数数量增加非常快。假设有k个内生变量、p阶滞后、M个区制、模型类型MSIAH,需要估计的自回归系数就有 M×p×k^2 个,加上截距项、方差项和转移概率,这在样本只有几十个观测时根本不可能稳健估计。
我的经验法则是:每个区制至少保证接近20个观测,总样本不低于50个,并且自主回归系数个数不要超过总观测的一半。如果数据长度不够,优先砍变量而不是砍区制。变量从三个减到两个,参数数量会大幅下降,而且模型更稳定。另一个可行思路是选择只切换方差(MSH)或只切换截距(MSI)的简约模型,这样同样能刻画区制性波动,但参数压力小得多。
5.4 区制标签反向是怎么回事
估计结果有时会让你陷入困惑:标记为“区制1”的高波动区制,从平滑概率图来看却对应着低波动时期。这不是程序出错,而是区制标签没有被唯一识别。马尔科夫切换模型本质上允许区制标签整体互换:如果把区制1和区制2的名称交换,转移矩阵和参数表也会对称地变化,似然值完全相同。
解决办法是在估计前为某个参数加入符号或大小的识别约束,比如约定“区制1的方差小于区制2的方差”,或者“区制1中某变量的均值小于区制2”。这类约束在MSVAR程序包的设置选项里通常可以指定。我习惯在估计后额外检查平滑概率图与变量实际走势是否吻合,如果发现标签反向,就调整约束重新估计。
5.5 GiveWin与Ox路径相关的环境问题速查
环境问题虽不涉及建模原理,但很消磨耐心。常见的有三种:一是提示找不到程序包或函数,多半是程序包没放进正确目录;二是数据文件打不开,检查是否从Excel另存为兼容格式,路径中是否有中文;三是图形输出不正常,请检查默认输出设备设置,或者尝试把图形导出为图片格式再使用。
我把常见问题整理成速查表:
| 现象 | 判断方向 | 处理方式 |
|---|---|---|
| 找不到程序包 | 环境路径未配置 | 复制程序包到Ox默认目录并重启 |
| 数据读取异常 | 格式或路径问题 | 另存为标准格式,移去中文路径 |
| 估计无法收敛 | 模型复杂或起点差 | 调整起点、简化模型类型 |
| 转移概率边界 | 样本不足或区制重叠 | 减少区制,添加约束 |
| 区制标签反向 | 无识别约束 | 设定均值/方差排序约束 |
6. 我的个人经验小结
做了不少区制转移相关的实证工作之后,我的体会是:MS-VAR真正出彩的地方不是参数表里的数字,而是它把“非线性”“结构变化”和“经济故事”缝合在一起的能力。即使是最简单的两区制MSIH模型,只要平滑概率图和实际经济背景对得上,整个实证的叙事就有了灵魂。另一个深刻教训是,建模前把数据、阶数、区制数和模型类型这几个前置决策写下来,比直接上手跑代码重要得多;模型设定三心二意,后面所有结论都容易被质疑。此外强烈建议写一个小的批处理脚本,把从数据加载、估计到输出图形的全流程固化成可复现的操作,这样回头调整参数或应对审稿意见时,效率会高很多。
最后再分享一个小技巧:估计完成后,不要轻易丢弃初始假设。把这一轮得到的参数作为下一轮更复杂模型(比如两区制升级到三区制)的初始值,通常能显著加快收敛,也能帮助判断模型复杂度是否真正被数据支持。对刚开始接触MS-VAR的人来说,把一个小而完整的案例反复跑通、读懂每一行输出,比追求复杂的模型更有价值。