如何確定ARIMA模型中引數p、d、q
在先前學習的使用ARIMA預測時間序列的文章中,對於如何確定引數p、d、q還是存在一些疑問,今天學習的這篇文章主要講解的是如何確定p、d、q引數。
實驗資料:連結: https://pan.baidu.com/s/14Nt8aU3NbgzBt2lA_jmB6Q 提取碼: 8rbt
讀取並觀察資料
import pandas as pd import matplotlib.pyplot as plt import statsmodels.api as sm data = pd.read_csv("arima-demo.csv",parse_dates=['date'],index_col='date') print(data.head()) data.plot(figsize=(12,6))
從上圖可知,存在一定的增長趨勢。
時間序列的差分d
ARIMA 模型對時間序列的要求是平穩型。因此,當你得到一個非平穩的時間序列時,首先要做的即是做時間序列的差分,直到得到一個平穩時間序列。如果你對時間序列做d次差分才能得到一個平穩序列,那麼可以使用ARIMA(p,d,q)模型,其中d是差分次數。
1階差分:
diff1 = data.diff(1) diff1.plot(figsize=(12,6))
目測已經平穩,再來看看2階差分的效果:
diff2 = data.diff(2) diff2.plot(figsize=(12,6))
可以看到二階差分侯差異不大,所以這裡d設定為1即可。
階層 p 和階數 q
現在我們已經得到一個平穩的時間序列,接來下就是選擇合適的ARIMA模型,即ARIMA模型中合適的p,q。
第一步我們要先檢查平穩時間序列的自相關圖和偏自相關圖。
diff1.dropna(inplace=True) fig = plt.figure(figsize=(12,8)) ax1=fig.add_subplot(211) fig = sm.graphics.tsa.plot_acf(diff1,lags=40,ax=ax1) ax2 = fig.add_subplot(212) fig = sm.graphics.tsa.plot_pacf(diff1,lags=40,ax=ax2)
其中lags 表示滯後的階數,以上分別得到acf 圖和pacf 圖。通過兩圖觀察得到:
- 自相關圖顯示滯後有3(4)個階超出了置信邊界
- 偏相關圖顯示在滯後1至7階(lags 1,2,…,7)時的偏自相關係數超出了置信邊界,從lag 7之後偏自相關係數值縮小至0
則有以下模型可以供選擇:
- ARMA(0,1)模型:即自相關圖在滯後1階之後縮小為0,且偏自相關縮小至0,則是一個階數q=1的移動平均模型;
- ARMA(7,0)模型:即偏自相關圖在滯後7階之後縮小為0,且自相關縮小至0,則是一個階層p=3的自迴歸模型;
- ARMA(7,1)模型:即使得自相關和偏自相關都縮小至零。則是一個混合模型。
為了確定哪個模型最合適,可以採用如下準則進行判定:
- AIC=-2 ln(L) + 2 k 中文名字:赤池資訊量 akaike information criterion
- BIC=-2 ln(L) + ln(n)*k 中文名字:貝葉斯資訊量 bayesian information criterion
- HQ=-2 ln(L) + ln(ln(n))*k hannan-quinn criterion
arma_mod70 = sm.tsa.ARMA(diff1,(7,0)).fit() print("arma_mod70:",arma_mod70.aic,arma_mod70.bic,arma_mod70.hqic) arma_mod01 = sm.tsa.ARMA(diff1,(0,1)).fit() print("arma_mod01:",arma_mod01.aic,arma_mod01.bic,arma_mod01.hqic) arma_mod71 = sm.tsa.ARMA(diff1,(7,1)).fit() print("arma_mod71:",arma_mod71.aic,arma_mod71.bic,arma_mod71.hqic) arma_mod70: 1579.7025547690232 1602.1002820966125 1588.7304359010805 arma_mod01: 1632.3203732818517 1639.7862823910482 1635.3296669925376 arma_mod71: 1581.0916055163707 1605.9779692136922 1591.12258455199
可以看到ARMA(7,0)的aic,bic,hqic均最小,因此是最佳模型。
模型校驗
在指數平滑模型下,觀察ARIMA模型的殘差是否是平均值為0且方差為常數的正態分佈(服從零均值、方差不變的正態分佈),同時也要觀察連續殘差是否(自)相關。
殘差的自相關一偏自相關
對ARMA(7,0)模型所產生的殘差做自相關圖:
resid = arma_mod70.resid#殘差 fig = plt.figure(figsize=(12,8)) ax1 = fig.add_subplot(211) fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40, ax=ax1) ax2 = fig.add_subplot(212) fig = sm.graphics.tsa.plot_pacf(resid, lags=40, ax=ax2)
看一看到大部分都在置信空間內,部分超出也只超出一點點。
D-W檢驗
ofollow,noindex" target="_blank">Durbin-Watson檢驗 ,簡稱D-W檢驗,是目前檢驗自相關性最常用的方法,但它只使用於檢驗一階自相關性。當DW值顯著的接近於O或4時,則存在自相關性,而接近於2時,則不存在(一階)自相關性。
print(sm.stats.durbin_watson(resid)) # 2.024244082702278
觀察是否符合正態分佈
這裡使用 QQ圖 ,它用於直觀驗證一組資料是否來自某個分佈,或者驗證某兩組資料是否來自同一(族)分佈。在教學和軟體中常用的是檢驗資料是否來自於正態分佈。
from statsmodels.graphics.api import qqplot fig = plt.figure(figsize=(12,6)) ax = fig.add_subplot(111) fig = qqplot(resid, line='q', ax=ax, fit=True)
Ljung-Box檢驗
Ljung-Box test是對randomness的檢驗,或者說是對時間序列是否存在滯後相關的一種統計檢驗。對於滯後相關的檢驗,我們常常採用的方法還包括計算ACF和PCAF並觀察其影象,但是無論是ACF還是PACF都僅僅考慮是否存在某一特定滯後階數的相關。LB檢驗則是基於一系列滯後階數,判斷序列總體的相關性或者說隨機性是否存在。 時間序列中一個最基本的模型就是高斯白噪聲序列。而對於ARIMA模型,其殘差被假定為高斯白噪聲序列,所以當我們用ARIMA模型去擬合數據時,擬合後我們要對殘差的估計序列進行LB檢驗,判斷其是否是高斯白噪聲,如果不是,那麼就說明ARIMA模型也許並不是一個適合樣本的模型。
import numpy as np r,q,p = sm.tsa.acf(resid.values.squeeze(), qstat=True) data = np.c_[range(1,41), r[1:], q, p] table = pd.DataFrame(data, columns=['lag', "AC", "Q", "Prob(>Q)"]) print(table.set_index('lag'))
AC Q Prob(>Q) lag 1.0 -0.014445 0.019203 0.889787 2.0 -0.047441 0.228719 0.891937 3.0 0.097778 1.129072 0.770061 4.0 0.047514 1.344178 0.853837 5.0 0.156219 3.697174 0.593785 6.0 -0.017855 3.728282 0.713391 7.0 -0.241230 9.475812 0.220274 8.0 0.068078 9.939217 0.269318 9.0 -0.012041 9.953895 0.354231 10.0 -0.256684 16.708543 0.081067 11.0 -0.085178 17.461885 0.094936 12.0 -0.063577 17.887029 0.119164 13.0 -0.096512 18.879634 0.126883 14.0 0.181119 22.422039 0.070348 15.0 -0.223097 27.869400 0.022401 16.0 0.012916 27.887910 0.032608 17.0 0.176769 31.402779 0.017833 18.0 -0.053140 31.724897 0.023694 19.0 -0.057704 32.110150 0.030374 20.0 0.037425 32.274556 0.040459 21.0 0.120519 34.004510 0.036199 22.0 0.102662 35.278536 0.036225 23.0 -0.007830 35.286058 0.048710 24.0 -0.148547 38.035517 0.034383 25.0 0.046254 38.306261 0.043173 26.0 -0.032621 38.443060 0.055055 27.0 0.032381 38.580025 0.069141 28.0 0.124968 40.653492 0.057760 29.0 -0.092711 41.813707 0.058361 30.0 -0.033602 41.968698 0.072016 31.0 0.011216 41.986264 0.090054 32.0 -0.016597 42.025405 0.110574 33.0 -0.047033 42.345328 0.127733 34.0 0.001922 42.345872 0.154137 35.0 -0.022258 42.420173 0.181558 36.0 -0.003481 42.422025 0.213721 37.0 -0.083009 43.495231 0.214345 38.0 -0.089174 44.758050 0.209260 39.0 0.005255 44.762523 0.242730 40.0 -0.065663 45.475168 0.254607
檢驗的結果就是看最後一列前十二行的檢驗概率(一般觀察滯後1~12階),如果檢驗概率小於給定的顯著性水平,比如0.05就拒絕原假設,其原假設是相關係數為零。就結果來看,如果取顯著性水平大於0.05,那麼相關係數與零沒有顯著差異,即為白噪聲序列。
參考連結:https://blog.csdn.net/u010414589/article/details/49622625