我的目的是使用扩展窗口中的数据使用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
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。
你能帮我找错吗?谢谢。