IT지식/빅데이터

토이프로젝트 - (8) 다변량 선형 확률과정 - 2단계

매 석 2023. 6. 27. 20:08
반응형

- 과거 내용

 

토이프로젝트 - (7) 다변량 선형 확률과정 - 1단계

과거 내용 여러 가지 논문을 보고 VAR 모형과 Granger 인과검정 등을 사용하기로 결정했다. 서칭하다 ...

blog.naver.com

 

 

- Granger 인과검정

 

그래인저 인과관계 - Granger Causality :: 인투더데이터 데이터과학 위키 Datascience Wiki

그래인저 인과관계 - Granger Causality 개요 닭이 먼저인가 달걀이 먼저인가? 실없는 유머나 말장난 같지만 과학적으로 닭이 먼저인가 달걀이 먼저인가?와 같은 인과관계를 파악하는 것은 매우 어려

intothedata.com

 

 

 

전제조건 : 시계열 정상성, 테스트 방향

-> 정상성이 없는 경우, 차분을 통해 해결할 수도 있다.

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이하로 낮추어여 정상성을 만족한다.

아래는 실행 결과이다.

  1. 로그변환 후 데이터
  2. 로그변환 후 adf test 결과
  3. 차분 후 adf test 결과
  4. 차분 후 데이터
          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에게 영향을 준다 주지 않는다의 판단의 근거이다.

나름 열심히 조사하고 거의 다 알지 못하는 내용이라 공부하면서 진행했다.

그래서 중간에 틀린 부분이 있다면 댓글로 알려주길 바란다.