El Value at Risk (VaR), es una medida de riesgo de mercado para una cartera de inversiones. El VaR también puede ser definido como la máxima pérdida esperada en un período de tiempo y con un nivel de confianza dado, esto en condiciones normales de mercado.

Existen diversas metodologías para la estimación del VaR, entre estas se encuentran el:

El VaR por Monte Carlo, es calculado haciendo uso de un software informático, el cuál permite generar ciento o miles de posibles resultados según los parámetros y el valor inicial dados.

En nuestro ejercicio, nos piden calcular el Value at Risk por Montecarlo, haciendo 10 000 simulaciones de un movimiento browniano geométrico (GBM), con el precio de los activos de la empresa de la PC1 - BBQ Holding para el período inicio ‘2019-01-01’ y fecha de fin ‘2020-01-01’. Para ello primero hacemos uso del paquete quantmod, el cual posee el comando getSymbols, este último lo utilizaremos para descargar la base de datos del precio de los activos de la empresa BBQ Holding, una empresa de restaurantes multimarca.

require(quantmod)
## Loading required package: quantmod
## Loading required package: xts
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
## Version 0.4-0 included new data defaults. See ?getSymbols.
getSymbols("BBQ",from="2019-01-01",to="2020-01-01")
## 'getSymbols' currently uses auto.assign=TRUE by default, but will
## use auto.assign=FALSE in 0.5-0. You will still be able to use
## 'loadSymbols' to automatically load data. getOption("getSymbols.env")
## and getOption("getSymbols.auto.assign") will still be checked for
## alternate defaults.
## 
## This message is shown once per session and may be disabled by setting 
## options("getSymbols.warning4.0"=FALSE). See ?getSymbols for details.
## [1] "BBQ"
head(BBQ)
##            BBQ.Open BBQ.High BBQ.Low BBQ.Close BBQ.Volume BBQ.Adjusted
## 2019-01-02     4.51     4.70    4.51      4.70       2100         4.70
## 2019-01-03     4.70     4.70    4.70      4.70        100         4.70
## 2019-01-04     4.61     4.70    4.28      4.33      11600         4.33
## 2019-01-07     4.33     4.69    4.33      4.57       5600         4.57
## 2019-01-08     4.70     4.70    4.29      4.30      20200         4.30
## 2019-01-09     4.34     4.57    4.34      4.55       1400         4.55

Los cálculos se realizarán sobre los precios ajustados al cierre, es por ello que solo nos quedamos con estos valores. El precio de las acciones ajustados al cierre los gráficaremos para observar su comportamiento en el tiempo. Esta gráfica evidencia una fuerte caída en el precio de las acciones de la compañia con una posteriore recuperación.

BBQ = BBQ[,"BBQ.Adjusted"]
plot(BBQ)

En el ejercicio nos piden realizar los cálculos de los parámetros a partir de los retornos continuos, para ello primero instalamos el comando PerformanceAnalytics, y luego con el comando Return.calculate los calculamos, eligiiendo para ello la opción “log”. De la misma manera gráficamos los rendimientos de las acciones. Esta gráfic evidencia una etapa de gran volatilidad entre los meses de mayo y julio del 2019.

require(PerformanceAnalytics)
## Loading required package: PerformanceAnalytics
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
rend_cont = Return.calculate(BBQ, method="log")
plot(rend_cont)

Las 10 000 simulaciones se realizarán simulando un Movimiento Browniano geómetrico (GBM) co media = y desviación estandar = . De esta manera podemos calcular los parámetros solicitados (media y desviación estándar).

#Media
mu= mean(na.omit(rend_cont))
mu
## [1] -0.000712841
#Desviación estandar
sigma=sd(na.omit(rend_cont))
sigma
## [1] 0.03736169

El siguiente paso, es cacular el Value at Risk, con el método de la simulación de Montercarlo.Se realizará 10 000 sim. de un Mov. Browniano Geométrico (MBG) Para ello primero definimos algunos de los parámetros a utilizar.

m=10000
n=100
ntime = 1:n
delta.n = 1/n
P.inicial = 3.93
mu
## [1] -0.000712841
sigma
## [1] 0.03736169

Hallamos el Risk at Value para alfa 0.01

Nos piden calcular y crear una matriz donde se guarde nuestros resultados - Primero creamos una matriz donde guardaremos las simulaciones.

matrix.sim1 = matrix(ncol = m, nrow = n)
VaR1 = numeric(length = m)

Ya con los parámetros estimados, calcularemos la simulación para alfa=0.01

for (i in 1:m) {
  matrix.sim1[1,i] = P.inicial
  for (h in 2:n) {
    e <- rnorm(1)
    matrix.sim1[h , i] = matrix.sim1[(h - 1), i] * exp((mu - (sigma^2) / 2)* delta.n + sigma * e * sqrt(delta.n))
  } 
}

Estas 10 000 simulaciones obtenidas de un Mov. Browniano Geométrico (MBG), las gráficamos para observar su comportamiento aletorio (para ello tambien será necesario utilizar los siguientes paquetes ggplot2, tidyverse, dplyr).

require(ggplot2)
## Loading required package: ggplot2
require(tidyverse)
## Loading required package: tidyverse
## -- Attaching packages ------------------------------------------------------------------------------------------ tidyverse 1.3.0 --
## v tibble  3.0.1     v dplyr   1.0.0
## v tidyr   1.1.0     v stringr 1.4.0
## v readr   1.3.1     v forcats 0.5.0
## v purrr   0.3.4
## -- Conflicts --------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::first()  masks xts::first()
## x dplyr::lag()    masks stats::lag()
## x dplyr::last()   masks xts::last()
require(dplyr)

Realizamos el gráfico de las simulaciones obtenidas de un Movimiento Browniano.

gbm_df <- as.data.frame(matrix.sim1) %>%
  dplyr::mutate(ix=1:nrow(matrix.sim1)) %>%
  tidyr::pivot_longer(-ix, names_to = 'Simulacion', values_to = 'Precio')

gbm_df %>%
  ggplot(aes(x=ix, y=Precio, color=Simulacion)) +
  geom_line() +
  theme(legend.position = 'none')

Ahora calculamos el VaR de cada simulación y guardamos el resultado en un vector de datos.

for(i in 1:m){
  vec <- matrix.sim1[, i]
  sim.R <- diff(log(vec))
  sim.q <- quantile(sim.R, 0.01, na.rm = TRUE)
  sim.var <- exp(sim.q) - 1
  VaR1[i] <-  sim.var
}

Finalmente nos solicitan el valor de la media de los VaR simulados:

mean(VaR1)
## [1] -0.008019043
El valor de la desviación estándar de los VaR simulados:


```r
sd(VaR1)
## [1] 0.001157425

Asi también, nos piden graficar la distribución de los VaR simulados:

plot(density(VaR1))

Se observa una distribución unimodal, con asimetría negativa y distribución leptocúrtica, lo que determina que el VaR histórico sea superior al VaR normal y, generalmente también mayor que el VaR Monte Carlo.

El percentil 0.025:

quantile(VaR1,0.025)
##        2.5% 
## -0.01056376

El percentil 0.975:

quantile(VaR1,0.975)
##        97.5% 
## -0.005986838

Hallamos el Risk at Value para alfa 0.05

Nos piden calcular y crear una matriz donde se guarde nuestros resultados - Primero creamos una matriz donde guardaremos las simulaciones.

matrix.sim2 = matrix(ncol = m, nrow = n)
VaR2 = numeric(length = m)

Ya con los parámetros estimados, calcularemos la simulación para alfa=0.01

for (i in 1:m) {
  matrix.sim2[1,i] = P.inicial
  for (h in 2:n) {
    e <- rnorm(1)
    matrix.sim2[h , i] = matrix.sim2[(h - 1), i] * exp((mu - (sigma^2) / 2)* delta.n + sigma * e * sqrt(delta.n))
  } 
}

Estas 10 000 simulaciones obtenidas de un Mov. Browniano Geométrico (MBG), las gráficamos para observar su comportamiento aletorio (para ello tambien será necesario utilizar los siguientes paquetes ggplot2, tidyverse, dplyr.

require(ggplot2)
require(tidyverse)
require(dplyr)

Realizamos el gráfico de las simulaciones obtenidas de un Movimiento Browniano.

gbm_df <- as.data.frame(matrix.sim2) %>%
  dplyr::mutate(ix=1:nrow(matrix.sim2)) %>%
  tidyr::pivot_longer(-ix, names_to = 'Simulacion', values_to = 'Precio')

gbm_df %>%
  ggplot(aes(x=ix, y=Precio, color=Simulacion)) +
  geom_line() +
  theme(legend.position = 'none')

Ahora calculamos el VaR de cada simulación y guardamos el resultado en un vector de datos

for(i in 1:m){
  vec <- matrix.sim2[, i]
  sim.R <- diff(log(vec))
  sim.q <- quantile(sim.R, 0.05, na.rm = TRUE)
  sim.var <- exp(sim.q) - 1
  VaR2[i] <-  sim.var
}

Finalmente nos solicitan el valor de la media de los VaR simulados:

mean(VaR2)
## [1] -0.005954125
El valor de la desviación estándar de los VaR simulados:


```r
sd(VaR2)
## [1] 0.0007520773

Asi también, nos piden graficar la distribución de los VaR simulados:

plot(density(VaR2))

Se observa una distribución unimodal, con asimetría negativa y distribución leptocúrtica, lo que determina que el VaR histórico sea superior al VaR normal y, generalmente también mayor que el VaR Monte Carlo.

El percentil 0.025:

quantile(VaR2,0.025)
##         2.5% 
## -0.007492856

El percentil 0.975:

quantile(VaR2,0.975)
##        97.5% 
## -0.004539681

Hallamos el Risk at Value para alfa 0.1

Nos piden calcular y crear una matriz donde se guarde nuestros resultados - Primero creamos una matriz donde guardaremos las simulaciones.

matrix.sim3 = matrix(ncol = m, nrow = n)
VaR3 = numeric(length = m)

Ya con los parámetros estimados, calcularemos la simulación para alfa=0.01

for (i in 1:m) {
  matrix.sim3[1,i] = P.inicial
  for (h in 2:n) {
    e <- rnorm(1)
    matrix.sim3[h , i] = matrix.sim3[(h - 1), i] * exp((mu - (sigma^2) / 2)* delta.n + sigma * e * sqrt(delta.n))
  } 
}

Estas 10 000 simulaciones obtenidas de un Mov. Browniano Geométrico (MBG), las gráficamos para observar su comportamiento aletorio (para ello tambien será necesario utilizar los siguientes paquetes ggplot2, tidyverse, dplyr.

require(ggplot2)
require(tidyverse)
require(dplyr)

Realizamos el gráfico de las simulaciones obtenidas de un Movimiento Browniano.

gbm_df <- as.data.frame(matrix.sim3) %>%
  dplyr::mutate(ix=1:nrow(matrix.sim3)) %>%
  tidyr::pivot_longer(-ix, names_to = 'Simulacion', values_to = 'Precio')

gbm_df %>%
  ggplot(aes(x=ix, y=Precio, color=Simulacion)) +
  geom_line() +
  theme(legend.position = 'none')

Ahora calculamos el VaR de cada simulación y guardamos el resultado en un vector de datos

for(i in 1:m){
  vec <- matrix.sim3[, i]
  sim.R <- diff(log(vec))
  sim.q <- quantile(sim.R, 0.1, na.rm = TRUE)
  sim.var <- exp(sim.q) - 1
  VaR3[i] <-  sim.var
}

Finalmente nos solicitan el valor de la media de los VaR simulados:

mean(VaR3)
## [1] -0.004688811
El valor de la desviación estándar de los VaR simulados:


```r
sd(VaR3)
## [1] 0.000628482

Asi también, nos piden graficar la distribución de los VaR simulados:

plot(density(VaR3))

Se observa una distribución unimodal, con asimetría negativa y distribución leptocúrtica, lo que determina que el VaR histórico sea superior al VaR normal y, generalmente también mayor que el VaR Monte Carlo.

El percentil 0.025:

quantile(VaR3,0.025)
##         2.5% 
## -0.005945984

El percentil 0.975:

quantile(VaR3,0.975)
##        97.5% 
## -0.003505057