時間序列預測模型-ARIMA原理及Python實現!

2022-01-01 小小挖掘機
1、數據介紹

再介紹本篇的內容之前,我們先來看一下本文用到的數據。本文用到的中國銀行股票數據下載: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就要依賴於它的過去信息,所以需要依賴性。這種依賴性不能有明顯的變化。

2.2 差分法

使用差分法可以使得數據更平穩,常用的方法就是一階差分法和二階差分法。

時間序列差分值的求解可以直接通過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、自回歸只適用於預測與自身前期相關的現象

3.2 移動平均模型MA

移動平均模型關注的是自回歸模型中的誤差項的累加 ,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,可以拉你進入小小挖掘機技術交流群喲!

相關焦點

  • 時間序列預測模型ARIMA淺析
    本文聊聊arima模型。ARIMA是一種比較常用的基於歷史數據來做預測的時間序列模型。
  • 用 Python 為時間序列預測創建 ARIMA 模型
    它是一類模型,它捕獲時間序列數據中的一套不同的標準時間結構。ARIMA模型的信息還可以參考這裡:https://www.statsmodels.org/devel/generated/statsmodels.tsa.arima_model.ARIMAResults.html在本教程中,您將了解如何使用Python為時間序列數據開發ARIMA模型。
  • 利用ARIMA構建高性能時間序列模型(附Python代碼)
    簡記為ARIMA(p,d,q),名稱為差分整合移動平均自回歸模型。ARIMA的實際就是差分運算與ARMA模型的組合,這意義關係重大,這說明任何非平穩序列如果能夠通過適當階數的差分實現差分後平穩,就可以對差分序列進行ARMA擬合了。而ARMA模型的分析方法非常成熟,這意味著對差分平穩序列的分析也將是非常簡單、非常可靠的。
  • ARIMA模型預測CO2濃度時間序列-python實現
    第3步-ARIMA時間序列模型在時間序列預測中使用的最常見的方法是被稱為ARIMA模型。ARIMA是可以擬合時間序列數據的模型,以便更好地理解或預測序列中的未來點。有三種不同的整數(p,  d,  q)是用來參數化ARIMA模型。因此,ARIMA模型用符號表示 ARIMA(p, d, q)。
  • 時間序列分析-ARIMA python實現
    時間序列分析常用於國民宏觀經濟控制、市場潛力預測、氣象預測、農作物害蟲災害預報,人口統計等。本次用來預測活躍用戶數量。時間序列只有兩個參數時間和想要預測的值,影響到預測值的主要有趨勢(隨著時間推移,數據變化)、季節性、噪聲或不規則性、循環性(如經濟周期)等。
  • R語言用多項式回歸和ARIMA模型預測電力負荷時間序列數據
    p=18037 根據我們對溫度的預測,我們可以預測電力消耗。繪製電力消耗序列圖: 我們可以嘗試一個非常簡單的模型,其中日期Y_t的消耗量是時間,溫度(以多項式形式表示)以及工業生產指數IPI_t的函數。
  • R語言用ARIMA模型預測巧克力的興趣趨勢時間序列
    p=18850  在本文中我們對在Google趨勢上的關鍵字「 Chocolate 」序列進行預測。序列如下> report = read.csv(url,skip=6,header=FALSE,nrows=636)> plot(X,type="l") 每月建立一個ARIMA模型比每周建立一個容易。因此,我們將每月數據序列化,將預測與觀察結果進行比較。
  • ARIMA模型:全國考研人數預測
    本文選用R語言為基礎分析語言,選取1995-2020年全國碩士研究生報名人數,擬結合ARIMA模型對未來五年的研究生考試報名人數進行預測。ARIMA模型,又稱整合移動平均自回歸模型(移動也可稱作滑動),是時間序列預測分析的主要模型之一。
  • Python實戰—基於ARIMA模型股票趨勢預測
    股票具有高收益的同時也具有高風險性,股票市場受眾多因素的影響,價格令人無法捉摸,股票價格預測的研究具有巨大的價值,因此對於股票價格的預測從股票市場誕生之日起,就成了股民與學者們不懈探索的難題。本文以此為背景,建立ARIMA模型,用於研究股票的趨勢,並且得出股票預測的估計值,擬合度較高,適應性良好。
  • Python中的ARIMA模型、SARIMA模型和SARIMAX模型對時間序列預測
    p=12272使用ARIMA模型,您可以使用序列過去的值預測時間序列。在本文中,我們從頭開始構建了一個最佳ARIMA模型,並將其擴展到Seasonal ARIMA(SARIMA)和SARIMAX模型。1.時間序列預測簡介時間序列是在定期時間間隔內記錄度量的序列。
  • 【python量化】Python實現經典的時間序列預測方法
    ARMA方法適用於沒有趨勢和季節性成分的單變量時間序列。ARMA 方法將序列中的下一步預測結果為先前時間步的觀測值和殘差的線性函數。它結合了AR 和MA 模型。模型的符號:AR(p) 和 MA(q) 模型的階數作為 ARMA 函數的參數,例如 ARMA(p, q)。ARIMA 模型可用於開發 AR 或 MA 模型。
  • 獨家 | 利用Auto ARIMA構建高性能時間序列模型(附Python和R代碼)
    為了鞏固概念,我們將使用一個數據集,並用Python和R實現它。目錄一、什麼是時間序列?二、時間序列預測的方法三、ARIMA簡介四、ARIMA實現步驟五、為什麼需要Auto ARIMA?六、用Auto ARIMA實現案例(航空乘客數據集)七、Auto ARIMA如何選擇參數?如果你熟悉時間序列及其常用方法(如移動平均、指數平滑和ARIMA),則可以直接跳到第4節。對於初學者,請從下面這一節開始,內容包括對時間序列和各種預測方法的簡要介紹。一、什麼是時間序列?
  • R語言中的時間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價格
    本文將提供使用時域方法對R環境中的金融時間序列進行分析和建模的過程。第一部分涵蓋了平穩的時間序列。第二部分為ARIMA和ARCH / GARCH建模提供了指南。接下來,它將研究組合模型及其在建模和預測時間序列方面的性能和有效性。最後,將對時間序列分析方法進行總結。
  • 時間序列模型matlab代碼 - CSDN
    幸運的是,老闆是個比較技術咖的人,他教會了我很多實際操作上的東西,結合我過去七個月做過的各種時間序列模型,決定好好總結一下時間序列常見模型各自的適用場合、特徵等理論知識,更重要的是,每個模型在R裡的具體代碼實現以及操作步驟,希望能幫助到需要使用R來做時間序列的朋友們~時間序列數據是在一段時間內作為時間間隔序列收集的數據點。
  • [STATA] 時間序列模型 - ARIMA檢驗
    ,以及如何通過Stata軟體來進行不同時間序列模型的預測性分析。一、背景介紹時間序列模型是將一個或一組變量按照時間次序排列,用於解釋變量和相互關係的數學表達式,所得到的離散數字組成的序列集合。時間序列模型,可分為平穩時間序列和非平穩時間序列。平穩時間序列可以用來擬合回歸方程進行未來的預測,而非平穩的時間序列不能直接做回歸,會產生沒有實際意義的偽回歸。
  • 金融時間序列 ARMA 與 ARIMA 的 Python 實現
    前天的文章裡,我們利用Python實現了金融時間序列的AR與MA模型,今天就在此基礎上實現他們的進階模型:ARMA & ARIMA
  • Python用ARIMA和SARIMA模型預測銷量時間序列數據
    p=21573介紹ARIMA模型是時間序列預測中一種常用的統計方法。指數平滑和ARIMA模型是時間序列預測中應用最為廣泛的兩種方法,它們是解決這一問題的補充方法。指數平滑模型是基於對數據趨勢和季節性的描述,而ARIMA模型則是為了描述數據的自相關性。在討論ARIMA模型之前,我們先來討論平穩性的概念和時間序列的差分技術。
  • 時間序列預測Python實現
    時間序列簡單的說就是各時間點上形成的數值序列,時間序列分析就是通過觀察歷史數據預測未來的值。時間序列分析並不是關於時間的回歸,它主要是研究自身的變化規律的(這裡不考慮含外生變量的時間序列)本文所考慮的時間序列預測是只含根據序列本身來預測,不含其他內生或外生變量,且不分析序列的隨機性,只關注預測部分(特別是SARIMA的Python實現)[R squared]:R²定係數(在計量經濟學中,它可以理解為描述模型方差的百分比
  • Keras 實現 LSTM時間序列預測
    向AI轉型的程式設計師都關注了這個號👇👇👇人工智慧大數據與深度學習  公眾號:datayx本文將介紹如何用 keras 深度學習的框架搭建 LSTM 模型對時間序列做預測1 項目簡單介紹1.1 背景介紹本項目的目標是建立內部與外部特徵結合的多時序協同預測系統。數據集採用來自業界多組相關時間序列(約40組)與外部特徵時間序列(約5組)。課題通過進行數據探索,特徵工程,傳統時序模型探索,機器學習模型探索,深度學習模型探索(RNN,LSTM等),算法結合,結果分析等步驟來學習時序預測問題的分析方法與實戰流程。
  • 時間序列預測方法總結
    張戎:Facebook 時間序列預測算法 Prophet 的研究https://zhuanlan.zhihu.com/p/52330017個人理解,想進一步用好,可以好好看看論文和官網,有空擼遍python的源碼理解prior_scale在代碼中如何實現控制趨勢項、季節項和節假日項對於趨勢項參數changepoint_range、