Python--時間序列一本通----實例大舞臺,有碼你就來

開局附後面例子的數據源:https://github.com/keefecn/python_practice_of_data_analysis_and_mining/blob/master/chapter5/demo/data/arima_data.xls

概述

常用按時間序列排序的一組隨機變量X1,X2,…,Xt(例如1月2月…)來表示一個隨機事件的時間序列,簡記爲{Xt};用x1,x2,…,xt或{xt,t=1,2,…n}來表示該隨機序列的n個有序觀察值,成爲序列長度爲n的觀察值序列。
應用時間序列分析的目的就是給定一個已被觀測了的時間序列,預測該序列的未來值。

時間序列算法

常用的時間序列模型

模型名稱 描述
平滑法 平滑法常用於趨勢分析和預測,利用修勻技術,削弱短期隨機波動對序列的影響,使序列平滑化。根據所用平滑技術的不同,可具體分爲’移動平均’法和’指數平滑法’
趨勢擬合法 趨勢擬合法把時間作爲自變量,響應的序列觀察值作爲因變量,建立迴歸模型,根據序列的特徵,可具體分爲線性擬合和曲線擬合
組合模型 時間序列的變化主要受長期趨勢(T)、季節變動(S)、週期變動(C)、不規則變動(ε) 這四個因素的影響。根據時間序列的特點,可以構建加法模型和乘法模型:加法模型:xt=Tt+St+Ct+εt 乘法模型:xt=TtStCt*εt
AR模型 在這裏插入圖片描述 以前p期的序列值Yt-1,Yt-2,…,Yt-p爲自變量、隨機變量的取值Yt爲因變量建立線性迴歸模型
MA模型 在這裏插入圖片描述 隨機變量的取值Y與以前各期的序列值無關,建立Y與前q期的隨機擾動εt-1,εt-2,…,εt-q的線性迴歸模型
ARMA模型 在這裏插入圖片描述 隨機變量的取值與前p期的序列值和前q期的隨機擾動都有關
ARIMA模型 許多非平穩序列差分後悔顯示出平穩序列的性質,稱這個非平穩序列爲差分平穩序列。 對差分平穩序列可以使用ARIMA進行擬合
ARCH模型 ARCH模型能準確地模擬時間序列變量的波動性的變化,適用於序列具有異方差性並且異方差函數短期自相關
GARCH模型及衍生模型 GARCH模型成爲廣義ARCH模型,是ARCH模型的拓展。相比ARCH更能反映實際序列中的長期記憶性、信息的非對稱性

時間序列的預處理

拿到一個觀察值序列後,首先要對它的純隨機性平穩性進行檢驗,這兩個重要的檢驗成爲序列的預處理。

  • 純隨機序列:白噪聲序列,序列的各項之間沒有任何相關關係,序列在進行完全無序的隨機波動,可以終止對該序列的分析。 白噪聲序列是沒有信息可提取的平穩序列
  • 平穩非白噪聲序列:它的均值和方差爲常數,通常是建立一個線性模型擬合該序列,ARMA模型是常用的平穩序列擬合模型
  • 非平穩序列:由於均值和方差不穩定,處理方法一般是轉換爲平穩序列,然後再應用平穩時間序列分析法(ARMA)。如果一個時間序列經差分運算後平穩,則爲差分平穩序列,使用(ARIMA)

平穩性檢驗

(1)平穩時間序列的定義

知識:
對於隨機變量X,可以計算均值(數學期望)μ、方差σ²;
對於兩個隨機變量X、Y,可以計算X、Y的協方差COV(X,Y)=【(X-μx)(Y-μy)】和相關係數ρ(X,Y)=COV(X,Y)/σxσy,他們度量了兩個事件之間的相互影響程度
對於時間序列{Xt,t∈T}在某一常數附近波動且波動範圍有限,即有常數均值和常數方差,則可以定義時間序列{Xt}的自協方差函數COV(t,s)和自相關係數ρ(t,s),t\s∈T,它們衡量同一時間在兩個不同時間(t和s)之間的相關程度

結論:

如果時間序列{Xt,t∈T}在某一常數附近波動且波動範圍有限,即有常數均值和常數方差,並且延遲k期的序列變量的自協方差和自相關係數是相等的,或者說延遲k期的序列變量之間影響程度是一樣的,則稱{Xt,t∈T}爲平穩序列

(2)平穩時間序列的檢驗

  • 根據時序圖和自相關圖的特徵做出判斷的圖檢驗
  • 根據構造檢驗統計量進行檢驗的方法(單位根檢驗)

時序圖檢驗
根據平穩時間序列的均值和方差都是常數的性質,平穩序列的時序圖顯示該序列值始終都在一個常數附近波動,而且波動的範圍有界;如果有明顯趨勢或者週期,通常不是平穩的
自相關圖檢驗
平穩序列具有短期相關性,表明通常只有近期的序列值對現時值的影響比較明顯,間隔遠的過去值影響較小。隨之延遲期數k的增加,平穩序列的自相關係數ρk會比較快的衰減趨於0,並在0附近隨機波動,而非平穩的序列自相關係數衰減慢

(3)單位根的檢驗
檢驗序列中是否存在單位根,如果存在就是非平穩時間序列

純隨機性檢驗

如果是純隨機序列,它的序列值之間應該沒有任何關係,滿足相關係數等於0,這是理論上纔會出現的理想狀態,平常只是很接近0

純隨機性檢驗也叫白噪聲檢驗,一般是構造檢驗統計量來檢驗序列的純隨機性,常用的檢驗統計量有:Q統計量、LB統計量

有樣本各延遲期數的自相關係數可以計算得到檢驗統計量,然後算出對應的P值,如P值大於顯著性水平α。則表示該序列不能拒絕純隨機原假設,可以停止分析

平穩時間序列分析

AR模型

在這裏插入圖片描述
以前p期的序列值Yt-1,Yt-2,…,Yt-p爲自變量、認爲主要受過去p期的序列值影響。誤差項是當期的隨機干擾εt(爲零均值白噪聲序列)

平穩AR模型的性質:

統計量 性質
均值 常數均值
方差 常數方差
自相關係數(ACF) 拖尾
偏自相關係數(PACF) p階拖尾

MA模型

在這裏插入圖片描述
隨機變量的取值Y與以前各期的序列值無關,建立Y與前q期的隨機擾動εt-1,εt-2,…,εt-q的線性迴歸模型,誤差項是當期的隨機干擾εt(爲零均值白噪聲序列),μ是序列的均值。認爲Yt主要受過去q期的誤差項影響

平穩MA模型的性質:

統計量 性質
均值 常數均值
方差 常數方差
自相關係數(ACF) q階拖尾
偏自相關係數(PACF) 拖尾

ARMA模型

在這裏插入圖片描述 隨機變量的取值與前p期的序列值和前q期的隨機擾動都有關,q爲0是AR模型,p爲0是MA模型

平穩ARMA模型的性質:

統計量 性質
均值 常數均值
方差 常數方差
自相關係數(ACF) 拖尾
偏自相關係數(PACF) 拖尾

平穩時間序列建模

  1. 計算ACF和PACF。先計算非平穩白噪聲序列的自相關係數(ACF)和偏相關係數(PACF)
  2. ARMA模型識別定階。由AR、MA和ARMA的自相關係數和偏自相關係數性質,選取合適的模型
  3. 估計模型中未知參數的值並進行參數檢驗
  4. 模型檢驗
  5. 模型優化(不通過則重新識別定階)
  6. 模型應用:短期預測

在這裏插入圖片描述

非平穩時間序列分析

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

  • 確定因素分解:把變化歸結爲四個因素(長期趨勢、季節變動、循環變動、隨機波動),其中長期趨勢和季節變動的規律性信息通常比較容易提取,而由隨機因素導致的波動則非常難確定和分析,浪費隨機信息會導致模型精度不理想。
  • 隨機時序分析:爲了彌補確定因素分析不足,有ARIMA模型、殘差自迴歸模型、季節模型、異方差模型等

舉例:ARIMA非平穩時間序列建模

在這裏插入圖片描述

導入數據

import pandas as pd
data = pd.read_excel('路徑/arima_data.xls',index_col=u'日期')
forecastnum = 5

檢驗模型序列的平穩性–差分前

時序圖:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data.plot()
plt.show()

不在常數附近波動,呈現趨勢,不平穩
在這裏插入圖片描述

自相關圖:

# 自相關圖
import statsmodels.api as sm
sm.graphics.tsa.plot_acf(data).show()

沒有較快的趨於0,而是呈現緩慢的波動,不平穩
在這裏插入圖片描述

平穩性檢測:

# 平穩性檢測
statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF檢測結果: ',ADF(data[u'銷量']))

返回值依次爲adf、pvalue、usedlag、nobs、critical values、from

P-value不接近0,大於顯著性水平α,所以接受0假設,即存在單根
在這裏插入圖片描述

檢驗模型序列的平穩性–差分後

差分:

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

時序圖:

D_data.plot()
plt.show()

在常數附近波動,範圍有界,平穩
在這裏插入圖片描述
自相關圖:

sm.graphics.tsa.plot_acf(D_data).show()

迅速接近於0並波動,平穩
在這裏插入圖片描述
偏相關圖:

sm.graphics.tsa.plot_pacf(D_data).show

偏相關圖同理
在這裏插入圖片描述
平穩性檢測:

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

P值小於顯著性水平α,拒絕原假設,不存在單根,平穩

返回值依次爲adf、pvalue、usedlag、nobs、critical values、from

在這裏插入圖片描述

白噪聲檢驗(純隨機性檢驗)

from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪聲檢驗結果爲: ' ,acorr_ljungbox(D_data,lags=1))

stat=11.3 P值=0.007 所以差分後是平穩非白噪聲序列

在這裏插入圖片描述

定階

採用相對最優模型識別:當p和q均小於等於3的所有組合BIC信息量最小的模型階數:

from statsmodels.tsa.arima_model import ARIMA

# 定階
pmax = int(len(D_data)/10)
qmax = int(len(D_data)/10)
bic_matrix = []
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)
p,q = bic_matrix.stack().idxmin()
print (u'BIC最小的p值和q值爲: %s、 %s' %(p,q))

定階完畢:
在這裏插入圖片描述

用AR(1)模型擬合一階差分後的序列,即對原序列建立ARIMA(0,1,1)模型。模型非唯一,檢驗ARIMA(1,1,0)和ARIMA(1,1,1)這兩個模型都可以通過檢驗

建模

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

魔性的參數檢驗和估計如下圖:
在這裏插入圖片描述
應用ARIMA(0,1,1)對data中的數據做其之後五天的預測:

model.forecast(5)

在這裏插入圖片描述

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