多元時(shí)間序列滾動(dòng)預(yù)測:ARIMA、回歸、ARIMAX模型分析|附代碼數(shù)據(jù)
原文鏈接:http://tecdat.cn/?p=22849
最近我們被客戶要求撰寫關(guān)于多元時(shí)間序列滾動(dòng)預(yù)測的研究報(bào)告,包括一些圖形和統(tǒng)計(jì)輸出。
當(dāng)需要為數(shù)據(jù)選擇最合適的預(yù)測模型或方法時(shí),預(yù)測者通常將可用的樣本分成兩部分:內(nèi)樣本(又稱 "訓(xùn)練集")和保留樣本(或外樣本,或 "測試集")。然后,在樣本中估計(jì)模型,并使用一些誤差指標(biāo)來評(píng)估其預(yù)測性能。
如果這樣的程序只做一次,那么這被稱為 "固定原點(diǎn) "評(píng)估。然而,時(shí)間序列可能包含離群值,一個(gè)差的模型可能比更合適的模型表現(xiàn)得更好。為了加強(qiáng)對(duì)模型的評(píng)估,我們使用了一種叫做 "滾動(dòng)原點(diǎn) "的方法。
滾動(dòng)原點(diǎn)是一種預(yù)測方法,根據(jù)這種方法,預(yù)測原點(diǎn)被連續(xù)更新,預(yù)測是由每個(gè)原點(diǎn)產(chǎn)生的(Tashman 2000)。這種方法允許獲得幾個(gè)時(shí)間序列的預(yù)測誤差,從而更好地了解模型的表現(xiàn)。
相關(guān)視頻:Python和R語言使用指數(shù)加權(quán)平均(EWMA),ARIMA自回歸移動(dòng)平均模型預(yù)測時(shí)間序列
如何實(shí)現(xiàn)呢?
下圖描述了滾動(dòng)原點(diǎn)的基本思想。白色單元格對(duì)應(yīng)的是樣本內(nèi)數(shù)據(jù),而淺灰色單元格對(duì)應(yīng)的是前三步的預(yù)測。該圖中時(shí)間序列有25個(gè)觀測值,預(yù)測從8個(gè)原點(diǎn)開始產(chǎn)生,從原點(diǎn)15開始。模型在每次迭代中都被重新估計(jì),并產(chǎn)生預(yù)測結(jié)果。之后,在系列的末尾增加一個(gè)新的觀測值,這個(gè)過程繼續(xù)進(jìn)行。當(dāng)沒有更多的數(shù)據(jù)需要添加時(shí),這個(gè)過程就會(huì)停止。這可以被認(rèn)為是一個(gè)滾動(dòng)的原點(diǎn),有一個(gè)固定的保留樣本量。這個(gè)程序的結(jié)果是產(chǎn)生了8個(gè)一到三步的預(yù)測。在此基礎(chǔ)上,我們可以計(jì)算出誤差測量方法,并選擇表現(xiàn)最好的模型。

從8個(gè)原點(diǎn)產(chǎn)生預(yù)測的另一個(gè)選擇是,從原點(diǎn)17而不是15開始(見下圖)。在這種情況下,程序一直持續(xù)到原點(diǎn)22,即產(chǎn)生最后一個(gè)三步超前預(yù)測的時(shí)候,然后繼續(xù)以遞減的預(yù)測范圍進(jìn)行。因此,兩步預(yù)測從原點(diǎn)23產(chǎn)生,只有一步預(yù)測從原點(diǎn)24產(chǎn)生。因此,我們得到8個(gè)一步預(yù)測,7個(gè)兩步預(yù)測和6個(gè)三步預(yù)測。這可以被認(rèn)為是一個(gè)滾動(dòng)的原點(diǎn),有一個(gè)非固定的保留樣本量??捎糜谠谛颖镜那闆r下,當(dāng)我們沒有多余的觀測值的時(shí)候。

最后,在上述兩種情況下,我們的樣本量都在增加。然而對(duì)于某些研究目的,我們可能需要一個(gè)恒定的內(nèi)樣本。下圖展示了這樣一種情況。在這種情況下,在每次迭代中,我們?cè)谙盗械哪┪苍黾右粋€(gè)觀察值,并從系列的開始刪除一個(gè)觀察值(深灰色單元)。

R實(shí)現(xiàn):一元時(shí)間序列ARIMA案例
R實(shí)現(xiàn)了對(duì)任何函數(shù)的滾動(dòng)原點(diǎn)估計(jì),有一個(gè)預(yù)定義的調(diào)用,并返回預(yù)期的值。
我們從一個(gè)簡單的例子開始,從正態(tài)分布生成序列。
x?<-?rnorm(100,100,10)
我們?cè)谶@個(gè)例子中使用ARIMA(0,1,1)。
predict(arima(x=data,order=c(0,1,1)),n.ahead=h
調(diào)用包括兩個(gè)重要元素:data和h。data指定了樣本內(nèi)值在我們要使用的函數(shù)中的位置。h將告訴我們的函數(shù),在選定的函數(shù)中指定了預(yù)測的范圍。在這個(gè)例子中,我們使用arima(x=data,order=c(0,1,1)),產(chǎn)生了一個(gè)想要的ARIMA(0,1,1)模型,然后我們使用predict(...,n. ahead=h),從該模型產(chǎn)生一個(gè)預(yù)測。
還需要指定函數(shù)應(yīng)該返回什么??梢允菞l件平均數(shù)(點(diǎn)預(yù)測),預(yù)測區(qū)間,模型的參數(shù)。然而,根據(jù)你使用的函數(shù)返回的內(nèi)容,滾動(dòng)預(yù)測返回的內(nèi)容有一些不同。如果它是一個(gè)矢量,那么滾動(dòng)預(yù)測將產(chǎn)生一個(gè)矩陣(列中有每個(gè)原點(diǎn)的值)。如果它是一個(gè)矩陣,那么就會(huì)返回一個(gè)數(shù)組。最后,如果它是一個(gè)列表,那么將返回一個(gè)列表的列表。
我們先從predict()函數(shù)中收集條件平均值。
我們可以使用滾動(dòng)原點(diǎn)從模型中產(chǎn)生預(yù)測結(jié)果。比方說,我們想要三步預(yù)測和8個(gè)原點(diǎn),所有其他參數(shù)的默認(rèn)值。
predro(x,?h?,?orig?)
該函數(shù)返回一個(gè)列表,其中包含我們要求的所有數(shù)值,再加上保留樣本的實(shí)際數(shù)值。我們可以根據(jù)這些值計(jì)算一些基本的誤差指標(biāo),例如,按比例的平均絕對(duì)誤差。
apply(abs(holdo?-?pred),1,mean)?/?mean(actual)
在這個(gè)例子中,我們使用apply()函數(shù),區(qū)分不同的預(yù)測期,并了解模型在每個(gè)預(yù)測期的表現(xiàn)。以類似的方式,我們可以評(píng)估其他一些模型的性能,并與第一個(gè)模型產(chǎn)生的誤差進(jìn)行比較。這些數(shù)字本身并不能說明什么,但如果我們把這個(gè)模型的表現(xiàn)與另一個(gè)模型進(jìn)行比較,那么我們就可以推斷出一個(gè)模型是否比另一個(gè)模型更適合數(shù)據(jù)。
我們還可以繪制來自滾動(dòng)原點(diǎn)的預(yù)測結(jié)果。
plot(Values1)

點(diǎn)擊標(biāo)題查閱往期內(nèi)容

R語言用ARIMA模型,ARIMAX模型預(yù)測冰淇淋消費(fèi)時(shí)間序列數(shù)據(jù)

左右滑動(dòng)查看更多
01

02

03

04

在這個(gè)例子中,來自不同來源的預(yù)測結(jié)果是相互接近的。這是因?yàn)閿?shù)據(jù)是平穩(wěn)的,模型是相當(dāng)穩(wěn)定的。
如果我們看一下返回的矩陣,我們會(huì)注意到它們包含缺失值。

這是因?yàn)樵谀J(rèn)情況下,保留樣本被設(shè)置為非常數(shù)。內(nèi)樣本也被設(shè)置為非常數(shù),這就是為什么模型在每次迭代時(shí)都會(huì)對(duì)增加的樣本進(jìn)行重新估計(jì)。我們可用修改這一點(diǎn)。
predro(x,?h?,?ori?)
請(qǐng)注意,return2的值與return1的值不能直接比較,因?yàn)樗鼈兪怯刹煌钠瘘c(diǎn)生成的。這一點(diǎn)在我們繪圖時(shí)可以看出來。
plot(returned2)

如果你使用預(yù)測包中的函數(shù),可以用以下方式修改調(diào)用和返回值。
?"forecast(ets(data)?,level=95"?c("mean","lower","upper")
多元時(shí)間序列ARIMA案例
當(dāng)你有一個(gè)模型和一個(gè)時(shí)間序列時(shí),滾動(dòng)預(yù)測的是一個(gè)方便的方法。但是如果你需要將不同的模型應(yīng)用于不同的時(shí)間序列呢?我們會(huì)需要一個(gè)循環(huán)。在這種情況下,有一個(gè)簡單的方法來使用滾動(dòng)預(yù)測。現(xiàn)在引入幾個(gè)時(shí)間序列。
對(duì)于這個(gè)例子,我們需要一個(gè)返回值的數(shù)組。
array(NA,c(3,2,3,8))
在這里,我們將有3個(gè)時(shí)間序列,2個(gè)模型和來自8個(gè)來源的3步超前預(yù)測。我們的模型將被保存在一個(gè)單獨(dú)的列表中。在這個(gè)例子中,我們將有ARIMA(0,1,1)和ARIMA(1,1,0)。
?list(c(0,1,1),?c(1,1,0))
我們從函數(shù)中返回相同的預(yù)測值,但我們需要改變調(diào)用方式,因?yàn)楝F(xiàn)在我們必須將這兩種不同的模型考慮在內(nèi)。
"predict(arima(data,Models[[i]])ahead=h)"
我們沒有直接指定模型,而是使用列表中的第i個(gè)元素。
我們還想從保留樣本中保存實(shí)際值,以便能夠計(jì)算誤差。
這個(gè)數(shù)組有3個(gè)時(shí)間序列和來自8個(gè)原點(diǎn)的3步超前預(yù)測的維度。
最后,我們可以寫一個(gè)循環(huán)并產(chǎn)生預(yù)測結(jié)果。
for(j?in?1:3)??for(i?in?1:2)predro(data,?h?,?or=8)
比較兩者在不同時(shí)間序列上的表現(xiàn)。
exp(mean(log(apply(Holdout?-?Fore??/?apply(abs(Holdout?-?Fore?))
?
因此,根據(jù)這些結(jié)果,可以得出結(jié)論,在我們的三個(gè)時(shí)間序列上,ARIMA(0,1,1)平均來說比ARIMA(1,1,0)更準(zhǔn)確。
線性回歸和ARIMAX案例
我們的最后一個(gè)例子,我們創(chuàng)建數(shù)據(jù)框并擬合線性回歸。
請(qǐng)注意,在這個(gè)例子中,lm()函數(shù)中實(shí)現(xiàn)的回歸依賴于數(shù)據(jù)框架,不使用預(yù)測范圍。
predict(lm(y~x1+x2+x3,xre),newdat
此外,函數(shù)predict.lm()返回的是一個(gè)帶有數(shù)值的矩陣,而不是一個(gè)列表。最后調(diào)用滾動(dòng)預(yù)測。
pred(y,?h?,?ori??)
在這種情況下, 我們需要在調(diào)用的數(shù)據(jù)參數(shù)中提供因變量, 因?yàn)樵摵瘮?shù)需要提取holdout的值.
predict(lm(?xreg?,new?=xreg?"
predro(?$y,?h?,?or??)plot(?Return)

作為最后一個(gè)例子,我們考慮以下數(shù)據(jù)的ARIMAX模型。

并相應(yīng)地修改調(diào)用。
ourCall?<-?"predict(arima(x=data,?order=c(0,1,1),?xreg=xreg[counti,]),?n.ahead=h,?newxreg=xreg[counto,])"
考慮到現(xiàn)在我們處理的是ARIMA,我們需要同時(shí)指定數(shù)據(jù)和h。此外,xreg與之前的例子不同,因?yàn)樗F(xiàn)在不應(yīng)該包含因變量。
如果你使用ETSX模型,調(diào)用可以簡化為:
?"es(x=dat,?xreg,?h=h"
最后,上面提到的所有例子都可以并行完成,特別是當(dāng)數(shù)據(jù)非常多且樣本量很大時(shí)。
參考文獻(xiàn)
Davydenko, Andrey, and Robert Fildes. 2013. “Measuring Forecasting Accuracy: The Case of Judgmental Adjustments to Sku-Level Demand Forecasts.”?International Journal of Forecasting?29 (3). Elsevier B.V.: 510–22.?https://doi.org/10.1016/j.ijforecast.2012.09.002.
Petropoulos, Fotios, and Nikolaos Kourentzes. 2015. “Forecast combinations for intermittent demand.”?Journal of the Operational Research Society?66 (6). Nature Publishing Group: 914–24.?https://doi.org/10.1057/jors.2014.62.

本文摘選?《?R語言多元時(shí)間序列滾動(dòng)預(yù)測:ARIMA、回歸、ARIMAX模型分析?》?,點(diǎn)擊“閱讀原文”獲取全文完整資料。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
【視頻】時(shí)間序列分析:ARIMA-ARCH / GARCH模型分析股票價(jià)格
時(shí)間序列GARCH模型分析股市波動(dòng)率
PYTHON用GARCH、離散隨機(jī)波動(dòng)率模型DSV模擬估計(jì)股票收益時(shí)間序列與蒙特卡洛可視化
極值理論 EVT、POT超閾值、GARCH 模型分析股票指數(shù)VaR、條件CVaR:多元化投資組合預(yù)測風(fēng)險(xiǎn)測度分析
Garch波動(dòng)率預(yù)測的區(qū)制轉(zhuǎn)移交易策略
金融時(shí)間序列模型ARIMA 和GARCH 在股票市場預(yù)測應(yīng)用
時(shí)間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價(jià)格
R語言風(fēng)險(xiǎn)價(jià)值:ARIMA,GARCH,Delta-normal法滾動(dòng)估計(jì)VaR(Value at Risk)和回測分析股票數(shù)據(jù)
R語言GARCH建模常用軟件包比較、擬合標(biāo)準(zhǔn)普爾SP 500指數(shù)波動(dòng)率時(shí)間序列和預(yù)測可視化
Python金融時(shí)間序列模型ARIMA 和GARCH 在股票市場預(yù)測應(yīng)用
MATLAB用GARCH模型對(duì)股票市場收益率時(shí)間序列波動(dòng)的擬合與預(yù)測R語言GARCH-DCC模型和DCC(MVT)建模估計(jì)
Python 用ARIMA、GARCH模型預(yù)測分析股票市場收益率時(shí)間序列
R語言中的時(shí)間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價(jià)格
R語言ARIMA-GARCH波動(dòng)率模型預(yù)測股票市場蘋果公司日收益率時(shí)間序列
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模擬進(jìn)行股價(jià)預(yù)測
R語言時(shí)間序列GARCH模型分析股市波動(dòng)率
R語言ARMA-EGARCH模型、集成預(yù)測算法對(duì)SPX實(shí)際波動(dòng)率進(jìn)行預(yù)測
matlab實(shí)現(xiàn)MCMC的馬爾可夫轉(zhuǎn)換ARMA - GARCH模型估計(jì)
Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模擬進(jìn)行股價(jià)預(yù)測
使用R語言對(duì)S&P500股票指數(shù)進(jìn)行ARIMA + GARCH交易策略
R語言用多元ARMA,GARCH ,EWMA, ETS,隨機(jī)波動(dòng)率SV模型對(duì)金融時(shí)間序列數(shù)據(jù)建模
R語言股票市場指數(shù):ARMA-GARCH模型和對(duì)數(shù)收益率數(shù)據(jù)探索性分析
R語言多元Copula GARCH 模型時(shí)間序列預(yù)測
R語言使用多元AR-GARCH模型衡量市場風(fēng)險(xiǎn)
R語言中的時(shí)間序列分析模型:ARIMA-ARCH / GARCH模型分析股票價(jià)格
R語言用Garch模型和回歸模型對(duì)股票價(jià)格分析
GARCH(1,1),MA以及歷史模擬法的VaR比較
matlab估計(jì)arma garch 條件均值和方差模型R語言POT超閾值模型和極值理論EVT分析