Эффективный тест на коинтеграцию в Python

Мне интересно, есть ли лучший способ проверить, объединены ли две переменные, чем следующий метод:

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, но, похоже, не мог ничего найти. Или, может быть, есть умный тест для коинтеграции без выполнения регрессии или какого-либо эффективного метода.

Мне нужно запустить множество тестов коинтеграции, и было бы неплохо улучшить мой текущий метод.

Ответ 1

Вы можете попробовать следующее:

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) 

Код сам по себе поясняет: - 1) Импортировать необходимые пакеты 2) Получение данных о фондах Facebook и Apple в течение года 3) Объединить данные в соответствии с столбцом даты 4) Выберите цену закрытия 5) Проведите коинтеграционный тест 6) переменная coin_result имеет статистику теста коинтеграции

Ответ 2

"лучший способ тестирования", как вы просили, - это тест johansens.

Тест Johansens устраняет необходимость проверки пар переменных для коинтеграции, потому что вы можете проверить их все сразу.

Это значительно ускорит вашу программу, поскольку цикл по определению является сложностью порядка N, удалив цикл, он становится сложностью порядка 1, что означает, что масштабирование для многих переменных не является проблемой (и, таким образом, позволяет быстрее вычислять то, что коинтегрированы).

Для получения дополнительной информации, оригинальная статья о тесте: Оценка и гипотеза Тестирование векторов коинтеграции в моделях Гауссовой векторной авторегрессии Søren Johansen Econometrica Vol. 59, № 6 (ноябрь 1991 г.), стр. 1551-1580 Издатель: Econometric Society DOI: 10.2307/2938278 Стабильный URL: http://www.jstor.org/stable/2938278 Количество страниц: 30

statsmodels имеет модуль vecm, который включает тест johansens для коинтеграции. Чтобы получить его, вам нужно git его.

Ответ 3

Остатки легко вычисляются с помощью линейной алгебры Предполагая, что y n x 1, а X - n x m, тогда residuals = y-X(X'X)^-1X'y

Но более эффективным способом является использование теста Йохансена https://en.m.wikipedia.org/wiki/Johansen_test

Я нашел здесь реализацию python: https://github.com/iisayoo/johansen

Я не тестировал его.