我正在使用beta-t-egarch软件包,不幸的是它没有滚动预测,所以我想在R中手动创建它。循环的基本思想是它运行代码然后进行预测,保持预测data.frame中的预测值并返回,重新估计模型,预测并将该值添加到预测数据中。框架等等,直到循环结束。我在循环中的问题是它只预测了一天,并且没有重新估计模型并再次预测。
我在网上看了,我只能构建这段代码:
start = 1
finish = 65
for (k in start:finish) {
WIGcomp1<- tegarch(WIG$r)
forecast <- predict(WIGcomp1, n.ahead = 1)
forecast[k-start+1]
}
我的数据来自:
> head(WIG)
Date WIG r
5233 2014-01-02 51865.89 0.0112776612
5234 2014-01-03 51497.81 -0.0071220662
5235 2014-01-07 50444.78 -0.0206600098
5236 2014-01-08 50482.93 0.0007559867
5237 2014-01-09 49753.03 -0.0145638931
5238 2014-01-10 49796.50 0.0008733342
> tail(WIG)
Date WIG r
5293 2014-03-28 51831.67 0.003646887
5294 2014-03-31 52373.47 0.010398813
5295 2014-04-01 52571.51 0.003774173
5296 2014-04-02 52761.31 0.003603819
5297 2014-04-03 52376.18 -0.007326249
5298 2014-04-04 52660.68 0.005417159
数据的结构是:
'data.frame': 66 obs. of 3 variables:
$ Date: Date, format: "2014-01-02" "2014-01-03" "2014-01-07" "2014-01-08" ...
$ WIG : num 51866 51498 50445 50483 49753 ...
$ r : num 0.011278 -0.007122 -0.02066 0.000756 -0.014564 ...
如果需要修改或添加任何内容,请告诉我,我很乐意这样做。请提前感谢。
答案 0 :(得分:0)
您的代码的主要问题是您反复计算相同的预测,因为您不是使用k
来隔离移动窗口,而是每次都使用整个数据集。在这种情况下,只有一个可能的预测,它使用您的整个数据向量(WIGcomp1<- tegarch(WIG$r)
)。例如,请考虑此数据集以及代码的略微修改版本:
library(betategarch)
##
set.seed(1234)
Data <- data.frame(
Date=seq.Date(
from=as.Date("2014-01-02"),
by="day",
length.out=66),
WIG=rnorm(66,mean=51000,sd=1500),
r=rnorm(66,mean=0,sd=.005))
##
##
your.fun <- function(){
start = 1
finish = 65
Forecast <- NULL
for (k in start:finish) {
WIGcomp1<- tegarch(Data$r)
Forecast[k] <- predict(WIGcomp1, n.ahead = 1)
##forecast[k-start+1]
}
Forecast
}
##
> your.fun()
[1] 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116
[10] 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116
[19] 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116
[28] 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116
[37] 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116
[46] 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116
[55] 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116 0.003424116
[64] 0.003424116 0.003424116
由于您没有使用源数据的移动窗口,因此它只是反复进行相同的预测。另一种解决方案是使用移动的数据子集从移动窗口进行连续的1步预测,该窗口跨越n
天(在下面的示例中为n = 10
)。这代表了每天获得新观测值的情况,并使用该数据点和前9天的数据来预测明天的价值。
rolling.forecast <- function(Df=Data,Var="r",Window=10,nAhead=1){
##
fCast <- rollapplyr(
Df[,Var], width=Window, function(x){
predict(
tegarch(x),
n.ahead=nAhead)
})
##
newData <- cbind(
Df,
Forecast=c(
rep(NA,Window-1),
fCast))
##
return(newData)
}
##
> NewData <- rolling.forecast()
> head(NewData,10)
Date WIG r Forecast
1 2014-01-02 49189.40 -5.693039e-03 NA
2 2014-01-03 51416.14 6.839136e-03 NA
3 2014-01-04 52626.66 6.647824e-03 NA
4 2014-01-05 47481.45 1.682364e-03 NA
5 2014-01-06 51643.69 3.446419e-05 NA
6 2014-01-07 51759.08 -2.277344e-03 NA
7 2014-01-08 50137.89 -1.832620e-03 NA
8 2014-01-09 50180.05 3.241433e-03 NA
9 2014-01-10 50153.32 1.035135e-02 NA
10 2014-01-11 49664.94 -7.669921e-04 0.003737219
> tail(NewData)
Date WIG r Forecast
61 2014-03-03 51984.88 -0.003157046 0.255080969
62 2014-03-04 54823.49 -0.007566441 0.011048830
63 2014-03-05 50947.86 -0.003180499 0.012665863
64 2014-03-06 49995.55 0.001131508 0.002204160
65 2014-03-07 50988.59 0.005068452 0.047949976
66 2014-03-08 53665.63 0.001263751 0.001458638
当你这样做时,你当然只能生成N - Window + 1
个新值;其中N
是数据中观察的数量,Window
是数据滚动窗口的跨度。由于我使用的函数rollapplyr
的默认align
值为right
(改编自包rollapply
中更通用的函数zoo
),因此第一个Window-1 = 9
观察结果设为NA
。