做金融时间序列的人,最近应该没少听到“溢出指数”这个词。尤其股票、债券、商品、行业指数混在一个系统里的时候,大家关心的早已不是单资产收益,而是“谁在向谁传递风险”。经典做法是 Diebold-Yilmaz 的溢出指数,再升级一点就是 TVP-VAR-DY 动态连接模型。可问题也很现实:当资产数量从十几个涨到四五十个,普通 TVP-VAR 的参数会膨胀到根本没法估计。
我后来真正在项目里跑通的是 HD-TVP-VAR-DY,也就是高维多变量溢出指数。它的核心思路并不复杂:在时变参数 VAR 的框架里引入 Elastic Net 惩罚,用“少量偏差换方差”的方式,把高维系数估计拉回稳定区间。这篇文章我会从原理、模型设计、代码实现到实战踩坑,完整拆一遍这套方法,适合正在做多资产风险传染、行业联动或者宏观金融网络的人参考。
1. 溢出指数为什么一到高维就失灵
1.1 Diebold-Yilmaz 的底子:“方差分解”到底在拆什么
Diebold-Yilmaz 溢出指数(通常简称 DY 指数)的核心,是预测误差方差分解。听起来复杂,但本质就一句话:当系统里某个资产受到一个冲击后,这个冲击带来的预测误差,有多少比例是被“自己”解释的,又有多少比例是被“别人”解释的。
假设一个 K 个变量的 VAR(p) 模型,估计完之后可以转化成 VMA(∞) 的形式,然后做 H 步预测误差方差分解。得到的结果是一个 K×K 的矩阵,元素 θ_ij 表示变量 j 的冲击对变量 i 的预测误差方差的贡献比例。把矩阵按行归一化之后,就能得到方向性溢出指标:
- 总溢出指数 TCI:系统中所有“跨变量”贡献之和占全部预测误差方差的比例;
- FROM 溢出:某个变量 i 的方差中,来自其他所有变量的部分;
- TO 溢出:某个变量 i 对其他所有变量的总贡献;
- NET 溢出:TO 减去 FROM,描述这个变量是风险的“净发射方”还是“净接收方”;
- 配对溢出:两两资产之间的净传导,可以画成网络图。
这个方法被广泛使用,因为它不依赖变量顺序。普通 Cholesky 分解对变量顺序很敏感,而 DY 用的是广义预测误差方差分解(GFEVD),结果更稳健。这也是为什么它成了风险传染和宏观联动研究的“默认工具”。
1.2 TVP-VAR-DY:滚动窗口的进化版
原始的 DY 方法用的是滚动窗口估计 VAR。选一个窗口长度,比如 200 天,在窗口里估计 VAR,算一次溢出指数,然后窗口往前滚一天。这样确实能观察到溢出指数随时间的变化,但问题也很明显:
- 窗口长度不好选。窗口太短,单次估计方差大;窗口太长,结构变化又被平均掉了;
- 每次滚动窗口里的样本高度重叠,导致相邻两天的指标序列高度自相关,看着平滑,实际很多是“假平滑”;
- 一次只能得到一个时间点的估计,没法刻画系数在窗口内部的连续变化。
TVP-VAR-DY 的主要改进,就是不再用等权重滚动窗口,而是对所有历史观测施加一个指数衰减权重。越靠近当前时刻的观测,权重越大;离得越远,权重越小。这样每个时点都对应一组“更关注近期”的系数,参数随着时间连续演进,不需要人为选择窗口长度,只用选一个衰减系数 η(通常叫 forgetting factor)。
这个思路在低维系统里已经很成熟。但资产数量一多,新的麻烦就来了。
1.3 高维瓶颈:参数多了,故事就编不下去了
先说一个简单的账。一个 K 变量、滞后阶数 p 的 VAR,单条方程里要估计的系数是 1 + Kp 个,整个系统还要乘以 K。也就是说,总系数个数是 K(1+Kp)。
如果 K = 10,p = 2,一共是 10 × 21 = 210 个系数,用几百期日频数据还能接受。但如果 K = 50,p = 2,总系数数就到了 50 × 101 = 5050。这还是在系数不随时间变化的前提下。一旦变成 TVP,每个时点都要有一组这样的系数,而每个时点实际“有效”的衰减后样本可能只有几十到几百期。用几百个样本去估计五千多个系数,结果只有两个:要么过拟合得一塌糊涂,要么压根估不出来。
更麻烦的是残差的方差协方差矩阵也是时变的,维度同样是 K × (K+1)/2。K = 50 时这是 1275 个自由参数。如果不加任何约束,整个系统处于“数据根本撑不起来”的状态。
所以高维溢出指数缺的不是新理论,而是一个能把参数数量压下来、同时又保留“哪些变量之间确实有连接”这个信息的估计方法。Elastic Net 正好补上了这个位置。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Elastic Net 为什么能救场:HD-TVP-VAR-DY 的设计逻辑
2.1 两个惩罚一起上:L1 管稀疏,L2 管稳定
Elastic Net 是 Lasso 和 Ridge 的混合物。Lass
