2012-07-06 9 views
11

Zastanawiam się, czy istnieje lepszy sposób na sprawdzenie, czy dwie zmienne są skointegrowane niż następujący sposób:Skuteczny test kointegracji w Pythonie

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) 

Powyższa metoda działa; jednak nie jest bardzo wydajny. Kiedy uruchamiam sm.OLS, oblicza się wiele rzeczy, a nie tylko reszty, co oczywiście zwiększa czas wykonywania. Mógłbym oczywiście napisać własny kod, który oblicza tylko pozostałości, ale nie sądzę, że będzie to również bardzo efektywne.

Szukam testu wbudowanego, który bezpośrednio testuje kointegrację. Myślałem, Pandas, ale wydaje się, że nie można znaleźć niczego. A może jest sprytny do testowania kointegracji bez uruchamiania regresji lub jakiejś skutecznej metody.

Muszę uruchomić wiele testów kointegracyjnych i byłoby miło poprawić moją obecną metodę.

+2

Witajcie - minęło kilka lat od ostatniej odpowiedzi tutaj. Zastanawiam się, czy w jakikolwiek sposób dokonano tutaj jakiegokolwiek postępu? Nie sądzę, by w statmodels nadal istniała metoda testowania kointegracji, prawda? – WillZ

Odpowiedz

5

Można spróbować wykonać następujące czynności:

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

Edit:

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) 

Kod jest oczywista: - 1) importować niezbędne pakiety 2) Pobiera dane z Facebooka i Apple magazynie przez okres jednego roku 3) Scal dane zgodnie z kolumną z datą 4) Wybierz cenę zamknięcia 5) Przeprowadzić test kointegracji 6) Zmienna coin_result ma statystykę testu kointegracji

+0

Proszę dodać wyjaśnienie do * dlaczego * ten kod może być wypróbowany (być może na przykładzie OP). –

+1

z tą metodą cointa uzyskałem inne wyniki niż tsadfuller na reszty, dlatego mam duże wątpliwości co do użyteczności ts.coint – BigChief

+0

Byłoby pomocne, gdybyś wkleił swój kod. –

-1

"Lepszym sposobem na sprawdzenie", zgodnie z prośbą, jest test johansens.

Test Johansensa eliminuje potrzebę testowania zmiennych par dla kointegracji, ponieważ można przetestować wszystkie z nich jednocześnie.

To znacznie przyspieszy twój program, ponieważ pętla z definicji jest porządkiem N złożonością, przez usunięcie pętli staje się złożonością rzędu 1, co oznacza, że ​​skalowanie do wielu zmiennych nie jest problemem (i tym samym umożliwia szybsze obliczanie tego, co jest kointegrowany).

Aby uzyskać więcej informacji, oryginalnym artykułem z testu jest: Ocena i testowanie wektorów kointegracyjnych w wektorowych modelach autoregresyjnych Gaussa Søren Johansen Econometrica obj. 59, nr 6 (listopad 1991), s. 1551-1580 Opublikowane przez: The Econometric Society DOI: 10.2307/2938278 Stabilny adres URL: http://www.jstor.org/stable/2938278 Liczba stron: 30

statsmodels ma moduł vecm, który obejmuje test johansens dla kointegracja. Aby go zdobyć, musisz to naprawić.