(五十一)时间序列分析二:平稳时间序列分析(ARMA)
平穩時間序列
平穩時間序列分為嚴平穩時間序列與寬平穩時間序列。如果在一個時間序列中,各期數據的聯合概零分布與時間 t 無關,則該序列為嚴平穩時間序列。實際中討論的平穩時間序列是寬平穩時間序列,指對任意時間下,序列的均值、方差存在并為常數,且自協方差函數與自相關系數只與時間間隔k有關。只有平穩時間序列才可以進行統計分析,因為平穩性保證了時間序列數據都是出自同一分布。可以使用單位根檢驗來檢驗時間序列的平穩性。
若一個平穩時間序列的序列值之間沒有相關性,那么就意味著這種數據前后沒有規律,也就無法挖掘出有效的信息,這種序列稱為純隨機序列。在純隨機序列中,有一種序列稱為白噪聲序列,這種序列隨機且各期的方差一致。平穩時間序列分析在于充分挖掘時間序列之間的關系,當時間序列中的關系被提取出來后,剩下的序列就應該是個白噪聲序列。
時間序列自相關與概率論中的相關定義本質是一致的,它衡量的是序列自身在不同時刻隨機變量的相關性;偏自相關系數則剔除了兩時刻之間其他隨機變量的干擾,是更加純粹的相關。
ARMA模型與定階
1、AR模型認為通過時間序列過去時點的線性組合加上白噪聲即可預測當前時點。
Xt = α1Xt-1 + α2Xt-2 +…+ αpXt-p + εt ,其中 εt 是一個獨立于 Xt 的白噪聲序列。AR模型在金融模型中主要是對金融序列過去的表現進行建模,如交易中的動量與均值回歸。
2、MA模型是歷史白噪聲的線性組合。與AR最大的不同之處在于,AR模型中歷史白噪聲的影響是間接影響當前預測值的(通過影響歷史時序值)。Xt = εt - β1εt-1 - β2εt-2 -…- βqεt-q 。在金融模型中,MA常用來刻畫沖擊效應,例如預期之外的事件。
3、ARMA模型是AR和MA模型的混合,AR( p )和MA( q )共同組成了ARMA(p,q)。Xt = α1Xt-1 + α2Xt-2 +…+ αpXt-p + εt - β1εt-1 - β2εt-2 -…- βqεt-q 。
如何確定p、q的值就是ARMA模型的定階問題。一個常用的定階方法是利用ACF圖和PACF圖,不同模型的ACF、PACF圖識別方法如下表:
| ACF | 拖尾 | q階截尾 | 拖尾 |
| PACF | p階截尾 | 拖尾 | 拖尾 |
所謂截尾指的是從某階開始均為(接近)0的性質,拖尾指的是并不存在某一階突然跳變到0而是逐漸衰減為0。
使用ACF與PACF對ARMA模型進行定階時,由于估計誤差的存在,實際中有時很難判斷AR模型與MA模型的截尾期數。在實際操作中,可以通過AIC或者BIC準則識別,兩個統計量都是越小越好。
案例
ARMA建模的基本步驟是:檢驗數據的平穩性→定階→ARMA建模→模型預測→殘差白噪聲檢驗。先導入庫和數據,查看時序圖:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import statsmodels.api as sm data= pd.read_csv(r'C:\Users\lenovo\Desktop\ts_simu200.csv',index_col='t') dates=pd.date_range(start='2017/01/01', periods=200) data.set_index(dates, inplace=True) data=data['ARMA_11_b'] data.plot(figsize=(12,8)) plt.show()1、平穩性檢驗
ADF是一種常用的單位根檢驗方法,它的原假設為序列具有單位根,即非平穩,對于一個平穩的時序數據,就需要在給定的置信水平上顯著,拒絕原假設。
temp = np.array(data) t = sm.tsa.stattools.adfuller(temp) # ADF檢驗 output=pd.DataFrame(index=['Test Statistic Value', "p-value", "Lags Used", "Number of Observations Used","Critical Value(1%)","Critical Value(5%)","Critical Value(10%)"],columns=['value']) output['value']['Test Statistic Value'] = t[0] output['value']['p-value'] = t[1] output['value']['Lags Used'] = t[2] output['value']['Number of Observations Used'] = t[3] output['value']['Critical Value(1%)'] = t[4]['1%'] output['value']['Critical Value(5%)'] = t[4]['5%'] output['value']['Critical Value(10%)'] = t[4]['10%'] output Out[1]: value Test Statistic Value -4.8944 p-value 3.57598e-05 Lags Used 3 Number of Observations Used 196 Critical Value(1%) -3.46416 Critical Value(5%) -2.8764 Critical Value(10%) -2.57469可以看出,p-value接近于0,小于顯著性水平。原假設"序列具有單位根即非平穩"被拒絕,因此該時間序列為平穩的。
2、ARMA模型定階
先用第一種定階方法:利用ACF圖和PACF圖找出該序列適合的模型。
#自相關和偏自相關圖 fig = plt.figure(figsize=(12,8)) fig = sm.graphics.tsa.plot_acf(data,lags=20)#lags表示展示的滯后的階數 fig = sm.graphics.tsa.plot_pacf(data,lags=20) plt.show()
很明顯圖中ACF和PACF都是拖尾的,應該建立ARMA(p,q)模型。下面分別應用AIC和BIC法則為我們的模型定階。為了控制計算量,根據上圖我們限制AR最大階不超過5,MA最大階不超過5:
可以看出,AIC和BIC法則求解的模型階次均為(1,1),下面就來建立ARMA(1,1)模型,源數據的最后20個數據用于預測。
3、ARMA(1,1)建模
為了檢驗擬合效果,可用經調整的R2來測算:
可以發現擬合精度較高,接著來看預測效果。
4、模型預測
由于該數據集從2017-01-01開始,共有200條,因此我們需要預測最后20條并對比,即2017-06-30至2017-07-19。
predicts = tempModel.predict(180,199,dynamic=True) comp = pd.DataFrame() comp['original'] = test comp['predict'] = predicts comp.plot()
可以發現預測效果不是很好。結合之前的擬合效果來看,發現該模型擬合歷史數據較好,而預測差強人意:
5、殘差白噪聲檢驗
模型是否提取了原數據足夠的信息的重要參考是ARMA模型的殘差是否是白噪聲序列:
resid = tempModel.resid sm.graphics.tsa.plot_acf(resid, lags=50) sm.graphics.tsa.plot_pacf(resid, lags=50) plt.show()
可以看出,殘差已經無信息可提取。在ACF圖中,殘差滯后各期均無顯著的自相關性(ACF第0期代表與自身的相關性,其值恒為1),在PACF圖中,各期也無顯著的偏自相關性。可以判定,殘差序列為白噪聲序列。
參考文獻
常國珍等《Python數據科學:技術詳解與商業實踐》,機械工業出版社;
https://uqer.datayes.com/v3/community/share/57988677228e5ba28e05faff
總結
以上是生活随笔為你收集整理的(五十一)时间序列分析二:平稳时间序列分析(ARMA)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vtkdelaunay3d的参数设置_V
- 下一篇: Win7-旗舰版-连接共享打印机时,报