EJEJMPLO

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

Cálculo de las pseudo observaciones

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)
  • Estimación de las marginales, donde dado el tipo de datos probaremos con la Normal y la t-Student:

Marginales Normales

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

Marginales t-Student

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)

  • Simulación de las U procedentes de la cópula estimada
set.seed(123) # Fijo una semilla

r<-100000 # Número total de valores a simular

Ajuste - Cópula de Gauss

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

Ajuste - Cópula t-Student

t.cop_est <- tCopula(0.50164, dim = 2, dispstr = "un", df=5.47304)

Sim_val.ln_tC<-rCopula(r,t.cop_est) # Valores simulados

Ajuste - Cópula Gumbel

gumb.cop_est<- gumbelCopula(1.44915, dim =2)    

Sim_val.ln_gumbelcopula <- rCopula(r, gumb.cop_est)

Ajuste - Cópula de Clayton

clay.cop_est<- claytonCopula(0.8450, dim = 2)

Sim_val.ln_clayC<-rCopula(r,clay.cop_est)# Valores simulados

Ajuste - Cópula de Frank

frank.cop_est<- frankCopula(param = 3.3007 , dim = 2)

Sim_val.ln_frankC<-rCopula(r,frank.cop_est)# Valores simulados
  • Simulación de los factores de riesgo y cálculo del riesgo
alfa<-c(0.99, 0.995,0.999) # Damos 3 valores para probar como alpha
w <- cbind(1,1) #Pesos de cada riesgo

COPULA GAUSSIANA

Marginales Normales

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)) 

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.04414621 0.04884395 0.05886217

TVaR

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

Marginales t-Student

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))

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.05016398 0.06050179 0.09014518

TVaR

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

COPULA t-STUDENT

Marginales Normales

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))

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.04473738 0.05049294 0.06287629

TVaR

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

Marginales t-Student

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))

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.05004803 0.06195684 0.09580875

TVaR

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

COPULA GUMBEL

Marginales Normales

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))

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.04122416 0.04551868 0.05430120

TVaR

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

Marginales t-Student

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))

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.04627295 0.05582171 0.08002345

TVaR

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

COPULA CLAYTON

Marginales Normales

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))

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.04799146 0.05377472 0.06460586

TVaR

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

Marginales t-Student

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))

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.05446083 0.06683789 0.10090362

TVaR

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

COPULA FRANK

Marginales Normales

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))

VaR

quantile(MC.Lsim, alfa) 
##        99%      99.5%      99.9% 
## 0.04079585 0.04476675 0.05291203

TVaR

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

Marginales t-Student

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))

VaR

quantile(MC.Lsim, alfa)
##        99%      99.5%      99.9% 
## 0.04598357 0.05431333 0.07521152

TVaR

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

Nota

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.