##################################################################### ##################################################################### ## ## ## R CODE FOR GLUEVAR RISK MEASURES APPLICATIONS ## ## JAUME BELLES SAMPERA - MONTSERRAT GUILLÉN - MIGUEL SANTOLINO ## ## RISKCENTER - UNIVERSITAT DE BARCELONA ## ## http://www.ub.edu/riskcenter ## ## DECEMBER 2014 ## ## Version 1.1 ## ## ## ##################################################################### ##################################################################### ################## LOADING PACKAGES library('Matrix') ################## EMPIRICAL PROBABILITY FUNCTIONS ################## Empirical Cumulative Distribution Function CDFemp<- function(data) { df<-dfemp(data) cdf<-matrix(0,ncol=ncol(df), nrow=nrow(df)) cdf[1,1]<-df[1,1] cdf[1,2]<-df[1,2] for(i in 2:nrow(df)) { cdf[i,1]<-df[i,1] cdf[i,2]<-df[i,2]+cdf[i-1,2] } return(cdf) } ################## Empirical Cumulative Survival Function CSFemp<- function(data) { cdf<-CDFemp(data) csf<-matrix(0,ncol=ncol(cdf), nrow=nrow(cdf)) for(i in 1:nrow(cdf)) { csf[i,1]<-cdf[i,1] csf[i,2]<-1-cdf[i,2] } return(csf) } ################## Empirical density function dfemp<-function(data) { ###### Controlling N/A data_dep<-0 for(i in 1:length(data)) { if(is.na(data[i]) != TRUE) data_dep<-c(data_dep, data[i]) } data_dep<-data_dep[-1] ###### n<-length(data_dep) inivec<-cbind(sort(data_dep),1/n) counter<-1 aux<-inivec[1] for(i in 1:n) { if(inivec[i]!=aux) { counter<-counter+1 aux<-inivec[i] } } dens<-matrix(0,ncol=2,nrow=n) for(i in 1:n) { auxdens<-inivec[i] dens[i,1]<-auxdens dens[i,2]<-sum((inivec[,2]) [inivec[,1] == auxdens]) } densres<-matrix(0,ncol=2,nrow=counter) aux<-inivec[1] auxcont<-1 for(i in 1:n) { if(inivec[i]!=aux) { densres[auxcont,1]<-aux densres[auxcont,2]<-dens[i-1,2] auxcont<-auxcont+1 aux<-inivec[i] } } densres[counter,1]<-dens[n,1] densres[counter,2]<-dens[n,2] return(densres) } ################# GLUEVAR PARAMETER MATRICES gluevar_H<-function(alpha, beta) { H<-matrix(c(1,1,(1-beta)/(1-alpha),1), ncol=2, nrow=2) return(H) } gluevar_Hinv<-function(alpha, beta) { Hinv<-matrix(c((1-alpha)/(1-beta), (alpha-1)/(beta-alpha), (beta-1)/(beta-alpha), (1-alpha)/(beta-alpha)), ncol=2, nrow=2) return(Hinv) } gluevar_T<-function(alpha, beta) { T<-matrix(c(1-beta,0,beta-1,1-alpha), ncol=2, nrow=2) return(T) } gluevar_Tinv<-function(alpha, beta) { Tinv<-matrix(c(1/(1-beta), 0, 1/(1-alpha), 1/(1-alpha)), ncol=2, nrow=2) return(Tinv) } gluevar_M<-function(alpha, beta) { M<-matrix(c(1-beta,1-beta,0,beta-alpha), ncol=2, nrow=2) return(M) } gluevar_Minv<-function(alpha, beta) { Minv<-matrix(c(1/(1-beta),-1/(beta-alpha),0,1/(beta-alpha)), ncol=2, nrow=2) return(Minv) } gluevarmatrix<-function(alpha, beta) { H<-gluevar_H(alpha,beta) Hinv<-gluevar_Hinv(alpha,beta) T<-gluevar_T(alpha,beta) Tinv<-gluevar_Tinv(alpha,beta) M<-gluevar_M(alpha,beta) Minv<-gluevar_Minv(alpha,beta) print("-----------------------------------", quote=FALSE) print("-------- GLUEVAR PARAMETERS -------", quote=FALSE) print("-----------------------------------", quote=FALSE) print("", quote=FALSE) print("Weights to heights. Matrix H:", quote=FALSE) print(H, quote=FALSE) print("", quote=FALSE) print("Heights to weights. Matrix H inverse:", quote=FALSE) print(Hinv, quote=FALSE) print("", quote=FALSE) print("Slopes to weights. Matrix T:", quote=FALSE) print(T, quote=FALSE) print("", quote=FALSE) print("Weights to slopes. Matrix T inverse:", quote=FALSE) print(Tinv, quote=FALSE) print("", quote=FALSE) print("Slopes to heights. Matrix M:", quote=FALSE) print(M, quote=FALSE) print("", quote=FALSE) print("Heights to slopes. Matrix M inverse:", quote=FALSE) print(Minv, quote=FALSE) print("", quote=FALSE) print("-----------------------------------", quote=FALSE) print("-----------------------------------", quote=FALSE) } ################# EMPIRICAL RISK CALCULATIONS gluevar_emp_risk<-function(filename, header, obs, alpha, beta, w1, w2, w3) { datafile<-read.table(filename, sep=";", header=TRUE) risks<-length(header) data<-matrix(0, ncol=risks, nrow=obs) for(j in 1:risks) { for(i in 1:obs) data[i,j]<-datafile[i,j] } print("-----------------------------------", quote=FALSE) print("--- EMPIRICAL RISK CALCULATIONS ---", quote=FALSE) print("-----------------------------------", quote=FALSE) print("", quote=FALSE) print(paste("Alpha confidence level: ", alpha), quote=FALSE) print(paste("Beta confidence level: ", beta), quote=FALSE) print(paste("VaR alpha weight: ", round(w3,4)), quote=FALSE) print(paste("TVaR alpha weight: ", round(w2,4)), quote=FALSE) print(paste("TVaR beta weight: ", round(w1,4)), quote=FALSE) rnames<-c("VaR_alpha","TVaR_alpha","TVaR_beta","GlueVaR") taula<-matrix(0, ncol=risks, nrow=4, dimnames=list(rnames,header)) for(j in 1:risks) { distrib<-CDFemp(data[,j]) dens<-dfemp(data[,j]) nobs<-length(distrib[,1]) rank.alpha<-0 rank.beta<-0 ES.alpha<-0 ES.beta<-0 VaR.alpha<-0 VaR.beta<-0 TVaR.alpha<-0 TVaR.beta<-0 #VaR alpha rank.alpha<-min(which(distrib[,2]>=alpha)) VaR.alpha<-distrib[rank.alpha,1] taula[1,j]<-round(VaR.alpha,4) if(rank.alpha=beta)) VaR.beta<-distrib[rank.beta,1] if(rank.beta0) #### Type II Pareto distribution { VaR.alpha<- (sigma.est/k.est)*(1-(1-alpha)^k.est) TVaR.alpha<- (sigma.est/k.est)*(1-(1-alpha)^k.est) + (sigma.est/k.est)*(k.est*((1-alpha)^k.est)/(k.est+1)) TVaR.beta<- (sigma.est/k.est)*(1-(1-beta)^k.est) + (sigma.est/k.est)*(k.est*((1-beta)^k.est)/(k.est+1)) } else { if(round(k.est,4)>-1) #### Pareto distribution with finite TVaR { VaR.alpha<- (sigma.est/k.est)*(1-(1-alpha)^k.est) TVaR.alpha<- (sigma.est/k.est)*(1-(1-alpha)^k.est) + (sigma.est/k.est)*(k.est*((1-alpha)^k.est)/(k.est+1)) TVaR.beta<- (sigma.est/k.est)*(1-(1-beta)^k.est)+ (sigma.est/k.est)*(k.est*((1-beta)^k.est)/(k.est+1)) } else #### Pareto distribution with infinite TVaR { VaR.alpha<- (sigma.est/k.est)*(1-(1-alpha)^k.est) TVaR.alpha<- NA TVaR.beta<- NA } } } else #### Exponential distribution { VaR.alpha<- -sigma.est*log(1-alpha) TVaR.alpha<- sigma.est*(1-log(1-alpha)) TVaR.beta<- sigma.est*(1-log(1-beta)) } T1[1,i]<-round(k.est,4) T1[2,i]<-round(sigma.est,4) T2[1,i]<-round(VaR.alpha,4) T2[2,i]<-round(TVaR.alpha,4) T2[3,i]<-round(TVaR.beta,4) T2[4,i]<-round(w1*TVaR.beta+w2*TVaR.alpha+w3*VaR.alpha,4) } print("", quote=FALSE) print("---- Parameter estimates - GPD ----", quote=FALSE) print("", quote=FALSE) print(T1, quote=FALSE) print("", quote=FALSE) print("---- Risk estimation - GDP ----", quote=FALSE) print("", quote=FALSE) print(T2, quote=FALSE) print("", quote=FALSE) } #### Empirical VaR as Choquet Integral emp_VaR_asCI<-function(filename,obs,cols1,alpha) { datafile<-read.table(filename, sep=";", header=TRUE) data<-matrix(0, ncol=1, nrow=obs) data[,1]<-sort(datafile[,cols1]) dens<-dfemp(data[,1]) n<-length(dens[,1]) rm<-0 ## We first calculate g() for VaR_alpha gPA<-matrix(0,nrow=n+1,ncol=1) for(i in 1:n) { PA<-0 for(k in i:n) PA<-PA+dens[k,2] if(PA>=1-alpha){ gPA[i,1]<-1 } } #### Vector of weights to calculate DRM for(i in 1:n) rm<-rm+dens[i,1]*(gPA[i,]-gPA[i+1,]) return(rm) } #### Empirical TVaR as Choquet Integral emp_TVaR_asCI<-function(filename,obs,cols1,alpha) { datafile<-read.table(filename, sep=";", header=TRUE) data<-matrix(0, ncol=1, nrow=obs) data[,1]<-sort(datafile[,cols1]) dens<-dfemp(data[,1]) n<-length(dens[,1]) rm<-0 ## We first calculate g() for TVaR_alpha gPA<-matrix(0,nrow=n+1,ncol=1) for(i in 1:n) { PA<-0 for(k in i:n) PA<-PA+dens[k,2] if(PA>=1-alpha){ gPA[i,1]<-1 } else gPA[i,1]<-PA/(1-alpha) } #### Vector of weights to calculate DRM for(i in 1:n) rm<-rm+dens[i,1]*(gPA[i,]-gPA[i+1,]) return(rm) } ################################################################################ ################################################################################ ############ EXAMPLE: HOW TO USE THESE FUNCTIONS ############################### # Data management # Load selected data data <- read.csv2("IBEX.csv") data <- read.csv2("CAC.csv") data <- read.csv2("DAX.csv") val <- as.matrix(data[,2]) n <- nrow(val) val.ln <- -diff(log(val)) # Factor risk changes write.table(val.ln, file="data.csv", dec=".", sep=";") filenamed<-"data.csv" maxnumdata<-length(data[,1]) headtitle<-c("Index") alpha<-0.95 beta<-0.995 w1<-0.33333 w2<-0.33333 w3<-1-w1-w2 gluevarmatrix(alpha, beta) # Empirical GlueVaR calculation emprisk<-gluevar_emp_risk(filenamed, headtitle, maxnumdata, alpha, beta, w1, w2, w3)