Dow Jones Industrial Average, Inc, es un índice Bursátil, compuesto por 30 empresas no solo de la industria, sino también de sectores financieros e informáticos. En Yahoo Finance podemos encontrar su ticker como DJI.
Necesitaremos instalar algunos comandos, tales como:
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.
require(PerformanceAnalytics)
## Loading required package: PerformanceAnalytics
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
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)
El comando getSymbols, nos permite extraer la base de datos de los precios al cierre ajustados del índice bursatil Dow Jones Industrial Average, Inc. (DJI)
require(quantmod)
getSymbols("^DJI",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] "^DJI"
DJI = DJI[,"DJI.Adjusted"]
head(DJI)
## DJI.Adjusted
## 2019-01-02 23346.24
## 2019-01-03 22686.22
## 2019-01-04 23433.16
## 2019-01-07 23531.35
## 2019-01-08 23787.45
## 2019-01-09 23879.12
Gráficamos los precios de las acciones de cierre ajustados de DJI
plot(DJI)
En el ejercio indican que debemos calcular el valor de la media y desviación estándar de retornos continuos, es por ello que se usará la opción log. Finalmente graficaremos.
rDJI = Return.calculate(DJI, method="log")
plot(rDJI)
Definimos los parámetros
nsim=10000
date=365
mat.time = 1:date
inv.mat.time = 1/date
P.inicial = 28.54
median = mean(na.omit(rDJI))
sd=sd(na.omit(rDJI))
Matriz donde guardaremos los valores de las simulaciones.
mat.0.01 = matrix(ncol = nsim, nrow = date)
Matriz para los valores del VaR
VaR.0.01 = numeric(length = nsim)
Simulación para \(\alpha = 0.01\)
for (i in 1:nsim) {
mat.0.01[1,i] = P.inicial
for (h in 2:date) {
e <- rnorm(1)
mat.0.01[h , i] = mat.0.01[(h - 1), i] * exp((median - (sd^2) / 2)* sd + sd * e * sqrt(inv.mat.time))
}
}
Gráficamos
Realizamos el gráfico de las simulaciones obtenidas de un Movimiento Browniano.
gbm_df <- as.data.frame(mat.0.01) %>%
dplyr::mutate(ix=1:nrow(mat.0.01)) %>%
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:mat.0.01){
vec <- mat.0.01[, i]
sim.R <- diff(log(vec))
sim.q <- quantile(sim.R, 0.01, na.rm = TRUE)
sim.var <- exp(sim.q) - 1
VaR.0.01[i] <- sim.var
}
## Warning in 1:mat.0.01: numerical expression has 3650000 elements: only the first
## used
Finalmente nos solicitan el valor de la media de los VaR simulados:
mean(VaR.0.01)
## [1] -2.656714e-06
El valor de la desviación estándar de los VaR simulados:
sd(VaR.0.01)
## [1] 5.032497e-05
Asi también, nos piden graficar la distribución de los VaR simulados:
plot(density(VaR.0.01))
El gráfico muetra que los retornos tienen valores muy cercanos a cero, y se concentra alrededor de este valor. El gráfico de la curva de la distribución, determina que es asimétrica, ademas tiene una distribución negativa y leptocurtica
El percentil 0.025:
quantile(VaR.0.01,0.025)
## 2.5%
## 0
El percentil 0.975:
quantile(VaR.0.01,0.975)
## 97.5%
## 0
Matriz donde guardaremos los valores de las simulaciones.
mat.0.05 = matrix(ncol = nsim, nrow = date)
Matriz para los valores del VaR
VaR.0.05 = numeric(length = nsim)
Simulación para \(\alpha = 0.05\)
for (i in 1:nsim) {
mat.0.05[1,i] = P.inicial
for (h in 2:date) {
e <- rnorm(1)
mat.0.05[h , i] = mat.0.05[(h - 1), i] * exp((median - (sd^2) / 2)* sd + sd * e * sqrt(inv.mat.time))
}
}
Gráficamos
Realizamos el gráfico de las simulaciones obtenidas de un Movimiento Browniano.
gbm_df <- as.data.frame(mat.0.05) %>%
dplyr::mutate(ix=1:nrow(mat.0.05)) %>%
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:mat.0.05){
vec <- mat.0.05[, i]
sim.R <- diff(log(vec))
sim.q <- quantile(sim.R, 0.05, na.rm = TRUE)
sim.var <- exp(sim.q) - 1
VaR.0.05[i] <- sim.var
}
## Warning in 1:mat.0.05: numerical expression has 3650000 elements: only the first
## used
Finalmente nos solicitan el valor de la media de los VaR simulados:
mean(VaR.0.05)
## [1] -1.850911e-06
El valor de la desviación estándar de los VaR simulados:
sd(VaR.0.05)
## [1] 3.499748e-05
Asi también, nos piden graficar la distribución de los VaR simulados:
plot(density(VaR.0.05))
El gráfico muetra que los retornos tienen valores muy cercanos a cero, y se concentra alrededor de este valor. El gráfico de la curva de la distribución, determina que es asimétrica, ademas tiene una distribución negativa y leptocurtica
El percentil 0.025:
quantile(VaR.0.05,0.025)
## 2.5%
## 0
El percentil 0.975:
quantile(VaR.0.05,0.975)
## 97.5%
## 0
Matriz donde guardaremos los valores de las simulaciones.
mat.0.1 = matrix(ncol = nsim, nrow = date)
Matriz para los valores del VaR
VaR.0.1 = numeric(length = nsim)
Simulación para \(\alpha = 0.1\)
for (i in 1:nsim) {
mat.0.1[1,i] = P.inicial
for (h in 2:date) {
e <- rnorm(1)
mat.0.1[h , i] = mat.0.1[(h - 1), i] * exp((median - (sd^2) / 2)* sd + sd * e * sqrt(inv.mat.time))
}
}
Gráficamos
Realizamos el gráfico de las simulaciones obtenidas de un Movimiento Browniano.
gbm_df <- as.data.frame(mat.0.1) %>%
dplyr::mutate(ix=1:nrow(mat.0.1)) %>%
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:mat.0.1){
vec <- mat.0.1[, i]
sim.R <- diff(log(vec))
sim.q <- quantile(sim.R, 0.1, na.rm = TRUE)
sim.var <- exp(sim.q) - 1
VaR.0.05[i] <- sim.var
}
## Warning in 1:mat.0.1: numerical expression has 3650000 elements: only the first
## used
Finalmente nos solicitan el valor de la media de los VaR simulados:
mean(VaR.0.1)
## [1] 0
El valor de la desviación estándar de los VaR simulados:
sd(VaR.0.1)
## [1] 0
Asi también, nos piden graficar la distribución de los VaR simulados:
plot(density(VaR.0.1))
El gráfico muetra que los retornos tienen valores muy cercanos a cero, y se concentra alrededor de este valor. El gráfico de la curva de la distribución, determina que es asimétrica, ademas tiene una distribución negativa y leptocurtica
El percentil 0.025:
quantile(VaR.0.1,0.025)
## 2.5%
## 0
El percentil 0.975:
quantile(VaR.0.1,0.975)
## 97.5%
## 0
Al representar el VaR una medida d eriesgo de mercado para un activo o una cartera, esta nos indica la máxima pérdida que se pueda experimentar
Para un valor de alfa = 0.01 en valores monetarios es de: el VaR es de -2.57559*10-6
Para un valor de alfa = 0.05 en valores monetarios es de: el VaR es de -1.84188*10-6
Para un valor de alfa = 0.1 en valores monetarios es de: el VaR es de 0
El valor toma estos valores explicados por su asimetría, y su distribución negativa qu se concentra alrededor del valor cero, en valores monetarios estos valores son muy bajos.