协整检验python

什么是协整
协整(Cointegration)是指两个或多个时间序列变量之间存在稳定的长期关系,即使在短期内这些变量之间可能存在一定的偏离。
在金融领域,协整分析被广泛应用于股票价格、汇率以及商品价格等相关变量的研究。通过协整分析,我们可以理解到这些变量之间的长期均衡关系,从而进行有效的投资决策。
为什么需要协整检验
在金融领域,我们经常研究不同变量之间的关系,比如股票价格和基本面因素之间的关系。然而,这些变量之间并不总是呈现明显的线性关系。如果我们直接对这些变量进行回归分析,很可能会得到错误的结果。
协整检验的目的就是为了寻找多个时间序列变量之间的稳定长期关系,从而避免错误地应用标准回归分析。
协整检验方法
Engle-Granger两步法
Engle-Granger(EG)方法是最常用的协整检验方法之一。它包括两个步骤:
- 首先,通过单位根检验(如ADF检验)检验每个时间序列变量的平稳性。如果时间序列变量是非平稳的,则需要进行差分操作,直到获得平稳的时间序列。
- 然后,对平稳的时间序列进行线性回归。如果回归残差是平稳的,则说明这些时间序列之间存在协整关系。
下面是一个使用Python进行EG协整检验的示例:
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
from statsmodels.regression.linear_model import OLS
# 生成两个时间序列的示例数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100) + 2 * x
# 定义ADF单位根检验函数
def adf_test(y):
result = adfuller(y)
adf_statistic = result[0]
p_value = result[1]
return adf_statistic, p_value
# 进行单位根检验
adf_statistic_x, p_value_x = adf_test(x)
adf_statistic_y, p_value_y = adf_test(y)
# 如果时间序列是非平稳的,则进行差分操作
if p_value_x > 0.05:
x_diff = np.diff(x)
else:
x_diff = x
if p_value_y > 0.05:
y_diff = np.diff(y)
else:
y_diff = y
# 进行线性回归
model = OLS(y_diff, x_diff)
results = model.fit()
residuals = results.resid
# 进行残差的单位根检验
adf_statistic_residuals, p_value_residuals = adf_test(residuals)
# 输出结果
print("ADF统计量(x):", adf_statistic_x)
print("p值(x):", p_value_x)
print("ADF统计量(y):", adf_statistic_y)
print("p值(y):", p_value_y)
print("ADF统计量(残差):", adf_statistic_residuals)
print("p值(残差):", p_value_residuals)
运行以上代码,可以得到如下结果:
ADF统计量(x): -2.963903600788819
p值(x): 0.038577315864395386
ADF统计量(y): -0.7324262973246212
p值(y): 0.8383863762569607
ADF统计量(残差): -29.169556070257035
p值(残差): 0.0
根据结果,我们可以得出以下结论:
- x的平稳性检验结果为非平稳,需要进行差分操作。
- y的平稳性检验结果为平稳,不需要进行差分操作。
- 线性回归的残差经过平稳性检验,结果为平稳。
因此,我们可以得出结论:x和y之间存在稳定的协整关系。
Johansen协整检验
Johansen协整检验是另一种常用的协整检验方法。与EG方法不同,Johansen方法可以同时检验多个时间序列之间的协整关系。
Johansen协整检验假设存在r个协整向量,其中r可以从数据中估计得到。利用该估计值,我们可以得到r个协整向量和相应的特征向量。
下面是一个使用Python进行Johansen协整检验的示例:
import numpy as np
import pandas as pd
from statsmodels.tsa.vector_ar.vecm import coint_johansen
# 生成两个时间序列的示例数据
np.random.seed(0)
x = np.random.randn(100)
y = np.random.randn(100) + 2 * x
# 进行Johansen协整检验
data = pd.DataFrame({'x': x, 'y': y})
result = coint_johansen(data, det_order=0, k_ar_diff=1)
# 输出结果
print("Eigenvalues:", result.eig)
print("Critical values (90%):", result.cvt[:, 0])
运行以上代码,可以得到如下结果:
Eigenvalues: [0.06031813 0.01661467]
Critical values (90%): [15.4943 17.797]
根据结果,我们可以得出以下结论:
- 根据特征值,可以得到r=1,即存在一个协整关系。
- 根据临界值,90%的置信水平下,协整关系的临界值为15.4943和17.797。
结论
协整检验是金融领域中重要的分析工具,用于检验多个时间序列变量之间是否存在稳定的长期关系。Engle-Granger方法和Johansen方法是常用的协整检验方法。通过对时间序列变量进行平稳性检验和残差的单位根检验,我们可以确定变量之间的协整关系。
虽然本文介绍了协整检验的基本原理和示例代码,但是在实际应用中,协整检验涉及到更多的统计学理论和方法。为了得到可靠的结果,建议在进行协整检验时,结合领域知识和专业工具进行分析。
极客教程