본문 바로가기
2. Data Science Basics/Python

Granger's Causality Test

by Mojito 2021. 8. 18.

Granger's Causality란?

  - 1969년에 처음 발명된 통계기법으로 시계열 데이터 x 가 얼마나 y에 영향을 끼치는지 알아볼 수 있는 Test이다.

Null Hypothesis = x does not Granger-cause y

P-value가 0.05 보다 낮다면 Null hypothesis 를 reject 할 수 있으며, 곧 x가 y에게 유의미하게 영향을 끼쳤단 뜻이다.

 

1. Hang Seng

2. Kospi

3. S&P 500

4. Shanghai Composite

 

먼저 필요한 라이브러리를 import 해준다

import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import grangercausalitytests

새로운 데이터프레임을 만든 후 필요한 데이터만 read 후 넣어준다.

df1 = pd.read_csv('../Hang Seng Historical Data.csv', index_col='Date')
df2 = pd.read_csv('../KOSPI Historical Data.csv', index_col='Date')
df3 = pd.read_csv('../S&P 500 Historical Data.csv', index_col='Date')
df4 = pd.read_csv('../Shanghai Composite Historical Data.csv', index_col='Date')
df5 = pd.read_csv(r'D:\Private\VAR DATA\Nikkei 225 Historical Data.csv', index_col='Date')

df = pd.DataFrame(columns=['HS', 'KS', 'SP', 'SH'])
df['HS'] = df1['Price']
df['KS'] = df2['Price']
df['SP'] = df3['Price']
df['SH'] = df4['Price']
df['NK'] = df5['Price']
df.dropna(inplace=True)

df

 

위 데이터를 사용해서 데이터를 numeric 으로 변환 후 granger causality test 를 하면 아래와 같은 결과가 나온다.

df.replace(',', '', regex=True, inplace=True) 
df = df.apply(pd.to_numeric, errors='coerce') # numeric 변환
maxlag= 14
test = 'ssr_chi2test'

def grangers_causation_matrix(data, variables, test='ssr_chi2test', verbose=False):    
   
    df = pd.DataFrame(np.zeros((len(variables), len(variables))), columns=variables, index=variables)
    for c in df.columns:
        for r in df.index:
            test_result = grangercausalitytests(data[[r, c]], maxlag=maxlag, verbose=False)
            p_values = [round(test_result[i+1][0][test][1],4) for i in range(maxlag)]
            if verbose: print(f'Y = {r}, X = {c}, P Values = {p_values}')
            min_p_value = np.min(p_values)
            df.loc[r, c] = min_p_value
    df.columns = [var + '_x' for var in variables]
    df.index = [var + '_y' for var in variables]
    return df

grangers_causation_matrix(df, variables = df.columns)

#코드출저: https://stackoverflow.com/questions/58005681/is-it-possible-to-run-a-vector-autoregression-analysis-on-a-large-gdp-data-with

Granger Causuality Test

위 표를 읽는 방법은 아래와 같다.

1. p-value 가 0.05보다 작다면 Null hypothesis 를 reject 할 수 있다.

2. Reject 한다면 x는 유의미하게 granger cause y 하였다.

 

0.0396 (Row 1 Column 4)을 보면 0.05 보다 작은 값이므로 Shanghai index 가 granger cause Hangseng index라고 말할 수 있다. (상하이지표가 항생지표에게 유의미하게 영향을 미친다)

 

 

결론: Granger Causality Test를 통하여 보았을 때, SP500 지수 (미국시장)는 항생, 코스피, 상하이 인덱스, 니케이에 모두 interchangebly 유의미하게 영향을 끼치고 (granger cause),

코스피지수 => 상하이, 니케이

상하이지수 => 항생지수

니케이 => 코스피

 

에 영향을 끼친다

반응형

댓글