상세 컨텐츠

본문 제목

시계열 분석 스터디 3주차(우명진) - ARIMA

본문

본 포스팅은 DMQA 김성범 교수님의 ARIMA 모델-Part 2과 '실전 시계열 분석'의 6장 시계열의 통계 모델, POSTECH 전치혁 교수님의 Week 4. 비정상적 시계열을 바탕으로 작성되었습니다. 

 

시계열 분석 스터디 3주차에서는 ARIMA에 대한 스터디를 진행하였습니다. 

특히, 비정상성 교정 / ARIMA 모형  / SARIMA 모형 에 대하여 학습했습니다. 

 

S&P 500 Stock Price 데이터를 이용한 모델 구현은 https://github.com/loiswoo/Time-Series/blob/main/TS_study_w3.ipyn에서 확인 가능합니다. 

 


 

 

Autoregressive Integrated Moving Average(ARIMA)

ARMA 모델에서 추세를 제거하고 시계열을 정상화하는 차분까지 고려하는 모델이다.

ARIMA는 정상성을 만족하는 데이터를 위하여 Differencing을 진행한다. 

 

 

ARIMA 모델은 (p, d, q) parameter로 구성된다.

AR(p): independent variable의 개수

I(d): differencing을 횟수

MA(q): 파라미터의 개수 

 


<ARIMA 유의점>

• 차분의 차수가 너무 크지 않아야 한다.

• ARIMA의 parameter 값은 부적절한 복잡성과 샘플 데이터에 대한 과적합을 피하기 위해 가능한 작게 유지되어야 한다.

  p > 5, d > 2, q > 5인 경우는 회의적인 자세를 취하는 것이 좋다

  p나 q 항 중 하나만 크게 설정하고, 나머지는 상대적으로 작은 값을 설정하는 것이 좋다

 

<ARIMA 모델의 일부>

 ARIMA(0,0,0)은 백색잡음 모델

 ARIMA(0,1,0)은 확률보행

 ARIMA(0,1,1)은 지수평활모델

 ARIMA(0,2,2)은 지수평활을 추세로 가진 데이터로 확장시킨 Holt's linear method

 

 

차분(Differencing): nonstationary한 데이터를 stationary하게 바꿔주는 것 

현 시점 데이터에서 d시점 이전 데이터를 뺀 것 

1차 차분: t차원의 데이터와 t-1차원의 데이터

→차분을 통해 stationary한 데이터가 생길 수 있다

 

- constant average trend가 있다면 1차 차분으로 충분하다

- time varying trend가 있다면 2차 차분을 진행한다

대부분의 데이터는 2차 차분으로 충분하다 

만약 3차 차분을 해야한다면, ARIMA 모델 자체가 적절하지 않은 것이다. 

 

 

 

 

<ARIMA 모델의 Parameter 추정하는 방법>

1. 수동적으로 모델을 적합시키는 방법  - Box-Jenkins ARIMA Procedure

1. Data Preprocessing(transformation, differencing)

Nonstationary한 데이터는 ACF 그래프에서 천천히 감소하는 형태를 보인다. 

따라서 Differencing을 통해 stationary하게 바꿔줄 수 있다. 

 

Stationary하다면, ACF 그래프에서 lag2에서 확 떨어지거나, 일정한 패턴이 보이지 않을 것이다. 

 

 

2. Identify Model to be Tentatibely Entertained

Graphical Method를 사용한다.

Model ACF Partial ACF
MA(q) Cut off after lag q Die out(지수적으로 감소, 소멸하는 sine함수 형태)
AR(p) Die out(지수적으로 감소, 소멸하는 sine함수 형태) Cut off after lag p(p시차 이후 0으로 절단)
ARMA(p,q) Die out(시차 q-p이후부터 소멸) Die out(시차 q-p이후부터 소멸)

 

 

3. Estimate Parameters

ARIMA(p,d,q)에서 parameter를 추정하는 과정이다. 

보통 d =1 또는 2 중에서 결정이 된다.

 

그리고 p: 1~20, q: 1~20 으로 설정한 다음에, for loop을 돌려보아 

AIC나 Testing Accuracy가 가장 좋은 때로 설정하면 된다. 

 

 

4. Diagnosis Check  (2번으로 돌아갈 수 있음)

Model should be checked for adequacy.

 

1) 잔차를 구하고 2) 잔차들의 ACF plot를 확인해야한다.

→ 40개 중에서 2~3개 정도만 bound 밖으로 벗어나야한다. 

 

ACF(residual) 그래프를 그려서 잔차(오차항)들 간의 자체상관 패턴이 보이면 안된다. 만약 어떤 패턴이 드러난다면, 잔차의 자체상관을 다룰 수 있도록 모델에 추가로 항을 포함해 복잡성을 늘리는 것을 고려해야한다. 

 

모델의 예측과 실젯값 사이의 상관관계를 분석하여 모델을 빠르게 비교/선택할 수 있다. 예측값과 실젯값 사이의 상관계수가 상당히 커졌다면 이는 모델의 성능이 우수하다는 것을 의미한다. 그러나 상관계수가 이전모델과 비교했을 때 비슷한 수치라면 굳이 더 복잡한 모델을 선택할 필요가 없다.

 

5. Use Model to Predict

 

 

 

 

2. 자동으로 모델을 적합시키는 방법 - forecast 패키지의 auto.arima()

 

auto.arima()는 grid search를 통한 AIC 최소화 작업을 진행한다. 

 

 

 


 

Seasonal ARIMA Model(SARIMA)

Seasonal ARIMA 모델은 기존 ARIMA 모델에 계절 변동을 반영한 모델이다. 

 

- SARIMA 모형은 각 계절에 따른 독립적인 ARIMA 모델이 합쳐져 있는 모형이다. 

- SARIMA 모형은 multiplicative 계절성을 가정한다.

- 기존 ARIMA(p,d,q) 모형에 계절성 주기를 나타내는 차수 s가 추가적으로 필요하기 때문에

ARIMA(p,d,q)(P,D,Q)s로 표기한다 - 소문자는 비계절 요인, 대문자는 계절 요인 

- s의 중요한 점은 모델이 시간상 인접한 데이터가 동일한 계절 또는 서로 다른 계절에 있어도 시간적으로 근접한 일반적인 방법으로 서로의영향을 인식한다는 점이다. 

- s의 값은 월별 계절성을 나타낼 때는 s = 12가 되고, 분기별 계절성을 나타낼 때는 s=4가 된다

 


4-1 비정상적 시계열 모형화를 위한 ARIMA 모형

시계열의 비정상성: 시계열에 추세 또는 계절성이 포함되는 경우 

 

<판단 방법>

1) 시계열의 시간에 대한 그래프를 보고 시각적으로 판단

2) ACF가 시차에 대하여 서서치 감소하는 패턴

3) 단위근 설정(기각하면 단위근이 없는것으로 정상적인 것)

 

<대응 방법>

1) 차분을 통한 정상적 시계열로 변환

 - 1차 차분: t시점과 (t-1)시점의 차이를 산출 

 → 정상적인 시계열을 보인다면, 1차 차분으로 끝. 그렇지 않다면 2차 차분 과정. 

2) 함수변환을 통하여 분산 안정화

3) 분해법으로 추세 및 계절성 제거 

 

-차수 d 누적 시계열: d차 차분 후 시계열이 처음으로 정상적일 때, 원 시계열을 차수 d 누적시계열이라고 하고 I(d)로 표기 

4-2 계절성을 반영한 ARIMA 모형 이해 

일반적 시계열에서는 추세와 계절성이 동시에 존재하는 경우가 많다.

추세는 차분으로 제거될 수 있으나 계절성은 여전히 남을 수 있다. 

ARIMA모형은 비계절성에 대한 것이며 계절성은 별도로 처리해야한다

일반적 시계열은 비계절성 ARIMA 모형과 계절성 ARIMA 모형이 복합된 형태이다. 

 

계절성 차분(seasonal differencing)

-계절성 주기 s(월별: s=12, 분기: s = 4)

-계절성이 있는 경우 단순 (비계절성) 차분으로는 정상화가 되지 않음

-1차 계절성 차분: 인근한 두 계절 값의 차이를 산출 

<SARIMA 모형의 Parameter 추정하는 방법>

1. 시계열도를 그려보고 추세 및 계절성 존재 여부 판단

 

2. 적절한 차분 실시 

 -추세는 없고 계절성이 있는 경우: 해당 주기에 계절성 차분

 -추세가 있고 뚜렷한 계절성이 없는 경우: 선형추세가 있는 경우 1차 차분, 곡선형태의 추세가 있는 경우 차분 전에 함수 변환 시도 

 -추세와 계절성이 있는 경우: 우선 계절성 차분을 실시하고 추세를 다시 검토. 추세가 여전히 남아있는 경우 1차 차분 추가 실시

 

3. 차분 시계열에 대한 ACF와 PACF를 바탕으로 p,q,P,Q를 결정

 -비계절성 계수인 p,q는 ARMA 모형의 경우와 동일한 요령으로 결정

 -계절성 계수인 P,Q는 주기의 배수에서 나타나는 ACF와 PACF의 패턴을 보고 결정

 

4. 모형 파라미터 추정

 

5. 잔차 검정 실시 

AR에서는 차분을 안했고, MA에서는 차분을 함
큰 차수에서는 유의하지 않다.

 

 

4-3 비정상성 검정을 위한 단위근(Unit Root) 검정

단위근 검정은 통계적 검정을 통하여 시계열의 정상성 여부를 판정

-대표적인 단위근 검정은 ADF 검정

-Dickey and Fuller가 AR(1)모형에 대해 제안

-모든 정상적 시계열은 고차원의 AR모형으로 근사될 수 있다고 가정. 

 

 


DACON의 삼성전자 주가 예측 게시물을 참고하여 정리하였습니다. 

https://dacon.io/en/codeshare/2570

 

[Python] 삼성전자 주가 예측 입니다

 

dacon.io

AR: 자기 자신의 과거를 정보로 사용하는 개념  / '현재의 상태는 이전의 상태를 참고해서 계산된다'

MA: '이번 항에서의 오차를 이용하여 현재 항의 상태를 추론하자' 

ARIMA: 추세 변동의 경향성까지 반영한 방법

 

ARIMA의 클래스 order = (2,1,2)

p: "AR이 몇번째 과거까지를 바라보는지에 대한 파라미터'

d: 차분에 대한 파라미터 (차분: 현재 상태의 변수에서 바로 전 상태의 변수를 빼주는 것, 시계열의 불규칙성을 보정해주는 역할)

q: MA가 몇번째 과거까지를 바라보는지에 대한 파라미터 

 

<ARIMA 파라미터 가이드라인>

1. p와 q의 합이 2 미만인 경우

2. p와 q의 곱이 짝수인 경우 (0도 포함)

 

 

불규칙적 시계열 예측의 경우에는 먼 미래를 예측하는 것의 큰 의미가 없기 때문에 '앞으로 N일동안 어느 정도로 상승/하락할 것이다' 정도의 대략적인 경향 예측만을 수행하는 것이 일반적

 

모델의 평가 과정

- model_fit.forecast(steps=5)로 향후 5일의 가격을 예측하여 pred_y로 정의한다

-bitcoin_df.iloc[361:]로 해주어 bitcoin_df의 마지막 5일을 test_y로 정의한다

-모델의 예측한 상한값, 하한값을 pred_y_uppper, pred_y_lower로 정의한다

-정의한 모든 값을 비교하여 5일동안의 상승 경향 예측이 얼마나 맞는지 평가해본다

 

 

MODEL 2: Facebook Prophet

Prophet: Additive 모델이라는 모델링 방법에 기반한 시계열 예측 모델, 시계열 데이터의 트렌드성(연간/월간/일간)을 예측하는 것에 초점에 맞추어져 있다

  +) Additive 모델: 선형회귀 분석의 단점을 극복하기 위해 개량된 분석 방법 -> 각 피쳐마다 비선형적인 적합을 가능하게 하는 일련의 방법 

fbprophet 라이브러리 - 데이터 프레임의 피쳐를 'ds'와 'y'로 변경 / Prophet 클래스 선언 / fit()함수로 모델 학습 

 

파라미터

1) seasonality_mode: 연간, 월간, 주간, 일간 등의 트렌드성을 반영하는 것을 의미 -> 각 순서에 따른 트렌드 확인 가능  

2) changepoint_prior_scale: 트렌드가 변경되는 문맥을 반영하는 파라미터. 수치가 높을수록 모델은 과적합에 가까워짐

 

모델의 성능을 높이는 방법 

1) 상한값 혹은 하한값을 지정해주는 것 

바닥과 천장이 없는 주가 데이터의 경우 의미가 없을 수 있지만 시계열 데이터에서는 상한값 혹은 하한값을 설정해주는 것이 모델의 성능을 높여줄 수 있는 방법 중 하나이다.

ex) Prophet 모델 : future_data['cap'] = 96000 으로 상한선 설정 / 모델 안에 파라미터 growth = 'logistic' 설정 

 

2) 이상치 제거 

이상치를 설정해준 후, 이상치에 해당하는 데이터 = None으로 설정 

관련글 더보기

댓글 영역