2017-10-18 34 views
0

那麼這裏是用來產生無功並行循環的代碼,它正常工作正常:警告使用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 

這裏是叫裏面的函數代碼環和其也使用包keblu/MSGARCH的一些功能和使用預先生成的數據:

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失敗 - 「矩陣乘法:奇異矩陣的逆;建議使用solve()來代替「

回答

0

這可能是由於Rcpp中的自適應採樣器的新實現,我們最近推到了github版本。我們還沒有做過大規模測試,但是這個錯誤似乎來自協方差矩陣的校正,當我們在適應步驟中檢測到它不是半正定正數時,我們將負的特徵值修正爲一個小的正數,以重建一個半正定的正矩陣,但似乎它有時會失效。我們將盡力解決這個錯誤,謝謝。

同時,你能否在https://github.com/keblu/MSGARCH/issues上寫下一個問題,這樣我們就可以更容易的跟蹤bug。

另外,CRAN版本仍然使用自適應採樣器的R實現,因此您可以使用它。

謝謝。