次の方法よりも、2つの変数が共和分されているかどうかをテストするためのより良い方法があるかどうか疑問に思っています。
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
を考えていましたが、何も見つからないようです。あるいは、回帰を実行せずに共和分をテストする賢い方法や、効率的な方法があるかもしれません。
私は多くの共和分テストを実行する必要があり、現在の方法を改善するのは素晴らしいことです。
次のことを試すことができます。
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 1年間の在庫)3)日付列に従ってデータをマージします4)終了を選択します価格5)共和分検定を実行します6)変数coin_resultには共和分検定の統計があります
あなたが要求した「より良いテスト方法」は、ジョハンセン検定です。
Johansens検定では、変数のペアすべてを一度にテストできるため、共和分について変数のペアをテストする必要がなくなります。
定義上、ループはN次の複雑さであるため、これによりプログラムが大幅に高速化されます。ループを削除すると1次の複雑さになります。つまり、多くの変数へのスケーリングは問題になりません(したがって、共和分されるものの計算が高速になります)。
詳細については、テストの元の記事は次のとおりです。ガウスベクトル自己回帰モデルにおける共和分ベクトルの推定と仮説検定SørenJohansenEconometricaVol。 59、No。6(1991年11月)、pp.1551-1580発行:The Econometric Society DOI:10.2307/2938278安定したURL: http://www.jstor.org/stable/2938278 =ページ数:30
statsmodelsには、共和分のジョハンセン検定を含むvecmモジュールがあります。それを取得するには、gitする必要があります。