GARCH 预测扩展窗口:rollapplyr() 和 apply.fromstart()

问题描述 投票:0回答:1

我的目的是使用扩展窗口中的数据使用 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。

你能帮我找出错误吗?谢谢。

r quantmod performanceanalytics volatility rollapply
1个回答
0
投票

我最近回测了我的 GJR-GARCH 代码以进行分配,也许您可以从我使用的代码中获得洞察。 我以参数方式计算了 VaR,并且对于超出某个初始估计窗口的每个观察值,我使用 for 循环重新估计了我的模型。它肯定效率不高,但也许可以提供帮助。

初始窗口= 250

VaR_参数 <- numeric(length = length(log_returns_demean[,1])-initial_window) hits <- numeric(length = length(log_returns_demean[,1])-initial_window) weights <- matrix(c(1/6,1/6,1/6,1/6,1/6,1/6), nrow = 1)

for (i in (initial_window + 1):length(log_returns_demean[,1])) {

t_GJR_GARCH_multifit_rolling <- multifit(multispec = t_GJR_GARCH_uspec, data = xts(f[1:(i-1),1:nf], order.by=index(log_returns_demean[1:(i-1)])), solver = 'hybrid')

sigma_滚动<- sigma(t_GJR_GARCH_multifit_rolling) htMat_rolling <- xts(sigma_rolling^2, order.by = index(log_returns_demean[1:(i-1)])) errors_rolling <- log_returns_demean[1:(i-1),1:6] - f[1:(i-1), 1:nf] %*% t(PCA$rotation[,1:nf]) omega_rolling <- diag(colMeans(errors_rolling^2))

ht_rolling <- PCA$rotation[, 1:nf] %% diag(as.numeric(htMat_rolling[nrow(htMat_rolling),1:nf ])) %% t(PCA$rotation[, 1:nf]) + omega_rolling VaR_parametric[i-initial_window] <- -sqrt(weights %% ht_rolling %% t(权重)) * qnorm(0.05)

点击[i-initial_window] <- ifelse(log_returns_demean[i,7] < -VaR_parametric[i-initial_window], 1, 0)

}

您可以自行尝试或在此基础上进行构建

© www.soinside.com 2019 - 2024. All rights reserved.