-
當前位置:首頁 > 創(chuàng)意學院 > 技術 > 專題列表 > 正文
單步預測和多步預測(單步預測和多步預測優(yōu)缺點)
大家好!今天讓創(chuàng)意嶺的小編來大家介紹下關于單步預測和多步預測的問題,以下是小編對此問題的歸納整理,讓我們一起來看看吧。
開始之前先推薦一個非常厲害的Ai人工智能工具,一鍵生成原創(chuàng)文章、方案、文案、工作計劃、工作報告、論文、代碼、作文、做題和對話答疑等等
只需要輸入關鍵詞,就能返回你想要的內(nèi)容,越精準,寫出的就越詳細,有微信小程序端、在線網(wǎng)頁版、PC客戶端
官網(wǎng):https://ai.de1919.com。
創(chuàng)意嶺作為行業(yè)內(nèi)優(yōu)秀的企業(yè),服務客戶遍布全球各地,如需了解SEO相關業(yè)務請撥打電話175-8598-2043,或添加微信:1454722008
本文目錄:
一、預測步長是什么
計算機控制算法。多步預測控制,是用于數(shù)值算法采用多步測試,滾動優(yōu)化和反饋校正等控制策略。預測步長是一類新型的計算機控制算法,因而控制效果好,適用于控制不宜建立精確數(shù)字模型且比較復雜的工業(yè)生產(chǎn)過程。
二、eviews預測
如何使用EViews軟件對時間序列進行預測
http://jingyan.baidu.com/article/1709ad8089a69e4634c4f0ff.html
做計量分析的目的就是為了探尋經(jīng)濟現(xiàn)象內(nèi)在的相關關系,而預測效果的好壞則是檢驗這種關系存在與否以及解釋力度大小的標準。模型一般分為兩類,一是基于單個序列的模型,二則是我們常見常用的多序列模型。
一、單序列模型的預測
最常用的方法就是指數(shù)平滑法,這個已經(jīng)在之前詳細闡述。
ARMA模型
時間序列可以通過將時間序列引入轉(zhuǎn)化為多序列模型
二、多序列模型的預測
1、一般理解
當確定了序列之間的回歸方程之后即可根據(jù)回歸方程進行擬合預測。Eviews路徑:回歸方程窗口-----forecast。
衡量預測效果的標準是預測誤差,即預測值與實際值之間的偏差。預測輸出界面參數(shù)的理解如下:
第一,誤差均方根(Root Mean Squared Error)。對預測誤差的等可能加權平方和求平方根
第二,平均絕對誤差(Mean Absolute Error)。對預測誤差的絕對值求平均。
第三,平均相對誤差(Mean Abs.Percent Error)。其計算公式與平均絕對方差一樣都是對誤差采用絕對值,但這里要除以實際值,所以最終度量的是相對誤差。因為公式乘以了100,所以輸出結(jié)果中其值的度量單位為百分比。
第四,Theil不等系數(shù)(Theil Inequality Coefficient)。它的計算公式含義也很清晰,分子就是誤差均方根,分母則是預測值等可能加權平方和開平方根+實際值等可能加權平方和開平方根。因此這一系數(shù)的取值區(qū)間為0-1,越靠近0,表示單位誤差均方根越小,即預測值與實際值越靠近,模型擬合效果越好。前面三個參數(shù)的值也是如此,越小表示模型擬合效果越好,只是怎樣才叫小卻是無從判定。
預測均方差又可以分解為三個指標之和,偏差比、方差比和協(xié)方差比之和為1:
第一,偏差比率(Bias Proportion)
第二,方差比率(Variance Proportion)
第三,協(xié)方差比率(Covariance Proportion)
偏差比率表明預測均值與序列實際均值的偏差程度(預測均值與實際均值之差的平方占誤差均方的比率);方差比表明預測方差與序列實際方差的偏離程度(預測值和實際值的分布偏差標準差之差的平方占誤差均方的比率);協(xié)方差比率衡量非系統(tǒng)誤差的大小(預測值和實際值的分布偏差協(xié)方差占誤差均方的比率)。
如果預測結(jié)果好,那么偏差比率和方差比率應該較小,協(xié)方差比率較大。
2、動態(tài)預測與靜態(tài)預測
動態(tài)預測是進行多步預測,除了第一個預測值是用解釋變量的實際值預測外,其后各期預測值都是采用遞推預測的方法,用滯后被解釋變量(即所謂的動態(tài)項)的前期預測值代入估計(預測)方程來預測下一期的預測值。
靜態(tài)預測則是對進行一系列的一步預測,即它必須用解釋變量的真實值來進行預測,而不能使用被解釋變量的預測值作為解釋變量進行預測。靜態(tài)預測要求外生變量和任何滯后內(nèi)生變量在預測樣本中的觀測值可以獲得。如果沒有某期數(shù)據(jù),對應該期的預測值為NA。但是,它并不會對以后預測產(chǎn)生影響。所以,如果進行靜態(tài)預測還需要給出用于預測的解釋變量的值以及滯后被解釋變量的值。如果要以解釋變量的估計值為基礎進行預測,則需要先打開解釋變量的序列窗口,在預測之前將這些估計值添加進其相應區(qū)間。
3、被解釋變量為公式的預測
如果被解釋變量的公式是簡單形式,Eviews在做預測確定預測序列時會給出兩個選擇:第一,以整個公式整體作為預測序列;第二,以這個公式中第一個出現(xiàn)的序列為預測序列,如公式為x/2y,則以x為預測序列。
但是當公式比較復雜時,Eviews則只能以整個公式作為預測序列。甚至,當公式過于復雜時,Eviews就會自己認慫,給出一條錯誤信息,表示它已經(jīng)hold不住場面,無法對這個公式求解了。
三、r語言arma-garch怎樣預測
原文鏈接:http://tecdat.cn/?p=20015
本文將說明單變量和多變量金融時間序列的不同模型,特別是條件均值和條件協(xié)方差矩陣、波動率的模型。
均值模型
本節(jié)探討條件均值模型。
iid模型
我們從簡單的iid模型開始。iid模型假定對數(shù)收益率xt為N維高斯時間序列:
均值和協(xié)方差矩陣的樣本估計量分別是樣本均值
和樣本協(xié)方差矩陣
我們從生成數(shù)據(jù)開始,熟悉該過程并確保估計過程給出正確的結(jié)果(即完整性檢查)。然后使用真實的市場數(shù)據(jù)并擬合不同的模型。
讓我們生成合成iid數(shù)據(jù)并估算均值和協(xié)方差矩陣:
# 生成綜合收益數(shù)據(jù)X <- rmvnorm(n = T, mean = mu, sigma = Sigma)# 樣本估計(樣本均值和樣本協(xié)方差矩陣)mu_sm <- colMeans(X)Sigma_scm <- cov(X)# 誤差norm(mu_sm - mu, "2")#> [1] 2.44norm(Sigma_scm - Sigma, "F")#> [1] 70.79
現(xiàn)在,讓我們針對不同數(shù)量的觀測值T再做一次:
# 首先生成所有數(shù)據(jù)X <- rmvnorm(n = T_max, mean = mu, sigma = Sigma)# 現(xiàn)在遍歷樣本的子集for (T_ in T_sweep) { # 樣本估算 mu_sm <- colMeans(X_) Sigma_scm <- cov(X_) # 計算誤差 error_mu_vs_T <- c(error_mu_vs_T, norm(mu_sm - mu, "2")) error_Sigma_vs_T <- c(error_Sigma_vs_T, norm(Sigma_scm - Sigma, "F"))# 繪圖plot(T_sweep, error_mu_vs_T, main = "mu估計誤差",
plot(T_sweep, error_Sigma_vs_T main = "Sigma估計中的誤差", ylab = "誤差"
單變量ARMA模型
對數(shù)收益率xt上的ARMA(p,q)模型是
其中wt是均值為零且方差為σ2的白噪聲序列。模型的參數(shù)是系數(shù)ϕi,θi和噪聲方差σ2。
請注意,ARIMA(p,d,q)模型是時間差分為d階的ARMA(p,q)模型。因此,如果我們用xt代替對數(shù)價格,那么先前的對數(shù)收益模型實際上就是ARIMA(p,1,q)模型,因為一旦對數(shù)價格差分,我們就獲得對數(shù)收益。
rugarch生成數(shù)據(jù)
我們將使用rugarch包 生成單變量ARMA數(shù)據(jù),估計參數(shù)并進行預測。
首先,我們需要定義模型:
# 指定具有給定系數(shù)和參數(shù)的AR(1)模型#> #> *----------------------------------*#> * ARFIMA Model Spec *#> *----------------------------------*#> Conditional Mean Dynamics#> ------------------------------------#> Mean Model : ARFIMA(1,0,0)#> Include Mean : TRUE #> #> Conditional Distribution#> ------------------------------------#> Distribution : norm #> Includes Skew : FALSE #> Includes Shape : FALSE #> Includes Lambda : FALSE#> Level Fixed Include Estimate LB UB#> mu 0.01 1 1 0 NA NA#> ar1 -0.90 1 1 0 NA NA#> ma 0.00 0 0 0 NA NA#> arfima 0.00 0 0 0 NA NA#> archm 0.00 0 0 0 NA NA#> mxreg 0.00 0 0 0 NA NA#> sigma 0.20 1 1 0 NA NA#> alpha 0.00 0 0 0 NA NA#> beta 0.00 0 0 0 NA NA#> gamma 0.00 0 0 0 NA NA#> eta1 0.00 0 0 0 NA NA#> eta2 0.00 0 0 0 NA NA#> delta 0.00 0 0 0 NA NA#> lambda 0.00 0 0 0 NA NA#> vxreg 0.00 0 0 0 NA NA#> skew 0.00 0 0 0 NA NA#> shape 0.00 0 0 0 NA NA#> ghlambda 0.00 0 0 0 NA NA#> xi 0.00 0 0 0 NA NAfixed.pars#> $mu#> [1] 0.01#> #> $ar1#> [1] -0.9#> #> $sigma#> [1] 0.2true_params#> mu ar1 sigma #> 0.01 -0.90 0.20
然后,我們可以生成時間序列:
# 模擬一條路徑apath(spec, n.sim = T)# 轉(zhuǎn)換為xts并繪圖plot(synth_log_returns, main = "ARMA模型的對數(shù)收益率"plot(synth_log_prices, main = "ARMA模型的對數(shù)價格"
ARMA模型
現(xiàn)在,我們可以估計參數(shù)(我們已經(jīng)知道):
# 指定AR(1)模型arfimaspec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE))# 估計模型#> mu ar1 sigma #> 0.0083 -0.8887 0.1987#> mu ar1 sigma #> 0.01 -0.90 0.20
我們還可以研究樣本數(shù)量T對參數(shù)估計誤差的影響:
# 循環(huán)for (T_ in T_sweep) { estim_coeffs_vs_T <- rbind(estim_coeffs_vs_T, coef(arma_fit)) error_coeffs_vs_T <- rbind(error_coeffs_vs_T, abs(coef(arma_fit) - true_params)/true_params)# 繪圖matplot(T_sweep, estim_coeffs_vs_T, main = "估計的ARMA系數(shù)", xlab = "T", ylab = "值",
matplot(T_sweep, 100*error_coeffs_vs_T, main = "估計ARMA系數(shù)的相對誤差", xlab = "T", ylab = "誤差 (%)",
首先,真正的μ幾乎為零,因此相對誤差可能顯得不穩(wěn)定。在T = 800個樣本之后,其他系數(shù)得到了很好的估計。
ARMA預測
為了進行健全性檢查,我們現(xiàn)在將比較兩個程序包 Forecast 和 rugarch的結(jié)果:
# 指定具有給定系數(shù)和參數(shù)的AR(1)模型spec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE), fixed.pars = list(mu = 0.005, ar1 = -0.9, sigma = 0.1))# 生成長度為1000的序列arfima(arma_fixed_spec, n.sim = 1000)@path$seriesSim# 使用 rugarch包指定和擬合模型spec(mean.model = list(armaOrder = c(1,0), include.mean = TRUE))# 使用包“ forecast”擬合模型#> ARIMA(1,0,0) with non-zero mean #> #> Coefficients:#> ar1 mean#> -0.8982 0.0036#> s.e. 0.0139 0.0017#> #> sigma^2 estimated as 0.01004: log likelihood=881.6#> AIC=-1757.2 AICc=-1757.17 BIC=-1742.47# 比較模型系數(shù)#> ar1 intercept sigma #> -0.898181148 0.003574781 0.100222964#> mu ar1 sigma #> 0.003605805 -0.898750138 0.100199956
確實,這兩個軟件包給出了相同的結(jié)果。
ARMA模型選擇
在先前的實驗中,我們假設我們知道ARMA模型的階數(shù),即p = 1和q = 0。實際上,階數(shù)是未知的,因此必須嘗試不同的階數(shù)組合。階數(shù)越高,擬合越好,但這將不可避免地導致過度擬合。已經(jīng)開發(fā)出許多方法來懲罰復雜性的增加以避免過度擬合,例如AIC,BIC,SIC,HQIC等。
# 嘗試不同的組合# 查看排名#> AR MA Mean ARFIMA BIC converged#> 1 1 0 1 0 -0.38249098 1#> 2 1 1 1 0 -0.37883157 1#> 3 2 0 1 0 -0.37736340 1#> 4 1 2 1 0 -0.37503980 1#> 5 2 1 1 0 -0.37459177 1#> 6 3 0 1 0 -0.37164609 1#> 7 1 3 1 0 -0.37143480 1#> 8 2 2 1 0 -0.37107841 1#> 9 3 1 1 0 -0.36795491 1#> 10 2 3 1 0 -0.36732669 1#> 11 3 2 1 0 -0.36379209 1#> 12 3 3 1 0 -0.36058264 1#> 13 0 3 1 0 -0.11875575 1#> 14 0 2 1 0 0.02957266 1#> 15 0 1 1 0 0.39326050 1#> 16 0 0 1 0 1.17294875 1#選最好的armaOrder#> AR MA #> 1 0
在這種情況下,由于觀察次數(shù)T = 1000足夠大,因此階數(shù)被正確地檢測到。相反,如果嘗試使用T = 200,則檢測到的階數(shù)為p = 1,q = 3。
ARMA預測
一旦估計了ARMA模型參數(shù)ϕi ^ i和θ^j,就可以使用該模型預測未來的值。例如,根據(jù)過去的信息對xt的預測是
并且預測誤差將為xt-x ^ t = wt(假設參數(shù)已被估計),其方差為σ2。軟件包 rugarch 使對樣本外數(shù)據(jù)的預測變得簡單:
# 估計模型(不包括樣本外)coef(arma_fit)#> mu ar1 sigma #> 0.007212069 -0.898745183 0.200400119# 整個樣本外的預測對數(shù)收益forecast_log_returns <- xts(arma_fore@forecast$seriesFor[1, ], dates_out_of_sample)# 恢復對數(shù)價格prev_log_price <- head(tail(synth_log_prices, out_of_sample+1), out_of_sample)# 對數(shù)收益圖plot(cbind("fitted" = fitted(arma_fit),# 對數(shù)價格圖plot(cbind("forecast" = forecast_log_prices, main = "對數(shù)價格預測", legend.loc = "topleft")
多元VARMA模型
對數(shù)收益率xt上的VARMA(p,q)模型是
其中wt是具有零均值和協(xié)方差矩陣Σw的白噪聲序列。該模型的參數(shù)是矢量/矩陣系數(shù)ϕ0,Φi,Θj和噪聲協(xié)方差矩陣Σw。
比較
讓我們首先加載S&P500:
# 加載標普500數(shù)據(jù)head(SP500_index_prices)#> SP500#> 2012-01-03 1277.06#> 2012-01-04 1277.30#> 2012-01-05 1281.06#> 2012-01-06 1277.81#> 2012-01-09 1280.70#> 2012-01-10 1292.08# 準備訓練和測試數(shù)據(jù)logreturns_trn <- logreturns[1:T_trn]logreturns_tst <- logreturns[-c(1:T_trn)]# 繪圖{ plot(logreturns, addEventLines(xts("訓練"
現(xiàn)在,我們使用訓練數(shù)據(jù)(即,對于t = 1,…,Ttrnt = 1,…,Ttrn)來擬合不同的模型(請注意,通過指示排除了樣本外數(shù)據(jù) out.sample = T_tst)。特別是,我們將考慮iid模型,AR模型,ARMA模型以及一些ARCH和GARCH模型(稍后將對方差建模進行更詳細的研究)。
# 擬合i.i.d.模型coef(iid_fit)#> mu sigma #> 0.0005712982 0.0073516993mean(logreturns_trn)#> [1] 0.0005681388sd(logreturns_trn)#> [1] 0.007360208# 擬合AR(1)模型coef(ar_fit)#> mu ar1 sigma #> 0.0005678014 -0.0220185181 0.0073532716# 擬合ARMA(2,2)模型coef(arma_fit)#> mu ar1 ar2 ma1 ma2 sigma #> 0.0007223304 0.0268612636 0.9095552008 -0.0832923604 -0.9328475211 0.0072573570# 擬合ARMA(1,1)+ ARCH(1)模型coef(arch_fit)#> mu ar1 ma1 omega alpha1 #> 6.321441e-04 8.720929e-02 -9.391019e-02 4.898885e-05 9.986975e-02#擬合ARMA(0,0)+ARCH(10)模型coef(long_arch_fit)#> mu omega alpha1 alpha2 alpha3 alpha4 alpha5 #> 7.490786e-04 2.452099e-05 6.888561e-02 7.207551e-02 1.419938e-01 1.909541e-02 3.082806e-02 #> alpha6 alpha7 alpha8 alpha9 alpha10 #> 4.026539e-02 3.050040e-07 9.260183e-02 1.150128e-01 1.068426e-06# 擬合ARMA(1,1)+GARCH(1,1)模型coef(garch_fit)#> mu ar1 ma1 omega alpha1 beta1 #> 6.660346e-04 9.664597e-01 -1.000000e+00 7.066506e-06 1.257786e-01 7.470725e-01
我們使用不同的模型來預測對數(shù)收益率:
# 準備預測樣本外周期的對數(shù)收益# i.i.d.模型預測forecast(iid_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# AR(1)模型進行預測forecast(ar_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(2,2)模型進行預測forecast(arma_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# 使用ARMA(1,1)+ ARCH(1)模型進行預測forecast(arch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(0,0)+ARCH(10)模型預測forecast(long_arch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)# ARMA(1,1)+GARCH(1,1)模型預測forecast(garch_fit, n.ahead = 1, n.roll = T_tst - 1) dates_out_of_sample)
我們可以計算不同模型的預測誤差(樣本內(nèi)和樣本外):
print(error_var)#> in-sample out-of-sample#> iid 5.417266e-05 8.975710e-05#> AR(1) 5.414645e-05 9.006139e-05#> ARMA(2,2) 5.265204e-05 1.353213e-04#> ARMA(1,1) + ARCH(1) 5.415836e-05 8.983266e-05#> ARCH(10) 5.417266e-05 8.975710e-05#> ARMA(1,1) + GARCH(1,1) 5.339071e-05 9.244012e-05
我們可以觀察到,隨著模型復雜度的增加,樣本內(nèi)誤差趨于變?。ㄓ捎跀M合數(shù)據(jù)的自由度更高),盡管差異可以忽略不計。重要的實際上是樣本外誤差:我們可以看到,增加模型復雜度可能會得出較差的結(jié)果。就預測收益的誤差而言,似乎最簡單的iid模型已經(jīng)足夠了。
最后,讓我們展示一些樣本外誤差的圖表:
plot(error, main = "不同模型收益預測的樣本外誤差",
請注意,由于我們沒有重新擬合模型,因此隨著時間的發(fā)展,誤差越大(對于ARCH建模尤其明顯)。
滾動窗口比較
讓我們首先通過一個簡單的示例比較靜態(tài)預測與滾動預測的概念:
#ARMA(2,2)模型spec <- spec(mean.model = list(armaOrder = c(2,2), include.mean = TRUE))# 靜態(tài)擬合和預測ar_static_fit <- fit(spec = spec, data = logreturns, out.sample = T_tst)#滾動擬合和預測modelroll <- aroll(spec = spec, data = logreturns, n.ahead = 1, # 預測圖plot(cbind("static forecast" = ar_static_fore_logreturns, main = "使用ARMA(2,2)模型進行預測", legend.loc = "topleft")# 預測誤差圖plot(error_logreturns, col = c("black", "red"), lwd = 2, main = "ARMA(2,2)模型的預測誤差", legend.loc = "topleft")
我們可以清楚地觀察到滾動窗口過程對時間序列的影響。
現(xiàn)在,我們可以在滾動窗口的基礎上重做所有模型的所有預測:
# 基于i.i.d.模型的滾動預測roll(iid_spec, data = logreturns, n.ahead = 1, forecast.length = T_t# AR(1)模型的滾動預測roll(ar_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, # ARMA(2,2)模型的滾動預測roll(arma_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, # ARMA(1,1)+ ARCH(1)模型的滾動預測roll(arch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, refit.win# ARMA(0,0)+ ARCH(10)模型的滾動預測roll(long_arch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, # ARMA(1,1)+ GARCH(1,1)模型的滾動預測roll(garch_spec, data = logreturns, n.ahead = 1, forecast.length = T_tst, refit.every = 50, refit.window
讓我們看看滾動基準情況下的預測誤差:
print(rolling_error_var)#> in-sample out-of-sample#> iid 5.417266e-05 8.974166e-05#> AR(1) 5.414645e-05 9.038057e-05#> ARMA(2,2) 5.265204e-05 8.924223e-05#> ARMA(1,1) + ARCH(1) 5.415836e-05 8.991902e-05#> ARCH(10) 5.417266e-05 8.976736e-05#> ARMA(1,1) + GARCH(1,1) 5.339071e-05 8.895682e-05
和一些圖表:
plot(error_logreturns, main = "不同模型的滾動預測誤差", legend.loc = "topleft"
我們看到,現(xiàn)在所有模型都擬合了時間序列。此外,我們在模型之間沒有發(fā)現(xiàn)任何顯著差異。
我們最終可以比較靜態(tài)誤差和滾動誤差:
barplot(rbind(error_var[, "out-of-sample"], rolling_error_var[, "out-of-sample"]) col = c("darkblue", "darkgoldenrod"), legend = c("靜態(tài)預測", "滾動預測"),
我們可以看到,滾動預測在某些情況下是必須的。因此,實際上,我們需要定期進行滾動預測改進。
方差模型
ARCH和GARCH模型
對數(shù)收益率殘差wt的ARCH(m)模型為
其中zt是具有零均值和恒定方差的白噪聲序列,而條件方差σ2t建模為
其中,m為模型階數(shù),ω> 0,αi≥0為參數(shù)。
GARCH(m,s)模型使用σ2t上的遞歸項擴展了ARCH模型:
其中參數(shù)ω> 0,αi≥0,βj≥0需要滿足∑mi =1αi+ ∑sj = 1βj≤1的穩(wěn)定性。
rugarch生成數(shù)據(jù)
首先,我們需要定義模型:
# 指定具有給定系數(shù)和參數(shù)的GARCH模型#> #> *---------------------------------*#> * GARCH Model Spec *#> *---------------------------------*#> #> Conditional Variance Dynamics #> ------------------------------------#> GARCH Model : sGARCH(1,1)#> Variance Targeting : FALSE #> #> Conditional Mean Dynamics#> ------------------------------------#> Mean Model : ARFIMA(1,0,0)#> Include Mean : TRUE #> GARCH-in-Mean : FALSE #> #> Conditional Distribution#> ------------------------------------#> Distribution : norm #> Includes Skew : FALSE #> Includes Shape : FALSE #> Includes Lambda : FALSE#> Level Fixed Include Estimate LB UB#> mu 0.005 1 1 0 NA NA#> ar1 -0.900 1 1 0 NA NA#> ma 0.000 0 0 0 NA NA#> arfima 0.000 0 0 0 NA NA#> archm 0.000 0 0 0 NA NA#> mxreg 0.000 0 0 0 NA NA#> omega 0.001 1 1 0 NA NA#> alpha1 0.300 1 1 0 NA NA#> beta1 0.650 1 1 0 NA NA#> gamma 0.000 0 0 0 NA NA#> eta1 0.000 0 0 0 NA NA#> eta2 0.000 0 0 0 NA NA#> delta 0.000 0 0 0 NA NA#> lambda 0.000 0 0 0 NA NA#> vxreg 0.000 0 0 0 NA NA#> skew 0.000 0 0 0 NA NA#> shape 0.000 0 0 0 NA NA#> ghlambda 0.000 0 0 0 NA NA#> xi 0.000 0 0 0 NA NA#> $mu#> [1] 0.005#> #> $ar1#> [1] -0.9#> #> $omega#> [1] 0.001#> #> $alpha1#> [1] 0.3#> #> $beta1#> [1] 0.65true_params#> mu ar1 omega alpha1 beta1 #> 0.005 -0.900 0.001 0.300 0.650
然后,我們可以生成收益率時間序列:
# 模擬一條路徑hpath(garch_spec, n.sim = T)#> num [1:2000, 1] 0.167 -0.217 # 繪圖對數(shù)收益{ plot(synth_log_returns, main = "GARCH模型的對數(shù)收益", lwd = 1.5) lines(synth_volatility
GARCH
現(xiàn)在,我們可以估計參數(shù):
# 指定一個GARCH模型ugarchspec(mean.model = list(armaOrder = c(1,0)# 估計模型coef(garch_fit)#> mu ar1 omega alpha1 beta1 #> 0.0036510100 -0.8902333595 0.0008811434 0.2810460728 0.6717486402#> mu ar1 omega alpha1 beta1 #> 0.005 -0.900 0.001 0.300 0.650# 系數(shù)誤差#> mu ar1 omega alpha1 beta1 #> 0.0013489900 0.0097666405 0.0001188566 0.0189539272 0.0217486402
我們還可以研究樣本數(shù)量T對參數(shù)估計誤差的影響:
# 循環(huán)for (T_ in T_sweep) { garch_fit error_coeffs_vs_T <- rbind(error_coeffs_vs_T, abs((coef(garch_fit) - true_params)/true_params)) estim_coeffs_vs_T <- rbind(estim_coeffs_vs_T, coef(garch_fit))# 繪圖matplot(T_sweep, 100*error_coeffs_vs_T, main = "估計GARCH系數(shù)的相對誤差", xlab = "T", ylab = "誤差 (%)",
真實的ω幾乎為零,因此誤差非常不穩(wěn)定。至于其他系數(shù),就像在ARMA情況下一樣,μ的估計確實很差(相對誤差超過50%),而其他系數(shù)似乎在T = 800個樣本后得到了很好的估計。
GARCH結(jié)果比較
作為健全性檢查,我們現(xiàn)在將比較兩個軟件包 fGarch 和 rugarch的結(jié)果:
# 指定具有特定參數(shù)值的ARMA(0,0)-GARCH(1,1)作為數(shù)據(jù)生成過程garch_spec #生成長度為1000的數(shù)據(jù)path(garch_fixed_spec, n.sim = 1000)@path$# 使用“ rugarch”包指定和擬合模型rugarch_fit <- ugarchfit(spec = garch_spec, data = x)# 使用包“ fGarch”擬合模型garchFit(formula = ~ garch(1, 1), data = x, trace = FALSE)# 比較模型系數(shù)#> mu omega alpha1 beta1 #> 0.09749904 0.01395109 0.13510445 0.73938595#> mu omega alpha1 beta1 #> 0.09750394 0.01392648 0.13527024 0.73971658# 比較擬合的標準偏差print(head(fGarch_fi#> [1] 0.3513549 0.3254788 0.3037747 0.2869034 0.2735266 0.2708994print(head(rugar#> [1] 0.3538569 0.3275037 0.3053974 0.2881853 0.2745264 0.2716555
確實,這兩個軟件包給出了相同的結(jié)果。
使用rugarch包進行GARCH預測
一旦估計出GARCH模型的參數(shù),就可以使用該模型預測未來的值。例如,基于過去的信息對條件方差的單步預測為
給定ω^ /(1-∑mi =1α^ i-∑sj =1β^ j)。軟件包 rugarch 使對樣本外數(shù)據(jù)的預測變得簡單:
# 估計模型,不包括樣本外garch_fit coef(garch_fit)#> mu ar1 omega alpha1 beta1 #> 0.0034964331 -0.8996287630 0.0006531088 0.3058756796 0.6815452241# 預測整個樣本的對數(shù)收益garch_fore@forecast$sigmaFor[1, ]# 對數(shù)收益圖plot(cbind("fitted" = fitted(garch_fit), main = "合成對數(shù)收益預測", legend.loc = "topleft")
#波動率對數(shù)收益圖plot(cbind("fitted volatility" = sigma(garch_fit), main = "預測合成對數(shù)收益率的波動性", legend.loc = "topleft")
不同方法
讓我們首先加載S&P500:
# 加載標準普爾500指數(shù)數(shù)據(jù)head(SP500_index_prices)#> SP500#> 2008-01-02 1447.16#> 2008-01-03 1447.16#> 2008-01-04 1411.63#> 2008-01-07 1416.18#> 2008-01-08 1390.19#> 2008-01-09 1409.13# 準備訓練和測試數(shù)據(jù)x_trn <- x[1:T_trn]x_tst <- x[-c(1:T_trn)]# 繪圖{ plot(x, main = "收益" addEventLines(xts("訓練", in
常數(shù)
讓我們從常數(shù)開始:
plot(cbind(sqrt(var_constant), x_trn) main = "常數(shù)")
移動平均值
現(xiàn)在,讓我們使用平方收益的移動平均值:
plot(cbind(sqrt(var_t), x_trn), main = "基于簡單滾動平方均值的包絡線(時間段=20)
EWMA
指數(shù)加權移動平均線(EWMA):
請注意,這也可以建模為ETS(A,N,N)狀態(tài)空間模型:
plot(cbind(std_t, x_trn), main = "基于平方EWMA的包絡")
乘法ETS
我們還可以嘗試ETS模型的不同變體。例如,具有狀態(tài)空間模型的乘性噪聲版本ETS(M,N,N):
四、看到你之前關于matlab神經(jīng)網(wǎng)絡多步滾動預測的提問,你說你解決了。我想問你具體的程序如何,謝謝。
奇怪,百度還多這樣的功能。
其實是一個比較取巧的方法,是從訓練數(shù)據(jù)從新編排入手的,舉例來說,你就只有一列數(shù)據(jù),例如自然數(shù)列,1,2,3,4,5,6,7,你把數(shù)列從新編成一個矩陣
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
矩陣前兩列做訓練的輸入矩陣p,第三列做輸出那個t,然后訓練網(wǎng)絡直到滿足你的條件
這樣訓練后的網(wǎng)絡就可以用了,當你想預測第八個數(shù)的時候,仿真輸入6 7,他就預測第八個數(shù),假設輸出是8,想繼續(xù)預測第九個數(shù),把預測的8和之前的7組成新矩陣,也就是輸入7 8,他就會出第九個數(shù),9
至于你要的矩陣是2列,3列,4列就隨便了,看你的結(jié)果和之前的那幾個數(shù)相關大的,按需要組矩陣吧
上面也可以用
1 2
2 3
3 4
……
這樣的矩陣,第一列p,第二列t,來訓練,這樣就是一輸入一輸出了
原理都一樣,這是多步預測,誤差其實越到后面越大
滾動預測就是把新預測的數(shù)再放進數(shù)列里面,當作這數(shù)列是新的,再做新訓練和仿真
其實新編矩陣很簡單了,for循環(huán)就可以,然后歸一化,再訓練,最后仿真
以上就是關于單步預測和多步預測相關問題的回答。希望能幫到你,如有更多相關問題,您也可以聯(lián)系我們的客服進行咨詢,客服也會為您講解更多精彩的知識和內(nèi)容。
推薦閱讀: