본문 바로가기
Analysis/Time series

Lecture 16. 다변량 선형확률과정

by 5ole 2021. 4. 5.

 

  • Univariate, 단변량 선형확률과정은 종속변수 Y가 독립변수들에만 영향 받는다고 가정
  • 현실적으로는 종속변수와 독립변수는 상호 영향을 주기에 어떤 것이 종속변수로 적합한가에 대한 논의

 

1. VAR 벡터자기회귀 모형

 

  • Vector Autoregressive Model
  • VAR(p)로 변환된 종속변수로 식을 표현

 

(1) VAR Equation

 

 

 

 

 

(2) Impulse Response Function 임펄스 반응 함수

 

  • VAR 모형을 여러 시계열 상관관계를 통해 각 변수가 다른 변수에 어떤 영향을 주는지 임펄스 반응 함수로 확인
  • 다른 시계열에 미치는 영향을 시간에 따라 표시

 

(3) VAR 실습- 유사한 추세를 가진 데이터

 

# VAR 모형적합
fit = sm.tsa.VAR(simul_values).fit()
display(fit.summary())

# 예측 및 시각화
forecast_num = 20
pred_var = fit.forecast(fit.model.endog[-1:], steps=forecast_num)
pred_var_ci = fit.forecast_interval(fit.model.endog[-1:], steps=forecast_num)
fit.plot_forecast(forecast_num)
plt.tight_layout()
plt.show()

# 임펄스반응함수 추정
fit.irf(forecast_num).plot()
plt.tight_layout()
plt.show()

# 잔차진단
fit.plot_acorr()
plt.tight_layout()
plt.show()

 

 

예시 식
예시 데이터

 

fit summary

 

점추정, 구간추정으로 20개 예측

 

20시간에 대해 Imperse (x->y : x축이 바뀔때 y에 미치는 영향)
잔차확인

 

 

 

2. Granger Causality Model (그레인저 인과관계 모형)

 

 

  • 인과관계 : 닭이 먼저인가? 달걀이 먼저인가?
  • 그레인저 인과관계 : 닭과 달걀의 생산량의 인과관계
  • 무조건적 인과관계를 단정할 수 없음

 

(1) 모형 전제 : 과거의 사건은 현재의 사건을 유발할 수 있지만 미래의 사건은 현재의 사건을 유발할 수 없다

 

  • 정상성 : 독립변수(𝑋)와 종속변수(𝑌)는 모두 정상성 상태여야 함
  • 입력시차: 입력변수로 시차(Lagged) 적용된 변수를 반영해야 하며, 예상되는 시차가 N이라면, 1부터 N까지의 시차 모두를 입력변수로 사용해야 함
  • 최종시차: 예상시차 N에 매우 민감하므로 적합한 길이를 선택해야 함
    • 통상 연 환산빈도의 2~3배까지: 연별 자료시 2, 분기별 자료시 8, 월별 자료시 24)
    • F 검정통계량의 유의한 변화에 의해 결정
  • 검정방향: 독립변수와 종속변수의 양방향 관련성 비교가 필요하기에 총 Y 갯수 검정을 수행해야 함

( H0 : 한 변수가 다른 변수를 예측하는데 도움 되지 않는다 ) vs ( H1 : 한 변수가 다른 변수를 예측하는데 도움 된다 )

 

 

 

(2) Granger Causality  실습 - 삼성전자와 삼성전자 우선주 인과관계

 

 

# 데이터 로딩
import pandas_datareader.data as web
import datetime

start = datetime.datetime(2014, 1, 1)
end = datetime.datetime(2018, 12, 31)

raw1 = web.DataReader("005930.KS", 'yahoo', start, end)
raw2 = web.DataReader("005935.KS", 'yahoo', start, end)

# 데이터 시각화
raw = pd.concat([raw1.Close, raw2.Close], axis=1).dropna()
raw.columns = ["SE", "SE_PS"]
raw.plot(figsize=(10,5))
plt.show()

 

 

# 비정상성 차분 차수 추론

target = raw.SE.copy()
integ_result = pd.Series(sm.tsa.stattools.adfuller(target)[0:4], 
                         index=['Test Statistics', 'p-value', 'Used Lag', 'Used Observations'])
Y1_integ_order = 0
if integ_result[1] > 0.1:
    Y1_integ_order = Y1_integ_order + 1
    
    
target = raw.SE_PS.copy()
integ_result = pd.Series(sm.tsa.stattools.adfuller(target)[0:4], 
                         index=['Test Statistics', 'p-value', 'Used Lag', 'Used Observations'])
Y2_integ_order = 0
if integ_result[1] > 0.1:
    Y2_integ_order = Y2_integ_order + 1
    
print('Y1_order: ', Y1_integ_order, 'Y2_order: ', Y2_integ_order)

 

Y1_order: 1 / Y2_order: 1

 

# Granger Causality 테스트
print('\n[삼성전자우 -> 삼성전자]')
granger_result1 = sm.tsa.stattools.grangercausalitytests(raw.diff(1).dropna().values, maxlag=4, verbose=True)
print('\n[삼성전자 -> 삼성전자우]')
granger_result2 = sm.tsa.stattools.grangercausalitytests(raw.diff(1).dropna().iloc[:,[1,0]].values, maxlag=4, verbose=True)

 

삼성전자 우선주가 4일까지도 삼성전자에 영향을 주고 있다

 

 

3. 공적분 모형 ( Cointegration Model )

 

  • 공적분 : 두 비정상성 시계열을 선형조합한 시계열의 적분(Integration) 차수가 낮아지거나 정상상태가 되는 경우
  • 공적분 시계열 : 서로 상관관계를 가지지 않음에도 불구하고 장기적으로 같은 방향으로 움직이는 특성
  • 페어 트레이딩 (Pair Trading), 통계적 차익거래 (Statistical Arbitrage) 등의 매매전략에서 응용

( H0 : 공적분이 없다  vs H1 : 공적분 관계가 있다 )

 

예 ) 차분 1, 차분 2일때 선형조합 차분차수는  1보다 작을 때

 

 

 

(1) Cointegration 실습 - 삼성전자와 삼성전자 우선주 공적분

 

  • 위의 실습 데이터 로드
  • 차분 차수 추론 사용 ( Y1_order: 1 / Y2_order: 1 ) -> 최소 차분숫자가 각각 1로 나타남
  • 회귀분석 계수를 가져와 차분이 필요한 이 두 시계열을 선형결합

 

# 회귀분석 적합

Y = raw.SE
X = raw.SE_PS
X = sm.add_constant(X)
fit = sm.OLS(Y, X).fit()
display(fit.summary())

 

회귀계수 359.877 사용 

 

# 공적분 시계열 시각화 (잔차)

Y_integ = raw.SE - fit.params[1]*raw.SE_PS  # 실제Y - 예측Y = 잔차 

plt.figure(figsize=(10,7))
Y_integ.plot()
plt.show()
# 공적분 시계열 비정상성 테스트 (잔차)
target = fit.resid
display(pd.Series(sm.tsa.stattools.adfuller(target)[0:4], 
                  index=['Test Statistics', 'p-value', 'Used Lag', 'Used Observations']))

 

정상성

 

( Adf ) 정상상태 - Integration order 0

 

  • 공적분 관계 있음을 확인할 수 있다.

 

# VECM 공적분 테스트

coint_result = sm.tsa.coint(raw.SE, raw.SE_PS)
pd.DataFrame([coint_result[0], coint_result[1]], index=['statistics', 'p-value'], columns=['output'])

 

공적분 관계가 있다

 

댓글