1. 程式人生 > >時序預測之二_ARIMA

時序預測之二_ARIMA

1. 說明

 ARMA迴歸滑動平均模型(Autoregressive Moving Average Model,簡記ARIMA),是研究時間序列的重要方法,由自迴歸模型(簡稱AR模型)與滑動平均模型(簡稱MA模型)為基礎“混合”構成。常用於具有季節變動特徵的銷售量、市場規模的預測等。ARIMA模型相對ARMA模型,僅多了差分操作。

2. 相關概念

(1) 自迴歸模型(AR)

 自迴歸模型autoregressive model,簡稱AR.在時序分析中,描述時間序列{yt}自身某一時刻和前p個時刻之間相互關係的模型稱自迴歸模型,其形式為:



 其中Φ1, Φ2,…, Φp是模型引數,εt是白噪聲序列,它反映了所有其它隨機因素的干擾.其中p為模型階次,即yt由前p個值決定.

(2) 滑動平均模型(MA)

 滑動平均模型moving average model,也稱移動平均模型,它將時間序列{yt}看成白噪聲序列的線性組合,為什麼誤差能描述模型呢?假設某個值可通過之間前N個值的平均值預測,稍作變化,即實際值可以通過前一值的預測值加誤差得到.因此實際值可用多個誤差值的累加來表示.其形式為:

(3) 迴歸滑動平均模型(ARMA)

 簡單地說:AR模型是建立當前值和歷史值之間的聯絡,MA模型是計算AR部分累積的誤差。ARMA是兩個維度的和.

(4) 資料預處理

 ARMA要求被分析的資料呈正態分佈,平穩,零均值.平穩性一般是指:均值為常數,方差為常數,且自協方差為常數.比如說上升的趨勢中,均值就不是常數;如果震盪幅度越來越大,則方差不是常數。
 如果僅是均值非0的情況,可減去均值;如果趨勢可用線性擬合,可以減去擬合後的趨勢;另外還可以用差分,或者季節性差分的方法使之平穩;對於非正態分佈,可使用對數處理.

(5) 差分

 差分是將資料進行移動之後與原資料進行比較得出的差異資料,這裡的移動是指上移或者下移.簡單的說,比如對某支股票的價格資料做一階差分,就是將每日價格減去前一天的價格.
 在python中,差分運算可使用pandas的diff(periods=n)函式實現,其中n為階數,預設為一階差分,一階差分的具體操作是df.shift()-df.用於生成平穩資料,比如下面的曲線.

 一階差分後

 由此可見,差分之後,去掉了趨勢,均值趨於0.有助於分析其它特徵.

(6) 自相關與偏自相關(ACF&PACF)

 自相關acf和偏自相關pacf是分析時序資料的重要方法,是在平穩條件下求得的.
 自相關函式Auto Correlation Function,簡稱ACF.形如:

 X軸表示滯後值,Y軸從[-1,1],表示了這些值的相關性.比如左邊第一點相關性為1,就是說該點與它自己完全相關.從圖中可觀察到:12個月為週期的相關性相當明顯的.呼叫方法如下:

from statsmodels.graphics.tsaplots import plot_acf
plot_acf(df['xxx'])

 注意時序資料中不能包括空值,如果之前用了一次一階差分和一次十二階差分,應去掉前13個為空的值.
 圖中藍色部分是描述的統計顯著性,如果資料隨機分佈,Y軸的位置會在藍色區域之內.因此,要著重看藍色區域以外的點.
 自相關係數包含了其它變數影響下的相關關係,有時需要只考慮某兩個變數的相關關係,即偏相關係數.其中的偏字,指的是隻考慮首尾兩項的關係,把中間項當成常數,使用了偏導數的方法.使用方法如下:

from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(df['xxx'])

(7) 拖尾和截尾

 我們通過觀察自相關圖和偏自相關圖來確使用哪種模型,以自相關圖為例,先看看圖片呈現的幾種形式.

 左邊的圖呈直線形式衰減,說明可能包括趨勢,需要進一步差分;中間是截尾圖,它指的是在某個值(如圖中的7)後截止為0;右則是拖尾圖,指的是按指數形式或正弦形式有規律地衰減.
 如果自相關係數拖尾,偏自相關係數p階截尾,則使用p階的AR模型.
 如果自相關係數q階截尾,偏自相關函式拖尾,則使用q階的MA模型.
 簡單的講,它們兩個都是看截尾截在哪兒.
 如果自相關函式和偏自相關函式均拖尾,則使用ARMA模型,由於AR和MA相互影響,階數需要從小到大逐步嘗試.

(8) 模型檢驗

i. 模型對訓練資料的擬合
 用模型對訓練資料做擬合,用觀察或者計算誤差的方式,檢視二者差異,差異越小越好.

ii. 檢查殘差的自相關函式
 殘差的自相關函式應該沒有可識別的結構.

iii. AIC資訊準則
 AIC資訊準則Akaike information criterion,是衡量統計模型擬合優良性的一種標準,AIC值越小越好,也有根據AIC自動選引數的工具.

3. 步驟

 具體使用python呼叫statsmodels庫實現.statsmodels是一套統計工具集.具體需要考慮三個引數:d,p,q.其中d是消除趨勢的差分階數,p是AR階層,q是MA的階數.步驟如下:

(1) 做時序圖觀察基本的趨勢和週期.

(2) 分析平穩性,正態性,週期性;並對資料進行轉換.

(3) 做自相關和偏自相關圖,確定模型階次.

(4) 模型檢驗

(5) 用模型預測.

4. 問題與解答

(1) 做ARMA分析前是否應該剔除週期性因素?
 我們可以從自相關圖中看出週期性波動,比如上邊右側的拖尾圖,它說明某天與前7,14,21天都強相關.如果發現強相關,可先進行多階差分(季節差分)後,再進一步使用ARMA模型處理.需要注意的是各層次差分在預測時都需要對應的還原.

(2) 做長期預測時如何應對衰減?
 我在做鹽城上牌預測時就遇到了嚴重的衰減問題,當時需要預測之後幾百天的資料,而ARMA在預測了幾十天之後,就從類似正弦波型衰減成了一條直線,導致我最終放棄了該模型,改為使用線性擬合趨勢,嚴重損失了精度.後來看複賽排名第一的大神分享,他也使用ARMA,並且也有衰減問題,不同的是他採用按月預測,相比於按日預測,衰減就好得多,非常贊!

5. 參考