を計算するためにMSGarchパッケージを使用する場合は、ヴァールを生成するために使用される並列ループのためのコードであり、通常は正常に動作します:警告さてここで、多段階のVaR
cl <- makeCluster(5) #not to overload your computer
registerDoSNOW(cl)
#parallel foreach loop
N=195
data_startpoint = 2
#VaR_matrix = matrix(0,20,max(N))
VaR_matrix_MS = matrix(0,20,max(N))
tempMatrix = matrix(0,20,max(N))
############################################################
#VaR_matrix <- foreach(i = 1:N,.combine = "cbind") %dopar% {
VaR_matrix_MS <- foreach(i = 1:N,.combine = "cbind") %dopar% {
#tempMatrix[,i] = multi_day_VaR(10067+i-1,11567+i-1)
tempMatrix[,i] = multi_day_VaR(data_startpoint+i-1,data_startpoint+1500+i-2)
tempMatrix[,i]
#Equivalent to finalMatrix = cbind(finalMatrix, tempMatrix)
}
#stop cluster
stopCluster(cl)
end.time <- Sys.time()
time.taken <- end.time - start.time
time.taken
そして、ここでは、内部で呼び出される関数のコードですループとそのも/ MSGARCH、aは、事前に生成されたデータ使用kebluパッケージのいくつかの機能を使用して:
multi_day_VaR <- function(est_begin, est_end) {
library(MSGARCH)
data_est = All_dataset[c(est_begin:est_end),2]#6years 1500, AIC: 3728.115
data_est = as.numeric(as.character(data_est))
###################################################################################
#data_est = All_dataset[c(2:1501),2]#6years 1500, AIC: 3728.115
###################################################################################
## Example 1: A single-regime model
#spec <- CreateSpec(variance.spec = list(model = c("sGARCH")),
# distribution.spec = list(distribution = c("norm")))
#spec <- CreateSpec(variance.spec = list(model = c("sGARCH")),
# distribution.spec = list(distribution = c("sstd")))
## Example 2: A MS-GARCH model
spec <- CreateSpec(variance.spec = list(model = c("gjrGARCH")),
distribution.spec = list(distribution = c("sstd")),
switch.spec = list(do.mix = FALSE, K = 2))
#set.seed(123)
#out.mle = MSGARCH:: FitML(spec = spec, data = data_est)
#ctr.bay = list(n.burn = 5000L, n.mcmc = 10000L, n.thin = 10L, par0 = out.mle$par)
ctr.bay = list(n.burn = 5000L, n.mcmc = 10000L, n.thin = 10L)
set.seed(123)
out.bay = MSGARCH::FitMCMC(spec = spec, data = data_est, ctr = ctr.bay)
#-----------------------------------------------------------------------------------
#compute the one-step ahead Value-at-Risk and Expected-shortfall out-of-sample
#Risk(object = out.bay, alpha = c(0.01, 0.05), do.es = FALSE, do.its = FALSE, n.ahead = 250)
#Risk(object = out.mle, alpha = c(0.01, 0.05), do.es = FALSE, do.its = FALSE, n.ahead = 20)
#------------------------------------------------------------------------------------
set.seed(123)
sim = Sim(object = out.bay, n.ahead = 250, n.sim = 1)
#sim1 = Sim(object = out.mle, n.ahead = 20L, n.sim = 1000L, par = out.mle$par, n.burnin = 500L)
#----------------------------------------------------------------------------------
#MARGIN: for a matrix 1 indicates rows, 2 indicates columns, c(1, 2) indicates rows and columns.
ret = t(apply(sim$draw, MARGIN = 2,FUN = cumsum))
VaR = matrix(0,20,1)#1,5,10,20 days
VaR[1,1] = quantile(ret[,1],probs = c(0.01)) # daily
VaR[2,1] = quantile(ret[,5],probs = c(0.01)) # weekly
VaR[3,1] = quantile(ret[,20],probs = c(0.01)) # monthly
VaR[4,1] = quantile(ret[,60],probs = c(0.01)) # quarterly
VaR[5,1] = quantile(ret[,250],probs = c(0.01)) # yearly
VaR[6,1] = quantile(ret[,1],probs = c(0.05)) # daily
VaR[7,1] = quantile(ret[,5],probs = c(0.05)) # weekly
VaR[8,1] = quantile(ret[,20],probs = c(0.05)) # monthly
VaR[9,1] = quantile(ret[,60],probs = c(0.05)) # quarterly
VaR[10,1] = quantile(ret[,250],probs = c(0.05)) # yearly
#for day ahead return
VaR[11,1] = quantile(sim$draw[1,],probs = c(0.01))
VaR[12,1] = quantile(sim$draw[5,],probs = c(0.01))
VaR[13,1] = quantile(sim$draw[20,],probs = c(0.01))
VaR[14,1] = quantile(sim$draw[60,],probs = c(0.01))
VaR[15,1] = quantile(sim$draw[250,],probs = c(0.01))
VaR[16,1] = quantile(sim$draw[1,],probs = c(0.05))
VaR[17,1] = quantile(sim$draw[5,],probs = c(0.05))
VaR[18,1] = quantile(sim$draw[20,],probs = c(0.05))
VaR[19,1] = quantile(sim$draw[60,],probs = c(0.05))
VaR[20,1] = quantile(sim$draw[250,],probs = c(0.05))
VaR
#print(VaR)
#set.seed(123)
#risk.mle = MSGARCH::risk(out.bay, level = c(0.95), ES = FALSE,
# do.its = FALSE)
#risk.mle$VaR
}
ループを実行している場合、それは、このエラーが表示され、そこにあるときに、これが唯一起こるように、私はその理由を把握カントをループの反復回数が多い:
{: タスク190が失敗しました - "行列乗算:特異行列の逆数。