这套新模型到底解决了什么问题,我这里直接说结论:TVP-Quantile-VAR-DY(简称TVP-QVAR-DY)把三样东西焊死在了一起——时变参数(TVP)、分位数回归(Quantile)、以及Diebold-Yilmaz溢出指数(DY)。过去你要研究金融风险溢出,要么用静态系数VAR算DY指数,得到一条“平均意义”上的溢出曲线;要么用分位数VAR但参数不随时间变化,只能看某个固定区间内的尾部联动。TVP-QVAR-DY的玩法是:让系数本身跟着时间跑,同时又在不同分位数水平上分别建模,最后在每一个时点、每一个分位数水平下都算出一套完整的溢出指数。
这套东西适合谁?金融风险管理岗、宏观金融研究、量化策略团队,还有做系统性风险监测的机构研究者。你手头如果有跨境股票指数、行业板块收益率、或者加密货币与主流资产的高频日度数据,都可以拿它来刻画“市场恐慌时谁在往外传风险、谁在吸收风险”。下面我把从模型结构到实操细节的完整链路拆开讲,包括我自己调试过程中的踩坑记录,尽量让拿到这篇文章的人能直接上手复现。
1. 模型整体设计与思路拆解
1.1 为什么不能继续用普通VAR算溢出指数
经典的Diebold-Yilmaz溢出指数基于标准VAR模型,核心思路是把N个变量的预测误差方差做分解,看第j个变量的冲击对第i个变量预测方差的贡献比例。这个框架本身没有任何问题,逻辑干净、计算高效,但从2014年之后几乎所有做金融风险传导的研究者都在吐槽同一个点:普通VAR的系数是不随时间变化的。
金融市场的联动关系根本不是稳定的。2008年雷曼兄弟倒闭那阵子,全球股市的相关系数几乎一夜之间翻倍;2013年美联储缩减恐慌,资金从新兴市场夺路而逃;2020年疫情冲击下,原油价格波动和权益市场的传导路径跟平时完全不是一回事。固定系数的VAR把这些结构性变化全都平均掉了,算出来的溢出指数是一条“四平八稳”的曲线,它没有办法回答“刚刚发生了什么导致风险传导突然加速”。
这就是TVP(Time-Varying Parameter)存在的理由。让系数随时间平滑变动,捕捉联动关系的缓变和突变。但TVP-VAR有个老毛病——它描述的是条件均值层面的关系,也就是“平均而言,A对B的影响有多大”。可风险管理者最关心的恰恰不是平均状态,而是市场处于压力状态时,比如收益分布在5%分位数以下的时候,传导关系会不会发生质变。
1.2 分位数视角补上了均值模型的盲区
分位数VAR(QVAR)的思路是:我不再假设你只有一个均值方程,而是把整个条件分布切成若干个区间,在每个分位数水平τ上分别估计一个VAR。比如τ=0.05时,模型反映的是“当市场已经处于极端熊市状态时,变量之间的动态关系”;τ=0.5时,反映的是中位数状态下的典型关系。
这个设定对溢出分析的价值是颠覆性的。有两个市场同时暴跌,均值模型可能显示A市场对B市场的溢出只有30%,但在5%分位数下这个数字可能飙升到70%。这种“尾部溢出放大效应”才是系统性风险研究的核心关注点,而普通均值模型根本不给这个信息。
QVAR的局限在于参数估计是静态的。你得到的是“整个样本期内、5%分位数水平下的VAR系数”,它告诉你的是平均意义上的尾部依赖,但没法刻画“2015年股灾期间的尾部溢出”和“2022年俄乌冲突期间的尾部溢出”之间的差异。把这两个时间段混在一起估计,系数只是它们的一个折中。
1.3 TVP-QVAR-DY:把时变结构装进分位数框架再算溢出
所以TVP-QVAR-DY的做法就顺理成章了:用带时变系数的分位数VAR模型作为底层估计框架,在每一个时间点t、每一个分位数水平τ下,得到一组时变的系数矩阵,然后基于这组时变系数计算广义预测误差方差分解,进而在每个时点、每个分位数水平下得到完整的溢出指数矩阵。
这个过程不是简单地把三个模块拼起来。它有几个关键的设计选择值得注意:
第一,时变参数的演化方式。在实践中常用的是随机游走或自回归过程来描述系数随时间的演化。随机游走的好处是灵活度极高,能捕捉到剧烈的结构变化,但代价是可能出现系数的过度波动;带均值回归的AR过程更平滑,但需要额外估计均值回复速度和扰动方差。
第二,分位数回归与贝叶斯估计的融合。TVP-QVAR的估计不能直接用经典分位数回归的线性规划方法,因为参数维度太高且有状态方程约束。实际操作中,几乎都是走贝叶斯路线——用马尔可夫链蒙特卡洛(MCMC)从后验分布中抽样。这里有个关键处理:分位数回归的误差项通常假设为非对称拉普拉斯分布(ALD),贝叶斯推断在这个框架下会方便很多。
第三,溢出指数的动态化。传统DY指数用固定预测步长H的广义方差分解矩阵来构建,比如H=10。TVP-QVAR-DY沿用了同样的思路,但不同的是,这里的方差分解矩阵在每一个时点和每一个分位数水平下都不一样。最后你会得到一个三维的溢出指数序列:时间维度、分位数维度、以及变量间的方向维度。
下面这张表概括了三种模型路径的能力差异,方便对号入座:
| 模型路径 | 时变特征 | 尾部特征 | 溢出指数 | 典型产出 |
|---|---|---|---|---|
| 标准VAR-DY | 不支持 | 不支持 | 静态 | 一条平均溢出曲线 |
| TVP-VAR-DY | 支持 | 不支持 | 动态,均值层 | 时变平均溢出 |
| QVAR-DY | 不支持 | 支持 | 静态,按分位数 | 固定分位溢出 |
| TVP-QVAR-DY | 支持 | 支持 | 动态且按分位数 | 时变-分位-方向三维矩阵 |
2. 核心细节解析与实操要点
2.1 模型方程体系的完整写法
为了便于实操对照,我把TVP-QVAR-DY的模型体系完整写出来。这里假设研究对象的收益率向量为( y_t = (y_{1t}, y_{2t}, \ldots, y_{Nt})' ),滞后阶数为p,分位数水平为τ。
状态方程(系数随时间的演化过程):
[ \beta_t = \beta_{t-1} + u_t, \quad u_t \sim N(0, \Omega) ]
量测方程(分位数回归的VAR形式):
[ y_t = X_t' B_t(\tau) + e_t, \quad e_t \sim ALD(0, \sigma, \tau) ]
其中( X_t )是包含各变量滞后项和截距项的回归矩阵,( B_t(\tau) )是时变系数矩阵在分位数τ下的取值。ALD表示非对称拉普拉斯分布,其概率密度函数可以写成:
[ f(e) = \frac{\tau(1-\tau)}{\sigma} \exp\left(-\frac{e(\tau - I(e<0))}{\sigma}\right) ]
这里有个重要细节:误差项的方差参数σ也可以设成时变的,尤其是在金融收益率数据上,波动率的聚集效应非常明显,如果σ固定,后验估计的效果会受到很大影响。但从简化估计的角度,初版模型可以先让σ固定,后续版本再放开。
2.2 广义方差分解到底是怎么算出来的
溢出指数的核心是从预测误差方差分解(FEVD)入手的。在分位数τ和时间t的条件下,定义:
[ H_t(\tau) = \sum_{j=0}^{H-1} A_j(\tau, t) \Sigma_t(\tau) A_j'(\tau, t) ]
其中( A_j(\tau, t) )是从时变VAR系数中推导出的脉冲响应矩阵,( \Sigma_t(\tau) )是分位数残差的协方差矩阵。广义方差分解的好处是不需要Cholesky分解那样依赖变量排序,直接计算第j个变量对第i个变量的预测误差方差的贡献比例:
[ \theta_{ij,t}^g(\tau) = \frac{\sigma_{jj,t}^{-1} \sum_{h=0}^{H-1} (e_i' A_h \Sigma_t e_j)^2}{\sum_{h=0}^{H-1} e_i' A_h \Sigma_t A_h' e_i} ]
然后行归一化得到:
[ \tilde{\theta}{ij,t}(\tau) = \frac{\theta{ij,t}^g(\tau)}{\sum_{j=1}^{N} \theta_{ij,t}^g(\tau)} ]
总溢出指数就可以定义为:
[ C_t(\tau) = \frac{\sum_{i eq j} \tilde{\theta}_{ij,t}(\tau)}{N} \times 100 ]
实际操作中,A_h矩阵的推导是关键障碍。标准VAR中可以直接从系数矩阵递推,但TVP-QVAR的系数是时变的,一个常见的近似处理是:在计算脉冲响应时,把当前时刻t的系数矩阵当作未来h期内的常数来使用,即“局部稳定性”假设。这个假设的合理性在于,TVP系数的变化速度通常远慢于冲击传导的速度,因此在短预测期H内做局部恒定处理是可以接受的。
2.3 关键参数如何配置
滞后阶数p的选择:在TVP框架下,滞后阶数不宜太大。普通VAR可能用AIC/BIC选到p=2或p=3,但TVP-QVAR的每个滞后系数都是时变的,参数数量非常庞大,p过大直接导致MCMC的收敛速度急剧下降,也容易过拟合。结合我自己的调试经验,日度收益率数据建议从p=1开始试,最多不要超过p=2。
预测步长H的选择:DY指数常用的H是10天。这个参数的敏感性测试建议要做一遍,分别看H=5、H=10、H=20的结果走势是否大体一致。如果H的变化导致溢出指数出现质变,说明模型可能存在不稳定问题,需要回溯检查残差的协方差矩阵是否异常。
分位数水平τ的选择:大部分场景下建议用0.05、0.1、0.5这三档,分别代表极端下行压力、下行压力、典型状态。如果研究对象是波动率而非收益率,可以考虑0.5、0.9、0.95这三档。
抽样次数与老化期(burn-in):MCMC链的长度建议至少跑10000次,其中前5000次作为老化期丢弃。如果模型复杂导致有效样本量不足,可以把总抽样次数提高到20000到30000次。切记要同时跑至少两条链,用来做Gelman-Rubin诊断。
2.4 模型识别的三条注意事项
**注意一:系数扰动的方差不能随意设定。**如果Ω设得过大,系数会剧烈震荡,溢出指数几乎完全被估计噪声主导;如果Ω设得过小,TVP设定名存实亡,系数退化成常数,整个模型退化回QVAR-DY。建议的做法是给Ω一个逆Wishart先验,让数据自己决定时变程度。
**注意二:分位数水平下残差方差的识别。**在分位数回归中,ALD分布的参数存在尺度不确定性问题。为了保持可识别性,通常固定分位数残差的中位数绝对偏差在某个基准水平,或者给σ一个相对紧的先验。
**注意三:变量顺序的敏感性。**虽然广义方差分解不依赖变量排序,但在数值计算中,如果变量之间的相关性极高,方差分解的稳定性依然会受到共线性问题影响。建议在跑模型前先做相关性矩阵检查,对相关系数高于0.95的变量对,考虑是否合并为一个组合变量。
3. 实操过程与核心环节实现
3.1 实施方案选型
落地这套模型,大概率跑不掉MCMC。目前市面上能直接调用的完整TVP-QVAR-DY流程包几乎不存在,实际开发路径基本是两条:
第一条,基于MATLAB的现有TVP-VAR工具包进行改造。Koop和Korobilis整理的TVP-VAR代码质量非常高,结构清晰,分位数部分自己写ALD似然函数然后嵌入MCMC采样器。好处是验证过程相对可控,出问题时可以逐行检查;坏处是分位数VAR的贝叶斯推断需要自己处理很多细节,比如ALD分布的参数化与Gibbs采样器之间的配合。
第二条,跳过现成工具包,直接用R语言自己搭估计流程。R有几个好用的包可以做贝叶斯分位数回归,但要把它们扩展成TVP框架,工作量并不小。我自己的经验是:如果整个模型从零开发,R的调试成本不低于MATLAB,但在数据处理和后处理可视化上,R反而更有优势。
我自己最终采用的是MATLAB改造路线。从Koop-Korobilis的基础框架出发,把核心的量测方程替换为分位数回归形式,并修改MCMC采样器中的似然函数部分。
3.2 分位数方程中的误差项处理
这是改造过程中最关键的一个环节。在标准的TVP-VAR中,误差项被假设为正态分布,因此可以直接用共轭先验做Gibbs采样。但在分位数设定中,误差项是ALD分布,这带来一个常用的技术性技巧:
ALD分布可以表示为正态分布与指数分布的混合。具体地说,如果( e \sim ALD(0, \sigma, \tau) ),那么存在一个潜变量( v ),使得:
[ e | v \sim N(\theta v, \sigma \tau(1-\tau) v), \quad v \sim Exp(1/\sigma) ]
其中( \theta = (1-2\tau)/(\tau(1-\tau)) )。
这个表示的妙处在于,它在条件于潜变量v时可以退化为正态分布的共轭形式,从而可以继续使用标准的Gibbs采样步骤。每次迭代中,先采样潜变量v,再在v的条件下采样系数和方差参数。这个技巧是整个MCMC实现中最值得反复确认的地方,这里错了,后面的一切估计结果都不可信。
3.3 MCMC采样的完整步骤
完整的MCMC迭代流程可以概括为以下几步:
初始化所有参数:设置( \beta_0 )为OLS估计得到的初始值,( \Omega )初始化为( 0.001 \times I ),( \sigma )初始化为收益率样本的标准差。
采样潜变量( v_t ),条件分布为广义逆高斯分布。
在条件于v_t的条件下,利用卡尔曼滤波和平滑算法采样状态变量( \beta_t )。
采样状态方程扰动的协方差矩阵Ω,在逆Wishart先验下,这一步是标准操作。
采样分位数残差方差σ,这步的条件分布也服从逆伽马分布。
重复第2到第5步,直到设定的迭代次数。
每次迭代结束后,记录当前的系数矩阵序列,为后续的溢出指数计算做准备。
3.4 敏感性分析和结果评估
模型跑通之后,必须先做一轮敏感性验证,否则自己心里没底。我建议至少检查下面几个维度:
第一,先验敏感性。把Ω的先验尺度参数调到原来的1/5和5倍,看总溢出指数的走势是否出现质的改变。如果结果对先验极度敏感,说明数据本身对参数的约束能力不足,这时要检查数据长度是否足够、变量个数是否偏多。
第二,分位数交叉检验。用τ=0.1和τ=0.9做对比。如果两个尾部水位的溢出指数走势高度一致,说明所谓的尾部特征可能只是均值效应,模型的实际增量价值有限。
第三,脉冲响应动态检验。随机选取几个时点,比如市场压力期和平稳期各选一个,比较它们在同一个分位数水平下的脉冲响应函数。如果压力期的脉冲响应没有明显放大,需要重新检查ALD分布的尾部参数设定。
第四,与基准模型对比。把TVP-QVAR-DY的结果与TVP-VAR-DY对比,观察在5%分位数下极端尾部溢出的水平是否显著高于均值状态下的结果。如果差异不大,问题不在于模型本身,而是数据选择的问题——你选的资产组合之间可能确实不存在显著的尾部放大效应。
4. 常见问题与排查技巧实录
4.1 MCMC不收敛或收敛极慢
症状:粒子链的轨迹图出现大的漂移,或者R-hat诊断值大于1.1,又或者有效样本量(ESS)低于200。
排查步骤:第一步检查潜变量v_t的采样是否正确,这是我遇到的最常见原因。如果v_t的分布偏差大,后面的系数采样也会陷入局部区域。第二步检查Ω的初始值,太小的Ω会让状态方程在初始阶段锁定一个错误的范围,导致链难以混合。第三步检查是否需要对数据进行标准化,极端差异的量纲尺度会造成系数后验分布极端扁平,拖慢收敛速度。
一个可用的小技巧:先固定σ和Ω,只采样β_t,跑几百次迭代看系数路径是否合理,如果这一步都发散,问题就出在状态空间模型本身,与分位数设定无关。
4.2 估计出的溢出指数振荡太剧烈
症状:溢出指数序列肉眼可见地在20%和80%之间来回穿梭,没有稳定的趋势或周期性,看上去像纯噪声。
原因通常有两个:一个是τ=0.05分位数水平下的有效样本量太小,尾部观测极少,系数估计方差大得惊人;另一个是Ω估计偏大,导致系数在时间维度上过度灵活。
处理方法:适当加大MCMC迭代次数,同时调整Ω的先验,使用更紧的逆Wishart先验设定,降低系数的时变波动速度。另一个比较简单但有效的办法是,在做结果展示前对溢出指数序列做5日移动平均平滑。
4.3 极端分位数下溢出指数反而低于中位数
症状:你预期市场恐慌时溢出放大,结果τ=0.05时算出来的总溢出指数比τ=0.5时还低。
这一开始容易让人怀疑模型错了,但仔细想一下是有可能出现的:如果选中的市场在样本期内没有出现过同步的剧烈下跌,那么高分位数对应的状态向量包含的观测点偏少,信息量不足,估计结果更倾向于收缩。这种情况下要把不同分位数下的有效观测数量列出来,并检查是否有某一段极端行情在样本分割上被排除掉了。
还有一种可能,分位数水平定义的是收益率分布的分位数,而尾部风险传导往往体现在波动率上而非收益率本身。如果你研究的是股票指数日收益率,在极端下跌状态下波动率升高是短期的,但传导关系的改变可能滞后几天。这时可以考虑用已实现波动率替代收益率,或者把预测步长H适当延长。
4.4 方向性溢出指数的符号解释不直观
TVP-QVAR-DY中“A对B的溢出”是广义方差分解比例,这个值永远为正,它表示贡献比例而非因果方向的正负。很多初学者在这个点上会犯迷糊,试图解读为“A对B的溢出是正还是负”。正确的解读是:“B的预测误差方差中有多大比例来自A的冲击扰动”。这个比例高,意味着B在很大程度上被A牵着走,至于A的冲击本身是利好还是利空,并不在这个指数中体现。
做方向性分析时,建议分别计算“定向溢出接收方”和“定向溢出发送方”两个指标。前者是所有其他市场对i的总溢出,后者是i对所有其他市场的总溢出。两者之间的差值可以粗略看作市场的净溢出地位。
4.5 数据处理阶段必须避开的坑
滞后阶数选取之前,必须先做平稳性检验。虽然时变参数的框架对非平稳数据有一定程度的容忍性,但极度偏离平稳状态的数据会让MCMC的数值稳定性显著变差。价格类数据一律先取对数差分。
另外,节假日的处理要提前想好。跨国资产组合中,不同市场节假日不一致,直接使用自然日对齐会造成收益率序列中出现异常零值,这些零值会扭曲分位数模型在极端分位数下的估计。建议采用交易日对齐后的收益率序列,或者在模型中加入虚拟变量消除节假日效应。
5. TVP-QVAR-DY能做什么,以及它还差什么
5.1 三个最有价值的应用场景
**场景一:系统性风险监测的早预警。**与均值溢出相比,尾部溢出指数对风险的响应更前置。在实际研究中,我观察到宽松货币政策环境下尾部溢出指数会领先均值溢出指数上行,说明市场在积累脆弱性。这种特征可以被用来构建风险预警信号,在尾部溢出指数超过历史90分位阈值时提高风险预警等级。
**场景二:投资组合的极端风险传导分析。**传统均值框架下的相关性矩阵在危机期间严重失真,基于它做资产配置会低估组合尾部风险。TVP-QVAR-DY输出的动态尾部溢出矩阵,可以直接用于压力测试场景设计,或者作为构建最小尾部连通性组合的输入数据。
**场景三:政策效果的时变评估。**当中央银行实施非常规货币政策后,市场之间的风险传导路径是否发生结构变化,变化是发生在常态区间还是尾部区间?这类问题无法用静态模型回答,TVP-QVAR-DY的时间维度和分位数维度正好能交叉定位政策冲击的响应区间。
5.2 不同分位数溢出的解读框架
建议把所有分位数水平的溢出指数放在一张热力图上,横轴为时间、纵轴为分位数水平、颜色为溢出强度。你会看到风险传导呈现明显的“带状结构”——在极端分位数下颜色普遍更深,说明尾部风险溢出的强度系统性高于均值层。
当这种“带状结构”在某一段时间内急剧变宽时,说明市场对极端尾部事件的敏感度在上升。同时,观察不同分位数之间溢出指数的差距是否收敛,可以判断市场是否处于一种“对信息高度敏感”的状态,这种状态下任何一个局部冲击都可能被快速扩散为系统性问题。
5.3 模型的局限和改进方向
坦率地讲,这套模型的局限很明显。第一,计算成本巨大。三维时变结构的MCMC在100个变量以内还算可以接受,但如果扩展到行业层面或微观层面的面板数据,计算时间会呈指数级上升。第二,分位数水平的离散选择是一个人为设定,实际上尾部状态是一个连续过程,把它切成几个离散的τ值会损失连续性的信息。第三,模型仍然是线性结构,只是系数随时间变化。如果市场存在非线性的阈值效应,比如超过某个门槛后传导关系发生突变,TVP-QVAR-DY会用渐进平滑的时变系数去逼近这种突变,容易把突变拉平成渐变。
后续改进可以考虑的方向包括:把状态方程改成带马尔可夫区制转移的设定,让系数在“温和区制”和“恐慌区制”之间切换;引入DCC-GARCH结构来建模时变方差协方差矩阵,替代目前对方差协方差做静态或简单随机游走假设的方案;还可以考虑用变分贝叶斯代替MCMC,大幅提升高维场景下的计算效率。
拿我自己跑过的案例来说,我拿欧洲、美国、日本、中国四个股票市场指数,以及WTI原油和黄金,六个变量做日度收益率分析,样本跨越近15年。在τ=0.05、H=10、p=1的设定下,MCMC链跑20000次需要大概数小时量级的计算时间。但产出的结果非常有信息量,最典型的发现是中国A股在极端下行区间的溢出接收比例显著高于中位数区间的水平,说明国内股市在危机状态下的对外部冲击暴露程度远高于常规状态,这个结论用传统均值溢出模型完全看不出来。
关于这套模型,我自己最深的体会是:模型的复杂度本身不是卖点,关键要在实证结果中看到均值模型看不到的新信息。如果你调完参跑完模型,得到的结论和TVP-VAR-DY没有本质区别,那绝不是数据的问题,而是你的资产组合选取或分位数设定需要重新思考。建模这件事,模型是手段,问题和数据才是起点。先把你的研究问题用一句话说清楚,再去调分位数、调滞后阶数,方向对了结果自然不会差。
如果你正在考虑把这套方法用在自己的研究或工作里,我的建议是:先用相对简单的样本组合跑通流程,比如5到6个变量、单一分位数、较短的时间跨度,确保MCMC收敛和溢出指数计算逻辑都正确,再逐步扩展维度。这套模型对数据和计算的耐心要求都挺高,但一旦跑顺了,你会发现它在捕捉市场状态切换方面确实有传统模型替代不了的优势。后续如果再摸索出更高效的计算技巧或者新的改进方向,我会再写文章更新。