#python #pandas #dataframe #statistical-test
#python #pandas #фрейм данных #статистический тест
Вопрос:
Итак, я пытаюсь создать алгоритм, который проверяет коинтеграцию:
import matplotlib.pyplot as plt
import pandas as pd
import pandas_datareader as web
import datetime as dt
from datetime import date
import numpy as np
import os
from statsmodels.tsa.stattools import adfuller
import statsmodels.api as sm
import statsmodels.tsa.stattools as ts
from statsmodels.tsa.vector_ar.vecm import coint_johansen
df = pd.DataFrame()
data = []
csv_file = pd.read_csv(os.path.expanduser("/Users/benitocano/Downloads/copyOfSandP500.csv"), delimiter = ',')
tickers = pd.read_csv("/Users/benitocano/Downloads/copyOfSandP500.csv", delimiter=',', names = ['Symbol', 'Name', 'Sector'])
#Get the asset data
def get_data():
start = dt.datetime(2020, 5, 30)
end = dt.datetime.now()
for ticker in tickers['Symbol'][:3]:
try:
df1 = web.DataReader(ticker, 'yahoo', start, end)
df1.drop(['High', 'Low', 'Open', 'Close', 'Volume'], axis=1, inplace=True)
data.append(df1)
except KeyError:
pass
for stock in data:
series = pd.Series(stock['Adj Close'])
df[ticker] = series
df.fillna(method='ffill', inplace=True)
#test if each asset is Nonstationary or not>
def ADF_Test():
for ticker, prices in df.iteritems():
adf_statistic = ts.adfuller(prices, 1)
for key, value in adf_statistic[4].items():
value = value
test_stat = value < adf_statistic[0]
pvalue_stat = adf_statistic[1] > .05
if pvalue_stat==False and test_stat==False:
df.drop(ticker, axis=1, inplace=True)
def get_spread():
pass
data1 = []
a = 0
b = a
for y in range (a, len(df.columns)):
b = a 1
for e in range (b, len(df.columns)):
if e == y:
pass
else:
ticker_1 = df.columns[e]
ticker_2 = df.columns[y]
ticker_dict = {
ticker_1 : df[ticker_1],
ticker_2 : df[ticker_2]
}
ticker_frame = pd.DataFrame(ticker_dict)
result = coint_johansen(ticker_frame, 0, 1)
trace_statistic = result.lr1[0]
critical_value = result.cvt
print("trace statistic: {}".format(trace_statistic))
print("Critcal values: {}".format(critical_value))
b = b 1
get_data()
ADF_Test()
get_spread()
То, что делает алгоритм, собирает данные из файла csv, а затем помещает все в один фрейм данных. Затем решается, какие компании являются стационарными, а какие нет. Наконец, он запускает цикл for, в котором создает все возможные пары и помещает их в отдельные фреймы данных. Затем, наконец, запуск теста Йохансена на этих фреймах данных. Проблема в том, что когда я распечатываю код, все критические значения одинаковы. Результат:
trace statistic: 9.736276687870111
Critcal values: [[13.4294 15.4943 19.9349]
[ 2.7055 3.8415 6.6349]]
trace statistic: 14.374497415885136
Critcal values: [[13.4294 15.4943 19.9349]
[ 2.7055 3.8415 6.6349]]
trace statistic: 8.388038242212934
Critcal values: [[13.4294 15.4943 19.9349]
[ 2.7055 3.8415 6.6349]]
trace statistic: 8.388038242212934
Critcal values: [[13.4294 15.4943 19.9349]
[ 2.7055 3.8415 6.6349]]
Почему все значения получаются одинаковыми, учитывая, что это было бы почти статистически невозможно? Кроме того, для упрощения я проиндексировал только первые 3 компании для запуска этого кода, но размер не имеет значения, я все равно сталкиваюсь с той же проблемой. Спасибо!
Файл csv можно найти по адресу: https://datahub.io/core/s-and-p-500-companies
Комментарии:
1. Если критическое значение основано на одинаковой вероятности, то критические значения могут быть абсолютно одинаковыми для каждой компании. См support.minitab.com/en-us/minitab-express/1/help-and-how-to /…
2. Значит, в этих результатах нет ничего плохого? Кроме того, какую вероятность он вычисляет, что делает его одинаковыми значениями?
3. Процентили 90, 95 и 99. Вот где это вычисляется: github.com/statsmodels/statsmodels/blob /…
4. хотя, как возможно, что все пары в S amp; P имеют одинаковые критические значения?