ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

VECM向量误差修正模型实战:从协整检验到滚动监控的Python落地指南

VECM向量误差修正模型实战:从协整检验到滚动监控的Python落地指南 简介这份资源面向宏观经济与金融时间序列分析的学习者和研究者聚焦向量误差修正模型VECM的MATLAB实现用于处理多变量非平稳数据间的长期均衡与短期调整关系。压缩包共4个文件均为m脚本整体约2KB涵盖Johansen共整合检验、误差修正项构造、动态ECM建模与估计等核心环节可辅助完成从数据预处理、模型设定到结果分析的全流程练习。已有488人学习下载适合需要动手复现VECM建模步骤、理解共整合与误差修正机制的中高级读者参考。通过运行这些脚本读者可掌握变量间长期均衡关系的检验方法、短期动态调整系数的解释思路并据此开展预测与政策评估是学习多变量时间序列建模的实用工具。1. 从一组不平稳的价差说起VECM 到底在修正什么很多人第一次接触 VECMVector Error Correction Model向量误差修正模型是在做配对交易或者多品种价差监控的时候。你手里有两支股票、两个期货合约或者两个地区的现货价格它们各自看单序列都不平稳一阶差分之后才平稳但你又清楚地知道它们长期不该无限拉开——价差总会被套利、库存、运输成本这些力量拽回来。这时候直接上 VAR 做差分建模短期动态是干净了可长期那根“橡皮筋”被差分丢掉了模型永远不知道两个序列偏离太远时该往回走。VECM 就是补这根橡皮筋的它在差分 VAR 的基础上额外加一项误差修正项把长期均衡关系写进方程让短期波动围绕长期均衡调整。ecm模型、误差修正模型这套东西本质是在回答“偏离均衡后多久、以多快速度、由谁来修正”。它适合做价差回归、跨市场传导、库存与价格联动这类既有长期锚、又有短期噪声的场景。下面我按自己落地的顺序把选型、协整检验、建模、诊断和避坑讲清楚。2. 建模前必须想清楚的三件事平稳性、协整与滞后阶2.1 为什么不能直接对原始序列跑 VARVAR 要求序列平稳否则 t 统计量、F 统计量全部失真脉冲响应也不收敛。但经济金融里绝大多数价格、指数、库存序列都是 I(1)也就是本身不平稳、一阶差分平稳。直接对 I(1) 跑 VAR常见后果是伪回归R² 很高系数看着显著实际是共同趋势造成的假象。差分之后跑 VAR 又丢掉了水平信息无法刻画长期关系。VECM 的定位就在这两者之间它承认序列是 I(1)但假设它们之间存在协整也就是某个线性组合是 I(0)。这个线性组合就是误差修正项记作 βY_{t-1}β 是协整向量代表长期均衡系数。2.2 协整检验Johansen 的两种设定别选错判断能不能上 VECM核心是协整检验。工程上最常用 Johansen 迹检验和最大特征值检验。实操里最容易翻车的不是看不懂统计量而是确定性趋势设定选错。Johansen 提供五种设定我一般先看序列图如果原始序列没有明显线性趋势协整方程里也不该有趋势项用“协整方程有截距、VAR 无趋势”这一档如果序列有确定性趋势再考虑带趋势的设定。设定选错协整秩会直接判错后面全盘皆输。设定协整方程VAR 部分适用场景情形1无截距无趋势无序列均值为零极少用情形2有截距无序列无趋势、均值非零最常用情形3有截距有线性趋势序列有确定性趋势情形4有截距有趋势有线性趋势趋势在协整关系内情形5有截距有趋势有二次趋势罕见慎用2.3 滞后阶怎么定别只看 AICVECM 的滞后阶指的是差分项的滞后阶对应水平 VAR 的阶数减一。定阶常用 AIC、BIC、HQ但三者经常打架。我的习惯是先看 BIC它惩罚更重、模型更简洁样本不大时更稳如果残差还有自相关再往 AIC 方向加一阶。定完阶一定要做残差白噪声检验否则脉冲响应和方差分解都不可信。样本量小的时候宁可少一阶也不要为了显著性硬加参数估计方差会爆炸。3. 用 Python 跑通一个 VECM 的最小可复现流程3.1 数据准备与平稳性检验先准备两个 I(1) 序列这里用 statsmodels 自带的宏观数据演示换成你自己的价差对即可。关键是先做单位根检验确认都是 I(1)再进协整。import numpy as np import pandas as pd from statsmodels.tsa.vector_ar.vecm import coint_johansen, VECM from statsmodels.tsa.stattools import adfuller # 读取两个价格序列index 为时间 df pd.read_csv(prices.csv, index_col0, parse_datesTrue) data df[[price_a, price_b]].dropna() # 对每个序列做 ADF确认 I(1) for col in data.columns: stat, pval, *_ adfuller(data[col], autolagAIC) print(f{col} 水平 ADF p{pval:.4f}) stat_d, pval_d, *_ adfuller(data[col].diff().dropna(), autolagAIC) print(f{col} 一阶差分 ADF p{pval_d:.4f})逻辑说明ADF 原假设是存在单位根。水平检验 p 值大、差分检验 p 值小才说明是 I(1)。参数上 autolagAIC 让检验自动选滞后避免人为设定偏差。如果水平检验就拒绝单位根说明序列本身平稳直接 VAR 即可不必上 VECM。3.2 Johansen 协整检验与协整秩确定# det_order0 表示协整方程有截距、VAR 无趋势对应情形2 # k_ar_diff 是差分项滞后阶先设 1后续再调 jres coint_johansen(data, det_order0, k_ar_diff1) print(迹统计量:, jres.lr1) print(5% 临界值:, jres.cvt[:, 1]) print(最大特征值统计量:, jres.lr2) print(5% 临界值:, jres.cvm[:, 1]) # 协整秩 r迹统计量大于临界值的个数 r int(np.sum(jres.lr1 jres.cvt[:, 1])) print(判定协整秩 r , r)逻辑说明lr1 是迹统计量cvt 是临界值表第二列是 5% 水平。从 r0 开始逐个比较第一个统计量小于临界值的位置就是协整秩。参数 det_order 必须和前面设定一致k_ar_diff 要和最终建模的滞后阶对齐否则检验和模型不自洽。协整秩为 1 是最常见的场景意味着两个序列有且只有一条长期均衡关系。3.3 拟合 VECM 并读取误差修正项# 用确定的协整秩和滞后阶拟合 model VECM(data, k_ar_diff1, coint_rank1, deterministicci) res model.fit() print(res.summary()) # 提取协整向量 beta 和调整速度 alpha beta res.beta alpha res.alpha print(协整向量 beta:\n, beta) print(调整速度 alpha:\n, alpha)逻辑说明deterministicci 表示协整方程内有截距、VAR 无趋势和检验设定对应。beta 是长期均衡系数alpha 是调整速度衡量每个变量对偏离均衡的响应方向和强度。alpha 的符号很关键至少有一个 alpha 显著且符号正确通常为负表示往回拉否则协整关系没有实际修正力模型只是统计上的巧合。参数 k_ar_diff 若残差有自相关就加一coint_rank 必须用上一步判定的值。3.4 残差诊断与脉冲响应# 残差自相关检验 from statsmodels.stats.diagnostic import acorr_ljungbox resid res.resid for i in range(resid.shape[1]): lb acorr_ljungbox(resid[:, i], lags[10], return_dfTrue) print(f方程{i} Ljung-Box p{lb[lb_pvalue].values[0]:.4f}) # 脉冲响应 irf res.irf(periods20) irf.plot(orthTrue)逻辑说明Ljung-Box 原假设是残差无自相关p 值大于 0.05 才通过。若某个方程不通过说明滞后阶不够回到 3.1 加阶重来。脉冲响应用正交化冲击看一个变量受冲击后另一个变量多久回到均衡这直接对应误差修正的“修正速度”直觉。periods 按你的业务周期设日频数据一般看 20 到 60 期。4. 避坑与排查VECM 落地最常见的五个翻车点4.1 现象协整秩判定为 0但业务上明明有长期关系原因Johansen 设定选错或者样本太短、噪声太大检验功效不足。解决先画序列图确认趋势形态重新对照第 2.2 节的五种设定样本至少要有几十个观测太短就换更粗的频率或者拉长时间窗口。别为了得到协整硬改设定那是在自欺。4.2 现象alpha 全不显著误差修正项形同虚设原因协整关系存在但调整速度极慢或者序列其实没有经济意义上的回归力量。解决看 alpha 的 t 值和符号若都不显著说明这套价差没有可交易的修正机制VECM 不适合别硬套。可以退回去检查是不是漏了结构突变比如政策、交割规则变化导致均衡关系断裂。4.3 现象残差 Ljung-Box 不通过脉冲响应发散原因滞后阶不足短期动态没被充分刻画。解决逐步加 k_ar_diff每次加完重跑残差检验直到通过。注意加阶会消耗自由度样本小的时候要权衡必要时用信息准则辅助而不是无限加。4.4 现象换了样本区间协整向量符号翻转原因存在结构突变长期均衡关系在不同区间不稳定。解决做递归协整或者滚动窗口检验确认关系是否稳定。若不稳定考虑分段建模或者引入虚拟变量处理突变点。血泪经验是忽略结构突变的 VECM样本外表现会断崖式下跌。4.5 现象模型样本内拟合很好样本外价差预测一塌糊涂原因过拟合滞后阶或变量太多把噪声当信号。解决用滚动预测做样本外验证比较不同滞后阶和协整秩的样本外误差。宁可模型简单一点也不要为了样本内好看堆参数。这一步没有后悔药只能老老实实做滚动回测。5. 把 VECM 用稳的一个进阶习惯滚动重估与修正速度监控真正把 VECM 用进生产靠的不是一次拟合而是持续监控。我一般会做两件事滚动重估和修正速度跟踪。滚动重估是每隔固定窗口重新做协整检验和拟合观察 beta 和 alpha 是否漂移修正速度跟踪是把 alpha 乘以偏离度算出“每期预期修正幅度”当它持续衰减甚至变号时就是均衡关系可能失效的早期信号。下面这段代码演示滚动窗口下 alpha 的提取和监控。window 250 # 滚动窗口长度按数据频率调整 step 20 # 每 20 期重估一次 alphas [] for start in range(0, len(data) - window, step): sub data.iloc[start:start window] try: jr coint_johansen(sub, det_order0, k_ar_diff1) r int(np.sum(jr.lr1 jr.cvt[:, 1])) if r ! 1: alphas.append((sub.index[-1], np.nan, np.nan)) continue m VECM(sub, k_ar_diff1, coint_rank1, deterministicci).fit() alphas.append((sub.index[-1], m.alpha[0, 0], m.alpha[1, 0])) except Exception as e: alphas.append((sub.index[-1], np.nan, np.nan)) adf pd.DataFrame(alphas, columns[date, alpha_a, alpha_b]).set_index(date) print(adf.tail(10))逻辑说明窗口长度要覆盖至少一个完整业务周期日频数据 250 期是常见起点。step 控制重估频率太密计算量大太疏反应迟钝。r 不等于 1 时记 NaN说明该窗口协整关系不成立这本身就是重要信号。alpha 序列如果长期稳定在负值区间说明修正机制健康如果频繁穿越零轴就要警惕。监控指标健康表现预警信号处理动作协整秩 r稳定为 1频繁变 0 或 2检查结构突变、缩短窗口alpha 符号至少一个显著为负符号翻转或全不显著暂停使用重估均衡残差自相关Ljung-Box p0.05p 持续偏小增加滞后阶样本外误差稳定且小于基准误差持续放大降复杂度或换模型我自己的习惯是任何 VECM 上线前先跑至少三轮滚动重估把 alpha 的分布看清楚再决定参数。模型不是拟合一次就完事误差修正这套逻辑的价值恰恰在于它承认关系会变所以监控比建模更重要。希望帮到你。本文还有配套的精品资源点击获取
返回列表