1. 程式人生 > 其它 >使用python的statsmodels模組擬合ARIMA模型

使用python的statsmodels模組擬合ARIMA模型

技術標籤:python操作基礎知識statsmodelARIMA模型

匯入必要包和模組

from scipy import stats
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_predict
plt.rcParams['font.sans-serif']=['simhei']#用於正常顯示中文標籤
plt.rcParams['axes.unicode_minus']=False#用於正常顯示負號

1.讀取資料並畫圖

data=pd.read_csv('資料/客運量.csv',index_col=0)
data.index = pd.Index(sm.tsa.datetools.dates_from_range('1949', '2008'))#將時間列改為專門時間格式,方便後期操作
data.plot(figsize=(12,8),marker='o',color='black',ylabel='客運量')#畫圖

#本文所使用的客流量時間序列資料:https://download.csdn.net/download/weixin_45590329/14143811

#時間序列折線圖如下所示,顯然資料有遞增趨勢,初步判斷資料不平穩

2.平穩性檢驗

sm.tsa.adfuller(data,regression='c')
sm.tsa.adfuller(data,regression='nc')
sm.tsa.adfuller(data,regression='ct')

進行三種形式的ADF單位根檢驗,如部分結果所示,發現序列不平穩

3.對資料作一階差分處理

diff=data.diff(1)
diff.dropna(inplace=True)
diff.plot(figsize=(12,8),marker='o',color='black')#畫圖

作出資料一階差分後折線圖,初步判斷平穩

4.對一階差分資料進行平穩性檢驗

sm.tsa.adfuller(diff,regression='c')
sm.tsa.adfuller(diff,regression='nc')
sm.tsa.adfuller(diff,regression='ct')

如圖所示,說明序列平穩

5.確定ARIMA(p,d,q)階數

fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(diff.values.squeeze(), lags=12, ax=ax1)#自相關係數圖1階截尾,決定MA(1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(diff, lags=12, ax=ax2)#偏相關係數圖1階截尾,決定AR(1)

根據自相關係數圖ACF和偏自相關係數圖PACF,將原始資料確定為ARIMA(1,1,1)模型

6.引數估計

model = ARIMA(data, order=(1, 1, 1)).fit()#擬合模型
model.summary()#統計資訊彙總

#係數檢驗
params=model.params#係數
tvalues=model.tvalues#係數t值
bse=model.bse#係數標準誤
pvalues=model.pvalues#係數p值

#繪製殘差序列折線圖
resid=model.resid#殘差序列
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
ax = model.resid.plot(ax=ax)

#計算模型擬合值
fit=model.predict(exog=data[['TLHYL']])

7.模型檢驗

#8.1.檢驗序列自相關
sm.stats.durbin_watson(model.resid.values)#DW檢驗:靠近2——正常;靠近0——正自相關;靠近4——負自相關

#8.2.AIC和BIC準則
model.aic#模型的AIC值
model.bic#模型的BIC值

#8.3.殘差序列正態性檢驗
stats.normaltest(resid)#檢驗序列殘差是否為正態分佈
#最終檢驗結果顯示無法拒絕原假設,說明殘差序列為正態分佈,模型擬合良好

#8.4.繪製殘差序列自相關圖和偏自相關圖
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=12, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(resid, lags=12, ax=ax2)
#如果兩圖都零階截尾,這說明模型擬合良好

8.預測

#預測至2016年的資料。由於ARIMA模型有兩個引數,至少需要包含兩個初始資料,因此從2006年開始預測
predict = model.predict('2006', '2016', dynamic=True)
print(predict)

#畫預測圖及置信區間圖
fig, ax = plt.subplots(figsize=(10,8))
fig = plot_predict(model, start='2002', end='2006', ax=ax)
legend = ax.legend(loc='upper left')