日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 阿甘ch1wn8cyc3 2019-03-19

目錄

1、模型識別

01 主要的模型

02 截尾和拖尾

03 如何判斷拖尾和截尾

2、時間序列算法公式

3、詳細(xì)步驟

01 平穩(wěn)性檢驗(yàn)(adf檢驗(yàn))

02 對數(shù)據(jù)進(jìn)行差分構(gòu)造平穩(wěn)序列

03 平穩(wěn)性監(jiān)測

04 白噪聲檢驗(yàn)

05 定階

06 模型預(yù)測

4、案例代碼


1、模型識別

01 主要的模型

AR(P)模型(Autoregressive Model)

    自回歸模型描述的是當(dāng)前值與歷史值之間的關(guān)系
        
MA(q)模型(Moving Average Model)
     移動平均模型描述的是自回歸部分的誤差累計(jì)
   
 ARIMA模型(Autoregressive Integrated Moving Average Model)

    所謂ARIMA模型,是指將非平穩(wěn)時間序列轉(zhuǎn)化為平穩(wěn)時間序列,然后將因變量僅對它的之后值以及隨機(jī)誤差項(xiàng)的現(xiàn)值和滯后值進(jìn)行回歸所建立的模型
    
    Xt=自回歸AR+移動平均MA模型

模型 自相關(guān)系數(shù) 偏自相關(guān)系數(shù)
AR(P)  拖尾 P階截尾
MA(q) q階截尾 拖尾
ARMA(P,q) p階拖尾 q階拖尾

02 截尾和拖尾

(1)p階自回歸模型 AR(P) 
AR(p)模型的偏自相關(guān)函數(shù)PACF在p階之后應(yīng)為零,稱其具有截尾性; 
AR(p)模型的自相關(guān)函數(shù)ACF不能在某一步之后為零(截尾),而是按指數(shù)衰減(或成正弦波形式),稱其具有拖尾性。

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

03 如何判斷拖尾和截尾


(1)如果樣本自相關(guān)系數(shù)(或偏自相關(guān)系數(shù))在最初的d階明顯大于2倍標(biāo)準(zhǔn)差范圍,而后幾乎95%的樣本自相關(guān)(偏自相關(guān))系數(shù)都落在2倍標(biāo)準(zhǔn)差范圍以內(nèi),而且由非零自相關(guān)(偏自相關(guān))系數(shù)衰減為小值波動的過程非常突然,這時,通常視為自相關(guān)(偏自相關(guān))系數(shù)截尾。

(2)如果有超過5%的樣本相關(guān)系數(shù)落在2倍標(biāo)準(zhǔn)差范圍以外,或者是由顯著非零的相關(guān)函數(shù)衰減為小值波動的過程比較緩慢或者非常連續(xù),這時,通常視為相關(guān)系數(shù)不截尾。

2、時間序列算法公式

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

3、詳細(xì)步驟

01 平穩(wěn)性檢驗(yàn)(adf檢驗(yàn))


#  a  時序圖檢驗(yàn)

根據(jù)平穩(wěn)時間序列的均值和方差都為常數(shù)的性質(zhì),平穩(wěn)序列的時序圖顯示該序列值始終在一個常熟附近隨機(jī)波動,而且波動的范圍有界;如果有明顯的趨勢性或者周期性,那他通常不是平穩(wěn)序列

#  b 自相關(guān)圖檢驗(yàn)。

平穩(wěn)序列具有短期相關(guān)性民政性質(zhì)對平穩(wěn)序列而言通常只有近期的序列值對現(xiàn)時值的影響比較明顯,間隔越遠(yuǎn)的過去只對現(xiàn)時值得影響越小。隨著延遲期數(shù)K的增加,平穩(wěn)序列的自相關(guān)系數(shù)Pk(延遲K期)會比較快的衰減趨向于零,并在零附近隨機(jī)波動,而非平穩(wěn)序列的自相關(guān)系數(shù)衰減的速度比較慢,這就是利用自相關(guān)圖進(jìn)行平穩(wěn)性檢驗(yàn)的標(biāo)準(zhǔn)


#c 單位根檢驗(yàn)  

單位根檢驗(yàn)是指檢驗(yàn)序列中是否存在單位根,如果存在單位根就是非平穩(wěn)時間序列了


# ADF單位根檢驗(yàn)

其中第二中的ADF檢驗(yàn)中,如果p值顯著大于0.05,統(tǒng)計(jì)量化大于三個或者兩個水平值,差距越大,越不平穩(wěn)。

若統(tǒng)計(jì)量顯著小于三個置信度且p值接近0,為平穩(wěn)序列

其他情況,可能是數(shù)據(jù)量不夠的原因沒有展現(xiàn)趨勢

02 對數(shù)據(jù)進(jìn)行差分構(gòu)造平穩(wěn)序列

差分運(yùn)算:

p階差分

相聚一期的兩個序列值之間的減法運(yùn)算稱為I階差分運(yùn)算

k步差分

相聚k期的兩個序列值之間的減法運(yùn)算稱為k步chafenyunsuan

#差分后的結(jié)果
D_data = data.diff(k).dropna()

k 相距k時間

一般在一階差分后就是比較平穩(wěn)的序列

03 平穩(wěn)性監(jiān)測

04 白噪聲檢驗(yàn)

#白噪聲檢驗(yàn)
from statsmodels.stats.diagnostic import acorr_ljungbox

#返回統(tǒng)計(jì)量和p值

print(u'差分序列的白噪聲檢驗(yàn)結(jié)果為:', acorr_ljungbox(D_data, lags=1))  # 分別為stat值(統(tǒng)計(jì)量)和P值

# P值小于0.05,所以一階差分后的序列為平穩(wěn)非白噪聲序列。

05 定階

第一種方法人為識別

一階差分后自相關(guān)圖顯示1階截尾,

偏自相關(guān)顯示托尾性,所以建立ARIMA(0,1,1)

第二種:相對最優(yōu)模型識別

計(jì)算ARMA(p,q)。當(dāng)p,q均小于所組合BIC信息量,取其中BIC信息量達(dá)到最小的模型階數(shù)

確定pq值

from statsmodels.tsa.arima_model import ARIMA
#定階

#一般階數(shù)不超過length/10

pmax = int(len(D_data)/10) 

#一般階數(shù)不超過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信息量達(dá)到最小的模型階數(shù),結(jié)果p為0,q為1,定階完成。

06 模型預(yù)測


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

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

#給出一份模型報告

model.summary2() 

#作為期5天的預(yù)測,返回預(yù)測結(jié)果、標(biāo)準(zhǔn)誤差、置信區(qū)間。

model.forecast(5)
 

4、案例代碼


  1. import pandas

  2. # 讀取數(shù)據(jù),指定日期為索引列

  3. data = pandas.read_csv(
  4. 'D:\\DATA\\pycase\\number2\\9.3\\Data.csv' ,
  5. index_col='日期'
  6. )

  7. # 繪圖過程中

  8. import matplotlib.pyplot as plt

  9. # 用來正常顯示中文標(biāo)簽

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

  11. # 用來正常顯示負(fù)號

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

  13. # 查看趨勢圖
  14. data.plot() #有增長趨勢,不平穩(wěn)


  15. # 附加:查看自相關(guān)系數(shù)合片自相關(guān)系數(shù)(查分之后),可以用于平穩(wěn)性的檢測,也可用于定階系數(shù)預(yù)估

  16. #自相關(guān)圖()

  17. from statsmodels.graphics.tsaplots import plot_acf

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





  19. # 1 平穩(wěn)性檢測

  20. from statsmodels.tsa.stattools import adfuller as ADF


  21. def tagADF(t):
  22. result = pandas.DataFrame(index=[
  23. "Test Statistic Value", "p-value", "Lags Used",
  24. "Number of Observations Used",
  25. "Critical Value(1%)", "Critical Value(5%)", "Critical Value(10%)"
  26. ], columns=['銷量']
  27. );
  28. result['銷量']['Test Statistic Value'] = t[0]
  29. result['銷量']['p-value'] = t[1]
  30. result['銷量']['Lags Used'] = t[2]
  31. result['銷量']['Number of Observations Used'] = t[3]
  32. result['銷量']['Critical Value(1%)'] = t[4]['1%']
  33. result['銷量']['Critical Value(5%)'] = t[4]['5%']
  34. result['銷量']['Critical Value(10%)'] = t[4]['10%']
  35. return result;


  36. print('原始序列的ADF檢驗(yàn)結(jié)果為:',tagADF(ADF(data[u'銷量']))) # 添加標(biāo)簽后展現(xiàn)

  37. # 平穩(wěn)判斷:得到統(tǒng)計(jì)量大于三個置信度(1%,5%,10%)臨界統(tǒng)計(jì)值,p值顯著大于0.05,該序列為非平穩(wěn)序列。
  38. # 備注:得到的統(tǒng)計(jì)量顯著小于3個置信度(1%,5%,10%)的臨界統(tǒng)計(jì)值時,為平穩(wěn) 此時p值接近于0 此處不為0,嘗試增加數(shù)據(jù)量,原數(shù)據(jù)太少

  39. # 2 進(jìn)行數(shù)據(jù)差分,一般一階差分就可以

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

  42. #差分圖趨勢查看

  43. D_data.plot()
  44. plt.show()

  45. # 附加:查看自相關(guān)系數(shù)合片自相關(guān)系數(shù)(查分之后),可以用于平穩(wěn)性的檢測,也可用于定階系數(shù)預(yù)估

  46. #自相關(guān)圖

  47. plot_acf(D_data).show()

  48. plt.show()

  49. #偏自相關(guān)圖

  50. from statsmodels.graphics.tsaplots import plot_pacf

  51. plot_pacf(D_data).show()

  52. # 3 平穩(wěn)性檢測

  53. print(u'差分序列的ADF檢驗(yàn)結(jié)果為:', tagADF(ADF(D_data[u'銷量差分'])))

  54. # 解釋:Test Statistic Value值小于兩個水平值,p值顯著小于0.05,一階差分后序列為平穩(wěn)序列。

  55. # 4 白噪聲檢驗(yàn)
  56. from statsmodels.stats.diagnostic import acorr_ljungbox

  57. #返回統(tǒng)計(jì)量和p值

  58. print(u'差分序列的白噪聲檢驗(yàn)結(jié)果為:', acorr_ljungbox(D_data, lags=1)) # 分別為stat值(統(tǒng)計(jì)量)和P值

  59. # P值小于0.05,所以一階差分后的序列為平穩(wěn)非白噪聲序列。


  60. # 5 p,q定階

  61. from statsmodels.tsa.arima_model import ARIMA

  62. #一般階數(shù)不超過length/10

  63. pmax = int(len(D_data)/10)


  64. #一般階數(shù)不超過length/10

  65. qmax = int(len(D_data)/10)

  66. #bic矩陣

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

  77. #從中可以找出最小值

  78. bic_matrix = pandas.DataFrame(bic_matrix)

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

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



  81. print(u'BIC最小的p值和q值為:%s、%s' %(p,q))
  82. # 取BIC信息量達(dá)到最小的模型階數(shù),結(jié)果p為0,q為1,定階完成。

  83. # 6 建立模型和預(yù)測

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

  85. #給出一份模型報告

  86. model.summary2()

  87. #作為期5天的預(yù)測,返回預(yù)測結(jié)果、標(biāo)準(zhǔn)誤差、置信區(qū)間。

  88. model.forecast(5)



 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多