ARMA 时间序列模型
更好的理解協方差以及相關系數
###X因素和Y因素協方差公式:
自相關系數ACF
直觀上來說,ACF 描述了一個觀測值和另一個觀測值之間的自相關,包括直接和間接的相關性信息。
其實自相關系數可以這么理解:把一列數據按照滯后數拆成兩列數據,在對這兩列數據做類似相關系數的操作。
這組數據是求滯后數為2的自相關系數,則變成求{x1,x2,…,x8}和{x3,x4,…,x10}兩者的“相關系數”,相關系數打引號是因為這個相關系數的公式和以往的有點不一樣。下面看一下公式的對比:
所以,我們可以這么理解自相關系數, 她就是用來表達一組數據前后數據 (自己和自己) 的相關性的。
PACF 是部分自相關函數或者偏自相關函數。基本上,它不是找到像ACF這樣的滯后與當前的相關性,而是找到殘差(在去除了之前的滯后已經解釋的影響之后仍然存在)與下一個滯后值的相關性。因此,如果殘差中有任何可以由下一個滯后建模的隱藏信息,我們可能會獲得良好的相關性,并且在建模時我們會將下一個滯后作為特征。請記住,在建模時,我們不想保留太多相互關聯的特征,因為這會產生多重共線性問題。因此,我們只需要保留相關功能。
直觀上來說,PACF 只描述觀測值 y t y_{t} yt? 和其滯后項 y t ? k y_{t-k} yt?k? 之間的直接關系,調整了其他較短滯后項( y t ? 1 y_{t-1} yt?1? , y t ? 2 y_{t-2} yt?2? …… y t ? k ? 1 y_{t-k-1} yt?k?1? )的影響。
###截尾與拖尾
####拖尾是指序列以指數率單調遞減或震蕩衰減,而截尾指序列從某個時間點變得非常小。
出現以下情況,通常視為(偏)自相關系數d階截尾:
在最初的d階明顯大于2倍標準差范圍 之后幾乎95%的(偏)自相關系數都落在2倍標準差范圍以內 且由非零自相關系數衰減為在零附近小值波動的過程非常突然 出現以下情況,通常視為(偏)自相關系數拖尾: 如果有超過5%的樣本(偏)自相關系數都落在兩倍標準差范圍之外 或者是由顯著非0的(偏)自相關系數衰減為小值波動的過程比較緩慢或非常連續截尾是指時間序列的自相關函數(ACF)或偏自相關函數(PACF)在某階后均為0的性質(比如AR的PACF);拖尾是ACF或PACF并不在某階后均為0的性質(比如AR的ACF)。
P 階AR 過程可以寫成下面的式子:
yt?=c+?1?yt?1?+?2?yt?2?+……+?p?/yt?p?+εt?
其中 ε t \varepsilon_{t} εt? 是白噪聲, y t ? 1 y_{t-1} yt?1?, y t ? 2 y_{t-2} yt?2? 是滯后項。階數P 是滯后值,PACF 曲線在該滯后值首次穿過上限置信區間。這些P 延遲將作為我們預測AR 時間序列的特征。
我們不能在這里使用ACF圖,因為即使對于過去很久遠的滯后項,它也會顯示出良好的相關性。如果我們考慮了這么多特征,我們將遇到多重共線性問題。這對于PACF圖來說不是問題,因為它刪除了之前滯后已經解釋的成分,因此我們只得到了與殘差相關的滯后,比如未被較早的滯后項所解釋的成分。
###時間序列模型
1.時間序列模型的作用
對未來的資產價格預測模擬序列探索金融時間序列的趨勢和周期性時間序列與其他變量的內在關系,為策略提供輔助和增強不同時間序列之間的關系,發現新的策略波動率建模,期權相關的策略白噪聲
白噪聲是由一組0均值,不變方差,相互獨立的元素構成,當然可以對該元素的分布進行假設(如高斯分布)。白噪聲如同他的名字聽起來一樣是雜亂無章的,各元素之間沒有任何聯系。由白噪聲組成的序列是隨機游走,隨機游走序列的自相關特點是其自相關函數幾乎為1并且衰減很慢,這種特征我們稱為長記憶性(分形中我們會具體討論)。
自回歸模型(AR模型)
其中,yt是當前值;μ是常數項;p是階數;γi是自相關系數,?t是誤差值。
自回歸模型是描述當前值與歷史值之間的關系的模型,是一種用變量自身的歷史事件數據對自身進行預測的方法。
自回歸模型的使用有以下四項限制:
該模型用自身的數據進行預測,即建模使用的數據與預測使用的數據是同一組數據;
使用的數據必須具有平穩性;
使用的數據必須有自相關性,如果自相關系數小于0.5,則不宜采用自回歸模型;
自回國模型只適用于預測與自身前期相關的現象。
移動平均模型(MA模型)
其中各個字母的意義與AR公式相同,θi為MA公式的相關系數。
移動平均模型關注的是自回歸模型中的誤差項的累加。它能夠有效地消除預測中的隨機波動。
自回歸移動平均模型(ARMA模型)
在這個公式中,p與q分別為自回歸模型與移動平均模型的階數,是需要人為定義的。γi與θi分別是兩個模型的相關系數,是需要求解的。如果原始數據不滿足平穩性要求而進行了差分,則為差分自相關移動平均模型(ARIMA),將差分后所得的新數據帶入ARMA公式中即可。
###如何用PACF圖和ACF圖來確定p、q值?
舉例
可以看到ACF是一個逐漸趨于0的拖尾,而PACF在7階過后系數為0,所以模型是AR(7)或AR(8),即ARMA(7,0)或ARMA(8,0)。備選模型ARMA(7,1)。
這樣的圖,可以看到PACF是拖尾,ACF自1階過后都落在2倍標準差范圍內,所以是MA(1)模型。
最后看一個ARMA模型的例子:
ACF和PACF都呈現拖尾,在1階位置就開始基本落在2倍標準差范圍,所以是ARMA(1,1)模型。
ARIMA模型的建模過程:
完全代碼:解析版
# statsmodels.tsa.arima_model import ARIMA 導入時序模塊from statsmodels.tsa.arima_model import ARIMA import matplotlib.pyplot as plt import numpy as np import pandas as pd import seaborn as sns import statsmodels.api as sm from statsmodels.graphics.api import qqplot# 將list形式轉換為矩陣形式 data = [5922, 5308, 5546, 5975, 2704, 1767, 4111, 5542, 4726, 5866, 6183, 3199, 1471, 1325, 6618, 6644, 5337, 7064,2912, 1456, 4705, 4579, 4990, 4331, 4481, 1813, 1258, 4383, 5451, 5169, 5362, 6259, 3743, 2268, 5397, 5821,6115, 6631, 6474, 4134, 2728, 5753, 7130, 7860, 6991, 7499, 5301, 2808, 6755, 6658, 7644, 6472, 8680, 6366,5252, 8223, 8181, 10548, 11823, 14640, 9873, 6613, 14415, 13204, 14982, 9690, 10693, 8276, 4519, 7865, 8137,10022, 7646, 8749, 5246, 4736, 9705, 7501, 9587, 10078, 9732, 6986, 4385, 8451, 9815, 10894, 10287, 9666, 6072,5418] data=pd.Series(data)# 設置索引 data.index=pd.Index(sm.tsa.datetools.dates_from_range('1901', '1990'))#進行一階差分 data1=data.diff(1) data1.dropna(inplace=True)# 畫圖部分省略(根據自相關系數圖確定適合的模型) arma_mod1 = sm.tsa.ARMA(data1, (7, 0)).fit() print(arma_mod1.aic, arma_mod1.bic, arma_mod1.hqic) arma_mod2 = sm.tsa.ARMA(data1, (7, 1)).fit() print(arma_mod2.aic, arma_mod2.bic, arma_mod2.hqic) arma_mod3 = sm.tsa.ARMA(data1, (8, 0)).fit() print(arma_mod3.aic, arma_mod3.bic, arma_mod3.hqic)# 找出最適合的模型 # 由上面可以看出ARMA(7,0)模型最佳 # 第四步:進行模型檢驗 # 首先對ARMA(7,0)模型所產生的殘差做自相關圖 resid = arma_mod1.resid # 一定要加上這個變量賦值語句,不然會報錯resid is not defined ax5 = plt.subplot(2, 2, 1) sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40, ax=ax5) ax6 = plt.subplot(2, 2, 2) sm.graphics.tsa.plot_pacf(resid, lags=40, ax=ax6)# 對適合的模型進行自相關(也就是D-W檢驗) print(sm.stats.durbin_watson(arma_mod1.resid.values)) # 并觀察是否為正態分布 fig = qqplot(resid, line='q', ax=ax7, fit=True)# 最后用Ljung-Box檢驗:檢驗的結果就是看最后一列前十二行的檢驗概率(一般觀察滯后1~12階), # 如果檢驗概率小于給定的顯著性水平,比如0.05、0.10等就拒絕原假設,其原假設是相關系數為零。 # 就結果來看,前12階的P值都是大于0.05,所以在0.05的顯著性水平下,不拒絕原假設,即殘差為白噪聲序列。 r, q, p = sm.tsa.acf(resid.values.squeeze(), qstat=True) data2 = np.c_[range(1, 41), r[1:], q, p] table = pd.DataFrame(data2, columns=['lag', 'AC', 'Q', 'Prob(>Q)'])# 第五步:平穩模型預測,對未來十年進行預測 predict_y = arma_mod1.predict('1990', '2000', dynamic=True) # print(predict_y) ax8 = plt.subplot(2, 2, 4) ax9 = data1.loc['1901':].plot(ax=ax8) predict_y.plot(ax=ax8) plt.show()# 還原到原始序列 ts_restored = pd.Series([data[0]], index=[data.index[0]]).append(data1).cumsum()# 第六步:使用ARIMA模型進行預測 model = ARIMA(ts_restored, order=(7, 1, 0)) # 導入ARIMA模型 result = model.fit(disp=-1) # print(result.summary()) result.conf_int() # 模型診斷,可以發現所有的系數置信區間都不為0;即在5%的置信水平下,所有的系數都是顯著的,即模型通過檢驗。# 最后畫出時序圖 ax10 = plt.subplot(2, 2, 1) ax10 = ts_restored.loc['1901':].plot(ax=ax10) # 注意起點是從1901開始 result.plot_predict(5, 100, ax=ax10) # 因為前面是90個數,所以加上預測的10個就是100 plt.show() # 數據預測并畫圖效果展示
總結
以上是生活随笔為你收集整理的ARMA 时间序列模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用webbrowser和win32ap
- 下一篇: Android进阶——安卓调用ESC/P