27、python時間序列預測(ARIMA模型案例代碼)

目錄

1、模型識別

01 主要的模型

02 截尾和拖尾

03 如何判斷拖尾和截尾

2、時間序列算法公式

3、詳細步驟

01 平穩性檢驗(adf檢驗)

02 對數據進行差分構造平穩序列

03 平穩性監測

04 白噪聲檢驗

05 定階

06 模型預測

4、案例代碼


1、模型識別

01 主要的模型

AR(P)模型(Autoregressive Model)

    自迴歸模型描述的是當前值與歷史值之間的關係
        
MA(q)模型(Moving Average Model)
     移動平均模型描述的是自迴歸部分的誤差累計
   
 ARIMA模型(Autoregressive Integrated Moving Average Model)

    所謂ARIMA模型,是指將非平穩時間序列轉化爲平穩時間序列,然後將因變量僅對它的之後值以及隨機誤差項的現值和滯後值進行迴歸所建立的模型
    
    Xt=自迴歸AR+移動平均MA模型

模型 自相關係數 偏自相關係數
AR(P)  拖尾 P階截尾
MA(q) q階截尾 拖尾
ARMA(P,q) p階拖尾 q階拖尾

02 截尾和拖尾

(1)p階自迴歸模型 AR(P) 
AR(p)模型的偏自相關函數PACF在p階之後應爲零,稱其具有截尾性; 
AR(p)模型的自相關函數ACF不能在某一步之後爲零(截尾),而是按指數衰減(或成正弦波形式),稱其具有拖尾性。

(2)q階移動平均模型 MA(q) 
MA(q)模型的自相關函數ACF在q階之後應爲零,稱其具有截尾性; 
MA(q)模型的偏自相關函數PACF不能在某一步之後爲零(截尾),而是按指數衰減(或成正弦波形式),稱其具有拖尾性。

03 如何判斷拖尾和截尾


(1)如果樣本自相關係數(或偏自相關係數)在最初的d階明顯大於2倍標準差範圍,而後幾乎95%的樣本自相關(偏自相關)係數都落在2倍標準差範圍以內,而且由非零自相關(偏自相關)係數衰減爲小值波動的過程非常突然,這時,通常視爲自相關(偏自相關)係數截尾。

(2)如果有超過5%的樣本相關係數落在2倍標準差範圍以外,或者是由顯著非零的相關函數衰減爲小值波動的過程比較緩慢或者非常連續,這時,通常視爲相關係數不截尾。

2、時間序列算法公式

重要的幾種爲:AR、MA、ARMA、ARIMA模型,具體公式見下圖:

3、詳細步驟

01 平穩性檢驗(adf檢驗)


#  a  時序圖檢驗

根據平穩時間序列的均值和方差都爲常數的性質,平穩序列的時序圖顯示該序列值始終在一個常熟附近隨機波動,而且波動的範圍有界;如果有明顯的趨勢性或者週期性,那他通常不是平穩序列

#  b 自相關圖檢驗。

平穩序列具有短期相關性民政性質對平穩序列而言通常只有近期的序列值對現時值的影響比較明顯,間隔越遠的過去只對現時值得影響越小。隨着延遲期數K的增加,平穩序列的自相關係數Pk(延遲K期)會比較快的衰減趨向於零,並在零附近隨機波動,而非平穩序列的自相關係數衰減的速度比較慢,這就是利用自相關圖進行平穩性檢驗的標準


#c 單位根檢驗  

單位根檢驗是指檢驗序列中是否存在單位根,如果存在單位根就是非平穩時間序列了


# ADF單位根檢驗

其中第二中的ADF檢驗中,如果p值顯著大於0.05,統計量化大於三個或者兩個水平值,差距越大,越不平穩。

若統計量顯著小於三個置信度且p值接近0,爲平穩序列

其他情況,可能是數據量不夠的原因沒有展現趨勢

02 對數據進行差分構造平穩序列

差分運算:

p階差分

相聚一期的兩個序列值之間的減法運算稱爲I階差分運算

k步差分

相聚k期的兩個序列值之間的減法運算稱爲k步chafenyunsuan

#差分後的結果
D_data = data.diff(k).dropna()

k 相距k時間

一般在一階差分後就是比較平穩的序列

03 平穩性監測

04 白噪聲檢驗

#白噪聲檢驗
from statsmodels.stats.diagnostic import acorr_ljungbox

#返回統計量和p值

print(u'差分序列的白噪聲檢驗結果爲:', acorr_ljungbox(D_data, lags=1))  # 分別爲stat值(統計量)和P值

# P值小於0.05,所以一階差分後的序列爲平穩非白噪聲序列。

05 定階

第一種方法人爲識別

一階差分後自相關圖顯示1階截尾,

偏自相關顯示託尾性,所以建立ARIMA(0,1,1)

第二種:相對最優模型識別

計算ARMA(p,q)。當p,q均小於所組合BIC信息量,取其中BIC信息量達到最小的模型階數

確定pq值

from statsmodels.tsa.arima_model import ARIMA
#定階

#一般階數不超過length/10

pmax = int(len(D_data)/10) 

#一般階數不超過length/10

qmax = int(len(D_data)/10) 


#bic矩陣

bic_matrix = [] 
for p in range(pmax+1):
  tmp = []
  for q in range(qmax+1):
#存在部分報錯,所以用try來跳過報錯。
    try: 
      tmp.append(ARIMA(data, (p,1,q)).fit().bic)
    except:
      tmp.append(None)
  bic_matrix.append(tmp)

#從中可以找出最小值

bic_matrix = pandas.DataFrame(bic_matrix) 

#先用stack展平,然後用idxmin找出最小值位置。

p,q = bic_matrix.stack().idxmin() 

print(u'BIC最小的p值和q值爲:%s、%s' %(p,q))

# 取BIC信息量達到最小的模型階數,結果p爲0,q爲1,定階完成。

06 模型預測


 #建立ARIMA(0, 1, 1)模型

model = ARIMA(data, (p,1,q)).fit() 

#給出一份模型報告

model.summary2() 

#作爲期5天的預測,返回預測結果、標準誤差、置信區間。

model.forecast(5)
 

4、案例代碼


import pandas 

# 讀取數據,指定日期爲索引列

data = pandas.read_csv(
    'D:\\DATA\\pycase\\number2\\9.3\\Data.csv' ,
    index_col='日期'
)
 
# 繪圖過程中

import  matplotlib.pyplot as plt

# 用來正常顯示中文標籤

plt.rcParams['font.sans-serif']=['SimHei']

# 用來正常顯示負號

plt.rcParams['axes.unicode_minus'] = False 

# 查看趨勢圖
data.plot() #有增長趨勢,不平穩


# 附加:查看自相關係數合片自相關係數(查分之後),可以用於平穩性的檢測,也可用於定階係數預估

#自相關圖()

from statsmodels.graphics.tsaplots import plot_acf

plot_acf(data).show() #自相關圖既不是拖尾也不是截尾。以上的圖的自相關是一個三角對稱的形式,這種趨勢是單調趨勢的典型圖形,說明這個序列不是平穩序列





# 1 平穩性檢測

from statsmodels.tsa.stattools import adfuller as ADF


def tagADF(t):
    result = pandas.DataFrame(index=[
            "Test Statistic Value", "p-value", "Lags Used", 
            "Number of Observations Used", 
            "Critical Value(1%)", "Critical Value(5%)", "Critical Value(10%)"
        ], columns=['銷量']
    );
    result['銷量']['Test Statistic Value'] = t[0]
    result['銷量']['p-value'] = t[1]
    result['銷量']['Lags Used'] = t[2]
    result['銷量']['Number of Observations Used'] = t[3]
    result['銷量']['Critical Value(1%)'] = t[4]['1%']
    result['銷量']['Critical Value(5%)'] = t[4]['5%']
    result['銷量']['Critical Value(10%)'] = t[4]['10%']
    return result;


print('原始序列的ADF檢驗結果爲:',tagADF(ADF(data[u'銷量'])))  # 添加標籤後展現

# 平穩判斷:得到統計量大於三個置信度(1%,5%,10%)臨界統計值,p值顯著大於0.05,該序列爲非平穩序列。
# 備註:得到的統計量顯著小於3個置信度(1%,5%,10%)的臨界統計值時,爲平穩 此時p值接近於0 此處不爲0,嘗試增加數據量,原數據太少

# 2 進行數據差分,一般一階差分就可以

D_data = data.diff(1).dropna()
D_data.columns = [u'銷量差分']

#差分圖趨勢查看

D_data.plot() 
plt.show()

# 附加:查看自相關係數合片自相關係數(查分之後),可以用於平穩性的檢測,也可用於定階係數預估

#自相關圖

plot_acf(D_data).show()

plt.show()

#偏自相關圖

from statsmodels.graphics.tsaplots import plot_pacf

plot_pacf(D_data).show()

# 3 平穩性檢測

print(u'差分序列的ADF檢驗結果爲:', tagADF(ADF(D_data[u'銷量差分']))) 

# 解釋:Test Statistic Value值小於兩個水平值,p值顯著小於0.05,一階差分後序列爲平穩序列。

# 4 白噪聲檢驗
from statsmodels.stats.diagnostic import acorr_ljungbox

#返回統計量和p值

print(u'差分序列的白噪聲檢驗結果爲:', acorr_ljungbox(D_data, lags=1))  # 分別爲stat值(統計量)和P值

# P值小於0.05,所以一階差分後的序列爲平穩非白噪聲序列。


# 5 p,q定階

from statsmodels.tsa.arima_model import ARIMA

#一般階數不超過length/10

pmax = int(len(D_data)/10) 


#一般階數不超過length/10

qmax = int(len(D_data)/10) 

#bic矩陣

bic_matrix = [] 
for p in range(pmax+1):
  tmp = []
  for q in range(qmax+1):
#存在部分報錯,所以用try來跳過報錯。
    try: 
      tmp.append(ARIMA(data, (p,1,q)).fit().bic)
    except:
      tmp.append(None)
  bic_matrix.append(tmp)

#從中可以找出最小值

bic_matrix = pandas.DataFrame(bic_matrix) 

#先用stack展平,然後用idxmin找出最小值位置。

p,q = bic_matrix.stack().idxmin() 



print(u'BIC最小的p值和q值爲:%s、%s' %(p,q))
# 取BIC信息量達到最小的模型階數,結果p爲0,q爲1,定階完成。

# 6 建立模型和預測

model = ARIMA(data, (p,1,q)).fit() 

#給出一份模型報告

model.summary2() 

#作爲期5天的預測,返回預測結果、標準誤差、置信區間。

model.forecast(5)



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章