资讯详情

资讯详情

协整与误差修正模型:非平稳时间序列回归避坑指南

做时间序列的人迟早会撞上同一个尴尬场面两条明显共享同一趋势的序列扔进回归R²冲到0.95以上t值个个亮眼可DW只有0.3残差图画出来是一条缓慢漂移的曲线怎么看都不像白噪声。这时候如果直接把系数写成弹性边际效应写进报告基本等于给自己埋雷。协整和误差修正模型就是专门用来收拾这个烂摊子的工具前者判断两组非平稳序列之间是不是存在一条跑不散的长期纽带后者把这条纽带和短期波动放进同一个方程里做量化。它要解决的核心问题是——当数据本身不平稳时什么样的回归结果还能信什么样的回归纯粹是数字游戏。这套东西在宏观、金融、产业研究里几乎绕不过去消费与收入、汇率与物价、上下游产品价差、库存与产量、碳排放与产出凡是有长期应该一起走的经济逻辑就有它的用武之地。阅读门槛也不算高会做普通最小二乘回归、看得懂ADF检验的输出表就能往下走。但它的坑非常密——滞后阶数差一位、临界值查错一张表、确定性项设错一种结论就可能从存在长期均衡翻成什么关系都没有。下面我按自己实际做项目的顺序把这些环节拆开讲包括教材上通常一笔带过、但实操中一定会绊人的细节。1. 伪回归的恐慌与协整的出场这套方法到底在解决什么1.1 两组随机游走做回归R²为什么会骗人先把问题的根源说清楚。如果一个序列的均值、方差不随时间变化自协方差只与时间间隔有关它就是平稳的反之均值漂移、方差随时间膨胀的就是非平稳。绝大多数经济变量的水平值都是后者GDP、价格指数、货币供应量、股价指数一个比一个飘。对这类序列做回归残差里带着未被吸收的趋势成分最小二乘的正交性条件根本不成立系数估计量不再服从常规分布t检验、F检验全部失效这就是伪回归。伪回归最阴险的地方在于它看起来很好。两条完全独立生成的随机游走回归出来的R²期望并不趋近于0而是收敛到某个明显大于0的值样本越长越稳定同时DW统计量趋近于0残差高度正自相关。这其实是同一个现象的两面残差里有单位根说明回归没有把趋势关系吸收干净。我见过太多报告只报R²和t值不报DW、不做残差检验结论自然站不住。所以第一道工序永远是单位根检验先把每个序列的单整阶数摸清楚——原序列平稳记作I(0)差分一次才平稳记作I(1)以此类推。这里有个实操细节值得强调ADF检验的滞后阶数不能随手填。常用做法是从一个足够大的滞后开始逐步剔除不显著的滞后项或者直接按信息准则选。Schwert的经验规则给出最大滞后上限约为12 × (T/100)^(1/4)T是样本量T200时上限约14T100时约12。样本短的时候这个上限会偏大容易吃掉自由度我一般取min(建议值, 4)再配合AIC/BIC交叉验证。另外检验式里到底加常数项、加趋势项还是都不加要看序列图形有明显均值非零的加常数有明显线性趋势的加常数加趋势两个都没有的裸检验。这三种设定对应的临界值完全不同选错等于白做。1.2 协整的直觉主人、狗和那根绳子理解协整最好的比喻还是遛狗。主人沿着一条大致笔直的路往前走狗一会儿冲在前面一会儿落在后面甚至绕圈你单独看狗的轨迹它是个标准的随机游走完全不可预测但狗和主人之间的距离不会无限拉大因为中间有根绳子拴着。主人和狗的坐标各自都不平稳可它们的某个线性组合是稳定的——这就是协整。形式化一点如果 x_t 和 y_t 都是I(1)但存在一个非零常数 β使得 y_t − β·x_t 是I(0)就说这两个序列是协整的β叫协整系数(1, −β)叫协整向量。经济含义非常直白短期怎么折腾都行长期必须回到这条线上偏离越远回拉力越强。协整系数因此可以当作长期弹性来解读比如消费和收入协整、β约为0.9意思是长期看收入涨1%消费涨0.9%——注意这个限定语长期短期弹性完全是另一回事这是后面误差修正模型要补的部分。这个比喻还顺带解释了一个易错点协整关系不是唯一的当变量超过两个时可能存在多个线性独立的协整向量也就是好几根绳子同时拴着。两个变量的时候最多只有一根所以EG两步法够用三个及以上变量就必须用Johansen那套系统方法去估计秩这是选型的第一个分水岭。1.3 该不该上协整一份开工前的决策清单不是所有非平稳数据都值得走协整这条路。我习惯在动手前先过一遍清单能省掉大量返工。第一条变量的单整阶数必须一致或者至少能通过线性组合降阶。如果 y 是I(1)、x 是I(2)一般不要硬做例外是I(2)与I(1)的某种组合刚好I(1)这属于多重协整的范畴需要专门的检验初学者别碰。第二条必须有经济理论支撑长期关系的存在。纯靠数据挖出来的协整关系八成是样本期内的巧合换个区间就散了。第三条样本长度要够。协整检验的有限样本性质不算好我个人的经验底线是有效样本不低于60个观测最好在100以上。季度数据二十年、月度数据八年基本是能接受的下限。第四条样本期内不能有过于剧烈的结构变化。战争、政策突变、统计口径调整这些都会让协整关系整体平移甚至断裂不处理就直接检验结论往往是不存在协整其实是被断点掩盖了。满足这几条可以往下走不满足但确实有研究必要就考虑加入虚拟变量、使用允许结构突变的协整检验或者干脆退回到差分VAR只研究短期动态别硬套长期均衡的解释。我个人的偏好是宁可保守地说我没找到稳定的长期关系也不要勉强给出一个漂亮但脆弱的协整向量。2. 协整检验的三条路线EG两步法、Johansen与边界情形2.1 EG两步法所有细节都藏在残差表查什么临界值里Engle-Granger两步法逻辑极简第一步用OLS把 y 对 x 回归得到残差第二步对残差做单位根检验如果残差是I(0)说明这个线性组合平稳协整成立。看起来就是两个常规操作拼接实际上有两个地方几乎所有人第一次都会做错。第一个坑是临界值不能查普通ADF表。残差是从数据里估计出来的不是原始观测估计过程本身就让残差尽量平稳所以检验统计量的分布比标准ADF更靠左。两个变量、含常数项、无趋势的情形5%显著性水平下大致在 −3.34 附近而普通ADF是 −2.86三个变量大致要到 −3.74 左右。用普通临界值去判断会把大量本来不成立的伪协整判成成立。这是EG两步法最常见的事故来源。第二个坑是残差检验式里不能加常数项。回归残差均值为零这是OLS的代数性质再塞一个常数项进去等于让检验去估计一个理论上已知为零的参数自由度浪费且分布偏移。同样也不该加趋势项除非第一步回归里已经包含了确定性趋势。这两条是硬规矩写代码的时候要显式指定。顺手说一句EG两步法的估计量虽然是一致的但存在明显的有限样本偏误尤其当 x 的外生性不强、回归的R²不高时偏误会更大。有些做法会做反向回归x 对 y 回归看结果是否一致或者用动态OLS、FMOLS做修正。我一般在样本量够的时候优先考虑JohansenEG两步法更多用在快速探查和教学演示。2.2 Johansen检验滞后阶数设定是第一号陷阱变量一多EG两步法就撑不住了因为你要先假定谁是因谁是果而且只能找出一根协整向量。Johansen用向量自回归的框架通过检验系数矩阵的秩来确定协整关系的个数能同时处理多个协整向量也不预设内外生。它的两个统计量是迹统计量和最大特征值统计量前者检验协整秩 ≤ r后者检验协整秩 r两者结论大多数时候一致冲突时我通常以迹统计量为准因为它在有限样本下更稳健一些。真正的麻烦在于设定而设定的核心是滞后阶数。Johansen建立在水平变量的VAR之上协整检验里的滞后阶数指的是VAR的阶数 p。而后续估计VECM时模型里的差分项滞后是 p−1。这个差一位的关系在不同软件里的输入方式还不一样是最容易出错的地方。R的ca.jo里参数 K 填的是水平VAR的阶数K2 表示VAR(2)Python的coint_johansen里参数是差分滞后阶数等价于VAR阶数减一。两套代码来回切换不核对一遍必出错而错一位的后果可能是协整秩从1变成0。滞后阶数怎么定先对水平VAR用AIC/BIC选再看残差有没有自相关。BIC倾向选小阶数AIC倾向选大样本量不大时BIC更稳妥但如果你担心遗漏短期动态就用AIC然后检查残差LM检验。另外要留意Johansen对确定性项设定也很敏感五种情形从无常数无趋势到数据有二次趋势不等实际研究中绝大多数用数据有线性趋势、协整方程只含常数这一种但这必须结合图形判断不能默认。2.3 三条路线的适用边界对照除了EG两步法和Johansen实际工作中还会遇到另外两类情形一是变量里混着I(0)和I(1)二是存在已知的结构断点。前者在Johansen框架下其实可以兼容把I(0)变量放进去对应的协整关系会把它单独吸收掉只是解释时要小心后者需要专门的检验常规的协整检验在断点附近会严重损失功效。方法适用变量数能否识别多个协整关系主要限制典型误用EG两步法2个为主否需预设内外生有限样本偏误大残差检验用普通ADF临界值Johansen迹检验2个及以上能对滞后阶数与确定性项敏感水平VAR阶数与差分阶数混用Johansen最大特征值2个及以上能小样本下不如迹检验稳健与迹检验冲突时不加判断允许断点的协整检验2个及以上部分断点位置需估计或外生给定断点当外生但实际未知选型的经验是两个变量、样本中等、只想快速验证有没有关系EG两步法够用三个以上变量、或者需要区分多条长期关系、或者要做后续的VECM建模直接上Johansen。至于结构断点如果图形上能明显看出某一年前后水平整体平移别硬扛先处理断点再谈协整。3. 误差修正模型把长期均衡和短期波动拧成一根绳3.1 从协整向量到ECM手工推导与实操写法协整只回答有没有长期关系误差修正模型回答短期怎么走、多快回来。它的理论依据是格兰杰表示定理只要一组I(1)变量存在协整关系就一定能写成误差修正形式反之亦然。这句话很关键它意味着ECM不是一种可选的花样而是协整关系的等价表达。两变量情形下最直观的写法是Δy_t α γ·(y_{t-1} − β·x_{t-1}) δ·Δx_t ε_t括号里那一项叫误差修正项也就是上一期偏离长期均衡的缺口有时记作 ECT 或 ECM项。γ 是调整速度衡量每期把缺口修掉多少比例。δ 捕捉 x 的短期变动对 y 的即时影响和长期弹性 β 完全是两回事很多人把 δ 当长期效应报出去这是硬伤。实操上有两种构造方式。第一种就是从EG两步法接着走把第一步回归的残差取滞后一期作为一个新变量塞进差分回归再检验它的系数是否显著为负。第二种是直接用Johansen估计出的协整向量把 β 固定住再估VECM。前者简单但把第一步的估计误差完全忽略了标准误会有偏后者更严谨用极大似然一次性估完我通常优先选后者。Python里的写法大致是这样注意coint_johansen的滞后参数是差分阶数import numpy as np from statsmodels.tsa.vector_ar.vecm import coint_johansen, VECM # data 为 T×2 的矩阵列顺序为 [y, x] jres coint_johansen(data, det_order0, k_ar_diff1) # det_order0: 含常数项 print(jres.lr1) # 迹统计量 print(jres.cvt) # 迹统计量 90/95/99% 临界值 print(jres.evec) # 协整向量列 model VECM(data, k_ar_diff1, coint_rank1, deterministicci) res model.fit() print(res.summary())R这边同样一件事参数含义恰好相反需要留意library(urca) library(vars) # K 是水平 VAR 的阶数与 Python 的 k_ar_diff 相差 1 jo - ca.jo(data, type trace, ecdet const, K 2) summary(jo) # 转为 VECM 并估计 vecm - cajorls(jo, r 1) summary(vecm$rlm)3.2 系数怎么读调整速度、半衰期与长期弹性误差修正项的系数 γ 是整份输出里最需要盯住的数字。它必须为负——负号代表往回拉正号意味着系统在偏离均衡后还会继续往外跑那就不叫误差修正了。取值范围一般在 −1 到 0 之间偶尔会略小于 −1那是超调可以接受但要谨慎解释如果显著小于 −2模型基本可以判定为不稳定别急着写结论先回去查数据质量、滞后阶数和异常值。γ 的大小直接对应回到均衡的快慢。想更直观可以换算成半衰期半衰期 ln(0.5) / ln(1 γ)。γ −0.2 时半衰期约等于 3.1 期意思是偏离发生后大约三期修掉一半γ −0.05 时半衰期接近 14 期说明回到均衡非常缓慢。这个换算在写报告时特别好用比一个裸系数好懂得多。长期弹性 β 来自协整向量注意符号方向。Johansen输出的特征向量是标准化过的通常把第一个变量系数归一到1读的时候要按你自己的经济逻辑重新整理一遍。举个典型场景两个价格序列协整向量标准化后是 (1, −0.98)意思是长期看两者几乎一比一同步价差回归如果标准化后是 (1, −0.55)那说明长期存在稳定的比例关系这个比例本身就是有信息量的。还有一类系数容易被忽略误差修正项在另一个方程里的系数。如果检验发现 x 的方程里 ECT 系数也显著为负说明 x 也在向均衡调整这叫双向调节如果 x 的方程里 ECT 系数不显著说明 x 相对外生长期关系由它主导。这个判断很有价值它等于告诉你谁在牵着谁比简单的格兰杰因果检验更接近经济结构。3.3 VECM的多变量扩展格兰杰因果与脉冲响应三个以上变量、一条以上协整关系时就是标准的VECM。它的方程结构是每个变量的差分对常数、自身和别的变量的滞后差分、以及若干误差修正项做回归。估计完之后能做两类分析基于VECM的格兰杰因果检验和脉冲响应分析。这里有个细节值得单独拎出来。做格兰杰因果时如果你对差分变量做普通的因果检验会漏掉误差修正项里的长期信息导致结论偏保守明明有长期因果却检验不出来。正确的做法是在VECM框架下做把滞后差分项整体作为待检验的约束。我吃过一次亏两组序列在水平VAR下因果检验不显著换成VECM、加入误差修正项之后长期因果立刻显著差别不在数据全在模型设定。脉冲响应则要注意冲击的识别问题。VECM的方差协方差矩阵不是对角阵需要选择识别策略常用的有Cholesky分解但那意味着要给定一个变量的排序排在前面的变量当期不受后面变量影响。这个排序必须用经济逻辑来说明不能随便排。另外VECM的脉冲响应长期会收敛收敛到的位置就是长期均衡关系这一点在解读时要讲清楚——冲击只有临时效应不会永久改变均衡线除非你引入趋势项。做预测时VECM的样本外路径会逐步向协整关系靠拢。如果长期预测偏离那条线越来越远说明模型设定有问题。这个可以直接当成一个内部一致性检查很好用。4. 全流程实操从数据清洗到样本外检验4.1 数据准备与单整阶数确认真实项目里八成以上的返工都发生在数据环节。第一件事是频率对齐。两个序列频率不同要先统一能升频就升频不行就降频降频时注意用期间平均还是期末值对协整检验结论影响不小。第二件事是口径一致性尤其是价格类数据要确认是同比还是环比、是定基还是环比链式口径打架的两个序列根本不存在真正的长期关系。第三件事是缺失值和异常值。缺失值不要简单前向填充那样会人为制造出一段趋势直接影响单位根检验的结论。异常值比如一次性的政策冲击、极端天气建议用虚拟变量吸收而不是把观测删掉——删掉会在时间轴上留下断口而协整检验对断点很敏感。数据对齐后逐个做单位根检验。这里要养成两个习惯一是同时报ADF、PP或KPSS因为它们的原假设方向不同ADF和PP的原假设是有单位根KPSS的原假设是平稳两类结论互相印证比只看一个稳得多二是检验水平值、一阶差分都要做确认是I(1)而不是I(2)。如果某个序列在水平值上检验不出单位根、但图形明显在飘那多半是趋势设定写错了或者样本太短、检验功效不够。我通常会做一张汇总表把每个序列在原水平、一阶差分下的三种检验统计量和p值都列出来一眼就能看出单整阶数也方便后面复核。这一步花的时间最后都会在工作量上省回来。4.2 协整检验与模型设定确认了单整阶数一致接下来定滞后阶数。用水平VAR按信息准则选样本长用BIC样本短用AIC然后看残差自相关检验有没有通过。这一步千万别跳过因为Johansen对滞后阶数极其敏感。选完之后换算成检验函数需要的参数——记住前面说的那个差一位关系。然后是确定性项设定。绝大多数情形选协整方程含常数、数据无额外趋势但如果两个序列在图上明显各走各的上升通道、只是缓慢靠拢就要考虑允许数据有线性趋势。这个选择没有数据驱动的标准答案只能结合图形和经济常识判断选完最好做一次敏感性检查换一种设定再跑一遍看协整秩的结论是否仍然成立。如果一换设定结论就翻说明证据本身很弱写结论时务必留出余地。Johansen跑完看迹统计量。从 r0 开始逐个与临界值比较第一个统计量低于临界值的位置就对应协整秩。比如 r0 时拒绝、r≤1 时无法拒绝那么秩为1。这里还要结合特征值看强弱有时候第二个协整关系的统计量刚好卡在临界值附近这种边缘显著的关系我一般倾向于不纳入因为它在样本外很可能撑不住。最后一步是标准化协整向量并检查符号和经济含义。这一步很关键一个统计上成立但经济上无法解释的协整向量多半是遗漏变量或者结构断点导致的伪关系不要因为它显著就硬讲一个故事。4.3 估计、诊断与预测的三个关卡VECM估计完成输出一大张表我的检查顺序固定为三步。第一步看误差修正项系数。符号对不对量级合不合理显著不显著。如果有哪个方程的ECT系数显著为正或者绝对值大得离谱先停下来排查不要往下走。第二步看残差诊断。自相关用LM检验正态性用JB检验异方差用ARCH-LM。VECM的残差最好接近白噪声如果自相关明显说明滞后阶数不够加一阶再试。第三步看稳健性。同一组数据换滞后阶数±1、换样本区间去掉首尾各10%、换确定性项设定各跑一遍看核心结论——协整秩和ECT系数符号——是否稳定。这一步很枯燥但它是区分真的找到关系和碰巧显著的唯一办法。我做过一个小项目前三个设定下协整秩都是1唯独去掉最后两年样本后变成0追下去发现那两年有一次统计口径调整把变量水平整体推高了属于典型的结构断点加虚拟变量后结论稳定下来。预测环节样本外路径要分两步看短期看差分项带来的动态长期看是否收敛到协整线。如果预测曲线在几十期之后明显偏离长期关系说明模型有问题。另外做滚动预测时注意每次重新估计协整向量可能会漂如果漂得厉害那本身就是个信号——长期关系不稳固。5. 常见问题排查与踩坑实录5.1 结论互相打架时的速查表实操中最高频的困惑就是不同方法给出不同答案。下面这张表是我自己攒的排查顺序按出现频率排基本上顺着走一遍能定位到原因。现象最可能的原因排查动作处理办法EG两步法说无协整Johansen说有残差检验用错临界值核对是否用了EG专用表换MacKinnon的协整临界值重判Johansen迹检验与最大特征值冲突第二个关系处于边缘显著看特征值大小与样本量保守处理取较小的秩协整成立但ECT系数为正变量顺序或标准化方向错检查协整向量符号重新标准化确认回归方向换成不同样本区间结论翻转存在结构断点画滚动窗口协整检验加虚拟变量或改用允许断点的方法ECT系数小于−2模型设定或数据异常查异常值、滞后阶数修正后重估必要时加干预虚拟残差自相关明显滞后阶数不足做残差LM检验增加滞后阶数协整向量无法经济解释遗漏变量或量纲问题检查变量口径、做对数化补充变量或转换形式5.2 结构突变、样本区间与协整关系漂移结构突变是协整分析最大的隐形杀手。它的可怕之处在于不报错数据照样跑结果照样出只是协整秩从1变成0或者协整系数从一个值跳到另一个值而你完全不知道。识别的基本手段是滚动窗口——把样本切成若干个长度相同的子区间每个窗口单独估一次协整向量把系数画成一条线。如果这条线在某处突然跳变那里就是断点。处理办法有三个层次。最轻的是加虚拟变量吸收水平位移适用于一次性冲击。中度的是分段估计承认前后两个时期存在不同的长期关系然后比较两者的差异——很多时候这个差异本身就是研究结论。最重的是换用允许未知断点的协整检验需要在断点位置和协整关系之间同时做搜索计算量大但更严谨。还有一类容易被忽略的情况叫协整关系漂移。不是断点式的跳变而是系数缓慢移动。这在长样本里非常常见比如随着产业结构变化两个宏观变量之间的长期弹性会慢慢从0.8滑到0.6。这种情况下全样本估计出来的系数是个平均值两边都不准。如果研究问题关心的是现在的弹性是多少就得考虑时变参数的设定或者干脆缩短样本。5.3 几条没人写在教材里的实操心得第一条先画图再做检验。这件事听起来幼稚但真的能省下一半的排查时间。两条序列有没有共同的缓慢趋势、有没有明显的水平位移、有没有方差不齐图上基本一目了然。等检验结果出来了再回头看图往往已经晚了——你会不自觉地用图去论证检验结果而不是用图去质疑它。第二条变量取对数再进模型。除了少数比例型变量大多数经济序列我都先取对数。好处有三个一是把弹性直接变成系数解释方便二是压缩量纲差异减少数值计算问题三是很多时候能顺带削弱异方差。反过来要注意对数化会改变差分的经济含义一阶差分的对数近似等于增长率解读时别混。第三条别把协整当成因果。协整只说明存在稳定的线性关系不说明谁导致谁。两个变量同步受第三个因素驱动也能协整。要谈方向性得靠经济理论、外生性检验、以及前面提到的ECT系数在各方差中的分布三者结合着看单靠统计量下因果判断早晚要翻车。第四条报告里一定要写清楚设定。滞后阶数、确定性项、样本区间、是否取对数、异常值怎么处理这些都要写。我审过一些稿子结论本身没错但因为设定没交代清楚别人复现不出来可信度大打折扣。协整分析的结论对设定极其敏感把设定摊开写其实是在保护自己。第五条样本外检验是最好的照妖镜。协整关系在样本内成立不代表在样本外还成立。留出一段样本外区间用VECM做滚动预测看看预测误差是否稳定、长期预测是否收敛到协整线。这一段检验花不了多少时间但它对结论可靠性的判断比任何显著性水平都实在。最后分享一个我在实际使用中养成的小习惯每次跑完协整检验我都会把协整向量单独存成一个对象后面构造误差修正项、做情景分析、算长期均衡值全都从这个对象里取绝不手工重新抄一遍系数。抄错一位小数后面的调整速度、半衰期、预测路径全跟着错而且这种错很难在结果里看出来——数字看起来依然合理。协整这套方法本身不难难的是每一个环节都保持这种笨拙的谨慎。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →