Python 在johansen检验中获得相同的临界值

Python 在johansen检验中获得相同的临界值,python,pandas,dataframe,statistical-test,Python,Pandas,Dataframe,Statistical Test,因此,我尝试制作一个算法来测试协整: 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

因此,我尝试制作一个算法来测试协整:

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()
考虑到这几乎在统计上是可能的,为什么所有的值都是一样的?此外,为了简单起见,我只列出了前3家运行此代码的公司,但不管规模大小,我仍然遇到同样的问题。谢谢


csv文件位于:

如果临界值基于相同的概率,则每个公司的临界值可能完全相同。看到了吗,这些结果没有错?还有,计算的概率是多少,使其具有相同的值?90、95和99的百分位数。这就是它的计算方法:尽管标准普尔中的所有对怎么可能具有相同的临界值?
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]]