我想知道是否有更好的方法来测试两个变量是否整合而不是以下方法:
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
时,会计算很多东西,而不仅仅是残差,这当然会增加运行时间。我当然可以编写自己的代码来计算残差,但我认为这也不会非常有效。
我正在寻找直接测试协整的内置测试。我在想Pandas
,但似乎无法找到任何东西。或者,如果没有运行回归或一些有效的方法,就可以巧妙地测试协整。
我必须进行大量的协整测试,并且很好地改进我当前的方法。
答案 0 :(得分:7)
您可以尝试以下方法:
import statsmodels.tsa.stattools as ts
result=ts.coint(x, y)
编辑:
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)
代码不言自明: - 1)导入必要的包 2)获取Facebook和Apple股票的数据一年的持续时间 3)根据日期列合并数据 4)选择收盘价 5)进行协整检验 6)变量coin_result具有协整检验的统计
答案 1 :(得分:-1)
你所要求的“更好的测试方法”是johansens测试。
Johansens测试消除了测试变量对进行协整的需要,因为您可以一次测试所有变量。
这将显着加快您的程序,因为定义循环是N阶复杂度,通过删除循环它变为1阶复杂度,意味着缩放到许多变量不是问题(因此可以更快地计算什么是共整合)。
有关更多信息,测试的原始文章是:高斯矢量自回归模型中协整向量的估计和假设检验SørenJohansenEconometrica Vol。 59,No。6(1991年11月),第1551-1580页出版:The Econometric Society DOI:10.2307 / 2938278稳定的网址:http://www.jstor.org/stable/2938278页数:30
statsmodels有vecm模块,其中包括用于协整的johansens测试。为了得到它,你将不得不git它。
答案 2 :(得分:-3)
可以使用线性代数轻松计算残差
假设y
为n x 1
且X
为n x m
residuals = y-X(X'X)^-1X'y
但更有效的方法是使用Johansen test https://en.m.wikipedia.org/wiki/Johansen_test
我在这里找到了一个python实现: https://github.com/iisayoo/johansen
我还没有测试过。