2021년 6월 7일 월요일

Python - SARIMAX estimation model - 1/3

ARIMA 에서 파생된 SARIMAX 예측 모델을 사용해 추정해 보는 포스팅

예제 순서

1.US Wholesale Price Index (WPI) 데이터 Set에 ARIMA order (1,1,1)을 넣어서 추정
2.1번 예제에 MA(4) 항을 넣어서 계절적 특성(seasonal effect) 을 추가한다
3.월별 항공사 데이터에 ARIMA order(2,1,0) 과 Seasonal order(1,1,0,12)를 넣기
4.외인성 회귀 변수가 있는 ARIMA (1,1) 모델의 사용
5.Dynamic Forecasting
===================================
필요 package import & Figure size 지정
import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
import requests
from scipy.stats import norm
from io import BytesIO
from datetime import datetime

pd.plotting.register_matplotlib_converters()
plt.rc("figure", figsize=(16,8))
plt.rc("font", size=14)
===================================

Example - 1 - US Wholesale Price Index (WPI) with ARIMA order (1,1,1)
Code
# Dataset
wpi1 = requests.get('https://www.stata-press.com/data/r12/wpi1.dta').content
data = pd.read_stata(BytesIO(wpi1))
data.index = data.t
# Set the frequency
data.index.freq="QS-OCT"
# Fit the model
mod = sm.tsa.statespace.SARIMAX(data['wpi'], trend='c', order=(1,1,1))
res = mod.fit(disp=False)
print(res.summary())

Result
**붉은색에 인자가 (1,1,1)인것을 볼 수 있다**
**하단 파란 상자를 이용해 계산에 사용한다**

이를 이용해 최대 가능성 추정치를 산출하면 다음과 같이 계산이 된다


-파란 box의 sigma2-

를 계산하는 상황에서

-파란 box의 intercept-

-파란 box의 ar.L1-

을 조합해 식을 변형시켜 다음과 같이 쓸 수 있다


의 값을 얻을 수 있다

===================================
Example - 2 - Add MA(4)항의 추가 (seasonal effects 를 위해)
Code
# Dataset
data = pd.read_stata(BytesIO(wpi1))
data.index = data.t
data.index.freq="QS-OCT"
data['ln_wpi'] = np.log(data['wpi'])
data['D.ln_wpi'] = data['ln_wpi'].diff()
# Graph data
fig, axes = plt.subplots(1, 2, figsize=(15,4))
# Levels
axes[0].plot(data.index._mpl_repr(), data['wpi'], '-')
axes[0].set(title='US Wholesale Price Index')
# Log difference
axes[1].plot(data.index._mpl_repr(), data['D.ln_wpi'], '-')
axes[1].hlines(0, data.index[0], data.index[-1], 'r')
axes[1].set(title='US Wholesale Price Index - difference of logs');

 


# Graph data
fig, axes = plt.subplots(1, 2, figsize=(15,4))
fig = sm.graphics.tsa.plot_acf(data.iloc[1:]['D.ln_wpi'], lags=40, ax=axes[0])
fig = sm.graphics.tsa.plot_pacf(data.iloc[1:]['D.ln_wpi'], lags=40, ax=axes[1])

 

 

#Mode에 (1,1,1)삽입
mod = sm.tsa.statespace.SARIMAX(data['wpi'], trend='c', order=(1,1,1))


#MA 인자(lag polynomial) 을 위해 삽입
ar = 1 # this is the maximum degree specification
ma = (1,0,0,1) # this is the lag polynomial specification
mod = sm.tsa.statespace.SARIMAX(data['wpi'], trend='c', order=(ar,1,ma))

# Fit the model
mod = sm.tsa.statespace.SARIMAX(data['ln_wpi'], trend='c', order=(1,1,(1,0,0,1)))
res = mod.fit(disp=False)
print(res.summary())

Result



댓글 없음:

댓글 쓰기