波动率预测与"对于" GARCH家族模型的循环

时间:2014-09-08 20:08:42

标签: r

我正在使用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 ...

如果需要修改或添加任何内容,请告诉我,我很乐意这样做。请提前感谢。

1 个答案:

答案 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