从单位根检验到ECM:Granger因果与误差修正模型完整指南 📅 发布时间:2026/9/18 2:12:54 👁 浏览次数: 简介一份围绕Granger因果关系与误差修正模型ECM的专题资料面向经济学、能源经济及计量经济学方向的研究生和科研人员以中国电力消费与经济增长关系为案例系统梳理时间序列分析中必不可少的平稳性检验、Granger因果检验、协整检验与误差修正建模全流程。包内为1个doc格式文档约784KB集中呈现ADF与PP单位根检验、结构断点分析Zivot-Andrews模型、Granger因果检验的F统计量构造、Johansen协整检验及ECM方程推导等核心内容并附有模型公式与检验步骤说明方便对照学习。文档按分析流程分层展开逻辑清晰可直接用于课程论文、学位论文或课题研究中方法部分的参考。目前已有156人学习适合需要快速掌握非平稳时间序列建模思路的读者有助于理解变量间短期波动与长期均衡关系的实证分析方法。1. Granger与ECM为什么总被放在一起分析如果你拿到一份标注着2021—2022年的Granger和ECM专题资料大概率不是巧合。这两年恰好是宏观面数据剧烈波动、结构断点频出的阶段单纯做相关性分析已经不足以回答「谁先动、谁后动」和「偏离均衡之后多久能回来」这两类问题。Granger因果检验回答前者ECM误差修正模型回答后者而把它们串联起来的前提是协整关系存在。这套方法在国内的宏观分析、金融计量和量化策略里几乎是标准动作但在实际跑数据时最常见的翻车点不在模型本身而在前置的单位根检验、滞后期选择和协整检验顺序上。很多分析报告把非平稳序列直接丢进Granger检验得出一个看似显著实则毫无意义的p值或者协整关系成立却没有构建ECM把长期均衡信息白白丢掉。本文把这套流程从头到尾拆开给出一份可以直接抄作业的路径。2. 用单位根检验确定建模前提避免伪回归2.1 平稳性是一切后续分析的先决条件Granger因果检验的经典定义建立在VAR模型上要求变量是平稳的。如果两个序列都是I(1)一阶单整直接用水平值做回归会产生伪回归问题t统计量和F统计量的分布不再是标准分布检验结果偏向于拒绝原假设导致虚假的因果关系。反过来把I(1)序列差分后再做Granger检验虽然序列平稳了但如果变量之间存在协整关系差分模型会丢失长期信息犯「过度差分」的错误。所以正确的前置路径是先做单位根检验确认每个变量的单整阶数然后检验协整关系最后根据协整检验结果决定是用水平VAR做Granger检验还是构建VECM/ECM框架。2.2 ADF与KPSS的搭配使用ADF检验的原假设是「序列存在单位根」即非平稳KPSS检验的原假设正好相反是「序列平稳」。两者结论一致时比较好办不一致时才是真正考验。我在实际项目中见过不少只跑ADF就下结论的分析这在数据量较小或存在结构突变时风险很大。ADF检验对滞后阶数敏感对趋势项与漂移项的设定也敏感KPSS对短期自相关结构更稳健但功效偏低。所以常见的做法是两个都看ADF的p值大于0.05且KPSS的p值小于0.05才明确判定为非平稳若ADF拒绝而KPSS也拒绝说明序列可能同时存在单位根和趋势平稳的混合特征需要检查是否有结构断点或异常值。2.3 用Python逐项测定单整阶数下面这段代码封装了ADF和KPSS的联合判断逻辑对时间序列自动返回单整阶数。import numpy as np import pandas as pd from statsmodels.tsa.stattools import adfuller, kpss def check_integration_order(series, max_diff2, alpha0.05): 返回序列的单整阶数0表示I(0)1表示I(1)以此类推。 判定逻辑ADF不拒绝原假设非平稳且KPSS拒绝原假设非平稳时继续差分。 x series.copy() for d in range(max_diff 1): # 去掉缺失值ADF不支持NaN x_clean x.dropna() adf_res adfuller(x_clean, autolagAIC) kpss_res kpss(x_clean, regressionc, nlagsauto) adf_p adf_res[1] kpss_p kpss_res[1] print(f差分阶数{d}, ADF p值{adf_p:.4f}, KPSS p值{kpss_p:.4f}) if adf_p alpha and kpss_p alpha: return d x x.diff() return max_diff # 示例gdp是水平值序列fdi是水平值序列 # gdp_order check_integration_order(gdp) # fdi_order check_integration_order(fdi)ADF的autolagAIC表示自动按AIC选择最优滞后阶数这比手工指定滞后更可靠KPSS的regressionc表示仅含截距项这也是检验平稳性而非趋势平稳的默认选择。一个值得注意的细节KPSS的nlagsauto在statsmodels里按12 * (n/100) ** (1/4)计算对高频数据来说可能偏长如果序列长度不足100建议手动设置nlags4或6否则检验功效会下降。如果序列长度为I(1)而非I(0)接下来处理方式才分流变量同阶单整时走协整检验变量阶数不同时可以考虑用对数差分或增速变量来统一阶数但这样做会改变经济含义需要谨慎说明。3. Granger因果检验的实现与滞后期选择3.1 为什么必须在VAR或协整框架里做检验Granger因果的定义是如果X的过去值能显著提高对Y的预测精度就称X是Y的Granger原因。实现方式是对如下回归进行F检验Y_t α Σβ_i * Y_{t-i} Σγ_j * X_{t-j} ε_t原假设是所有γ_j同时为零。这个检验的分布性质要求回归中的变量是平稳的或者系统内各变量之间存在协整关系并建立VECM。直接对两个I(1)序列跑这个回归γ_j的估计量虽然一致但F统计量不再服从标准F分布检验结论不可靠。3.2 选择滞后阶数的三个依据滞后阶数是Granger检验里最敏感的参数。阶数太小自相关会残留在残差里导致F检验失真阶数太大自由度损失严重小样本下检验功效迅速下降。我一般的做法是同时看三个指标。AIC和SC也称BIC是两个最常用的信息准则但两者在样本量中等时经常给出不同的最优阶数。AIC倾向于选择更大的滞后阶数SC更保守。另一个做法是用似然比检验LR来比较相邻阶数的模型但LR检验在样本量不足时可能无法给出有限值。一个务实策略是如果AIC与SC给出的阶数不同优先参考SC但跑完Granger检验后必须做残差的自相关检验Ljung-Box Q统计量来验证所选阶数是否已经充分捕捉了动态关系。如果Q统计量仍然显著说明阶数不足需要向AIC的方向增加滞后。3.3 一个完整的Python检验流程statsmodels提供了直接的Granger因果检验函数代码非常紧凑。from statsmodels.tsa.stattools import grangercausalitytests import pandas as pd # 假设df包含两列gdp_growth 和 fdi_growth均为平稳序列 data df[[gdp_growth, fdi_growth]].dropna() # maxlag设定为4检验1到4阶滞后的Granger因果关系 gc_result grangercausalitytests(data, maxlag4, verboseTrue)verboseTrue会直接打印每个滞后阶数下的四种检验统计量其中ssr_ftest是残差平方和形式的F检验这是最常用也最稳妥的统计量params_ftest是对回归系数做F检验数值上略有差异但结论通常一致lrtest是似然比检验适合大样本ssr_chi2test是卡方检验渐近等价于F检验。注意grangercausalitytests要求输入的两列都是平稳序列如果原始序列是I(1)应该先差分。另一个常见误用是把协整系统的两个水平变量直接丢进这个函数这样得到的p值偏低会高估因果关系的显著性。正确的做法是如果协整检验表明变量之间存在长期均衡关系就改用VECM框架下的Granger因果检验这需要用statsmodels.tsa.vector_ar.vecm.VECM的test_granger_causality方法。滞后阶数的敏感性在代码里有直接体现增加一个maxlag某些阶数下的p值可能从0.04跳到0.09。所以严谨的做法是输出全部阶数下的p值矩阵而不是只挑一个显着的阶数写进报告——如果只有某一阶显著其他阶都不显著那这个因果关系是脆弱的需要谨慎下结论。3.4 EViews里的常规操作对应用EViews处理这类问题时操作逻辑与Python一致但路径不同。常见做法是先建立两个序列的VAR模型在Lag Structure里用Lag Length Criteria确定最优滞后阶数然后在View菜单下选择Granger Causality/Block Exogeneity Tests。EViews会输出各方程的F统计量和p值结论判断与Python完全一致。需要留意的是EViews的Granger检验默认在VAR框架下执行如果VAR里头变量用水平值但序列非平稳且不协整同样会踩伪回归的坑。4. ECM误差修正模型的完整构建流程4.1 协整才是ECM的合法前置条件ECM的设计动机是当两个I(1)变量存在协整关系时它们的水平值之间存在一条长期均衡路径短期内可以偏离但偏离会在后续时期被修正。ECM把这种修正机制显式建模ΔY_t α β * ΔX_t λ * EC_{t-1} ε_t其中EC_{t-1}是上一期的误差修正项即长期均衡方程Y_t θ φ * X_t的残差滞后一期。λ系数度量「向长期均衡回归的速度」理论上应该在-1到0之间越接近-1修正速度越快如果λ为正说明系统在偏离均衡后反而越走越远模型设定有误。协整检验有两种主流方法。EG两步法适合两个变量的情形先对水平值做OLS回归得到残差再对残差做ADF检验。Johansen检验适合多个变量同时存在多个协整向量的情形在EViews里用View/Cointegration Test直接指定在Python里用statsmodels.tsa.vector_ar.vecm.coint_johansen实现。4.2 两步法从长期方程到误差修正项EG两步法的第一步是估计长期均衡方程第二步是把残差滞后项代入差分方程。import statsmodels.api as sm from statsmodels.tsa.stattools import adfuller # 第一步估计长期均衡关系 y df[gdp_level] # I(1)序列 x df[fdi_level] # I(1)序列 X_const sm.add_constant(x) long_eq sm.OLS(y, X_const).fit() residual long_eq.resid # 对残差做ADF检验注意临界值应查Engle-Granger专用表 adf_res adfuller(residual, autolagAIC) print(f协整残差ADF p值: {adf_res[1]:.4f})这里有个很多初学者容易忽略的细节对协整残差做ADF检验时标准ADF临界值不再适用因为残差本身是从回归中估计出来的OLS会倾向于让残差看起来更平稳。statsmodels的adfuller输出的是标准DF临界值用它来判断协整残差的平稳性会高估显著性。EViews在处理EG两步法时会自动使用MacKinnon的协整临界值而在Python里需要手动查表或者用statsmodels.tsa.stattools.coint函数来实现Engle-Granger检验该函数会返回考虑了协整分布特性的统计量。如果残差ADF检验拒绝原假设存在单位根说明协整关系成立可以继续构建ECM。4.3 误差修正项的系数解释与收敛速度构建ECM的第二步代码如下# 第二步构造误差修正项并估计ECM ec_term residual.shift(1) # 误差修正项滞后一期 dy y.diff() dx x.diff() # 拼装数据并去掉缺失值 ecm_data pd.concat([dy, dx, ec_term], axis1).dropna() ecm_data.columns [dy, dx, ec] ecm_model sm.OLS( ecm_data[dy], sm.add_constant(ecm_data[[dx, ec]]) ).fit() print(ecm_model.summary())把ECM回归结果拿到手之后重点看三个数。ec的系数是误差修正速度必须为负且在统计上显著才说明系统存在负反馈机制。dx的系数衡量的是短期弹性即X的当期变化对Y当期变化的影响。常数项如果显著说明Y存在漂移趋势。误差修正速度可以换算成半生命周期half-life公式为ln(0.5) / ln(1 λ)。假设λ -0.3半生命周期约为1.94期即一期大约修正一半偏离。如果数据是季度频率那么这个修正速度属于中等偏快如果λ只有-0.05半生命周期超过13期说明偏离均衡后需要三年以上才能修复系统内资源配置效率较低。4.4 多变量系统切换到Johansen检验两个变量的协整关系用EG两步法即可但VAR系统一旦超过两个变量就可能存在多个协整向量两步法无法处理。此时切到Johansen检验逻辑是估计一个VAR模型的误差修正形式然后对系数矩阵的秩做检验。在Python里保持同一套数据流加一个协整检验和VECM估计from statsmodels.tsa.vector_ar.vecm import coint_johansen, VECM # 输入必须是二维数组列代表变量 vecm_data df[[gdp_level, fdi_level, other_level]].values joh_res coint_johansen(vecm_data, det_order0, k_ar_diff2) print(迹统计量:, joh_res.trace_stat) print(迹统计量临界值(95%):, joh_res.trace_stat_crit_vals)det_order0表示常数项进入协整向量不允许数据存在线性趋势det_order1则允许趋势项存在。k_ar_diff是差分项的滞后阶数对应VAR水平滞后阶数减1。判定规则是迹统计量大于对应的95%临界值则拒绝「至多r个协整向量」的原假设。实际应用中最常出现的状况是迹检验显示有2个协整向量最大特征值检验显示只有1个两者的结论不一致。这种时候优先相信最大特征值检验的结果同时在报告中给出两种统计量让读者自行判断。Johansen检验确定了协整向量个数r之后可以用VECM类直接拟合vecm_model VECM(vecm_data, k_ar_diff2, coint_rank1, deterministicci) vecm_fit vecm_model.fit() print(vecm_fit.summary())VECM的输出中alpha向量对应误差修正速度的多元版本beta向量对应协整向量。deterministicci表示常数项仅出现在协整向量中这是最常见的中性设定co表示既允许协整向量含常数也允许数据有漂移项需要根据业务背景来判断是否有必要。5. 诊断检验与容易翻车的三个细节5.1 残差自相关与稳定性检验模型估计完之后只盯着系数p值是不够的。ECM和VAR模型的有效性建立在残差是白噪声的假设上如果残差仍然存在自相关说明滞后结构没有充分捕捉动态关系需要增加滞后阶数或调整模型设定。用Ljung-Box检验来诊断from statsmodels.stats.diagnostic import acorr_ljungbox # ecm_model.resid来自前面的ECM拟合结果 lb_test acorr_ljungbox(ecm_model.resid, lags[6, 12], return_dfTrue) print(lb_test)return_dfTrue输出DataFrame格式方便直接查看lb_pvalue列。如果p值小于0.05说明残差仍存在显著的自相关模型不充分。另外对VECM模型残差的正态性检验Jarque-Bera和ARCH效应检验也应该纳入标准流程特别是处理金融收益序列时。5.2 三个经常出错的地方错误一把协整残差的ADF检验p值直接当标准p值报。这在Python里尤其容易踩因为statsmodels不会自动切换临界值表。解决方法是改用coint函数的返回结果或者手动使用MacKinnon临界值。错误二Granger检验在协整存在时仍然用差分变量。差分后会丢失长期均衡信息原本应该由EC项捕获的调整动因被移除短期Granger结论可能完全反转。正确做法是用VECM框架下的test_granger_causality。错误三滞后阶数只取AIC最小值然后直接下结论。应对做法是输出滞后1到8阶的全部p值看结论是否在多个阶数下保持一致。只在一两个阶数下显著的结果不能作为稳健因果关系的证据。下表总结常见陷阱与对应处理方式问题症状处理方法非平稳序列直接回归F统计量显著但结论虚假先做ADF/KPSS联合检验差分后丢失长期信息ECM系数不显著或为正值用协整检验确认后再建模残差ADF标准临界值错误协整关系被过度认可使用MacKinnon临界值或coint函数Johansen秩检验结论矛盾迹统计量与特征值不一致优先最大特征值并说明两种结果5.3 赛后检查用参数敏感性矫正你的结论最后一招是把整个流程重跑一遍但故意改变几个关键参数Granger检验的滞后期换成SC最优和AIC最优两个版本协整检验的滞后阶数加减一阶ECM模型有常数项和无常数项各跑一遍。把三个版本的结果列在一张表里对比如果因果关系和误差修正系数在全部设定下方向一致、显著性水平都优于0.05才算合格。只汇报一组参数下的结果只能证明你会操作不能证明结论可靠。本文还有配套的精品资源点击获取