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)
위 데이터를 사용해서 데이터를 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
위 표를 읽는 방법은 아래와 같다.
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),
코스피지수 => 상하이, 니케이
상하이지수 => 항생지수
니케이 => 코스피
에 영향을 끼친다
'2. Data Science Basics > Python' 카테고리의 다른 글
Data Science 인터뷰 질문 및 답변 (작성중) (0) | 2022.01.03 |
---|---|
Reddit에서 코인뉴스 API로 크롤링하기 (0) | 2021.12.28 |
A/B Testing 란? (0) | 2021.08.24 |
간단한 NLP 모델로 WSJ 부정적인 기사만 crawling 하기 (0) | 2021.08.23 |
VAR을 이용하여 Kospi 예측해보기 (0) | 2021.08.19 |
댓글