El primer paso consiste la importación de las librerías y los datos. En el caso de las primeras, estas pertenecen a la paquetería estadística de R, y en el caso del segundo punto, estos fueron recabados de los precios de cierre de Refinitiv.
library(readxl)
library(readr)
library(xts)
library(dplyr)
library(janitor)
library(kableExtra)
library(PerformanceAnalytics)
setwd("/Users/rogelio/Desktop/R")
precios <- read_excel("~/Desktop/R/precioss.xlsx")
Con esto, se procede a la limpieza de los datos, la cual en este caso solo consiste en convertir la fecha de los precios al formato deseado:
precios <- precios %>%
mutate(Date = convert_to_date(Date, character_fun = lubridate::mdy))
precios #Resultado final
Con base en esto, como se percibe en la tabla anterior, se recopilaron datos a partir del 31 de mayo de 2020 hasta el 1 de junio de 2023. Para tener un análisis más profundo, se optó por tabajar con la base ompleta, es decir, a 3 años, y con una versión recortada a un año, con un nivel de confianza del 95% y del 99%. Esta elección se hizo para considerar los impactos de la pandemia del COVID-19 en el mercado de valores.
Comenzando con los datos a 3 años, los resultados y el proceso de su obtención se muestra a continuación:
ALFA_3 <- xts(precios[,2:13], order.by = (precios$Date),)
#Rendimientos
rendimientos <- na.omit(Return.calculate(ALFA_3), method = "log")
#Desviación estándar
sd_portafolio <- apply(rendimientos, 2, sd)
cor_portafolio <- cor(rendimientos, use = "complete.obs", method = "pearson")
cov_portafolio <- diag(sd_portafolio) %*%
cor_portafolio %*%
diag(sd_portafolio)
cov_portafolio <- cov(rendimientos, use = "complete.obs", method = "pearson")
#
weights <- c(0.11,0.14,0.08,0.13,0.12,0.08,0.04,0.05,0.08,0.08,0.09,0)
volport <- sqrt(t(as.matrix(weights)) %*%
cov_portafolio %*%
as.matrix(weights))
rport <- rendimientos %*%
as.matrix(weights)
sd1 <- StdDev(rendimientos)
sd2 <- StdDev(rendimientos, weights = weights, portfolio_method = "component")
alpha.p <- 0.025
h <- 1
pv <- 1000000 #dólares
# Parametrico - 0.025
varpn <- sd_portafolio * qnorm(alpha.p) * sqrt(h) * pv
varpn
varpn_port <- sd(rport) * qnorm(alpha.p) * sqrt(h) * pv
varpn_port
# Historico - 0.05
alpha.h <- 0.05
n <- 11
m <- nrow(rendimientos)
pnl <- data.frame(percentile = 0: (m-1)/(m-1))
for (i in 1:n){
pnl <- cbind(pnl, sort(coredata(rendimientos[,i], decreasing = F)))
}
nombres <- c("ARCA", "AMXB","BIMBO","CEMEX","FEMSA","GCARSO","INBURSA","BANORTE",
"GMEXICO","COCA","WALMART")
names(pnl)[2:(n+1)] <- nombres
varh <- apply(rendimientos, 2, quantile, alpha.h) * sqrt(h) * pv
varh_port <- quantile(rport, alpha.h) * sqrt(h) * pv
# Monte Carlo
a <- chol(cor_portafolio) #distribución cholesky
e <- matrix(rnorm(1000*11), ncol = 12)
r_mc <- e %*% a
cor_mc <- cor(r_mc)
rport_mc <- r_mc %*% as.matrix(weights)
varmc <- apply(r_mc, 2, quantile, alpha.h) * sqrt(h) * pv # individual
varmc_port <- quantile(rport_mc, alpha.h) * sqrt(h) * pv
Con el 95% de confianza, los resultados son:
| VaR Paramétrico | VaR Histórico | VaR Montecarlo | |
|---|---|---|---|
| Portafolio | -9,549,193.07 | -23,993.00 | -1,040,226 |
| IPC | -27,824.69 | -22,826.46 | -1,587,463 |
alpha.p <- 0.01/2
h <- 1
pv <- 1000000 #dólares
# Parametrico - 0.025
varpn <- sd_portafolio * qnorm(alpha.p) * sqrt(h) * pv
varpn
varpn_port <- sd(rport) * qnorm(alpha.p) * sqrt(h) * pv
varpn_port
# Historico - 0.05
alpha.h <- 0.01
n <- 11
m <- nrow(rendimientos)
pnl <- data.frame(percentile = 0: (m-1)/(m-1))
for (i in 1:n){
pnl <- cbind(pnl, sort(coredata(rendimientos[,i], decreasing = F)))
}
nombres <- c("ARCA", "AMXB","BIMBO","CEMEX","FEMSA","GCARSO","INBURSA","BANORTE",
"GMEXICO","COCA","WALMART")
names(pnl)[2:(n+1)] <- nombres
varh <- apply(rendimientos, 2, quantile, alpha.h) * sqrt(h) * pv
varh
varh_port <- quantile(rport, alpha.h) * sqrt(h) * pv
varh_port
# Monte Carlo
a <- chol(cor_portafolio) #distribución cholesky
e <- matrix(rnorm(1000*11), ncol = 12)
r_mc <- e %*% a
cor_mc <- cor(r_mc)
rport_mc <- r_mc %*% as.matrix(weights)
varmc <- apply(r_mc, 2, quantile, alpha.h) * sqrt(h) * pv # individual
varmc
varmc_port <- quantile(rport_mc, alpha.h) * sqrt(h) * pv
varmc_port
Con el 99% de confianza, los resultados son:
| VaR Paramétrico | VaR Histórico | VaR Montecarlo | |
|---|---|---|---|
| Portafolio | -12,549,767.00 | -38,497.97 | -1,547,624 |
| IPC | -36,567.85 | -31,675.31 | -2,292,008 |
Siguiendo la misma metodología anterior, a continuación se muestran los resultados obtenidos para el VaR a 1 año.
ALFA_1 <- xts(precios[,2:13], order.by = (precios$Date),)
ALFA_1 <- ALFA_1["2022-05-31/"]
#Rendimientos
rendimientos <- na.omit(Return.calculate(ALFA_1), method = "log")
#Desviación estándar
sd_portafolio <- apply(rendimientos, 2, sd)
cor_portafolio <- cor(rendimientos, use = "complete.obs", method = "pearson")
cov_portafolio <- diag(sd_portafolio) %*%
cor_portafolio %*%
diag(sd_portafolio)
cov_portafolio <- cov(rendimientos, use = "complete.obs", method = "pearson")
#
weights <- c(0.11,0.14,0.08,0.13,0.12,0.08,0.04,0.05,0.08,0.08,0.09,0)
volport <- sqrt(t(as.matrix(weights)) %*%
cov_portafolio %*%
as.matrix(weights))
rport <- rendimientos %*%
as.matrix(weights)
sd1 <- StdDev(rendimientos)
sd2 <- StdDev(rendimientos, weights = weights, portfolio_method = "component")
alpha.p <- 0.025
h <- 1
pv <- 1000000 #dólares
# Parametrico - 0.025
varpn <- sd_portafolio * qnorm(alpha.p) * sqrt(h) * pv
varpn
varpn_port <- sd(rport) * qnorm(alpha.p) * sqrt(h) * pv
varpn_port
# Historico - 0.05
alpha.h <- 0.05
n <- 11
m <- nrow(rendimientos)
pnl <- data.frame(percentile = 0: (m-1)/(m-1))
for (i in 1:n){
pnl <- cbind(pnl, sort(coredata(rendimientos[,i], decreasing = F)))
}
nombres <- c("ARCA", "AMXB","BIMBO","CEMEX","FEMSA","GCARSO","INBURSA","BANORTE",
"GMEXICO","COCA","WALMART")
names(pnl)[2:(n+1)] <- nombres
varh <- apply(rendimientos, 2, quantile, alpha.h) * sqrt(h) * pv
varh
varh_port <- quantile(rport, alpha.h) * sqrt(h) * pv
varh_port
# Monte Carlo
a <- chol(cor_portafolio) #distribución cholesky
e <- matrix(rnorm(1000*11), ncol = 12)
r_mc <- e %*% a
cor_mc <- cor(r_mc)
rport_mc <- r_mc %*% as.matrix(weights)
varmc <- apply(r_mc, 2, quantile, alpha.h) * sqrt(h) * pv # individual
varmc
varmc_port <- quantile(rport_mc, alpha.h) * sqrt(h) * pv
varmc_port
Con el 95% de confianza, los resultados son:
| VaR Paramétrico | VaR Histórico | VaR Montecarlo | |
|---|---|---|---|
| Portafolio | -26,099.97 | -21,716.29 | -1,054,526 |
| IPC | -26,368.42 | -21,632.30 | -1,583,998 |
alpha.p <- 0.01/2
h <- 1
pv <- 1000000 #dólares
# Parametrico - 0.025
varpn <- sd_portafolio * qnorm(alpha.p) * sqrt(h) * pv
varpn
varpn_port <- sd(rport) * qnorm(alpha.p) * sqrt(h) * pv
varpn_port
# Historico - 0.05
alpha.h <- 0.01
n <- 11
m <- nrow(rendimientos)
pnl <- data.frame(percentile = 0: (m-1)/(m-1))
for (i in 1:n){
pnl <- cbind(pnl, sort(coredata(rendimientos[,i], decreasing = F)))
}
nombres <- c("ARCA", "AMXB","BIMBO","CEMEX","FEMSA","GCARSO","INBURSA","BANORTE",
"GMEXICO","COCA","WALMART")
names(pnl)[2:(n+1)] <- nombres
varh <- apply(rendimientos, 2, quantile, alpha.h) * sqrt(h) * pv
varh
varh_port <- quantile(rport, alpha.h) * sqrt(h) * pv
varh_port
# Monte Carlo
a <- chol(cor_portafolio) #distribución cholesky
e <- matrix(rnorm(1000*11), ncol = 12)
r_mc <- e %*% a
cor_mc <- cor(r_mc)
rport_mc <- r_mc %*% as.matrix(weights)
varmc <- apply(r_mc, 2, quantile, alpha.h) * sqrt(h) * pv # individual
varmc
varmc_port <- quantile(rport_mc, alpha.h) * sqrt(h) * pv
varmc_port
Con el 99% de confianza, los resultados son:
| VaR Paramétrico | VaR Histórico | VaR Montecarlo | |
|---|---|---|---|
| Portafolio | -34,301.17 | -29,203.91 | -1,453,805 |
| IPC | -34,653.98 | -30,042.33 | -2,252,665 |