- 과거 내용
- Granger 인과검정
전제조건 : 시계열 정상성, 테스트 방향
-> 정상성이 없는 경우, 차분을 통해 해결할 수도 있다.
Granger 인과검정은 A와 B의 값에 영향을 주는지 확인하는 작업이다.
p-value가 0.05 이하여야 유효하며, 이를 통해 두 요인 중 먼저 영향을 끼치는
변수가 무엇인지 알 수 있다. 하지만 이것이 인과관계를 의미하는 것이 아니다.
그렇기에 확대해석을 굉장히 주의해야 한다.
- 정상성 여부 검정
파이썬에서는 kpss test와 ADF test로 검정할 수 있다.
전자는 귀무가설이 정상 시계열이라는 것이고, 후자는 비정상 시계열이라는 것이다.
#정상성 분석 함수
def adf_test(data):
data = pd.read_csv(data+".csv")
from statsmodels.tsa.stattools import adfuller
data=data[['date','close']]
#로그 변환 - 주가가 큰 폭으로 움직여서
data['close']=np.log(data['close'])
result = adfuller(data['close'])
print(f'원 데이터 ADF Statistic: {result[0]:.3f}')
print(f'원 데이터 p-value: {result[1]:.3f}')
if(result[1]>0.05):
#차분으로 추세제거
data['close']=data['close'].diff(periods=1).iloc[1:]
data=data.dropna()
result = adfuller(data['close'])
print(f'1차 차분 ADF Statistic: {result[0]:.3f}')
print(f'1차 차분 p-value: {result[1]:.10f}')
#변환 후 반환
return data
주가가 큰 폭으로 움직이기 때문에 numpy를 이용해 로그변환을 해준다.
이후 statmodels의 adfuller를 사용해 종가의 adf_test를 한다.
그 결과를 확인 후 p-value가 0.05이하라면 정상성을 만족하지만
그렇지 않다면 1차 차분을 해주어 p-value를 0.05이하로 낮추어여 정상성을 만족한다.
아래는 실행 결과이다.
- 로그변환 후 데이터
- 로그변환 후 adf test 결과
- 차분 후 adf test 결과
- 차분 후 데이터
date close
0 20230622 10.432547
1 20230621 10.432689
2 20230620 10.435699
3 20230616 10.442875
4 20230615 10.446046
... ... ...
2595 20130301 9.553196
2596 20130228 9.550697
2597 20130227 9.552182
2598 20130226 9.539653
2599 20130225 9.531276
[2600 rows x 2 columns]
원 데이터 ADF Statistic: -0.502
원 데이터 p-value: 0.892
1차 차분 ADF Statistic: -15.939
1차 차분 p-value: 0.0000000000
date close
1 20230621 0.000142
2 20230620 0.003010
3 20230616 0.007176
4 20230615 0.003171
5 20230614 -0.012538
... ... ...
2595 20130301 -0.002705
2596 20130228 -0.002499
2597 20130227 0.001485
2598 20130226 -0.012528
2599 20130225 -0.008377
[2599 rows x 2 columns]
사진은 위의 과정을 적용해 다우지수와 코스피의 값을 변환한 후
둘의 값을 하나의 데이터프레임으로 합쳐준 결과이다.
이 데이터를 그레인저 인과검정을 할 때 사용할 것이다.
- granger 인과검정 기본 형태
#그레인저 인과검정
def granger(df,data,data2):
from statsmodels.tsa.stattools import grangercausalitytests
df_cols = df.columns
maxlag=4
#KS->DW
df_outs=grangercausalitytests(df[[data,data2]],maxlag=maxlag)
print(df_outs)
#DW->KS
df_outs=grangercausalitytests(df[[data2,data]],maxlag=maxlag)
print(df_outs)
- 결과화면 (4일)
KS->DW
Granger Causality
number of lags (no zero) 1
ssr based F test: F=0.5207 , p=0.4706 , df_denom=2595, df_num=1
ssr based chi2 test: chi2=0.5213 , p=0.4703 , df=1
likelihood ratio test: chi2=0.5213 , p=0.4703 , df=1
parameter F test: F=0.5207 , p=0.4706 , df_denom=2595, df_num=1
Granger Causality
number of lags (no zero) 2
ssr based F test: F=0.1679 , p=0.8455 , df_denom=2592, df_num=2
ssr based chi2 test: chi2=0.3364 , p=0.8452 , df=2
likelihood ratio test: chi2=0.3364 , p=0.8452 , df=2
parameter F test: F=0.1679 , p=0.8455 , df_denom=2592, df_num=2
Granger Causality
number of lags (no zero) 3
ssr based F test: F=0.1813 , p=0.9091 , df_denom=2589, df_num=3
ssr based chi2 test: chi2=0.5453 , p=0.9088 , df=3
likelihood ratio test: chi2=0.5453 , p=0.9088 , df=3
parameter F test: F=0.1813 , p=0.9091 , df_denom=2589, df_num=3
Granger Causality
number of lags (no zero) 4
ssr based F test: F=6.1934 , p=0.0001 , df_denom=2586, df_num=4
ssr based chi2 test: chi2=24.8598 , p=0.0001 , df=4
likelihood ratio test: chi2=24.7415 , p=0.0001 , df=4
parameter F test: F=6.1934 , p=0.0001 , df_denom=2586, df_num=4
DW->KS
Granger Causality
number of lags (no zero) 1
ssr based F test: F=4.0472 , p=0.0443 , df_denom=2595, df_num=1
ssr based chi2 test: chi2=4.0518 , p=0.0441 , df=1
likelihood ratio test: chi2=4.0487 , p=0.0442 , df=1
parameter F test: F=4.0472 , p=0.0443 , df_denom=2595, df_num=1
Granger Causality
number of lags (no zero) 2
ssr based F test: F=1.9809 , p=0.1382 , df_denom=2592, df_num=2
ssr based chi2 test: chi2=3.9694 , p=0.1374 , df=2
likelihood ratio test: chi2=3.9664 , p=0.1376 , df=2
parameter F test: F=1.9809 , p=0.1382 , df_denom=2592, df_num=2
Granger Causality
number of lags (no zero) 3
ssr based F test: F=7.3385 , p=0.0001 , df_denom=2589, df_num=3
ssr based chi2 test: chi2=22.0752 , p=0.0001 , df=3
likelihood ratio test: chi2=21.9818 , p=0.0001 , df=3
parameter F test: F=7.3385 , p=0.0001 , df_denom=2589, df_num=3
Granger Causality
number of lags (no zero) 4
ssr based F test: F=5.5858 , p=0.0002 , df_denom=2586, df_num=4
ssr based chi2 test: chi2=22.4211 , p=0.0002 , df=4
likelihood ratio test: chi2=22.3248 , p=0.0002 , df=4
parameter F test: F=5.5858 , p=0.0002 , df_denom=2586, df_num=4
p값이 0.05이하여야 유효하다.
즉 A가 B에게 영향을 준다 주지 않는다의 판단의 근거이다.
나름 열심히 조사하고 거의 다 알지 못하는 내용이라 공부하면서 진행했다.
그래서 중간에 틀린 부분이 있다면 댓글로 알려주길 바란다.
'IT지식 > 빅데이터' 카테고리의 다른 글
토이프로젝트 - (11) 다변량 선형 확률과정 - 5단계 (2) | 2023.07.02 |
---|---|
토이프로젝트 - (10) 다변량 선형 확률과정 - 4단계 (1) | 2023.07.01 |
토이프로젝트 - (7) VAR - 1단계 (1) | 2023.06.23 |
토이프로젝트 - (6) 논문 분석 (3) | 2023.06.20 |
토이프로젝트 - (5) 선형회귀의 조건 (2) | 2023.06.16 |