本篇文章將總結(jié)時間序列預(yù)測方法,并將所有方法分類介紹并提供相應(yīng)的python代碼示例,以下是本文將要介紹的方法列表:
1、使用平滑技術(shù)進行時間序列預(yù)測
2、單變量時間序列預(yù)測
3、外生變量的時間序列預(yù)測
4、多元時間序列預(yù)測
下面我們對上面的方法一一進行介紹,并給出python的代碼示例
指數(shù)平滑法是過去觀測值的加權(quán)平均值,隨著觀測值變老,權(quán)重呈指數(shù)會衰減。換句話說,觀察時間越近相關(guān)權(quán)重就越高。它可以快速生成可靠的預(yù)測,并且適用于廣泛的時間序列。
簡單指數(shù)平滑:此方法適用于預(yù)測沒有明確趨勢或季節(jié)性模式的單變量時間序列數(shù)據(jù)。簡單指數(shù)平滑法將下一個時間步建模為先前時間步的觀測值的指數(shù)加權(quán)線性函數(shù)。
它需要一個稱為 alpha (a) 的參數(shù),也稱為平滑因子或平滑系數(shù),它控制先前時間步長的觀測值的影響呈指數(shù)衰減的速率,即控制權(quán)重減小的速率。 a 通常設(shè)置為 0 和 1 之間的值。較大的值意味著模型主要關(guān)注最近的過去觀察,而較小的值意味著在進行預(yù)測時會考慮更多的歷史。簡單指數(shù)平滑時間序列的簡單數(shù)學(xué)解釋如下所示:
# SES examplefrom statsmodels.tsa.holtwinters import SimpleExpSmoothingfrom random import random# contrived datasetdata = [x + random() for x in range(1, 100)]# fit modelmodel = SimpleExpSmoothing(data)model_fit = model.fit()# make predictionyhat = model_fit.predict(len(data), len(data))print(yhat)
在 1957 年初,Holt擴展了簡單的指數(shù)平滑法,使它可以預(yù)測具有趨勢的數(shù)據(jù)。這種被稱為 Holt 線性趨勢的方法包括一個預(yù)測方程和兩個平滑方程(一個用于水平,一個用于趨勢)以及相應(yīng)的平滑參數(shù) α 和 β。后來為了避免趨勢模式無限重復(fù),引入了阻尼趨勢法,當(dāng)需要預(yù)測許多序列時,它被證明是非常成功和最受歡迎的單個方法。除了兩個平滑參數(shù)之外,它還包括一個稱為阻尼參數(shù) φ 的附加參數(shù)。
一旦能夠捕捉到趨勢,Holt-Winters 法擴展了傳統(tǒng)的Holt法來捕捉季節(jié)性。 Holt-Winters 的季節(jié)性方法包括預(yù)測方程和三個平滑方程——一個用于水平,一個用于趨勢,一個用于季節(jié)性分量,并具有相應(yīng)的平滑參數(shù) α、β 和 γ。
此方法有兩種變體,它們在季節(jié)性成分的性質(zhì)上有所不同。當(dāng)季節(jié)變化在整個系列中大致恒定時,首選加法方法,而當(dāng)季節(jié)變化與系列水平成比例變化時,首選乘法方法。
# HWES examplefrom statsmodels.tsa.holtwinters import ExponentialSmoothingfrom random import random# contrived datasetdata = [x + random() for x in range(1, 100)]# fit modelmodel = ExponentialSmoothing(data)model_fit = model.fit()# make predictionyhat = model_fit.predict(len(data), len(data))print(yhat)
在 AR 模型中,我們使用變量過去值的線性組合來預(yù)測感興趣的變量。 術(shù)語自回歸表明它是變量對自身的回歸。 AR模型的簡單數(shù)學(xué)表示如下:
這里,εt 是白噪聲。 這類似于多元回歸,但是使用 yt 的滯后值作為預(yù)測變量。 我們將其稱為 AR(p) 模型,即 p 階的自回歸模型。
from statsmodels.tsa.ar_model import AutoRegfrom random import random# contrived datasetdata = [x + random() for x in range(1, 100)]# fit modelmodel = AutoReg(data, lags=1)model_fit = model.fit()# make predictionyhat = model_fit.predict(len(data), len(data))print(yhat)
與在回歸中使用預(yù)測變量的過去值的 AR 模型不同,MA 模型在類似回歸的模型中關(guān)注過去的預(yù)測誤差或殘差。 MA模型的簡單數(shù)學(xué)表示如下:
這里,εt 是白噪聲。 我們將其稱為 MA(q) 模型,即 q 階移動平均模型。
# MA examplefrom statsmodels.tsa.arima.model import ARIMAfrom random import random# contrived datasetdata = [x + random() for x in range(1, 100)]# fit modelmodel = ARIMA(data, order=(0, 0, 1))model_fit = model.fit()# make predictionyhat = model_fit.predict(len(data), len(data))print(yhat)
需要說明的是不應(yīng)將這里說的移動平均線方法與計算時間序列的移動平均線混淆,因為兩者是不同的概念。
在 AR 模型中,我們使用變量過去值與過去預(yù)測誤差或殘差的線性組合來預(yù)測感興趣的變量。 它結(jié)合了自回歸 (AR) 和移動平均 (MA) 模型。
AR 部分涉及對變量自身的滯后(即過去)值進行回歸。 MA部分涉及將誤差項建模為在過去不同時間同時發(fā)生的誤差項的線性組合。 模型的符號涉及將 AR(p) 和 MA(q) 模型的順序指定為 ARMA 函數(shù)的參數(shù),例如 ARMA(p,q)。 ARMA 模型的簡單數(shù)學(xué)表示如下所示:
# ARMA examplefrom statsmodels.tsa.arima.model import ARIMAfrom random import random# contrived datasetdata = [random() for x in range(1, 100)]# fit modelmodel = ARIMA(data, order=(2, 0, 1))model_fit = model.fit()# make predictionyhat = model_fit.predict(len(data), len(data))print(yhat)
如果我們將差分與自回歸和移動平均模型相結(jié)合,我們將獲得 ARIMA 模型。 ARIMA 是差分整合移動平均自回歸模型Autoregressive Integrated Moving Average model 的首字母縮寫。 它結(jié)合了自回歸 (AR) 和移動平均模型 (MA) 以及為了使序列平穩(wěn)而對序列的差分預(yù)處理過程,這個過程稱為積分(I)。 ARIMA 模型的簡單數(shù)學(xué)表示如下:
其中 y′t 是差分級數(shù)。 右側(cè)的“預(yù)測變量”包括滯后值和滯后誤差。 我們稱之為 ARIMA(p,d,q) 模型。
這里,p 是自回歸部分的階數(shù),d 是所涉及的一階差分程度,q 是移動平均部分的階數(shù)。
ACF 和 PACF 圖在求 p 和 q 階中的意義:
# ARIMA examplefrom statsmodels.tsa.arima.model import ARIMAfrom random import random# contrived datasetdata = [x + random() for x in range(1, 100)]# fit modelmodel = ARIMA(data, order=(1, 1, 1))model_fit = model.fit()# make predictionyhat = model_fit.predict(len(data), len(data), typ='levels')print(yhat)
ARIMA 模型還能夠?qū)V泛的季節(jié)性數(shù)據(jù)進行建模。 季節(jié)性 ARIMA 模型是通過在 ARIMA 模型中包含額外的季節(jié)性項來形成的。
這里,m = 每個時間季節(jié)的步數(shù)。 我們對模型的季節(jié)性部分使用大寫符號,對模型的非季節(jié)性部分使用小寫符號。
它將 ARIMA 模型與在季節(jié)性數(shù)據(jù)級別執(zhí)行相同的自回歸、差分和移動平均建模的能力相結(jié)合。
# SARIMA examplefrom statsmodels.tsa.statespace.sarimax import SARIMAXfrom random import random# contrived datasetdata = [x + random() for x in range(1, 100)]# fit modelmodel = SARIMAX(data, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))model_fit = model.fit(disp=False)# make predictionyhat = model_fit.predict(len(data), len(data))print(yhat)
SARIMAX 模型是傳統(tǒng) SARIMA 模型的擴展,包括外生變量的建模,是Seasonal Autoregressive Integrated Moving-Average with Exogenous Regressors 的縮寫
外生變量是其值在模型之外確定并施加在模型上的變量。 它們也被稱為協(xié)變量。 外生變量的觀測值在每個時間步直接包含在模型中,并且與主要內(nèi)生序列的使用不同的建模方式。
SARIMAX 方法也可用于通過包含外生變量來模擬具有外生變量的其他變化,例如 ARX、MAX、ARMAX 和 ARIMAX。
# SARIMAX examplefrom statsmodels.tsa.statespace.sarimax import SARIMAXfrom random import random# contrived datasetdata1 = [x + random() for x in range(1, 100)]data2 = [x + random() for x in range(101, 200)]# fit modelmodel = SARIMAX(data1, exog=data2, order=(1, 1, 1), seasonal_order=(0, 0, 0, 0))model_fit = model.fit(disp=False)# make predictionexog2 = [200 + random()]yhat = model_fit.predict(len(data1), len(data1), exog=[exog2])print(yhat)
VAR 模型是單變量自回歸模型的推廣,用于預(yù)測時間序列向量或多個并行時間序列,例如 多元時間序列。 它是關(guān)于系統(tǒng)中每個變量的一個方程。
如果序列是平穩(wěn)的,可以通過將 VAR 直接擬合到數(shù)據(jù)來預(yù)測它們(稱為“VAR in levels”)。 如果序列是非平穩(wěn)的,我們會取數(shù)據(jù)的差異以使其平穩(wěn),然后擬合 VAR 模型(稱為“VAR in differences”)。
我們將其稱為 VAR(p) 模型,即 p 階向量自回歸模型。
# VAR examplefrom statsmodels.tsa.vector_ar.var_model import VARfrom random import random# contrived dataset with dependencydata = list()for i in range(100):v1 = i + random()v2 = v1 + random()row = [v1, v2]data.append(row)# fit modelmodel = VAR(data)model_fit = model.fit()# make predictionyhat = model_fit.forecast(model_fit.y, steps=1)print(yhat)
VARMA 方法是 ARMA 對多個并行時間序列的推廣,例如 多元時間序列。 具有有限階 MA 誤差項的有限階 VAR 過程稱為 VARMA。
模型的公式將 AR(p) 和 MA(q) 模型的階數(shù)指定為 VARMA 函數(shù)的參數(shù),例如 VARMA(p,q)。 VARMA 模型也可用于VAR 或 VMA 模型。
# VARMA examplefrom statsmodels.tsa.statespace.varmax import VARMAXfrom random import random# contrived dataset with dependencydata = list()for i in range(100):v1 = random()v2 = v1 + random()row = [v1, v2]data.append(row)# fit modelmodel = VARMAX(data, order=(1, 1))model_fit = model.fit(disp=False)# make predictionyhat = model_fit.forecast()print(yhat)
Vector Autoregression Moving-Average with Exogenous Regressors (VARMAX) 是 VARMA 模型的擴展,模型中還包含使用外生變量的建模。 它是 ARMAX 方法對多個并行時間序列的推廣,即 ARMAX 方法的多變量版本。
VARMAX 方法也可用于對包含外生變量的包含模型進行建模,例如 VARX 和 VMAX。
# VARMAX examplefrom statsmodels.tsa.statespace.varmax import VARMAXfrom random import random# contrived dataset with dependencydata = list()for i in range(100):v1 = random()v2 = v1 + random()row = [v1, v2]data.append(row)data_exog = [x + random() for x in range(100)]# fit modelmodel = VARMAX(data, exog=data_exog, order=(1, 1))model_fit = model.fit(disp=False)# make predictiondata_exog2 = [[100]]yhat = model_fit.forecast(exog=data_exog2)print(yhat)
在這篇文章中,基本上覆蓋了所有主要時間序列預(yù)測的問題。我們可以把上面提到的方法整理成以下幾個重要的方向:
本文中提到的每種算法基本上都是這幾種方法的組合,本文中已將每種的算法都進行了重點的描述和代碼的演示,如果你想深入了解其中的知識請查看相關(guān)的論文。