時間序列算法

背景介紹
時間序列:一組對於某一變量連續時段上的觀測值。
模式識別主要涉及到兩個方向:一個是複雜統計,另外一個是機器學習。複雜統計是將數據擬合到已知的古典模型中,好比ARMA。而機器學習會用深度學習-神經網絡,進行暴力擬合。本文主要講述複雜統計中的AR、MA、ARMA、ARIMA四種經典模型。深度學習能夠參考: https://zhuanlan.zhihu.com/p/23366705
 
 
時間序列分爲三類
1.平穩序列:均值和方差是常數,一般創建線性模型來擬合將來的發展情況,如AR、MA、ARMA模型等。
2.能夠轉化爲平穩序列的非平穩序列:通常通過K次差分後平穩,再按照平穩序列進行擬合,如ARIMA模型。
3.沒法轉化爲平穩序列的非平穩序列:所謂的白噪聲序列,沒有任何規律可循。能夠中止分析。
 
判斷是否平穩的方法:
a. 根據時序圖和自相關圖的特徵作出主觀判斷,該方法操做簡單、應用普遍,但帶有主觀性。
時序圖檢驗:平穩序列的時序圖顯示序列值始終在一個常數附近隨機波動,且波動的範圍有界。
自相關圖檢驗:平穩序列具備短時間相關性,因此間隔越遠的過去值對現時值的影響會愈來愈小。
平穩序列的自相關係數會比較快的衰減趨向於零,能夠轉化爲平穩序列的非平穩序列則比較慢。
b. 構造檢驗統計量,目前最經常使用的方法是單位根檢驗。存在單位根就是非平穩時間序列。
 
 
建模步驟
(1)獲得平穩序列數據:上述1類不用處理,上述2類要進行差分處理。
(2)計算ACF/PACF:計算得出序列的自相關係數和偏相關係數圖形。
(3)模型識別:根據ACF、PACF圖形選擇合適的模型。
(4)模型檢驗:估計模型中未知參數的值並進行檢驗。
(5)模型優化:如調整參數值達到理想狀態。
(6)模型應用:進行短時間預測。
時間序列算法

 
ACF/PACF是什麼
 
ACF:  自相關函數(係數)    Autocorrelation
PACF:偏相關函數(係數)    Partial Correlation
 
ACF在計算X(t)和X(t-h)的相關性的時候,僅會考慮(t-h)數據點對X(t)的影響。
PACF在計算X(t)和X(t-h)的相關性的時候,會挖空(t-h,t)上全部數據點對X(t)的影響。
這個過程用的多元線性擬合、最小二乘求極值的思想,各個數據點做爲特徵,其特徵向量就是係數值。
 
 
ACF/PACF圖形識別:拖尾 or 截尾
平穩序列的ACF/PACF圖形不是拖尾就是截尾:
拖尾就是有衰減趨勢,慢慢趨於0或者極小值。
截尾就是在某階以後,忽然變爲0或者極小值 。 
 
常見的三角對稱圖形,既非拖尾也非截尾,屬於單調序列的典型表現形式,表示原始數據是不平穩序列。
還有一種常見說法:拖尾是不在某階後均爲0;截尾是在某階後均爲0。有點一分爲二的絕對,不太認同。
 
 
根據ACF/PACF圖形選擇模型
平穩序列:
若是ACF拖尾,PACF截尾,則用 AR 算法
若是ACF截尾,PACF拖尾,則用 MA 算法
若是ACF拖尾、PACF拖尾,則用 ARMA 算法。
 
能夠轉化爲平穩序列的非平穩序列:
經常使用 ARIMA算法。它是ARMA算法的擴展版,用法相似 。
 
 
模型介紹
AR(p)、MA(q)、ARMA(p,q)、ARIMA(p,d,q):p爲自迴歸項數,q爲移動平均項數,d爲差分階數。
1.AR(p)模型:描述當前值與歷史值間的關係。參數p爲自迴歸項數,可認爲是截尾階數。
時間序列算法
2.MA(q)模型:描述自迴歸部分的偏差累計。參數q爲移動平均項數,可認爲是截尾階數。
時間序列算法
3.ARMA(p,q)模型:前兩個模型的結合體。q=0時即AR(p)模型;p=0時即MA(q)模型。
時間序列算法
4.ARIMA(p,d,q)模型:ARMA(p,q)的基礎上增長差分步驟,參數d爲差分次數。
英文名稱:Autoregressive Integrated Moving Average。「差分」單詞雖未體現,倒是關鍵步驟。
差分是爲了將非平穩序列轉化爲平穩序列。若一次差分後的序列即達到平穩序列,那麼參數d=1。依此類推。
 
由上能夠得出:
並不須要按照ACF/PACF圖形選擇模型。能夠直接應用ARMA/ARIMA算法,只要肯定參數p/q的值便可。
通常階數不超過length/10,因此將p/q分別從0遞加試到length/10,模型偏差最小時即肯定參數p/q的值。
 
 
簡單示例
 
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.pylab import style
import statsmodels.tsa.api as smt
import seaborn as sns
style.use('ggplot')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用來正常顯示中文標籤
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號
 
# 參數初始化
discfile = '123.xlsx'
forecastnum = 5
 
# 讀取數據,指定日期列爲指標,Pandas自動將「日期」列識別爲Datetime格式
data = pd.read_excel(discfile, index_col=u'日期')
 
# 時序圖
data.plot()
plt.show()
 
# 自相關圖
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
#plot_acf(data).show()
#plot_pacf(data).show()
# 平穩性檢測
from statsmodels.tsa.stattools import adfuller as ADF
#print('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()
plot_acf(D_data).show()  # 自相關圖
plot_pacf(D_data).show()  # 偏自相關圖
print(u'差分序列的ADF檢驗結果爲:', ADF(D_data[u'銷量差分']))  # 平穩性檢測
 
from statsmodels.stats.diagnostic import acorr_ljungbox  # 白噪聲檢驗
print(u'差分序列的白噪聲檢驗結果爲:', acorr_ljungbox(D_data, lags=1))  # 返回統計量和p值
 
from statsmodels.tsa.arima_model import ARIMA
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矩陣
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 = pd.DataFrame(bic_matrix)  # 從中能夠找出最小值
 
p, q = bic_matrix.stack().idxmin()  # 先用stack展平,而後用idxmin找出最小值位置。
#print(u'BIC最小的p值和q值爲:%s、%s' % (p, q))
 
model = ARIMA(data, (p, 1, q)).fit()  # 創建ARIMA(0, 1, 1)模型
model.summary(2)  # 給出一份模型報告
print model.forecast(5)  # 做爲期5天的預測,返回預測結果、標準偏差、置信區間。
相關文章
相關標籤/搜索