I have no idea what happened to the formatting, looked fine to me when I typed 
it in Outlook.
Here's the revised version, with amended code so that it is minimally 
reproducible (for this purpose, I will only use the first 25 companies, 100 
simulations for 10 trading days).
The revised code should take around 5 minutes,


Again, heres the code summary:
1. Fit GARCH models to each series.
2. Extract standardized returns.
3. Transform standardized returns to uniform marginals using the parametric IFM 
method by Joe.
4. Fit vine copulas.
5. Generate 100 1-day ahead forecasts from the vine copulas.
6. Reverse transform the simulated values.
7. Use these transformed forecasts in ugarchsim (using custom.dist)
8. Extract forecasted mu and sigma.
9. Calculate 95% and 99% VaR.

The full code:
#Load data and define variablesreturns <- read.zoo("E:/Dropbox/my 
own/Programming/R/returns.csv", header=TRUE, sep=",", format="%d-%m-%y")
model<-ugarchspec(variance.model=list(model="sGARCH",garchOrder=c(1,1)),mean.model=list(armaOrder=c(1,0),include.mean=FALSE),distribution.model="ged")times
 <- as.data.frame(time(returns_crisis))windows <- matrix(0, 20, 250)familyset 
<- c(1:5, 7, 10, 13, 14, 17, 20)sim <- array(0, dim = c(100, 20))residuals2 <- 
array(0, dim = c(100, 20))rvine_fitted <- array(0, dim = 
c(10,100,20))rvine_sigma <- array(0, dim = c(10,100,20))VaR01 = VaR05 = 
array(0, dim = c(10,100,20))
#Main calculation
for(i in 1:10){  print(i)  windows <- window(returns_crisis[,1:20], 
start=times[376-250-24+i,1], end=times[376-25+i,1])     # Step 1  fit <- 
lapply(windows, ugarchfit, spec=model, solver="hybrid")  print("rugarch fitting 
done")
  residuals <- sapply(fit, residuals, standardize=TRUE)  # Step 2       shape 
<- sapply(fit, coef)  shape <- shape[5,]
  UniformResiduals <- pged(residuals, nu = shape)     # Step 3  
if(any(UniformResiduals > 0.99999))  {    ix = which(UniformResiduals > 
0.99999)   UniformResiduals [ix] = 0.99999  }  if(any(UniformResiduals < 
.Machine$double.eps))  {    ix = which(UniformResiduals < 
(1.5*.Machine$double.eps))    UniformResiduals [ix] = .Machine$double.eps  }  
rvine <- RVineStructureSelect(UniformResiduals, indeptest=TRUE, 
familyset=familyset)   # Step 4  print(paste(i,"RVine fitting done"))  for(j in 
1:100)  {  sim[j,] <- RVineSim(1, rvine)      # Step 5  }  print(paste(i,"RVine 
simulation done"))  for(k in 1:20)  {  residuals2[,] <- qged(sim[,], nu = 
shape[k])         # Step 6
  residuals_temp <- residuals2[,k]  rvine_sim <- ugarchsim(fit[[k]], n.sim=1, 
m.sim=100, custom.dist = list(name=NA, distfit=residuals_temp))  # Step 7
  rvine_fitted[i,,k] <- fitted(rvine_sim)  # Step 8  rvine_sigma[i,,k] <- 
sigma(rvine_sim)    if (i==10)    {    for(j in 1:100)    {    VaR01[,j,k] <- 
rvine_fitted[,j,k] + rvine_sigma[,j,k] * qdist('ged', 0.01, mu=0, sigma=1, 
shape = shape[k])  # Step 9    VaR05[,j,k] <- rvine_fitted[,j,k] + 
rvine_sigma[,j,k] * qdist('ged', 0.05, mu=0, sigma=1, shape = shape[k])    }    
}else {}  }  print(paste(i, "rugarch forecast done"))}

#Cleanupremove(i, j, k, ix, familyset, model, sim, rvine_sim, residuals, 
residuals_temp)

Hope this time everything is formatted correctly!
After running the code, I export VaR01 and VaR05 to Excel, and notice that 
there's usually quite a few positive values.
This seems to happen because sometimes the sigma is too low compare to the 
(positive) forecast, and therefore the VaR stays in the positive.
My guess is that either there's a mistake in my code at step 3 (maybe the wrong 
shape is used?).Or more likely there's a mistake at step 6/7 (wrong 
transformation or transformed values are not inserted correctly into ugarchsim).
> Date: Thu, 21 Aug 2014 18:21:49 +0100
> From: [email protected]
> To: [email protected]; [email protected]
> Subject: Re: [R-SIG-Finance] rugarch + VineCopula for value at risk
> 
> Ole,
> 
> The email you've sent is really badly formatted and all over the place.
> 
> 1. Try to send a well structured text-only email (with no special
> characters).
> 2. Make an effort to send a minimally reproducible example.
> Telling us that your problem took 8 hours to run is not the way to go.
> Take a small subsample of your data which generates the behavior you
> want to highlight (try to find one that does), and use that so that we
> can investigate with minimal fuss.
> 
> -Alexios
> 
> On 21/08/2014 17:50, Ole Bueker wrote:
> > Anyway, here�s my code so far:# Load Data and define variables
> > returns <-  read.zoo("E:/Dropbox/my own/Programming/R/returns.csv", 
> > header=TRUE, sep=",", 
> > format="%d-%m-%y")model<-ugarchspec(variance.model=list(model="sGARCH",garchOrder=c(1,1)),mean.model=list(armaOrder=c(1,0),include.mean=FALSE),distribution.model="ged")times
> >  <- as.data.frame(time(returns))windows <- matrix(0, 112, 250)familyset <- 
> > c(1:5, 7, 10, 13, 14, 17, 20)                    # The vine copulas to be 
> > testedsim <- array(0, dim = c(1000, 112))residuals2 <- array(0, dim = 
> > c(1000, 112))rvine_fitted <- array(0, dim = c(25,1000,112))rvine_sigma <- 
> > array(0, dim = c(25,1000,112))VaR01 = VaR05 = array(0, dim = c(25,1000,112))
> > 
> > #Main calculation
> > for(i in 1:25){  print(i)  windows <- window(returns_crisis, 
> > start=times[376-250-24+i,1], end=times[376-25+i,1])            #Define the 
> > moving window  fit <- lapply(windows, ugarchfit, spec=model, 
> > solver="hybrid")                                                            
> >     #Fit the garch models  print("rugarch fitting done")  residuals <- 
> > sapply(fit, residuals, standardize=TRUE)                                    
> >                                                  #Extract residuals & shape 
> > parameters  shape <- sapply(fit, coef)  shape <- shape[5,]  
> > UniformResiduals <- pged(residuals, nu = shape)                             
> >                                                               #Transform 
> > residuals into uniform marginals  if(any(UniformResiduals > 0.99999))  {    
> > ix = which(UniformResiduals > 0.99999)   UniformResiduals [ix] = 0.99999  } 
> >  if(any(UniformResiduals < .Machine$double.eps))  {    ix = 
> > which(UniformResiduals < (1.5*.Machine$double.eps))    UniformResiduals 
> > [ix] =
>  .Machine$double.eps  }  rvine <- RVineStructureSelect(UniformResiduals, 
> indeptest=TRUE, familyset=familyset)             #Fit the Vine copulas  
> print(paste(i,"RVine fitting done"))  for(j in 1:1000)                        
>                                                                               
>                                                            #Simulate 1000 
> 1-day ahead using VineCopula  {  sim[j,] <- RVineSim(1, rvine)                
>                                                                               
>                                        # 1000 x 112 matrix of forecasts  
> }print(paste(i,"RVine simulation done"))                 for(k in 1:112)      
>                                                                               
>                                                                 #Next: 
> ugarchsimulation for all 112 companies                {                
> residuals2[,] <- qged(sim[,], nu = shape[k])                                  
>                   
>                                      # 1000 x 112 matrix of standardized 
> residuals                residuals_temp <- residuals2[,k]                     
>                                                                               
>             # 1000 x 1 vector of standardized residuals for individual 
> company                rvine_sim <- ugarchsim(fit[[k]], n.sim=1, m.sim=1000, 
> custom.dist = list(name=NA, distfit=residuals_temp))  #1000 simulations using 
> the standardized residuals from Vine copula models for ugarchfit              
>   rvine_fitted[i,,k] <- fitted(rvine_sim)                                     
>                                                                 #Extract 
> forecasted values - 25 x 1000 x 112               rvine_sigma[i,,k] <- 
> sigma(rvine_sim)                                                              
>                                        #Extract forecasted sigmas - 25 x 1000 
> x 112               for(j in 1:1000)                                          
>          
>                                                                               
>                                   #Next: Value at risk              {         
>        VaR01[,j,k] <- rvine_fitted[,j,k] + rvine_sigma[,j,k] * qdist('ged', 
> 0.01, mu=0, sigma=1, shape = shape[k]) #Value at risk for 99% quantile        
>         VaR05[,j,k] <- rvine_fitted[,j,k] + rvine_sigma[,j,k] * qdist('ged', 
> 0.05, mu=0, sigma=1, shape = shape[k]) #Value at risk for 95% quantile        
>        }                 }}remove(i, j, k)                                    
>                                                                               
>                                                  #Cleanupremove(windows, fit, 
> residuals, shape, residuals2, residuals_temp, rvine, sim, rvine_sim)          
>   #Cleanup   Hope I didn�t make any mistakes in my approach, but it seems 
> like this is the �standard� copula + rugarch approach � if anyone is familiar 
> with this, I am open to suggestions on how to speed up the si
> mulations.
> > So far, so good � the problem I am facing now:
> > Some (only a few) of my value at risk values are positive..I have manually 
> > checked and it seems like the fitted value is much larger than the sigma, 
> > so Value at Risk is positive � which doesn�t really make any economic sense 
> > to me.
> > Here�s a dropbox link to the returns.csv, in case anyone is interested in 
> > running my code: https://www.dropbox.com/s/69i5959f3h4kweb/returns.csv
> > 
> > Best Regards,
> > Ole                                           
> >     [[alternative HTML version deleted]]

                                          
        [[alternative HTML version deleted]]

_______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-sig-finance
-- Subscriber-posting only. If you want to post, subscribe first.
-- Also note that this is not the r-help list where general R questions should 
go.

Reply via email to