library(readxl)
library(ggplot2)
library(knitr)
library(kableExtra)
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:kableExtra':
##
## group_rows
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(scales) # Para formateo de porcentajes y dólares
# IMPORTACION DE DATOS
ruta_archivo <- "C://Users//Gerencial General//Desktop//R Studio//Precios e Inversiones.xlsx"
# DATOS DE LOS PRECIOS
datos_precios <- read_excel(ruta_archivo, sheet = "Precios")
# DATOS DE LAS INVERSIONES
datos_inversiones <- read_excel(ruta_archivo, sheet = "Inversiones")
# VECTOR DE PRECIOS
precios <- as.numeric(datos_precios$Precio)
# CALCULO DE RETORNOS LOGARTIMICOS
retornos <- diff(log(precios))
# VECTOR DE INVERSIONES
inversiones <- as.numeric(datos_inversiones$Inversiones)
# PARAMETROS
nivel_confianza <- 0.95
# DATA FRAME PARA LOS RESULTADOS DEL VaR PARA CADA MÉTODO
resultados <- data.frame(
Inversion = inversiones,
VaR_Parametrico = numeric(length(inversiones)),
Perdida_Parametrico = numeric(length(inversiones)),
VaR_NoParametrico = numeric(length(inversiones)),
Perdida_NoParametrico = numeric(length(inversiones)),
VaR_MonteCarlo = numeric(length(inversiones)),
Perdida_MonteCarlo = numeric(length(inversiones))
)
# METODO PARAMETRICO
media_retornos <- mean(retornos)
desviacion_estandar <- sd(retornos)
VaR_parametrico_porcentaje <- qnorm(1 - nivel_confianza, mean = media_retornos, sd = desviacion_estandar)
# METODO NO PARAMETRICO
VaR_no_parametrico_porcentaje <- quantile(retornos, probs = 1 - nivel_confianza)
# SIMULACION DE MONTECARLO
set.seed(123)
n_simulaciones <- 10000
simulaciones <- replicate(n_simulaciones, {
simulacion <- rnorm(length(retornos), mean = media_retornos, sd = desviacion_estandar)
min(simulacion)
})
VaR_montecarlo_porcentaje <- quantile(simulaciones, probs = 1 - nivel_confianza)
# CALCULO DEL VaR Y PÉRDIDA ESPERADA PARA CADA INVERSIÓN
for (i in 1:length(inversiones)) {
inversion <- inversiones[i]
# PARAMETRICO
resultados$VaR_Parametrico[i] <- VaR_parametrico_porcentaje
resultados$Perdida_Parametrico[i] <- inversion * abs(VaR_parametrico_porcentaje)
# NO PARAMETRICO
resultados$VaR_NoParametrico[i] <- VaR_no_parametrico_porcentaje
resultados$Perdida_NoParametrico[i] <- inversion * abs(VaR_no_parametrico_porcentaje)
# MONTECARLO
resultados$VaR_MonteCarlo[i] <- VaR_montecarlo_porcentaje
resultados$Perdida_MonteCarlo[i] <- inversion * abs(VaR_montecarlo_porcentaje)
}
# FORMATEAR LOS VALORES EN PORCENTAJE Y DÓLAR
resultados_formateados <- resultados %>%
mutate(
VaR_Parametrico = scales::percent(VaR_Parametrico, accuracy = 0.001),
VaR_NoParametrico = scales::percent(VaR_NoParametrico, accuracy = 0.001),
VaR_MonteCarlo = scales::percent(VaR_MonteCarlo, accuracy = 0.001),
Perdida_Parametrico = scales::dollar(Perdida_Parametrico, accuracy = 0.001),
Perdida_NoParametrico = scales::dollar(Perdida_NoParametrico, accuracy = 0.001),
Perdida_MonteCarlo = scales::dollar(Perdida_MonteCarlo, accuracy = 0.001)
)
# MOSTRAR LOS RESULTADOS EN UNA TABLA FORMATEADA
kable(resultados_formateados, caption = "VaR y Pérdida Esperada para Diferentes Montos de Inversión", format = "html") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = F) %>%
column_spec(1, bold = TRUE) %>%
row_spec(0, bold = TRUE, color = "white", background = "blue")
VaR y Pérdida Esperada para Diferentes Montos de Inversión
|
Inversion
|
VaR_Parametrico
|
Perdida_Parametrico
|
VaR_NoParametrico
|
Perdida_NoParametrico
|
VaR_MonteCarlo
|
Perdida_MonteCarlo
|
|
92476.64
|
-0.803%
|
$742.132
|
-0.817%
|
$755.397
|
-1.823%
|
$1,685.615
|
|
462187.30
|
-0.803%
|
$3,709.087
|
-0.817%
|
$3,775.387
|
-1.823%
|
$8,424.506
|
|
129412.44
|
-0.803%
|
$1,038.544
|
-0.817%
|
$1,057.108
|
-1.823%
|
$2,358.862
|
|
244729.92
|
-0.803%
|
$1,963.975
|
-0.817%
|
$1,999.082
|
-1.823%
|
$4,460.808
|
|
65653.00
|
-0.803%
|
$526.870
|
-0.817%
|
$536.288
|
-1.823%
|
$1,196.688
|
|
168822.00
|
-0.803%
|
$1,354.809
|
-0.817%
|
$1,379.026
|
-1.823%
|
$3,077.198
|
|
136.52
|
-0.803%
|
$1.096
|
-0.817%
|
$1.115
|
-1.823%
|
$2.488
|
# HISTOGRAMA DE RETORNOS
ggplot(data.frame(retornos), aes(x=retornos)) +
geom_histogram(bins=30, fill="lightblue", color="black") +
geom_vline(aes(xintercept=VaR_parametrico_porcentaje), color="red", linetype="dashed", size=1) +
geom_vline(aes(xintercept=VaR_no_parametrico_porcentaje), color="blue", linetype="dashed", size=1) +
labs(title="Histograma de Retornos", x="Retornos", y="Frecuencia") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# DENSIDAD DE RETORNOS
ggplot(data.frame(retornos), aes(x=retornos)) +
geom_density(fill="darkgreen", alpha=0.5) +
geom_vline(aes(xintercept=VaR_parametrico_porcentaje), color="red", linetype="dashed", size=1) +
geom_vline(aes(xintercept=VaR_no_parametrico_porcentaje), color="blue", linetype="dashed", size=1) +
labs(title="Densidad de Retornos", x="Retornos", y="Densidad") +
theme_minimal()

# HISTOGRAMA DE SIMULACIONES MONTE CARLO
ggplot(data.frame(simulaciones), aes(x=simulaciones)) +
geom_histogram(bins=50, fill="lightgreen", color="black") +
geom_vline(aes(xintercept=VaR_montecarlo_porcentaje), color="purple", linetype="dashed", size=1) +
labs(title="Simulaciones de Monte Carlo", x="Retornos Simulados", y="Frecuencia") +
theme_minimal()

# RETORNOS EN EL TIEMPO
ggplot(data.frame(Fecha=datos_precios$DATE[-1], Retornos=retornos), aes(x=Fecha, y=Retornos)) +
geom_line(color="darkblue", size=1) +
labs(title="Retornos en el Tiempo", x="Fecha", y="Retornos") +
theme_minimal()
