Python中的有效协整测试

Python中的有效协整测试,python,pandas,linear-regression,Python,Pandas,Linear Regression,我想知道是否有比以下方法更好的方法来测试两个变量是否是协整的: import numpy as np import statsmodels.api as sm import statsmodels.tsa.stattools as ts y = np.random.normal(0,1, 250) x = np.random.normal(0,1, 250) def cointegration_test(y, x): # Step 1: regress on variable on

我想知道是否有比以下方法更好的方法来测试两个变量是否是协整的:

import numpy as np
import statsmodels.api as sm
import statsmodels.tsa.stattools as ts

y = np.random.normal(0,1, 250)
x = np.random.normal(0,1, 250)

def cointegration_test(y, x):
    # Step 1: regress on variable on the other 
    ols_result = sm.OLS(y, x).fit() 
    # Step 2: obtain the residual (ols_resuld.resid)
    # Step 3: apply Augmented Dickey-Fuller test to see whether 
    #        the residual is unit root    
    return ts.adfuller(ols_result.resid)
上述方法有效;然而,它不是很有效。当我运行
sm.OLS
时,会计算很多东西,不仅仅是残差,这当然会增加运行时间。我当然可以编写自己的代码来计算残差,但我认为这也不是很有效

我正在寻找一个只直接测试协整性的内置测试。我在想熊猫,但似乎什么也找不到。或者,也许有一种聪明的方法可以在不进行回归的情况下测试协整,或者使用一些有效的方法


我必须运行很多协整测试,改进我当前的方法会很好。

您可以尝试以下方法:

import statsmodels.tsa.stattools as ts 
result=ts.coint(x, y)
编辑:

代码是不言自明的:- 1) 导入必要的包 2) 获取持续一年的Facebook和苹果股票数据 3) 根据日期列合并数据 4) 选择收盘价 5) 进行协整检验
6) 变量coin_结果具有协整检验统计量

残差可以用线性代数轻松计算 假设
y
nx1
x
nxm
,则
residuals=y-X(X'X)^-1X'y

但更有效的方法是使用Johansen测试

我在这里找到了一个python实现:

我还没有测试过它。

您要求的“更好的测试方法”是约翰森测试

Johansens测试消除了测试变量对协整的需要,因为您可以一次测试所有变量对

这将显著加快您的程序,因为循环的定义是N阶复杂度,通过删除循环,它将变为1阶复杂度,这意味着对多个变量的缩放不是问题(从而可以更快地计算协整的内容)

更多信息,关于检验的原始文章是:高斯向量自回归模型中协整向量的估计和假设检验Søren Johansen Econometric Vol.59,No.6(1991年11月),第1551-1580页,发表者:经济计量学会DOI:10.2307/2938278稳定URL:Page Count:30


statsmodels有vecm模块,其中包括协整的johansens测试。要获得它,您必须将其git。

请解释为什么可以尝试使用此代码(可能使用OP的示例)。使用此coint方法,我在残差方面得到的结果与ts.adfuller不同,因此我对ts.Cointca的可用性有很高的怀疑。即使在下载匹配日期的数据后,也必须合并它们,因为非重叠日期可能存在“nan”和/或缺失值。
来自statsmodels.tsa.vector\u ar.vecm import coint\u johansen
import statsmodels.tsa.stattools as ts
import numpy as np
import pandas as pd
import pandas.io.data as web

data1 = web.DataReader('FB', data_source='yahoo',start='4/4/2015', end='4/4/2016')


data2 = web.DataReader('AAPL', data_source='yahoo',start='4/4/2015', end='4/4/2016')


data1['key']=data1.index

data2['key']=data2.index

result = pd.merge(data1, data2, on='key')


x1=result['Close_x']


y1=result['Close_y']


coin_result = ts.coint(x1, y1)