再介紹本篇的內容之前,我們先來看一下本文用到的數據。本文用到的中國銀行股票數據下載:http://pan.baidu.com/s/1gfxRFbH。
我們先來導入一下我們的數據,順便畫出收盤價數據的折線圖:
import pandas as pd
import matplotlib.pyplot as plt
ChinaBank = pd.read_csv('ChinaBank.csv',index_col = 'Date',parse_dates=['Date'])
sub = ChinaBank['2014-01':'2014-06']['Close']
train = sub.ix['2014-01':'2014-03']
test = sub.ix['2014-04':'2014-06']
plt.figure(figsize=(10,10))
print(train)
plt.plot(train)
plt.show()
數據如下:
介紹了數據,我們接下來進入今天的正題。
2、時間序列平穩性2.1 平穩性平穩性就是要求經由樣本時間序列所得到的擬合曲線在未來一段時間內仍能順著現有的形態慣性地延續下去。平穩性要求序列的均值和方差不發生明顯變化。
嚴平穩
嚴平穩表示的分布不隨時間的改變而改變。如白噪聲(正太),無論怎麼取,都是期望為0,方差為1
寬平穩
期望與相關係數(依賴性)不變。未來某時刻的t的值Xt就要依賴於它的過去信息,所以需要依賴性。這種依賴性不能有明顯的變化。
使用差分法可以使得數據更平穩,常用的方法就是一階差分法和二階差分法。
時間序列差分值的求解可以直接通過pandas中的diff函數得到:
ChinaBank['Close_diff_1'] = ChinaBank['Close'].diff(1)
ChinaBank['Close_diff_2'] = ChinaBank['Close_diff_1'].diff(1)
fig = plt.figure(figsize=(20,6))
ax1 = fig.add_subplot(131)
ax1.plot(ChinaBank['Close'])
ax2 = fig.add_subplot(132)
ax2.plot(ChinaBank['Close_diff_1'])
ax3 = fig.add_subplot(133)
ax3.plot(ChinaBank['Close_diff_2'])
plt.show()
繪製的圖如下所示:
可以看到,基本上時間序列在一階差分的時候就已經接近於平穩序列了。
3、ARIMA模型介紹3.1 自回歸模型AR自回歸模型描述當前值與歷史值之間的關係,用變量自身的歷史時間數據對自身進行預測。自回歸模型必須滿足平穩性的要求。
自回歸模型首先需要確定一個階數p,表示用幾期的歷史值來預測當前值。p階自回歸模型的公式定義為:
上式中yt是當前值,u是常數項,p是階數 ri是自相關係數,et是誤差。
自回歸模型有很多的限制:
1、自回歸模型是用自身的數據進行預測
2、時間序列數據必須具有平穩性
3、自回歸只適用於預測與自身前期相關的現象
移動平均模型關注的是自回歸模型中的誤差項的累加 ,q階自回歸過程的公式定義如下:
移動平均法能有效地消除預測中的隨機波動。
3.3 自回歸移動平均模型ARMA自回歸模型AR和移動平均模型MA模型相結合,我們就得到了自回歸移動平均模型ARMA(p,q),計算公式如下:
3.4 差分自回歸移動平均模型ARIMA將自回歸模型、移動平均模型和差分法結合,我們就得到了差分自回歸移動平均模型ARIMA(p,d,q),其中d是需要對數據進行差分的階數。
4、建立ARIMA模型的過程一般來說,建立ARIMA模型一般有三個階段,分別是模型識別和定階、參數估計和模型檢驗,接下來,我們一步步來介紹:
4.1 模型識別和定階模型的識別問題和定階問題,主要是確定p,d,q三個參數,差分的階數d一般通過觀察圖示,1階或2階即可。這裡我們主要介紹p和q的確定。我們首先介紹兩個函數。
自相關函數ACF(autocorrelation function)
自相關函數ACF描述的是時間序列觀測值與其過去的觀測值之間的線性相關性。計算公式如下:
其中k代表滯後期數,如果k=2,則代表yt和yt-2
偏自相關函數PACF(partial autocorrelation function)
偏自相關函數PACF描述的是在給定中間觀測值的條件下,時間序列觀測值預期過去的觀測值之間的線性相關性。
舉個簡單的例子,假設k=3,那麼我們描述的是yt和yt-3之間的相關性,但是這個相關性還受到yt-1和yt-2的影響。PACF剔除了這個影響,而ACF包含這個影響。
拖尾和截尾
拖尾指序列以指數率單調遞減或震蕩衰減,而截尾指序列從某個時點變得非常小:
出現以下情況,通常視為(偏)自相關係數d階截尾:
1)在最初的d階明顯大於2倍標準差範圍
2)之後幾乎95%的(偏)自相關係數都落在2倍標準差範圍以內
3)且由非零自相關係數衰減為在零附近小值波動的過程非常突然
出現以下情況,通常視為(偏)自相關係數拖尾:
1)如果有超過5%的樣本(偏)自相關係數都落入2倍標準差範圍之外
2)或者是由顯著非0的(偏)自相關係數衰減為小值波動的過程比較緩慢或非常連續。
p,q階數的確定
根據剛才判定截尾和拖尾的準則,p,q的確定基於如下的規則:
根據不同的截尾和拖尾的情況,我們可以選擇AR模型,也可以選擇MA模型,當然也可以選擇ARIMA模型。接下來,我們就來畫一下我們數據的拖尾和截尾情況:
import statsmodels.api as sm
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(train, lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(train, lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')
fig.tight_layout()
plt.show()
結果如下:
哈哈,咱們這個數據自相關係數4階拖尾,偏自相關係數2階截尾,因此可以選擇的是AR(2)模型。
4.2 參數估計通過拖尾和截尾對模型進行定階的方法,往往具有很強的主觀性。回想我們之前在參數預估的時候往往是怎麼做的,不就是損失和正則項的加權麼?我們這裡能不能結合最終的預測誤差來確定p,q的階數呢?在相同的預測誤差情況下,根據奧斯卡姆剃刀準則,模型越小是越好的。那麼,平衡預測誤差和參數個數,我們可以根據信息準則函數法,來確定模型的階數。預測誤差通常用平方誤差即殘差平方和來表示。
常用的信息準則函數法有下面幾種:
AIC準則
AIC準則全稱為全稱是最小化信息量準則(Akaike Information Criterion),計算公式如下:
AIC = =2 *(模型參數的個數)-2ln(模型的極大似然函數)
BIC準則
AIC準則存在一定的不足之處。當樣本容量很大時,在AIC準則中擬合誤差提供的信息就要受到樣本容量的放大,而參數個數的懲罰因子卻和樣本容量沒關係(一直是2),因此當樣本容量很大時,使用AIC準則選擇的模型不收斂與真實模型,它通常比真實模型所含的未知參數個數要多。BIC(Bayesian InformationCriterion)貝葉斯信息準則彌補了AIC的不足,計算公式如下:
BIC = ln(n) * (模型中參數的個數) - 2ln(模型的極大似然函數值),n是樣本容量
好了,我們通過類似於網格搜索的方式來尋找我們模型最佳的p,q組合吧,這裡我們使用BIC進行試驗,AIC同理:
import itertools
import numpy as np
import seaborn as sns
p_min = 0
d_min = 0
q_min = 0
p_max = 5
d_max = 0
q_max = 5
results_bic = pd.DataFrame(index=['AR{}'.format(i) for i in range(p_min,p_max+1)],
columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])
for p,d,q in itertools.product(range(p_min,p_max+1),
range(d_min,d_max+1),
range(q_min,q_max+1)):
if p==0 and d==0 and q==0:
results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nan
continue
try:
model = sm.tsa.ARIMA(train, order=(p, d, q),
)
results = model.fit()
results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.bic
except:
continue
results_bic = results_bic[results_bic.columns].astype(float)
fig, ax = plt.subplots(figsize=(10, 8))
ax = sns.heatmap(results_bic,
mask=results_bic.isnull(),
ax=ax,
annot=True,
fmt='.2f',
)
ax.set_title('BIC')
plt.show()
繪製的熱力圖如下:
我們上面採用了循環的方式,其實可以用更簡單的方法得到p和q的最優值:
train_results = sm.tsa.arma_order_select_ic(train, ic=['aic', 'bic'], trend='nc', max_ar=8, max_ma=8)
print('AIC', train_results.aic_min_order)
print('BIC', train_results.bic_min_order)
結果為:
AIC (1, 0)
BIC (1, 0)
表明我們應該選擇AR(1)模型。
一般來說,BIC準則得到的ARMA模型的階數較AIC的低。
4.3 模型檢驗這裡的模型檢驗主要有兩個:
1)檢驗參數估計的顯著性(t檢驗)
2)檢驗殘差序列的隨機性,即殘差之間是獨立的
殘差序列的隨機性可以通過自相關函數法來檢驗,即做殘差的自相關函數圖:
model = sm.tsa.ARIMA(train, order=(1, 0, 0))
results = model.fit()
resid = results.resid
fig = plt.figure(figsize=(12,8))
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40)
plt.show()
結果如下:
這裡很明顯的檢測是通過的。
4.4 模型預測預測主要有兩個函數,一個是predict函數,一個是forecast函數,predict中進行預測的時間段必須在我們訓練ARIMA模型的數據中,forecast則是對訓練數據集末尾下一個時間段的值進行預估。
model = sm.tsa.ARIMA(sub, order=(1, 0, 0))
results = model.fit()
predict_sunspots = results.predict(start=str('2014-04'),end=str('2014-05'),dynamic=False)
print(predict_sunspots)
fig, ax = plt.subplots(figsize=(12, 8))
ax = sub.plot(ax=ax)
predict_sunspots.plot(ax=ax)
plt.show()
結果如下:
預估下一個值:
results.forecast()[0]
https://blog.csdn.net/weixin_41988628/article/details/83149849
推薦閱讀:
算法面試太難?反手就是一波面經
查收一份附帶答案的面經!
推薦系統遇上深度學習(二十一)--階段性回顧
推薦系統遇上深度學習(二十二)--DeepFM升級版XDeepFM模型強勢來襲!
推薦系統遇上深度學習(二十三)--大一統信息檢索模型IRGAN在推薦領域的應用
有關作者:
石曉文,中國人民大學信息學院在讀研究生,美團外賣算法實習生
簡書ID:石曉文的學習日記(https://www.jianshu.com/u/c5df9e229a67)
天善社區:https://www.hellobi.com/u/58654/articles
騰訊云:https://cloud.tencent.com/developer/user/1622140
開發者頭條:https://toutiao.io/u/470599
添加微信sxw2251,可以拉你進入小小挖掘機技術交流群喲!