本篇文章將總結(jié)時(shí)間序列預(yù)測(cè)方法,并將所有方法分類介紹并提供相應(yīng)的python代碼示例,以下是本文將要介紹的方法列表: 1、使用平滑技術(shù)進(jìn)行時(shí)間序列預(yù)測(cè)
2、單變量時(shí)間序列預(yù)測(cè)
3、外生變量的時(shí)間序列預(yù)測(cè)
4、多元時(shí)間序列預(yù)測(cè)
下面我們對(duì)上面的方法一一進(jìn)行介紹,并給出python的代碼示例 ![]() 1、指數(shù)平滑Exponential Smoothing指數(shù)平滑法是過(guò)去觀測(cè)值的加權(quán)平均值,隨著觀測(cè)值變老,權(quán)重呈指數(shù)會(huì)衰減。換句話說(shuō),觀察時(shí)間越近相關(guān)權(quán)重就越高。它可以快速生成可靠的預(yù)測(cè),并且適用于廣泛的時(shí)間序列。 簡(jiǎn)單指數(shù)平滑:此方法適用于預(yù)測(cè)沒(méi)有明確趨勢(shì)或季節(jié)性模式的單變量時(shí)間序列數(shù)據(jù)。簡(jiǎn)單指數(shù)平滑法將下一個(gè)時(shí)間步建模為先前時(shí)間步的觀測(cè)值的指數(shù)加權(quán)線性函數(shù)。 它需要一個(gè)稱為 alpha (a) 的參數(shù),也稱為平滑因子或平滑系數(shù),它控制先前時(shí)間步長(zhǎng)的觀測(cè)值的影響呈指數(shù)衰減的速率,即控制權(quán)重減小的速率。 a 通常設(shè)置為 0 和 1 之間的值。較大的值意味著模型主要關(guān)注最近的過(guò)去觀察,而較小的值意味著在進(jìn)行預(yù)測(cè)時(shí)會(huì)考慮更多的歷史。簡(jiǎn)單指數(shù)平滑時(shí)間序列的簡(jiǎn)單數(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) 2、Holt-Winters 法在 1957 年初,Holt擴(kuò)展了簡(jiǎn)單的指數(shù)平滑法,使它可以預(yù)測(cè)具有趨勢(shì)的數(shù)據(jù)。這種被稱為 Holt 線性趨勢(shì)的方法包括一個(gè)預(yù)測(cè)方程和兩個(gè)平滑方程(一個(gè)用于水平,一個(gè)用于趨勢(shì))以及相應(yīng)的平滑參數(shù) α 和 β。后來(lái)為了避免趨勢(shì)模式無(wú)限重復(fù),引入了阻尼趨勢(shì)法,當(dāng)需要預(yù)測(cè)許多序列時(shí),它被證明是非常成功和最受歡迎的單個(gè)方法。除了兩個(gè)平滑參數(shù)之外,它還包括一個(gè)稱為阻尼參數(shù) φ 的附加參數(shù)。 一旦能夠捕捉到趨勢(shì),Holt-Winters 法擴(kuò)展了傳統(tǒng)的Holt法來(lái)捕捉季節(jié)性。 Holt-Winters 的季節(jié)性方法包括預(yù)測(cè)方程和三個(gè)平滑方程——一個(gè)用于水平,一個(gè)用于趨勢(shì),一個(gè)用于季節(jié)性分量,并具有相應(yīng)的平滑參數(shù) α、β 和 γ。 此方法有兩種變體,它們?cè)诩竟?jié)性成分的性質(zhì)上有所不同。當(dāng)季節(jié)變化在整個(gè)系列中大致恒定時(shí),首選加法方法,而當(dāng)季節(jié)變化與系列水平成比例變化時(shí),首選乘法方法。
3、自回歸 (AR)在 AR 模型中,我們使用變量過(guò)去值的線性組合來(lái)預(yù)測(cè)感興趣的變量。 術(shù)語(yǔ)自回歸表明它是變量對(duì)自身的回歸。 AR模型的簡(jiǎn)單數(shù)學(xué)表示如下: ![]() 這里,εt 是白噪聲。 這類似于多元回歸,但是使用 yt 的滯后值作為預(yù)測(cè)變量。 我們將其稱為 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) 4、移動(dòng)平均模型(MA)與在回歸中使用預(yù)測(cè)變量的過(guò)去值的 AR 模型不同,MA 模型在類似回歸的模型中關(guān)注過(guò)去的預(yù)測(cè)誤差或殘差。 MA模型的簡(jiǎn)單數(shù)學(xué)表示如下: ![]() 這里,εt 是白噪聲。 我們將其稱為 MA(q) 模型,即 q 階移動(dòng)平均模型。
需要說(shuō)明的是不應(yīng)將這里說(shuō)的移動(dòng)平均線方法與計(jì)算時(shí)間序列的移動(dòng)平均線混淆,因?yàn)閮烧呤遣煌母拍睢?/p> 5、自回歸滑動(dòng)平均模型 (ARMA)在 AR 模型中,我們使用變量過(guò)去值與過(guò)去預(yù)測(cè)誤差或殘差的線性組合來(lái)預(yù)測(cè)感興趣的變量。 它結(jié)合了自回歸 (AR) 和移動(dòng)平均 (MA) 模型。 AR 部分涉及對(duì)變量自身的滯后(即過(guò)去)值進(jìn)行回歸。 MA部分涉及將誤差項(xiàng)建模為在過(guò)去不同時(shí)間同時(shí)發(fā)生的誤差項(xiàng)的線性組合。 模型的符號(hào)涉及將 AR(p) 和 MA(q) 模型的順序指定為 ARMA 函數(shù)的參數(shù),例如 ARMA(p,q)。 ARMA 模型的簡(jiǎn)單數(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) 6、差分整合移動(dòng)平均自回歸模型 (ARIMA)如果我們將差分與自回歸和移動(dòng)平均模型相結(jié)合,我們將獲得 ARIMA 模型。 ARIMA 是差分整合移動(dòng)平均自回歸模型Autoregressive Integrated Moving Average model 的首字母縮寫。 它結(jié)合了自回歸 (AR) 和移動(dòng)平均模型 (MA) 以及為了使序列平穩(wěn)而對(duì)序列的差分預(yù)處理過(guò)程,這個(gè)過(guò)程稱為積分(I)。 ARIMA 模型的簡(jiǎn)單數(shù)學(xué)表示如下: ![]() 其中 y′t 是差分級(jí)數(shù)。 右側(cè)的“預(yù)測(cè)變量”包括滯后值和滯后誤差。 我們稱之為 ARIMA(p,d,q) 模型。 這里,p 是自回歸部分的階數(shù),d 是所涉及的一階差分程度,q 是移動(dòng)平均部分的階數(shù)。 ACF 和 PACF 圖在求 p 和 q 階中的意義:
7、季節(jié)性 ARIMA (SARIMA)ARIMA 模型還能夠?qū)V泛的季節(jié)性數(shù)據(jù)進(jìn)行建模。 季節(jié)性 ARIMA 模型是通過(guò)在 ARIMA 模型中包含額外的季節(jié)性項(xiàng)來(lái)形成的。 ![]() 這里,m = 每個(gè)時(shí)間季節(jié)的步數(shù)。 我們對(duì)模型的季節(jié)性部分使用大寫符號(hào),對(duì)模型的非季節(jié)性部分使用小寫符號(hào)。 它將 ARIMA 模型與在季節(jié)性數(shù)據(jù)級(jí)別執(zhí)行相同的自回歸、差分和移動(dòng)平均建模的能力相結(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) 8、包含外生變量的SARIMA (SARIMAX)SARIMAX 模型是傳統(tǒng) SARIMA 模型的擴(kuò)展,包括外生變量的建模,是Seasonal Autoregressive Integrated Moving-Average with Exogenous Regressors 的縮寫 外生變量是其值在模型之外確定并施加在模型上的變量。 它們也被稱為協(xié)變量。 外生變量的觀測(cè)值在每個(gè)時(shí)間步直接包含在模型中,并且與主要內(nèi)生序列的使用不同的建模方式。 SARIMAX 方法也可用于通過(guò)包含外生變量來(lái)模擬具有外生變量的其他變化,例如 ARX、MAX、ARMAX 和 ARIMAX。
9、向量自回歸 (VAR)VAR 模型是單變量自回歸模型的推廣,用于預(yù)測(cè)時(shí)間序列向量或多個(gè)并行時(shí)間序列,例如 多元時(shí)間序列。 它是關(guān)于系統(tǒng)中每個(gè)變量的一個(gè)方程。 如果序列是平穩(wěn)的,可以通過(guò)將 VAR 直接擬合到數(shù)據(jù)來(lái)預(yù)測(cè)它們(稱為“VAR in levels”)。 如果序列是非平穩(wěn)的,我們會(huì)取數(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) 10、向量自回歸滑動(dòng)平均模型 (VARMA)VARMA 方法是 ARMA 對(duì)多個(gè)并行時(shí)間序列的推廣,例如 多元時(shí)間序列。 具有有限階 MA 誤差項(xiàng)的有限階 VAR 過(guò)程稱為 VARMA。 模型的公式將 AR(p) 和 MA(q) 模型的階數(shù)指定為 VARMA 函數(shù)的參數(shù),例如 VARMA(p,q)。 VARMA 模型也可用于VAR 或 VMA 模型。
11、包含外生變量的向量自回歸滑動(dòng)平均模型 (VARMAX)Vector Autoregression Moving-Average with Exogenous Regressors (VARMAX) 是 VARMA 模型的擴(kuò)展,模型中還包含使用外生變量的建模。 它是 ARMAX 方法對(duì)多個(gè)并行時(shí)間序列的推廣,即 ARMAX 方法的多變量版本。 VARMAX 方法也可用于對(duì)包含外生變量的包含模型進(jìn)行建模,例如 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) 總結(jié)在這篇文章中,基本上覆蓋了所有主要時(shí)間序列預(yù)測(cè)的問(wèn)題。我們可以把上面提到的方法整理成以下幾個(gè)重要的方向:
本文中提到的每種算法基本上都是這幾種方法的組合,本文中已將每種的算法都進(jìn)行了重點(diǎn)的描述和代碼的演示,如果你想深入了解其中的知識(shí)請(qǐng)查看相關(guān)的論文。 |
|