📑 查看全课大纲(第 20 / 20 节)

协整检验与误差修正模型(ECM)

约 60 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 时间序列分析

在现实经济与金融数据中,许多时间序列本身是非平稳的(如GDP、股价、消费支出),但它们之间往往存在长期的均衡关系。传统的多元回归要求所有变量平稳,否则会出现“虚假回归”问题。本节将介绍如何检验非平稳序列间的长期均衡关系(协整),并建立能够同时刻画长期均衡与短期动态调整的误差修正模型,为分析非平稳多元时间序列提供严谨的统计框架。

💡 核心导读

  • 从单整到协整:理解“单整”概念(序列需几阶差分才平稳),掌握协整的核心思想——多个非平稳序列的线性组合可能是平稳的,这揭示了它们之间的长期均衡关系。
  • Engle-Granger 两步法:学习最经典的协整检验与建模方法:第一步建立长期静态回归,第二步检验其残差是否平稳。若平稳,则协整关系成立,并可得到长期均衡方程。
  • 误差修正模型(ECM):在协整关系基础上,构建能够描述变量如何围绕长期均衡进行短期动态调整的模型。理解误差修正项的经济含义及其系数(必须为负)的调整机制。
  • Python 实战全流程:使用 statsmodels 库完整实现从单整检验、协整检验到 ECM 模型构建与解释的实证分析流程。

从单整到协整:长期均衡关系的统计定义

单整(Integration)的概念

在深入协整之前,我们需要明确描述一个序列“非平稳程度”的工具——单整阶数。

  • 零阶单整 I(0):如果序列 {Xt}\{X_t\} 本身是平稳的,则称其为零阶单整序列,记为 XtI(0)X_t \sim I(0)。这意味着序列不存在单位根。
  • 一阶单整 I(1):如果序列 {Xt}\{X_t\} 本身不平稳,但其一阶差分序列 {ΔXt}\{\Delta X_t\} 是平稳的,则称其为一阶单整序列,记为 XtI(1)X_t \sim I(1)。这意味着序列存在一个单位根。
  • d 阶单整 I(d):推广而言,如果序列 {Xt}\{X_t\} 需要进行 dd 阶差分后才能变为平稳序列,则称其为 dd 阶单整序列,记为 XtI(d)X_t \sim I(d)。这意味着序列存在 dd 个单位根。

单整的性质(线性组合的阶数):

  1. XtI(0)X_t \sim I(0),则对任意非零实数 a,ba, b,有 a+bXtI(0)a + bX_t \sim I(0)
  2. XtI(d),d>0X_t \sim I(d), d>0,则对任意非零实数 a,ba, b,有 a+bXtI(d)a + bX_t \sim I(d)
  3. XtI(0),YtI(0)X_t \sim I(0), Y_t \sim I(0),则对任意非零实数 a,ba, b,有 Zt=aXt+bYtI(0)Z_t = aX_t + bY_t \sim I(0)
  4. XtI(d),YtI(c)X_t \sim I(d), Y_t \sim I(c),令 Zt=aXt+bYtZ_t = aX_t + bY_ta,ba, b 为非零实数):若 d>cd > c,则 ZtZ_t 通常为 I(d)I(d),即 k=max(d,c)k = \max(d, c);当 d=cd = c 时,一般 k=dk = d,仅当存在协整向量(特定的 a,ba, b)时 kk 才可能小于 dd

第四条性质是协整思想的萌芽:两个同阶单整的非平稳序列,它们的某个线性组合可能变成更低阶(甚至零阶)的单整序列,即平稳序列

协整(Cointegration)的定义

协整概念由 Engle 和 Granger 于1987年正式提出,解决了非平稳序列建模的难题。

定义:考虑 k+1k+1 个时间序列 {Yt},{X1t},...,{Xkt}\{Y_t\}, \{X_{1t}\}, ..., \{X_{kt}\}。如果满足:

  1. 它们都是 dd 阶单整序列,即 YtI(d),XitI(d)(i=1,...,k)Y_t \sim I(d), X_{it} \sim I(d) (i=1,...,k)
  2. 存在一个非零向量 β=(β0,β1,...,βk)\boldsymbol{\beta} = (\beta_0, \beta_1, ..., \beta_k)^\top,使得线性组合 εt=Ytβ0β1X1t...βkXkt\varepsilon_t = Y_t - \beta_0 - \beta_1 X_{1t} - ... - \beta_k X_{kt} 是一个 bb 阶单整序列,且 b<db < d(通常 d=1,b=0d=1, b=0)。

则称序列 {Yt}\{Y_t\}{X1t},...,{Xkt}\{X_{1t}\}, ..., \{X_{kt}\} 之间存在 (d, b) 阶协整关系,向量 β\boldsymbol{\beta} 称为协整向量εt\varepsilon_t 称为均衡误差,它衡量了系统在 tt 期偏离长期均衡的程度。

最常用的情形:当 d=1,b=0d=1, b=0 时,即所有序列都是 I(1)I(1),但它们的某个线性组合是 I(0)I(0)(平稳)。这表明,尽管各个序列独自有随机游走的趋势,但它们被一种内在的“经济引力”捆绑在一起,长期内不会偏离太远。例如,居民消费 CtC_t 和可支配收入 YtY_t 都是 I(1)I(1),但 CtβYtC_t - \beta Y_t 是平稳的,意味着消费与收入存在长期稳定的比例关系。

协整的意义

  • 避免了虚假回归:传统回归对非平稳序列建模时,即使变量间毫无关系,也可能得到显著的回归结果(高 R2R^2、显著的 tt 统计量),这是因为趋势主导了回归。协整关系确保了回归残差是平稳的,从而回归结果反映了真实的长期均衡关系,而非共同趋势的伪相关。
  • 拓宽了建模范围:允许对非平稳序列直接建立有意义的回归模型,只要它们之间存在协整关系。

Engle-Granger 协整检验与建模两步法

Engle-Granger 两步法(EG 两步法)是检验并建立双变量协整关系最直观的方法。

第一步:长期静态回归与残差提取

假设我们怀疑 I(1)I(1) 序列 YtY_tXtX_t 之间存在协整关系。首先,用最小二乘法(OLS)估计长期静态回归方程Yt=β0+β1Xt+εtY_t = \beta_0 + \beta_1 X_t + \varepsilon_t 其中,εt\varepsilon_t 为误差项。

估计后得到协整向量的估计值 β^0,β^1\hat{\beta}_0, \hat{\beta}_1,并计算均衡误差的估计序列(即回归残差): ε^t=Ytβ^0β^1Xt\hat{\varepsilon}_t = Y_t - \hat{\beta}_0 - \hat{\beta}_1 X_t

第二步:对均衡误差进行平稳性检验

协整关系成立的核心是均衡误差 εt\varepsilon_t 是平稳的 (I(0)I(0))。因此,第二步就是对第一步得到的残差序列 {ε^t}\{\hat{\varepsilon}_t\} 进行单位根检验(如 ADF 检验)。

  • 原假设 (H0H_0)ε^t\hat{\varepsilon}_t 非平稳(即存在单位根)。这意味着 YtY_tXtX_t 不存在协整关系。
  • 备择假设 (H1H_1)ε^t\hat{\varepsilon}_t 平稳。这意味着 YtY_tXtX_t 存在协整关系。

注意:由于 ε^t\hat{\varepsilon}_t 是估计出来的残差,而非真实的 εt\varepsilon_t,其分布与标准的 ADF 检验不同。因此,EG 检验有自己专用的临界值表。在实践中,我们通常直接使用 statsmodels.tsa.stattools.coint 函数,它内部已经考虑了这一点,直接返回基于 EG 检验原理的统计量和 p 值。

如果检验拒绝原假设(p 值小于显著性水平,如 0.05),则认为协整关系成立。第一步估计出的方程 Yt=β^0+β^1XtY_t = \hat{\beta}_0 + \hat{\beta}_1 X_t 即为长期均衡关系

误差修正模型(ECM):从长期均衡到短期动态

协整关系刻画了变量间的长期均衡,但经济系统在短期常会偏离均衡。误差修正模型(Error Correction Model, ECM)正是用来描述变量如何围绕长期均衡进行短期动态调整的模型。它由长期均衡方程(协整关系)衍生而来。

ECM 模型的推导与形式

从长期均衡方程 Yt=β0+β1Xt+εtY_t = \beta_0 + \beta_1 X_t + \varepsilon_t 出发,考虑一阶差分形式并加入动态调整: ΔYt=γΔXt+λεt1+ut=γΔXt+λ(Yt1β0β1Xt1)+ut\begin{aligned} \Delta Y_t &= \gamma \Delta X_t + \lambda \varepsilon_{t-1} + u_t \\ &= \gamma \Delta X_t + \lambda (Y_{t-1} - \beta_0 - \beta_1 X_{t-1}) + u_t \end{aligned} 其中:

  • ΔYt=YtYt1\Delta Y_t = Y_t - Y_{t-1}, ΔXt=XtXt1\Delta X_t = X_t - X_{t-1} 分别是 YYXX 的短期波动。
  • εt1=Yt1β0β1Xt1\varepsilon_{t-1} = Y_{t-1} - \beta_0 - \beta_1 X_{t-1},是上一期的均衡误差,代表了系统对长期均衡的偏离。
  • λ\lambda 称为误差修正系数,是模型的核心。它衡量了系统对上一期偏离的纠正速度。
  • γ\gamma 反映了 XX 的当期波动对 YY 当期波动的即时影响。
  • utu_t 为白噪声扰动项,utWN(0,σu2)u_t \sim WN(0, \sigma_u^2)

更一般的 ECM 模型可包含常数项和更多的滞后差分项: ΔYt=α0+λεt1+i=0pγiΔXti+j=1qϕjΔYtj+ut\Delta Y_t = \alpha_0 + \lambda \varepsilon_{t-1} + \sum_{i=0}^{p}\gamma_i \Delta X_{t-i} + \sum_{j=1}^{q}\phi_j \Delta Y_{t-j} + u_t

误差修正系数的经济解释

误差修正系数 λ\lambda 的符号和大小具有关键的经济含义:

  • 符号必须为负λ<0\lambda < 0。这构成了 ECM 的“负反馈”机制。
    • 若上一期 YY 高于均衡值 (εt1>0\varepsilon_{t-1} > 0),负的 λ\lambda 会使 λεt1<0\lambda \varepsilon_{t-1} < 0,从而对当期的 ΔYt\Delta Y_t 产生向下的拉力,促使 YY 向均衡水平回落。
    • 若上一期 YY 低于均衡值 (εt1<0\varepsilon_{t-1} < 0),负的 λ\lambda 会使 λεt1>0\lambda \varepsilon_{t-1} > 0,从而对当期的 ΔYt\Delta Y_t 产生向上的推力,促使 YY 向均衡水平回升。
  • 绝对值大小反映调整速度λ|\lambda| 越大,系统对偏离的纠正速度越快,回归均衡的能力越强。λ|\lambda| 越小,调整越缓慢。若 λ=0\lambda = 0,则不存在误差修正机制,长期均衡关系对短期动态没有约束力。

因此,一个有效的 ECM 要求 λ\lambda 显著小于 0。

Python 实战:从协整检验到 ECM 建模

以下代码完整演示了如何用 Python 实现 EG 两步法协整检验并构建 ECM 模型。

import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.stattools import coint, adfuller

# 固定随机种子,确保结果可复现
np.random.seed(42)
n = 250

# ========== 1. 模拟生成具有协整关系的两个 I(1) 序列 ==========
# X_t: 一阶单整随机游走 I(1)
u_x = np.random.normal(0, 1.0, n)
x = np.cumsum(u_x) + 100.0  # 带漂移的随机游走

# 构造平稳的均衡误差 e_t: AR(1) 过程,I(0)
e = np.zeros(n)
u_e = np.random.normal(0, 0.8, n)
for t in range(1, n):
    e[t] = 0.5 * e[t-1] + u_e[t]

# Y_t: 与 X_t 具有长期均衡关系 Y_t = 1.8 * X_t + e_t + 常数
# 因此 Y_t 也是 I(1),但与 X_t 协整
y = 1.8 * x + e + 20.0

# ========== 2. 单整阶数检验 (ADF检验) ==========
print("=== 单整阶数检验 (ADF检验) ===")
adf_x = adfuller(x)[1]
adf_y = adfuller(y)[1]
adf_dx = adfuller(np.diff(x))[1]
adf_dy = adfuller(np.diff(y))[1]

print(f"X 序列: 原始p值={adf_x:.4f} (I(1): {adf_x > 0.05}), 一阶差分后p值={adf_dx:.4e}")
print(f"Y 序列: 原始p值={adf_y:.4f} (I(1): {adf_y > 0.05}), 一阶差分后p值={adf_dy:.4e}")
print("结论:X 和 Y 均为 I(1) 序列。\n")

# ========== 3. Engle-Granger 协整检验 ==========
print("=== Engle-Granger 协整检验 ===")
# 使用 statsmodels 的 coint 函数,它基于 EG 原理
coint_stat, coint_pval, coint_crit_vals = coint(y, x, trend='c', autolag='AIC')
print(f"协整检验统计量 = {coint_stat:.4f}")
print(f"协整检验 p 值 = {coint_pval:.4e}")
print(f"存在显著协整关系 (p < 0.05): {coint_pval < 0.05}\n")

# ========== 4. EG 第一步:估计长期静态回归(协整方程) ==========
print("=== EG 第一步:长期均衡方程估计 ===")
# 添加常数项
X_static = sm.add_constant(x)
static_model = sm.OLS(y, X_static)
static_res = static_model.fit()

beta_0 = static_res.params[0]
beta_1 = static_res.params[1]
ecm_residuals = static_res.resid  # 均衡误差估计序列 ê_t

print(f"长期均衡方程: Y_t = {beta_0:.4f} + {beta_1:.4f} * X_t")
print(f"回归 R-squared: {static_res.rsquared:.4f}\n")

# ========== 5. EG 第二步:对均衡误差进行平稳性检验 (ADF) ==========
print("=== EG 第二步:均衡误差平稳性检验 ===")
adf_resid = adfuller(ecm_residuals, autolag='AIC')
print(f"均衡误差序列的 ADF 检验 p 值 = {adf_resid[1]:.4e}")
print(f"均衡误差平稳 (p < 0.05): {adf_resid[1] < 0.05}\n")

# ========== 6. 构建误差修正模型 (ECM) ==========
print("=== 构建误差修正模型 (ECM) ===")
# 准备数据:差分序列和滞后一期的均衡误差
dy = np.diff(y)  # ΔY_t
dx = np.diff(x)  # ΔX_t
ecm_lag1 = ecm_residuals[:-1]  # ê_{t-1},误差修正项

# 构建 ECM 回归数据框
ecm_df = pd.DataFrame({
    'dy': dy,
    'dx': dx,
    'ecm_lag1': ecm_lag1
})

# 估计 ECM 模型: ΔY_t = α_0 + λ * ê_{t-1} + γ * ΔX_t + u_t
ecm_X = sm.add_constant(ecm_df[['ecm_lag1', 'dx']])
ecm_model = sm.OLS(ecm_df['dy'], ecm_X).fit()

alpha_0 = ecm_model.params['const']
lambda_ecm = ecm_model.params['ecm_lag1']  # 误差修正系数 λ
gamma_ecm = ecm_model.params['dx']         # 短期弹性系数 γ

print("ECM 模型回归结果:")
print(ecm_model.summary().tables[1])
print(f"\n误差修正系数 λ = {lambda_ecm:.4f} (p值: {ecm_model.pvalues['ecm_lag1']:.4e})")
print(f"短期影响系数 γ = {gamma_ecm:.4f} (p值: {ecm_model.pvalues['dx']:.4e})")
print(f"误差修正机制有效 (λ 显著为负): {lambda_ecm < 0 and ecm_model.pvalues['ecm_lag1'] < 0.05}")

运行结果:

=== 单整阶数检验 (ADF检验) ===
X 序列: 原始p值=0.3953 (I(1): True), 一阶差分后p值=2.3582e-29
Y 序列: 原始p值=0.3570 (I(1): True), 一阶差分后p值=3.7793e-30
结论:X 和 Y 均为 I(1) 序列。

=== Engle-Granger 协整检验 ===
协整检验统计量 = -8.6720
协整检验 p 值 = 5.9902e-13
存在显著协整关系 (p < 0.05): True

=== EG 第一步:长期均衡方程估计 ===
长期均衡方程: Y_t = 22.0976 + 1.7780 * X_t
回归 R-squared: 0.9996

=== EG 第二步:均衡误差平稳性检验 ===
均衡误差序列的 ADF 检验 p 值 = 1.3143e-12
均衡误差平稳 (p < 0.05): True

=== 构建误差修正模型 (ECM) ===
ECM 模型回归结果:
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          0.0085      0.050      0.169      0.866      -0.091       0.108
ecm_lag1      -0.4703      0.055     -8.602      0.000      -0.578      -0.363
dx             1.7792      0.019     92.087      0.000       1.741       1.817
==============================================================================

误差修正系数 λ = -0.4703 (p值: 9.8983e-16)
短期影响系数 γ = 1.7792 (p值: 1.8814e-94)
误差修正机制有效 (λ 显著为负): True

结果解读

  1. 单整检验:X 和 Y 原始序列的 ADF p 值均大于 0.05,无法拒绝“存在单位根”的原假设,说明它们是非平稳的 I(1)I(1) 序列。而它们的一阶差分序列 p 值极小,是平稳的,验证了 I(1)I(1) 的判断。
  2. 协整检验:EG 协整检验的 p 值约为 5.99×10135.99 \times 10^{-13},远小于 0.05,强烈拒绝“不存在协整关系”的原假设。表明 X 和 Y 之间存在显著的长期均衡关系。
  3. 长期均衡方程:估计结果为 Y^t=22.0976+1.7780Xt\hat{Y}_t = 22.0976 + 1.7780 X_t。这与我们模拟数据时设定的真实关系 (Yt=20+1.8Xt+etY_t = 20 + 1.8 X_t + e_t) 非常接近,且 R2R^2 高达 0.9996。
  4. 误差修正模型
    • 误差修正系数 λ^=0.4703\hat{\lambda} = -0.4703显著为负,符合理论预期。这意味着当上一期 YY 偏离长期均衡(ε^t10\hat{\varepsilon}_{t-1} \neq 0)时,系统会在本期以约 47% 的速度进行反向调整,使其回归均衡。
    • 短期弹性系数 γ^=1.7792\hat{\gamma} = 1.7792,显著为正。表明 XX 的当期波动 (ΔXt\Delta X_t) 会对 YY 的当期波动 (ΔYt\Delta Y_t) 产生几乎等比例的即时影响。
    • 常数项不显著,这与许多 ECM 的设定相符。

📝 动手练一练

  1. 理论理解:假设检验发现居民消费 CtC_t 和可支配收入 YtY_t 都是 I(1)I(1) 序列,且存在协整关系 Ct=0.85Yt+εtC_t = 0.85Y_t + \varepsilon_t。如果某期 ε^t1=2\hat{\varepsilon}_{t-1} = 2(即上一期消费比长期均衡水平高出2个单位),且 ECM 模型中的误差修正系数 λ^=0.3\hat{\lambda} = -0.3。请问,在其他条件不变的情况下,这一偏离会对本期的消费变动 ΔCt\Delta C_t 产生多大的影响?方向是增加还是减少?

  2. 代码实践:修改上面实战代码中生成数据的部分,将长期均衡关系从 Yt=1.8Xt+...Y_t = 1.8 X_t + ... 改为 Yt=0.9Xt+...Y_t = 0.9 X_t + ...,同时将均衡误差 ete_t 的 AR(1) 系数从 0.5 改为 0.8。重新运行整个分析流程,观察: a) 协整检验的 p 值是否依然显著? b) 长期均衡方程的估计值 β^1\hat{\beta}_1 是否接近 0.9? c) 误差修正系数 λ^\hat{\lambda} 的绝对值是变大了还是变小了?这反映了系统调整速度的何种变化?

参考答案

  1. 根据 ECM 模型,ΔCt\Delta C_t 会受到 λεt1\lambda \varepsilon_{t-1} 项的影响。代入 λ^=0.3\hat{\lambda} = -0.3ε^t1=2\hat{\varepsilon}_{t-1}=2,得到影响为 0.3×2=0.6-0.3 \times 2 = -0.6。由于 λ^<0\hat{\lambda}<0,且上一期消费偏高 (εt1>0\varepsilon_{t-1}>0),所以本期消费变动会受到向下的拉力,减少约 0.6 个单位,促使消费向均衡水平回调。
  2. a) 协整检验应依然显著,因为改变了系数但未破坏协整关系。b) β^1\hat{\beta}_1 应接近 0.9。c) 均衡误差 ete_t 的持久性增强 (AR系数从0.5到0.8),意味着偏离需要更长时间才能消除,因此误差修正系数 λ^\hat{\lambda} 的绝对值可能会变小,反映系统调整速度变慢。

本章小结

本节深入探讨了多元非平稳时间序列分析的核心工具——协整与误差修正模型。

  • 核心概念单整 描述了序列的非平稳程度;协整 揭示了多个非平稳序列间存在的长期统计均衡关系,是避免虚假回归的关键。
  • 核心方法Engle-Granger 两步法 是检验和建立协整关系的经典方法:第一步用 OLS 估计长期静态回归,第二步检验其残差是否平稳。
  • 核心模型误差修正模型 (ECM) 在协整关系的基础上建立,它巧妙地将长期均衡信息 (εt1\varepsilon_{t-1}) 引入到短期差分模型 (ΔYt,ΔXt\Delta Y_t, \Delta X_t) 中。误差修正系数 λ\lambda(必须显著为负)量化了系统向长期均衡回调的速度与力度。
  • 实战流程:完整的分析流程包括:1) 单整阶数检验;2) 协整关系检验;3) 估计长期均衡方程;4) 构建并解释 ECM 模型。

行动清单

  1. 检验你的数据:拿到一组可能存在关联的经济时间序列(如汇率、利率、股价指数),首先用 ADF 检验判断其单整阶数。
  2. 寻找长期关系:如果序列同阶单整(如都是 I(1)I(1)),立即使用 statsmodels.tsa.stattools.coint 函数进行协整检验,探寻它们之间是否隐藏着长期均衡。
  3. 建模短期动态:一旦确认协整关系,尝试构建 ECM 模型。重点关注误差修正项系数的符号和显著性,这是模型是否有效的“试金石”。

— 小象教研组

配套学习资源与课件
  • 第6章课件:多元时间序列分析
    下载
  • 时间序列分析推荐书籍(打包)(经典时序分析参考书合集)
    下载
  • 课程配套数据集(全课程实战数据)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信二维码:扫码添加课程顾问微信扫码添加顾问