본문 바로가기
Statistics/Time Series Analysis

TSA - 4. 자기회귀

by bents 2021. 1. 22.

# Unstationary Time series

  • 정상화 방법

    • 로그 : 분산변화

    • 차분(빼기) : mth 차분 - 계절성 평균변화, 1차 차분 - 평균변화 (level 변화)

  • 확인방법 : ACF가 0근처에 벗어남

# Stataionary Time series

1. 서로 다른 시간의 시계열값에 영향 주지 않음

  • 고정된 길이(진폭/높이,파장/너비)를 갖지 않으면 주기도 예측불가능하다

  • 장기적으로 볼 때 예측할 수 있는 패턴이 없음

2. 확인방법

  • ACF가 0근처에 분포함

  • KPSS Unit Root Test - H0 : 데이터에 정상성이 나타난다

3. 자기회귀 예측기법 : 자기 자신(변수)의 과거 값의 선형 조합을 이용하여 y예측

  • 해석

    베타 = 0 - 랜덤 베타 = 1 , 절편 = 0 - 랜덤워크 베타 = 1 , 절편 != 0 - 표류하는 랜덤워크 베타 < 0 - 진동발산

4. 이동평균 예측기법 : 과거 변수와 평균의 차이(오차)의 선형조합을 이용한 y예측 (*이동평균법 아님)

 

# Invertable Stationary Time series

: 사실상 정상성 있으면 가역성 조건 만족함.

 

1. 확인방법

  • unit root circle 안에 inverse 특성근이 포함되어야 함다.

2. 비계절성 ARMIA : 차분의 AR모델과 MA모델을 더해서 미래 차분을 예측

  • 변수 추정방법 : MLE

  • 모수 결정방법

    • AIC, AICc, 또는 BIC 으로 AR, MA 차수 정하기

    • KPSS Unit Root Test 로 정상성을 띄는 d 찾기
    • ACF, PACF(부분 자기상관값들(partial autocorrelations) )시각화

      • 이 값은 시차 1,2,3,…,k−1의 효과를 제거한 후의 yt와 yt−k 사이의 관계를 측정함.

  • 해석

    상수(절편)=0이고 차분횟수=0이면, 장기 예측값이 0에 가까워질 것입니다. 상수(절편)=0이고 차분횟수=1이면, 장기 예측값이 0이 아닌 상수에 가까워질 것입니다. 상수(절편)=0이고 차분횟수=2이면, 장기 예측값이 직선 형태로 나타나게 될 것입니다. 상수(절편)!=0이고 차분횟수=0이면, 장기 예측값이 데이터의 평균에 가까워질 것입니다. 상수(절편)!=0이고 차분횟수=1이면, 장기 예측값이 직선 형태로 나타나게 될 것입니다. 상수(절편)!=0이고 차분횟수=2이면, 장기 예측값이 2차 곡선 추세로 나타나게 될 것입니다. *정상성이 충족되지 않는 경우, 상수가 추세정보 담고있다.

  • 예측과정

    • 그래프로 나타내고, 특이한 관측값을 찾습니다.

    • 필요하다면, 분산을 안정화하기 위해 박스-칵스(Box-Cox)등 변환함.

    • 데이터가 정상성을 나타낼 때까지 데이터를 가지고 1차 차분을 계산합니다.

    • ACF/PACF를 살펴봅니다: ARIMA(p,d,0)이 적절한가? 아니면 ARIMA(0,d,q) 모델이 적절한가?

    • AICc이 낮은 모델 찾기 (+ 상수항 여부 비교)

    • 잔차의 ACF를 그리고 잔차의 포트맨토(portmanteau; 융박스) 검정을 통해 잔차가 백색잡음일 때까지 반복.

    • 잔차가 백색잡음처럼 보이면, 예측값을 계산합니다.

3. 계절성 ARIMA 예측기법

  • 계절성분 분해 -> 계절성분에 대한 차분, ARIMA를 적용한 결과값에,

  • 비계절성분 분해 -> ARIMA를 적용한다.

  • 합친다.

# http://alkaline-ml.com/pmdarima/
import pmdarima as pm
from pmdarima import model_selection
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import numpy as np
import joblib  # for persistence
import os 

arima = pm.ARIMA(order=(1, 1, 2), seasonal_order=(0, 1, 1, 12))
arima.fit(y)

train, test = model_selection.train_test_split(data, train_size=90)
# Fit a simple auto_arima model
modl = pm.auto_arima(train, start_p=1, start_q=1, start_P=1, start_Q=1, 
											max_p=5, max_q=5, max_P=5, max_Q=5, seasonal=True, 											 stepwise=True, supprexss_warnings=True, D=10,
                      max_D=10, error_action='ignore')

# Create predictions for the future, evaluate on test
modl.update(test)
preds, conf_int = modl.predict(n_periods=test.shape[0], return_conf_int=True)

# Print the error:
print("Test RMSE: %.3f" % np.sqrt(mean_squared_error(test, preds)))

# Decompose the dataset into trend, seasonal and random parts.
decomposed = arima.decompose(train, 'multiplicative', m=12)

 

# GARCH

- ARIMA + GARCH : bents.tistory.com/19

'Statistics > Time Series Analysis' 카테고리의 다른 글

TSA - 6. 벡터자기회귀  (0) 2021.01.22
TSA - 5. 동적회귀  (0) 2021.01.22
TSA - 3. 패턴분해  (0) 2021.01.22
TSA - 2. 일반회귀  (0) 2021.01.22
TSA - 1. 시각화 및 벤치마크 예측기법  (0) 2021.01.22