arima模型 p q d 确定_基于ARIMA预测股指期货价格走势
“?常用的時間序列模型有四種:自回歸模型 AR(p)、移動平均模型 MA(q)、自回歸移動平均模型 ARMA(p,q)、自回歸差分移動平均模型 ARIMA(p,d,q), 可以說前三種都是 ARIMA(p,d,q)模型的特殊形式。本文主要圍繞著如何使用ARIMA模型實現(xiàn)對股指期貨價格走勢的預(yù)測。”
01
—
ARIMA模型
ARIMA模型(英語:Autoregressive Integrated Moving Average model),差分整合移動平均自回歸模型,又稱整合移動平均自回歸模型(移動也可稱作滑動),是時間序列預(yù)測分析方法之一。ARIMA(p,d,q)中,AR是“自回歸”,p為自回歸項數(shù);MA為“滑動平均”,q為滑動平均項數(shù),d為使之成為平穩(wěn)序列所做的差分次數(shù)(階數(shù))。“差分”一詞雖未出現(xiàn)在ARIMA的英文名稱中,卻是關(guān)鍵步驟。
百度百科本文主要使用ARIMA模型實現(xiàn)對股指期貨價格走勢的預(yù)測,而使用ARIMA的模型主要包括以下四大步驟數(shù)據(jù)平穩(wěn)性檢驗
模型定階
模型參數(shù)檢驗
模型預(yù)測
02
—
數(shù)據(jù)獲取和平穩(wěn)性檢驗
ARIMA 模型是在平穩(wěn)的時間序列基礎(chǔ)上建立起來的,因此時間序列的平穩(wěn)性是建模的重要前提。檢驗時間序列模型平穩(wěn)的方法一般采用 ADF 單位根檢驗?zāi)P腿z驗。當(dāng)然如果時間序列不穩(wěn)定,也可以通過一些方法使得時間序列穩(wěn)定
定義基礎(chǔ)函數(shù)
# 獲取數(shù)據(jù)def getData(filename): IF = pd.read_csv(filename,encoding='utf-8',index_col = 'date',parse_dates = True) IF_price = IF[['close']]????return?IF_price????# 單位根檢驗:ADF是一種常用的單位根檢驗方法# 原假設(shè)為:序列具有單位根,即非平穩(wěn),# 對于一個平穩(wěn)的時序數(shù)據(jù),就需要在給定的置信水平上顯著,拒絕原假設(shè)。# ADF只是單位根檢驗的方法之一def testStationarity(timeSeries): # 單位根檢驗方法 adf = adfuller(timeSeries) adf_result = pd.Series(adf[0:4], index=['Test Statistic','p-value','Lags Used','Number of Observations Used']) for key,value in adf[4].items(): adf_result['Critical Value (%s)'%key] = value return adf_result獲取數(shù)據(jù)、平穩(wěn)性檢驗
#?獲取原始的數(shù)據(jù),從2010年4月16日至2017年9月13日IF = getData('data/IF-100416-170913.csv')#?將去除最后80天的數(shù)據(jù)集作為模型訓(xùn)練的數(shù)據(jù)源train = IF.iloc[:-80]#?按照線性差值的方式對訓(xùn)練數(shù)據(jù)重分布,填充非交易日部分的數(shù)據(jù),#?以滿足后續(xù)ARIMA模型訓(xùn)練的要求trainInterpolate=train.resample('D').interpolate('linear')#?對原始時間序列進(jìn)行平穩(wěn)性檢驗testStationarity(trainInterpolate)通過對比Test Statistic值和Critical Value的值,以及p值可以確定上述時間序列是非平穩(wěn)序列。
差分
既然原始數(shù)據(jù)是非平穩(wěn)序列,則需要對數(shù)據(jù)進(jìn)行一定的處理,如差分和取對數(shù)等等,本文主要采取差分的方法,持續(xù)差分直到序列滿足平穩(wěn)性要求。
#?一階差分trainInterpolate_diff1 = trainInterpolate.diff(1).dropna()#?對一階差分序列進(jìn)行平穩(wěn)性檢驗testStationarity(trainInterpolate_diff1)通過對比Test Statistic值和Critical Value的值,以及p值可以確定上述一階時間序列是平穩(wěn)序列。
可視化一階差分后的時間序列圖
trainInterpolate_diff1.plot()圖1、股指期貨IF一階差分后的收盤價格走勢
03
—
模型定參
要使用ARIMA 模型,必須確定模型的階數(shù) p、q以及d 。d的確定是比較簡單的,完全是差分后的數(shù)據(jù)是否是平穩(wěn)序列。對于p和q,p或者q越大,則模型的參數(shù)越多,越有可能捕捉到時間序列中不同間隔K的自相關(guān)性。但是,參數(shù)太多的話容易造成過擬合。因此在選擇階數(shù)時,必須同時考慮擬合的準(zhǔn)確性和避免過擬合。
通過前面的差分過程,已經(jīng)可以確定d的值是1(因為是一階差分序列)。后面需要確定的就是p和q的值。
在確定模型p和q的階數(shù)時,常用的工具是使用信息量準(zhǔn)則,包括赤池信息量準(zhǔn)則(Akaike information criterion,簡稱 AIC,由日本統(tǒng)計學(xué)家赤池弘次創(chuàng)立)以及貝葉斯信息量準(zhǔn)則(Bayesian information criterion,簡稱 BIC)。
上述兩個信息量準(zhǔn)則的目的都是尋找可以最好地解釋數(shù)據(jù)但包含最少自由參數(shù)的模型。它們均使用模型的似然函數(shù)、參數(shù)個數(shù)以及觀測點(diǎn)個數(shù)來構(gòu)建一個標(biāo)量函數(shù),以此作為評價模型好壞的標(biāo)準(zhǔn)。它們的區(qū)別是標(biāo)量函數(shù)的表達(dá)式有所不同。
除了使用上述的信息量準(zhǔn)則以外,畫ACF(自相關(guān)圖)和PACF(偏自相關(guān)圖)圖也是一種解決定階的方法。
ACF(自相關(guān)序列)圖
plot_acf(trainInterpolate_diff1)圖2、自相關(guān)圖
PACF(偏自相關(guān)序列)圖
plot_pacf(trainInterpolate_diff1)圖3、偏自相關(guān)圖
模型定階
其實很多時候不太容易通過自相關(guān)圖和偏自相關(guān)圖看出p和q的階數(shù),所以個人更習(xí)慣用工具去選擇合適的p和q。本文主要選擇AIC指標(biāo)(赤池信息量準(zhǔn)則)。
pqselect = st.arma_order_select_ic(y=trainInterpolate,\ max_ar=4,max_ma=4,ic=['aic'])當(dāng)我們使用 AIC 或者 BIC 確定模型的最優(yōu)p、q階數(shù)之后,便可以對時間序列建模。
# 把p、i、q分別傳入order中,設(shè)置數(shù)據(jù)的頻率為日線數(shù)據(jù)model = ARIMA(trainInterpolate,order=(3,1,2),freq="D" )04
—
參數(shù)檢驗
Ljung-Box檢驗
時間序列中一個最基本的模型就是高斯白噪聲序列,對于ARIMA模型,其殘差就被假定為高斯白噪聲序列。所以當(dāng)我們用ARIMA模型去擬合數(shù)據(jù)時,擬合后我們需要對殘差的估計序列進(jìn)行是否是白噪聲的檢驗。
Ljung-Box檢驗恰是對時間序列是否存在滯后相關(guān)的一種統(tǒng)計檢驗,通過Ljung-Box檢驗判斷其是否是高斯白噪聲,如果不是,那么說明ARIMA模型可能并不是一個合適的模型。
Ljung-Box檢驗的原假設(shè),H0:原本的數(shù)據(jù)都是獨(dú)立的,即總體的相關(guān)系數(shù)為0。
#?殘差的白噪聲檢驗lj = acorr_ljungbox(result.resid,lags=10)[1]for i in range(len(lj)): print('lag = '+str(i)+', p-value='+str(round(lj[i],4)))通過對比P值,可以發(fā)現(xiàn)在顯著性水平0.05或者0.01,無法拒絕原假設(shè)H0,所以殘差為獨(dú)立的數(shù)據(jù)。
05
—
模型預(yù)測
模型預(yù)測
對模型進(jìn)行訓(xùn)練,然后數(shù)據(jù)模型的匯總參數(shù)信息
# 對模型進(jìn)行訓(xùn)練result = model.fit()#?模型的匯總參數(shù)信息result.summary()圖4、模型的參數(shù)
可視化預(yù)測結(jié)果
#?基于模型生成預(yù)測數(shù)據(jù)predict = result.predict('20170523', '20170917',dynamic=True, typ='levels')# 可視化預(yù)測結(jié)果plt.figure(figsize=(12,?6))# 將橫左邊旋轉(zhuǎn)45度plt.xticks(rotation=45)# 可視化預(yù)測結(jié)果plt.plot(predict)# 可視化原始指數(shù)點(diǎn)位plt.plot(IF)圖5、模型預(yù)測結(jié)果可視化(紅色為原始數(shù),藍(lán)色為預(yù)測數(shù)據(jù))
通過圖5發(fā)現(xiàn) ,使用ARIMA的預(yù)測效果還是非常差的,整體的偏差性非常大,得到這樣的結(jié)果也是正常的。影響指數(shù)走勢的因素非常多,如國內(nèi)政策、國外市場情況等等,指數(shù)的歷史價格只是影響未來價格的一小部分因素。另外需要說明的是,ARIMA模型只能捕捉線性的影響因素,很多非線性的影響因素并不在模型內(nèi)。?
感興趣的讀者可以多多關(guān)注本公眾號,后續(xù)會持續(xù)分享科技、金融方面的話題,尤其是金融大數(shù)據(jù)分析領(lǐng)域。
總結(jié)
以上是生活随笔為你收集整理的arima模型 p q d 确定_基于ARIMA预测股指期货价格走势的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql的单行注释_MySQL基础--
- 下一篇: .jar中没有主清单属性_为什么 Spr