我的意图是使用来自扩展窗口的数据使用 GARCH(1,1) 生成预测。每天都有一个新的回报进入数据集,我将重做 GARCH 拟合和预测。函数 myFit 执行此操作,但现在我需要将一个每天都在增加的返回窗口作为参数传递。两种方法是 apply.fromstart() 和 rollapplyr()。
在下面的代码中,我决定在收集到至少 100 个回报后开始滚动计算,因为这是 ugarchforecast() 执行预测所需的最小数据量。
最后两行调用 myFit ,从 100 的窗口开始,它们将函数应用于扩展窗口。如果设置如下,我期望 apply.fromstart() 和 rollapplyr() 都提供相同的数据。毕竟他们将相同的功能(myFit)应用于相同的数据。不幸的是,只有第一个值是相同的,然后预测不再对齐。
library(quantmod)
library(PerformanceAnalytics)
library(rugarch)
source('~/Dropbox/myFit.R')
symbolLst <- c("^GSPC","^VIX")
startDate = as.Date("2004-01-01")
endDate = as.Date("2004-06-01")
myForHorizon = 22
myLag = 10
myData <- new.env()
getSymbols(symbolLst, env = myData, src = "yahoo", from = startDate, to = endDate)
args = eapply(myData,
function(x){OHLC(x)})
my_data = do.call(cbind,
args,
envir = myData)
my_data$Return <- ClCl(myData$GSPC)
my_data$Return[is.na(my_data$Return)] <- 0
spec = ugarchspec(
variance.model=list(garchOrder=c(1,1)))
forecastVec1 <- apply.fromstart(my_data$Return, FUN=myFit, gap = 100)
forecastVec2 <- rollapplyr(my_data$Return, width = seq(100, 104, 1), FUN=myFit)
这是我的健身
myFit <- function(myVector)
{
#library(rugarch)
myVec <- myVector
tryCatch(
{
fit = ugarchfit(spec=spec, data=myVec)
forecast = ugarchforecast(fit, n.ahead=myForHorizon)
myForecast = sigma(forecast)[myForHorizon,] * sqrt(252) * 100
print(myForecast)
return(myForecast)
},
warning = function(warn) FALSE,
error = function(err) FALSE
)
}
这些是 forecastVec1 的元素(因此使用 apply.fromstart() 时的预测):
[1] 12.35142
[1] 12.1961
[1] 12.45849
[1] 11.95578
[1] 12.08832
这些是 forecastVec2 的元素(使用 rollapplyr()):
[1] 12.35142
[1] 12.15684
[1] 12.10457
[1] 11.89805
[1] 11.94493
如前所述,只有第一个元素是相同的。我在 rollapplyr() 中应用增加窗口的方式可能是错误的?我正在传递一个宽度向量,所以我期望在每次迭代中,函数将使用一个窗口 100,然后是 101,然后是 102...103,最后是 104。这应该与 apply.fromstart() 后面的逻辑相同因为我设置了 gap=100 并且每次迭代都应该将窗口增加 1。
你能帮我找出错误吗?谢谢。