我是R的新手(现在已经玩了好几天了)如果这不是提出这样问题的合适地方,我很抱歉,但不知道还有什么地方可以发布。
我在R中一直使用这个循环。事情是需要大约一天来运行整个事情。必须有一种方法可以提高效率和速度。
它基本上模拟了在570天的测试期间,9个变量的10'000相关的1天提前返回。
simList <- array(dim=c(570,9,10000)
presigma=matrix(tail(sigma(tmp),1),ncol=9)
prereturns=matrix(unlist(returns[T+i-1,]),ncol=9,nrow=1)
preresiduals=matrix(tail(residuals(tmp),1),ncol=9, nrow=1)
preR=last(rcor(tmp))[,,1]
diag(preR)=1
preQ=tmp@mfilter$Qt[[length(tmp@mfilter$Qt)]]
preZ=tail(tmp@mfilter$Z,1)
for (i in 1:570){
tmp=cgarchfilter(specx, returns[i:(T+i-1),], filter.control=list(n.old=T))
sim <- cgarchsim(fit, n.sim=1, m.sim=10000, startMethod="sample", preR=preR, preQ=preQ,
preZ=preZ, prereturns=prereturns, preresiduals=preresiduals, presigma=presigma,
cluster=NULL)
simx=t(sapply(sim@msim$simX, FUN=function(x) x[1,]))
simList[i,,] <- simx
}
我一直在阅读有关矢量化或使用apply
函数的一些内容,但我发现的大多数示例都应用于相当“简单”的循环,我无法理解如何应用相同的方法就我而言。
你知道如何提高速度吗?你会不同地编写代码框架?什么可以从代码中提取出来并在其外部运行?
编辑1:在lmo的评论之后,我已经提取了其定义在其外部的循环内保持相同的所有对象。虽然从视觉角度来看是一种改进,并且更容易阅读,但计算时间仍然保持不变。感谢任何帮助。谢谢。
编辑2:如果您想尝试整个代码,这里是一个最小的工作示例(我稍微修改了一些细节,例如测试范围的长度,因为这个数据集不是我的'我正在努力,但速度问题仍然存在。)为了使代码有效,下面的代码应该在之前上面运行(下面:第1部分;上面:第2部分)。使用的包是rugarch
和rmgarch
。数据集自动随这些包一起提供。
data(dji30retw)
returns = dji30retw[, 1:9, drop = FALSE]
spec=ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1),
submodel = NULL, external.regressors = NULL, variance.targeting = FALSE),
mean.model = list(armaOrder = c(0,0), include.mean = FALSE, archm = FALSE,
archpow = 1, arfima = FALSE, external.regressors = NULL, archex = FALSE),
distribution.model = "norm", start.pars = list(), fixed.pars = list())
multigarch = multispec(replicate(9, spec) )
spec <- cgarchspec(uspec=multigarch, VAR=FALSE, robust=FALSE, dccOrder=c(1,1),
asymmetric=TRUE, distribution.model=list(copula="mvt", method="ML", time.varying=TRUE, transformation="spd"))
fit <- cgarchfit(spec, returns, out.sample=570, spd.control=list(upper=0.9, lower=0.1, type="mle", kernel="normal"),
cluster=NULL, fit.control=list(eval.se=FALSE))
T=571
specx <- spec
for (i in 1:9) specx@umodel$fixed.pars[[i]]=as.list(fit@model$mpars[fit@model$midx[,i]==1,i])
setfixed(specx) <- as.list(fit@model$mpars[fit@model$midx[,10]==1,10])