Python Johansen检验

引言

在时间序列分析中,我们经常需要对一个时间序列进行单位根检验,以确定该序列是否是平稳的。单位根检验是一个统计检验,其目的是检测一个时间序列是否具有单位根,即是否具有非平稳性。如果一个时间序列具有单位根,则它是非平稳的,反之亦然。单位根检验有多种方法,其中一种常用的方法是Johansen检验,它是由Søren Johansen在1988年提出的。

本文将介绍Johansen检验的原理和Python实现,并通过一个实例说明如何使用Johansen检验来分析时间序列的平稳性。

Johansen检验原理

Johansen检验是一种多元时间序列的单位根检验方法,适用于具有两个或更多相关时间序列的情况。它的基本思想是通过建立向量自回归模型(Vector Autoregressive Model, VAR)来检验时间序列的平稳性。VAR模型是一种多元时间序列模型,它将当前时刻的各个变量的取值与过去时刻的各个变量的取值相关联。

Johansen检验的步骤如下:

  1. 建立VAR模型。首先,需要确定VAR模型的滞后阶数(lag order),即模型中各个变量之间的滞后期数。可以使用信息准则(如AIC、BIC)来选择合适的滞后阶数。

  2. 估计VAR模型的系数。使用最小二乘法(Ordinary Least Squares, OLS)估计VAR模型的系数。

  3. 计算协整关系。通过对VAR模型的系数进行特征值分解,得到特征值和特征向量。特征向量表示时间序列之间的协整关系,特征值表示协整关系的强度。

  4. 进行假设检验。对特征值进行显著性检验,判断时间序列之间是否存在协整关系。

Python实现

在Python中,我们可以使用Statsmodels库来进行Johansen检验。Statsmodels是一个强大的统计模型库,提供了丰富的统计模型和方法。

首先,我们需要安装Statsmodels库。可以使用以下命令来安装:

pip install statsmodels

示例数据

为了演示Johansen检验的使用,我们将使用一个虚构的例子。假设我们有两个相关的时间序列:X和Y。我们的目标是检验它们之间是否存在协整关系。

下面是示例数据的代码:

import numpy as np
import pandas as pd

# 生成随机数据
np.random.seed(0)
n = 100
x = np.random.normal(0, 1, n)
y = np.random.normal(0, 1, n) + 0.5 * x

# 创建DataFrame
data = pd.DataFrame({'X': x, 'Y': y})

Johansen检验

使用Statsmodels库进行Johansen检验非常简单。下面是进行Johansen检验的代码:

from statsmodels.tsa.vector_ar.vecm import coint_johansen

# 提取数据
variables = data[['X', 'Y']]

# 进行Johansen检验
result = coint_johansen(variables, 0, 1)

# 打印结果
print('Eigenvalues:')
print(result.eig)

print('Critical values (90%, 95%, 99%):')
print(result.cvt)

print('Trace statistic:')
print(result.lr1)

print('Max eigenvalue statistic:')
print(result.lr2)

上述代码中,我们首先从数据中提取出需要进行检验的变量(X和Y)。然后,使用coint_johansen函数进行Johansen检验。该函数的第二个参数是滞后阶数,我们可以根据需要调整该参数的值。最后,我们打印出Johansen检验的结果,包括特征值(eigenvalues)、临界值(critical values)、迹统计量(trace statistic)和最大特征值