「 常用的時間序列模型有四種:自回歸模型 AR(p)、移動平均模型 MA(q)、自回歸移動平均模型 ARMA(p,q)、自回歸差分移動平均模型 ARIMA(p,d,q), 可以說前三種都是 ARIMA(p,d,q)模型的特殊形式。本文主要圍繞著如何使用ARIMA模型實現對股指期貨價格走勢的預測。」
01
—
ARIMA模型
ARIMA模型(英語:Autoregressive Integrated Moving Average model),差分整合移動平均自回歸模型,又稱整合移動平均自回歸模型(移動也可稱作滑動),是時間序列預測分析方法之一。ARIMA(p,d,q)中,AR是「自回歸」,p為自回歸項數;MA為「滑動平均」,q為滑動平均項數,d為使之成為平穩序列所做的差分次數(階數)。「差分」一詞雖未出現在ARIMA的英文名稱中,卻是關鍵步驟。
百度百科本文主要使用ARIMA模型實現對股指期貨價格走勢的預測,而使用ARIMA的模型主要包括以下四大步驟02
—
數據獲取和平穩性檢驗
ARIMA 模型是在平穩的時間序列基礎上建立起來的,因此時間序列的平穩性是建模的重要前提。檢驗時間序列模型平穩的方法一般採用 ADF 單位根檢驗模型去檢驗。當然如果時間序列不穩定,也可以通過一些方法使得時間序列穩定
定義基礎函數
# 獲取數據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是一種常用的單位根檢驗方法# 原假設為:序列具有單位根,即非平穩,# 對於一個平穩的時序數據,就需要在給定的置信水平上顯著,拒絕原假設。# 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
獲取數據、平穩性檢驗
# 獲取原始的數據,從2010年4月16日至2017年9月13日IF = getData('data/IF-100416-170913.csv')# 將去除最後80天的數據集作為模型訓練的數據源train = IF.iloc[:-80]# 按照線性差值的方式對訓練數據重分布,填充非交易日部分的數據,# 以滿足後續ARIMA模型訓練的要求trainInterpolate=train.resample('D').interpolate('linear')# 對原始時間序列進行平穩性檢驗testStationarity(trainInterpolate)
通過對比Test Statistic值和Critical Value的值,以及p值可以確定上述時間序列是非平穩序列。
差分
既然原始數據是非平穩序列,則需要對數據進行一定的處理,如差分和取對數等等,本文主要採取差分的方法,持續差分直到序列滿足平穩性要求。
# 一階差分trainInterpolate_diff1 = trainInterpolate.diff(1).dropna()# 對一階差分序列進行平穩性檢驗testStationarity(trainInterpolate_diff1)
通過對比Test Statistic值和Critical Value的值,以及p值可以確定上述一階時間序列是平穩序列。
可視化一階差分後的時間序列圖
trainInterpolate_diff1.plot()
圖1、股指期貨IF一階差分後的收盤價格走勢
03
—
模型定參
要使用ARIMA 模型,必須確定模型的階數 p、q以及d 。d的確定是比較簡單的,完全是差分後的數據是否是平穩序列。對於p和q,p或者q越大,則模型的參數越多,越有可能捕捉到時間序列中不同間隔K的自相關性。但是,參數太多的話容易造成過擬合。因此在選擇階數時,必須同時考慮擬合的準確性和避免過擬合。
通過前面的差分過程,已經可以確定d的值是1(因為是一階差分序列)。後面需要確定的就是p和q的值。
在確定模型p和q的階數時,常用的工具是使用信息量準則,包括赤池信息量準則(Akaike information criterion,簡稱 AIC,由日本統計學家赤池弘次創立)以及貝葉斯信息量準則(Bayesian information criterion,簡稱 BIC)。
上述兩個信息量準則的目的都是尋找可以最好地解釋數據但包含最少自由參數的模型。它們均使用模型的似然函數、參數個數以及觀測點個數來構建一個標量函數,以此作為評價模型好壞的標準。它們的區別是標量函數的表達式有所不同。
除了使用上述的信息量準則以外,畫ACF(自相關圖)和PACF(偏自相關圖)圖也是一種解決定階的方法。
ACF(自相關序列)圖
plot_acf(trainInterpolate_diff1)
圖2、自相關圖
PACF(偏自相關序列)圖
plot_pacf(trainInterpolate_diff1)
圖3、偏自相關圖
模型定階
其實很多時候不太容易通過自相關圖和偏自相關圖看出p和q的階數,所以個人更習慣用工具去選擇合適的p和q。本文主要選擇AIC指標(赤池信息量準則)。
pqselect = st.arma_order_select_ic(y=trainInterpolate,\ max_ar=4,max_ma=4,ic=['aic'])
當我們使用 AIC 或者 BIC 確定模型的最優p、q階數之後,便可以對時間序列建模。
# 把p、i、q分別傳入order中,設置數據的頻率為日線數據model = ARIMA(trainInterpolate,order=(3,1,2),freq="D" )
04
—
參數檢驗
Ljung-Box檢驗
時間序列中一個最基本的模型就是高斯白噪聲序列,對於ARIMA模型,其殘差就被假定為高斯白噪聲序列。所以當我們用ARIMA模型去擬合數據時,擬合後我們需要對殘差的估計序列進行是否是白噪聲的檢驗。
Ljung-Box檢驗恰是對時間序列是否存在滯後相關的一種統計檢驗,通過Ljung-Box檢驗判斷其是否是高斯白噪聲,如果不是,那麼說明ARIMA模型可能並不是一個合適的模型。
Ljung-Box檢驗的原假設,H0:原本的數據都是獨立的,即總體的相關係數為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值,可以發現在顯著性水平0.05或者0.01,無法拒絕原假設H0,所以殘差為獨立的數據。
05
—
模型預測
模型預測
對模型進行訓練,然後數據模型的匯總參數信息
# 對模型進行訓練result = model.fit()# 模型的匯總參數信息result.summary()
圖4、模型的參數
可視化預測結果
# 基於模型生成預測數據predict = result.predict('20170523', '20170917',dynamic=True, typ='levels')# 可視化預測結果plt.figure(figsize=(12, 6))# 將橫左邊旋轉45度plt.xticks(rotation=45)# 可視化預測結果plt.plot(predict)# 可視化原始指數點位plt.plot(IF)
圖5、模型預測結果可視化(紅色為原始數,藍色為預測數據)
通過圖5發現 ,使用ARIMA的預測效果還是非常差的,整體的偏差性非常大,得到這樣的結果也是正常的。影響指數走勢的因素非常多,如國內政策、國外市場情況等等,指數的歷史價格只是影響未來價格的一小部分因素。另外需要說明的是,ARIMA模型只能捕捉線性的影響因素,很多非線性的影響因素並不在模型內。
感興趣的讀者可以多多關注本公眾號,後續會持續分享科技、金融方面的話題,尤其是金融大數據分析領域。