AR、MA、ARMA和ARIMA模型------時間序列預測

ARMA模型的全稱是自迴歸移動平均模型,它是目前最常用的擬合平穩序列的模型。它又可以細分爲AR模型、MA模型和ARMA三大類。都可以看做是多元線性迴歸模型。

AR模型

具有如下結構的模型稱爲p階自迴歸模型,簡記爲AR(p)

                                                           x_t=\phi _0+\phi _1x_{t-1}+\phi _2x_{t-1}+...+\phi _px_{t-p}+\varepsilon _t

即在t時刻的隨機變量X_t的取值x_t是前px_{t-1},x_{t-1},..,x_{t-p}的多元線性迴歸,認爲x_t主要是受過去p期的序列值的影響。誤差項是當期的隨機干擾\varepsilon _t,爲零均值白噪聲序列,

平穩AR模型的性質如下所示:

1)均值

對滿足平穩性條件的AR(p)模型的方程,兩遍取期望,得:

已知E(x_t)=\mu ,E(\varepsilon _t)=0,所以:\mu =\phi _0+\phi _1\mu +\phi _2\mu +...+\phi _p\mu,解得:

注意:因爲之前已經定義了平穩性序列的均值爲常數,所以E(x_t)=E(x_{t-1})=...=E(x_{t-p})

2)方差

平穩AR(p)模型的方差有界,等於常數。

3)自相關係數(ACF)

平穩AR(p)模型的自相關係數\rho _k=\rho (t,t-k)=\frac{cov(X_t,X_{t-k})}{\sigma _t\sigma _{t-k}}呈指數的速度衰減,始終有非零取值,不會在k大於某個常數之後就恆等於零,這個性質就是平穩AR(p)模型的自相關係數\rho _k具有拖尾性。

4)偏自相關係數(PACF)

對於一個平穩AR(p)模型,求出延遲k期自相關係數\rho _k時,實際上得到的並不是X_tX_{t-k}之間單純的相關關係,因爲X_t同時還會受到中間k-1個隨機變量X_{t-1},X_{t-2},...,X_{t-k}的影響,所以自相關係數\rho _k裏面實際上摻雜了其他變量對X_tX_{t-k}的相關影響,爲了單純的預測X_{t-k}X_t的影響,引進偏自相關係數的概念。

MA模型

具有如下結構的模型稱爲q階自迴歸模型,簡記爲MA(q)

                                                                                x_t=\mu +\varepsilon _t-\theta _1\varepsilon _{t-1}-\theta _2\varepsilon _{t-2}-...-\theta _q\varepsilon _{t-q}

即在t時刻的隨機變量X_t的取值x_t是前q期的隨機擾動\varepsilon _{t-1},\varepsilon _{t-2},...,\varepsilon _{t-q}的多元線性函數,誤差項是當期的隨機干擾\varepsilon _t,爲零均值白噪聲序列,\mu是序列\{X_t\}的均值。認爲x_t主要是受過去q期的誤差項的影響。

平穩MA(q)模型的性質如下:

ARMA模型 

具有如下結構的模型稱爲自迴歸移動平均模型,簡記爲ARMA(p,q)

                           x_t=\phi _0+\phi _1x_{t-1}+\phi _2x_{t-1}+...+\phi _px_{t-p}+\varepsilon _t-\theta _1\varepsilon _{t-1}-\theta _2\varepsilon _{t-2}-...-\theta _q\varepsilon _{t-q}

即在t時刻的隨機變量X_t的取值x_tpx_{t-1},x_{t-1},..,x_{t-p}和前q期的隨機擾動\varepsilon _{t-1},\varepsilon _{t-2},...,\varepsilon _{t-q}的多元線性函數,誤差項是當前的隨機干擾\varepsilon _t,爲零均值白噪聲序列。認爲x_t主要是受過去p期的序列值和過去q期的誤差項的共同影響。

特別的,當q=0時,是AR(p)模型;當p=0時,是MA(q)模型。

平穩ARMA(p,q)的性質

平穩時間序列建模 

某個時間序列經過預處理,被判定爲平穩非白噪聲序列,就可以利用ARMA模型進行建模,計算出平穩非白噪聲序列\{X_t\}的自相關係數和偏自相關係數,再由AR(p)模型、MA(q)模型和ARMA(p,q)的自相關係數和偏自相關係數的性質,選擇合適的模型。建模步驟如下:

 

非平穩性時間序列分析 

實際上,在自然界中絕大部分序列都是非平穩的,因而對非平穩序列的分析更爲普遍、更爲重要,創造出來的分析方法也更多。

對非平穩時間序列的分析方法可以分爲確定性因素分解的時序分析和隨機時序分析兩大類。

確定性因素分解的方法把所有序列的變化都歸結爲4個因素(長期趨勢、季節變動、循環變動和隨機波動)的綜合影響,其中長期趨勢和季節變動的規律性信息通常比較容易提取,而由隨機因素導致的波動則非常難確定和分析,對隨機信息浪費嚴重,會導致模型擬合精度不夠理想。

隨機時序分析法的發展就是爲了彌補確定性因素分解方法的不足。根據時間序列的不同特點,隨機時序可以建立的模型有ARIMA模型、殘差自迴歸模型、季節模型、異方法模型等。這裏主要介紹ARIMA模型。

1. 差分運算

(1) p階差分

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

(2) k步差分

相距k期的兩個序列值之間的減法運算稱爲k步差分運算

2. ARIMA模型

差分運算具有強大的確定性信息提取能力,許多非平穩序列差分後會顯示出平穩序列的性質,這時稱這個非平穩序列爲差分平穩序列。對差分平穩序列可以使用ARMA模型進行擬合。ARIMA模型的實質就是差分運算與ARMA模型的組合。以下爲建模步驟:

示例 

對某餐廳2015/1/1~2015/2/6某餐廳的銷售數據進行建模。

1)檢驗序列的平穩性

明顯可以看到在第一幅時序圖中該序列有明顯的單調遞增趨勢,可以判斷爲使非平穩序列,第二幅自相關圖中顯示自相關係數長期大於零,說明序列間具有很強的長期相關性;在第三幅圖中是單位根檢驗表,其中p值顯著大於0.05,最終判斷該序列爲非平穩序列(非平穩序列一定不是白噪聲序列)。

2)對原始序列進行一階差分,並進行平穩性和白噪聲檢驗

首先差分之後對其進行平穩性檢驗,過程同上

 

 

經過一階差分之後的序列的時序圖在均值附近比較平穩的波動、自相關圖有很強的短期相關性、單位根檢驗p值小於0.05,所以一階差分之後的序列是平穩序列。

接下來對一階差分後的序列做白噪聲檢驗:

輸出的p值遠小於0.05,所以一階差分之後的序列是平穩的非白噪聲序列。

3)對一階差分之後的平穩非白噪聲序列擬合ARMA模型,就是確定p值和q值。

第一種方法:認爲識別的方法 

一階差分後自相關圖顯示出1階截尾,所以可以考慮用MA(1)模擬一階差分後的序列,即對原始序列建立ARIMA(0,1,1)模型。

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

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

ARIMA模型實現代碼:

def programmer_6():
    """
    警告解釋:
    # UserWarning: matplotlib is currently using a non-GUI backend, so cannot show the figure
  "matplotlib is currently using a non-GUI backend, "
    調用了多次plt.show()
    解決方案,使用plt.subplot()

    # RuntimeWarning: overflow encountered in exp
    運算精度不夠

    forecastnum-->預測天數
    plot_acf().show()-->自相關圖
    plot_pacf().show()-->偏自相關圖
    """
    discfile = 'data/arima_data.xls'
    forecastnum = 5
    data = pd.read_excel(discfile, index_col=0)

    fig = plt.figure(figsize=(8, 6))
    # 第一幅自相關圖
    ax1 = plt.subplot(411)
    fig = plot_acf(data, ax=ax1)

    # 平穩性檢測
    print(u'原始序列的ADF檢驗結果爲:', ADF(data[u'銷量']))
    # 返回值依次爲adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

    # 差分後的結果
    D_data = data.diff().dropna()
    D_data.columns = [u'銷量差分']
    # 時序圖
    D_data.plot()
    plt.show()
    # 第二幅自相關圖
    fig = plt.figure(figsize=(8, 6))
    ax2 = plt.subplot(412)
    fig = plot_acf(D_data, ax=ax2)
    # 偏自相關圖
    ax3 = plt.subplot(414)
    fig = plot_pacf(D_data, ax=ax3)
    plt.show()
    fig.clf()

    print(u'差分序列的ADF檢驗結果爲:', ADF(D_data[u'銷量差分']))  # 平穩性檢測

    # 白噪聲檢驗
    print(u'差分序列的白噪聲檢驗結果爲:', acorr_ljungbox(D_data, lags=1))  # 返回統計量和p值
    data[u'銷量'] = data[u'銷量'].astype(float)
    # 定階
    pmax = int(len(D_data) / 10)  # 一般階數不超過length/10
    qmax = int(len(D_data) / 10)  # 一般階數不超過length/10
    bic_matrix = []  # bic矩陣
    data.dropna(inplace=True)

    # 存在部分報錯,所以用try來跳過報錯;存在warning,暫未解決使用warnings跳過
    import warnings
    warnings.filterwarnings('error')
    for p in range(pmax + 1):
        tmp = []
        for q in range(qmax + 1):
            try:
                tmp.append(ARIMA(data, (p, 1, q)).fit().bic)
            except:
                tmp.append(None)
        bic_matrix.append(tmp)
    # 從中可以找出最小值
    bic_matrix = pd.DataFrame(bic_matrix)
    # 用stack展平,然後用idxmin找出最小值位置。
    p, q = bic_matrix.stack().astype(float).idxmin()
    print(u'BIC最小的p值和q值爲:%s、%s' % (p, q))
    #print("data",data)

    X = data.values
    print(X)
    history = [x for x in X]
    model = ARIMA(history, order=(0, 1, 1)).fit()  # 建立ARIMA(0, 1, 1)模型
    model.summary2()  # 給出一份模型報告
    print("5天的預測",model.forecast(forecastnum)) # 作爲期5天的預測,返回預測結果、標準誤差、置信區間。
if __name__ == "__main__":   
    programmer_6()

 數據可到鏈接: https://pan.baidu.com/s/1ap0ZuXyVRNls3GFGD6Xo8A 提取碼: 7pe9下載

參考書目《Python數據分析與挖掘實戰》

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