Aquí hay un ejemplo sobre cómo calcular el riesgo de una cartera utilizando cópulas paramétricas bivariadas y simulación de Monte Carlo. Se realizara la estimación de los parámetros de la cópula, luego ajustaremos las distribuciones marginales y finalmente calcularemos el valor en riesgo (VaR) y el valor de cola en riesgo (TVaR).
Primero, llamamos las librerias previamente instaladas
library(copula)
library(fCopulae)
library(QRM)
library(MASS)
Ahora hacemos la lectura de los datos de nuestra base de datps, tomando comformada por acciones a las cuales les sacaremos los Log-returns \(Ln(x_{i+1})-Ln(x_{i})\)
accions<-read.table("BaseDeDatos.csv", header=TRUE, sep=";")
val.ln <- cbind(accions[2],accions[3])
val.ln<- as.matrix(val.ln)
n<-nrow(val.ln)
head(val.ln) #Comprobamos que los datos están leídos correctamente
## NVS PFE
## [1,] -0.014308670 0.017236303
## [2,] -0.011474711 0.006937902
## [3,] 0.005250416 0.003764120
## [4,] -0.017268078 0.008728235
## [5,] -0.004312564 -0.004354595
## [6,] 0.003492556 -0.001872075
Hacemos las transformación de las variables originales a variables uniformes usando la función de distribución empírica corregida \(\frac{n}{n+1}*F_n\)
Udata <- pobs(val.ln)
Ajustamos una distribución Gaussiana
mod.GAUSS1 <- fitdistr(val.ln[,1], "normal")
mod.GAUSS1
## mean sd
## 0.0005685203 0.0108949358
## (0.0003970335) (0.0002807451)
AIC(mod.GAUSS1) #Valor del AIC (Criterio de Informacion de Akaike)
## [1] -4665.381
BIC(mod.GAUSS1) #Valor del BIC (Criterio Bayesiano de Schwarz)
## [1] -4656.133
mod.GAUSS2 <- fitdistr(val.ln[,2], "normal")
mod.GAUSS2
## mean sd
## 0.0008792612 0.0116116502
## (0.0004231521) (0.0002992137)
AIC(mod.GAUSS2) #Valor del AIC
## [1] -4569.433
BIC(mod.GAUSS2) #Valor del BIC
## [1] -4560.184
Ajustamos una distribución t-Student.
mod.t1 <- fitdistr(val.ln[,1], "t")
mod.t1
## m s df
## 0.0008312963 0.0081162148 4.3960892603
## (0.0003469035) (0.0003498206) (0.7078218858)
AIC(mod.t1) #Valor del AIC
## [1] -4751.7
BIC(mod.t1) #Valor del BIC
## [1] -4737.828
mod.t2 <- fitdistr(val.ln[,2], "t")
mod.t2
## m s df
## 0.0008340912 0.0084233478 4.0110346614
## (0.0003639518) (0.0003850297) (0.6365513093)
AIC(mod.t2) #Valor del AIC
## [1] -4653.185
BIC(mod.t2) #Valor del BIC
## [1] -4639.313
Estimamos el riesgo mediante Simulación de Monte Carlo con cada cópula y cada marginal (se pueden mezclar las marginales, es decir, se podrían utilizar distintas distribuciones en función del mejor ajuste)
set.seed(123) # Fijo una semilla
r<-100000 # Número total de valores a simular
norm.cop_est <- normalCopula(0.50688, dim = 2, dispstr = "un") #Se usan los valores de rho.1 que he estimado en NormCopEst a través de fit.copula
Sim_val.ln_normC<-rCopula(r,norm.cop_est)# Valores simulados
t.cop_est <- tCopula(0.50164, dim = 2, dispstr = "un", df=5.47304)
Sim_val.ln_tC<-rCopula(r,t.cop_est) # Valores simulados
gumb.cop_est<- gumbelCopula(1.44915, dim =2)
Sim_val.ln_gumbelcopula <- rCopula(r, gumb.cop_est)
clay.cop_est<- claytonCopula(0.8450, dim = 2)
Sim_val.ln_clayC<-rCopula(r,clay.cop_est)# Valores simulados
frank.cop_est<- frankCopula(param = 3.3007 , dim = 2)
Sim_val.ln_frankC<-rCopula(r,frank.cop_est)# Valores simulados
alfa<-c(0.99, 0.995,0.999) # Damos 3 valores para probar como alpha
w <- cbind(1,1) #Pesos de cada riesgo
sim.val.ln1 <- qnorm(Sim_val.ln_normC[,1], mean=mod.GAUSS1$estimate[[1]], sd=mod.GAUSS1$estimate[[2]])
sim.val.ln2 <- qnorm(Sim_val.ln_normC[,2], mean=mod.GAUSS2$estimate[[1]], sd=mod.GAUSS2$estimate[[2]])
MC.data<-cbind(sim.val.ln1, sim.val.ln2)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.04414621 0.04884395 0.05886217
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.05072984
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.05514836
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.06490634
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.05072984 0.05514836 0.06490634
sim.val.ln1t <- qst(Sim_val.ln_normC[,1], mu=mod.t1$estimate[[1]], sd=mod.t1$estimate[[2]],mod.t1$estimate[[3]])
sim.val.ln2t <- qst(Sim_val.ln_normC[,2], mu=mod.t2$estimate[[1]], sd=mod.t2$estimate[[2]],mod.t2$estimate[[3]])
MC.data<-cbind(sim.val.ln1t, sim.val.ln2t)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.05016398 0.06050179 0.09014518
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.06751419
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.08046573
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.1208008
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.06751419 0.08046573 0.1208008
sim.val.ln1 <- qnorm(Sim_val.ln_tC[,1], mean=mod.GAUSS1$estimate[[1]], sd=mod.GAUSS1$estimate[[2]])
sim.val.ln2 <- qnorm(Sim_val.ln_tC[,2], mean=mod.GAUSS2$estimate[[1]], sd=mod.GAUSS2$estimate[[2]])
MC.data<-cbind(sim.val.ln1, sim.val.ln2)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.04473738 0.05049294 0.06287629
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.05250196
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.0576802
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.06952463
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.05250196 0.0576802 0.06952463
sim.val.ln1t <- qst(Sim_val.ln_tC[,1], mu=mod.t1$estimate[[1]], sd=mod.t1$estimate[[2]],mod.t1$estimate[[3]])
sim.val.ln2t <- qst(Sim_val.ln_tC[,2], mu=mod.t2$estimate[[1]], sd=mod.t2$estimate[[2]],mod.t2$estimate[[3]])
MC.data<-cbind(sim.val.ln1t, sim.val.ln2t)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.05004803 0.06195684 0.09580875
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.0699718
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.0845824
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.1313577
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.0699718 0.0845824 0.1313577
sim.val.ln1 <- qnorm(Sim_val.ln_gumbelcopula[,1], mean=mod.GAUSS1$estimate[[1]], sd=mod.GAUSS1$estimate[[2]])
sim.val.ln2 <- qnorm(Sim_val.ln_gumbelcopula[,2], mean=mod.GAUSS2$estimate[[1]], sd=mod.GAUSS2$estimate[[2]])
MC.data<-cbind(sim.val.ln1, sim.val.ln2)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.04122416 0.04551868 0.05430120
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.04715983
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.05117159
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.059656
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.04715983 0.05117159 0.059656
sim.val.ln1t <- qst(Sim_val.ln_gumbelcopula[,1], mu=mod.t1$estimate[[1]], sd=mod.t1$estimate[[2]],mod.t1$estimate[[3]])
sim.val.ln2t <- qst(Sim_val.ln_gumbelcopula[,2], mu=mod.t2$estimate[[1]], sd=mod.t2$estimate[[2]],mod.t2$estimate[[3]])
MC.data<-cbind(sim.val.ln1t, sim.val.ln2t)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.04627295 0.05582171 0.08002345
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.06168055
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.07329557
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.1104726
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.06168055 0.07329557 0.1104726
sim.val.ln1 <- qnorm(Sim_val.ln_clayC[,1], mean=mod.GAUSS1$estimate[[1]], sd=mod.GAUSS1$estimate[[2]])
sim.val.ln2 <- qnorm(Sim_val.ln_clayC[,2], mean=mod.GAUSS2$estimate[[1]], sd=mod.GAUSS2$estimate[[2]])
MC.data<-cbind(sim.val.ln1, sim.val.ln2)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.04799146 0.05377472 0.06460586
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.05573633
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.06084581
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.07123873
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.05573633 0.06084581 0.07123873
sim.val.ln1t <- qst(Sim_val.ln_clayC[,1], mu=mod.t1$estimate[[1]], sd=mod.t1$estimate[[2]],mod.t1$estimate[[3]])
sim.val.ln2t <- qst(Sim_val.ln_clayC[,2], mu=mod.t2$estimate[[1]], sd=mod.t2$estimate[[2]],mod.t2$estimate[[3]])
MC.data<-cbind(sim.val.ln1t, sim.val.ln2t)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.05446083 0.06683789 0.10090362
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.07537338
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.0908916
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.1363624
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.07537338 0.0908916 0.1363624
sim.val.ln1 <- qnorm(Sim_val.ln_frankC[,1], mean=mod.GAUSS1$estimate[[1]], sd=mod.GAUSS1$estimate[[2]])
sim.val.ln2 <- qnorm(Sim_val.ln_frankC[,2], mean=mod.GAUSS2$estimate[[1]], sd=mod.GAUSS2$estimate[[2]])
MC.data<-cbind(sim.val.ln1, sim.val.ln2)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.04079585 0.04476675 0.05291203
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.04617799
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.04979459
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.05711178
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.04617799 0.04979459 0.05711178
sim.val.ln1t <- qst(Sim_val.ln_frankC[,1], mu=mod.t1$estimate[[1]], sd=mod.t1$estimate[[2]],mod.t1$estimate[[3]])
sim.val.ln2t <- qst(Sim_val.ln_frankC[,2], mu=mod.t2$estimate[[1]], sd=mod.t2$estimate[[2]],mod.t2$estimate[[3]])
MC.data<-cbind(sim.val.ln1t, sim.val.ln2t)
MC.Lsim <- -(MC.data%*%t(w))
quantile(MC.Lsim, alfa)
## 99% 99.5% 99.9%
## 0.04598357 0.05431333 0.07521152
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])])
## [1] 0.0602449
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])])
## [1] 0.07100205
mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])])
## [1] 0.1080635
cbind(mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[1])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[2])]),mean(MC.Lsim[MC.Lsim > quantile(MC.Lsim, alfa[3])]))
## [,1] [,2] [,3]
## [1,] 0.0602449 0.07100205 0.1080635
Recordemos que el VaR es la perdida máxima que puede experimentar un portafolio en un horizonte temporal (horizonte de riesgo) con un cierto nivel de significancia (en nuestro caso propusimos 3 alphas). Por ende nos podríamos optar por el ajuste que nos proporcione el VaR que nos represente la menor perdida maxima que se prodría experimentar.