- 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()
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)
3. 공적분 모형 ( Cointegration Model )
- 공적분 : 두 비정상성 시계열을 선형조합한 시계열의 적분(Integration) 차수가 낮아지거나 정상상태가 되는 경우
- 공적분 시계열 : 서로 상관관계를 가지지 않음에도 불구하고 장기적으로 같은 방향으로 움직이는 특성
- 페어 트레이딩 (Pair Trading), 통계적 차익거래 (Statistical Arbitrage) 등의 매매전략에서 응용
( H0 : 공적분이 없다 vs H1 : 공적분 관계가 있다 )
(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())
# 공적분 시계열 시각화 (잔차)
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']))
- 공적분 관계 있음을 확인할 수 있다.
# 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'])
'Analysis > Time series' 카테고리의 다른 글
Lecture 18. 시계열 딥러닝 알고리즘 (0) | 2021.05.02 |
---|---|
Lecture 17. 비선형 확률과정 (0) | 2021.04.06 |
Lecture 15. Kaggle 자전거 수요 예측 (SARIMAX / Auto-ARIMA) (0) | 2021.04.05 |
Lecture 14. Kaggle 자전거 수요 예측 (RF/SARIMA) (0) | 2021.04.03 |
Lecture 13. 선형확률과정 분석실습 (0) | 2021.04.03 |
댓글