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