En esta presentación se expondrá el análisis del VaR Montecarlo usando un Movimiento Browniano Geométrico (MBG) y poder obtener los valores del VaR al \(99\%\), \(90\%\) y \(95\%\) de nivel de confianza para luego analizar los parámetros de interés.
En primer lugar, se recopilarán los precios históricos presentados en la cotización de Twist Bioscience Corporation, con ticker TWST, luego se hallarán los retornos de esta acción, los cuales serán la información base para poder tener los parámetros que definir el comportamiento inicial de las simulaciones deseadas.
Luego, se va a desarrollar el VaR Montecarlo usan un MBG para una cartera de \(\$100000\), con distintos niveles de confianza (\(99\%\), \(90\%\) y \(95\%\)).
Por otro lado, es importante tener los siguientes paquetes instalados y/o activados:
esta parte es importante para poder desarrollar los códigos planteados en el resto del trabajo. Para ello, se va a ejecutar el siguiente código, el cual indica al programa primero instalar la lista de paquetes mencionados y luego activarlos.
pkges <- c("pdfetch", "tseries", "tidyverse", "forecast", "quantmod", "dplyr")
# install.packages(pkges)
lapply(pkges, "library",character.only=T)## [[1]]
## [1] "pdfetch" "stats" "graphics" "grDevices" "utils" "datasets"
## [7] "methods" "base"
##
## [[2]]
## [1] "tseries" "pdfetch" "stats" "graphics" "grDevices" "utils"
## [7] "datasets" "methods" "base"
##
## [[3]]
## [1] "forcats" "stringr" "dplyr" "purrr" "readr" "tidyr"
## [7] "tibble" "ggplot2" "tidyverse" "tseries" "pdfetch" "stats"
## [13] "graphics" "grDevices" "utils" "datasets" "methods" "base"
##
## [[4]]
## [1] "forecast" "forcats" "stringr" "dplyr" "purrr" "readr"
## [7] "tidyr" "tibble" "ggplot2" "tidyverse" "tseries" "pdfetch"
## [13] "stats" "graphics" "grDevices" "utils" "datasets" "methods"
## [19] "base"
##
## [[5]]
## [1] "quantmod" "TTR" "xts" "zoo" "forecast" "forcats"
## [7] "stringr" "dplyr" "purrr" "readr" "tidyr" "tibble"
## [13] "ggplot2" "tidyverse" "tseries" "pdfetch" "stats" "graphics"
## [19] "grDevices" "utils" "datasets" "methods" "base"
##
## [[6]]
## [1] "quantmod" "TTR" "xts" "zoo" "forecast" "forcats"
## [7] "stringr" "dplyr" "purrr" "readr" "tidyr" "tibble"
## [13] "ggplot2" "tidyverse" "tseries" "pdfetch" "stats" "graphics"
## [19] "grDevices" "utils" "datasets" "methods" "base"
La empresa Twist Bioscience Corporation, ahora será nombrada por su ticker TWST, es una empresa estadounidense fundada en febrero del año 2013, está especializada en la biología sintética. La compañía está desarrollando una plataforma disruptiva de síntesis de ácido desoxirribonucleico (ADN) para industrializar la ingeniería de la biología.
También, cuenta con un proceso de fabricación de ADN sintético basado en semiconductores con una plataforma de silicio de 10,000 pozos, que es capaz de producir herramientas de biología sintética, como genes, conjuntos de oligonucleótidos y bibliotecas de variantes.
Su metodología de diseño, junto con su plataforma de síntesis basada en silicio, permite la síntesis de cada variante de biblioteca posicionada exactamente donde el usuario quiere que esté. Ofrece piscinas oligo no amplificadas y piscinas oligo listas para clonación y también ofrece síntesis de agrupaciones de oligonucleótidos para la focalización específica.
Según la información publicada en su reporte fiscal al finalizar el segundo trimestre, la empresa presento unos ingresos totales de \(\$19.3\) millones en comparación a los \(\$13.6\) millones percibidos en el mismo periodo del año fiscal 2019, por otra parte, la compañía presento una pérdida neta de \(\$31.8\) millones en comparación de los \(\$25.9\) millones en el año fiscal 2019. Además, al 31 de marzo del 2020, la compañía tenía $230.1 millones en efectivo, equivalentes de efectivo e inversiones a corto plazo.
También es importante resaltar que la empresa está comprometida en la investigación sobre el virus Covid-19, haciendo publica la información de sus hallazgos, por lo que para el segundo trimestre de este año fiscal 2020 realizó gastos de investigación por \(\$10.6\) millones de dólares en comparación con los $8.9 millones de dólares gastados para el mismo período del año fiscal 2019.
A continuación, se obtendrán los precios cotizados de TWST desde 2019-01-01 hasta 2020-01-01, usando el código expuesto, el cual indica la creación de dos objetos start y end, donde se guardaran las fechas de inicio y final, luego se usa la función “quantmod()” para poder descargar la información de TWST desde la plataforma de Yahoo Finance.
start <- as.Date("2019-01-01")
end <- as.Date("2020-01-01")
quantmod::getSymbols("TWST", src = "yahoo", from = start, to = end)## [1] "TWST"
Para poder confirmar que se han obtenido los datos deseado se utiliza las funciones “head()” y “tail()” para obtener la primera y ultima fila de la data frame descargada. Además, se utiliza la función “names()” para poder reconocer el nombre de las variables que se encuentran en la data frame.
## TWST.Open TWST.High TWST.Low TWST.Close TWST.Volume TWST.Adjusted
## 2019-01-02 22.7 24.5 21.5 24.5 135500 24.5
## TWST.Open TWST.High TWST.Low TWST.Close TWST.Volume TWST.Adjusted
## 2019-12-31 21 21.3 20.8 21 752300 21
## [1] "TWST.Open" "TWST.High" "TWST.Low" "TWST.Close"
## [5] "TWST.Volume" "TWST.Adjusted"
Como se logra ver en el gráfico, durante los últimos 4 meses del periodo estudiado la cotización de TWST ha seguido una tendencia hacia la baja, pero también el volumen comercializado en el mismo perdido fue el más alto, específicamente en el mes de Diciembre del año 2019.
Luego, como se desea trabajar específicamente con los precios ajustados al cierre de cada periodo que cotizo TWST, ya que si se utilizan los precios al cierre sin ajustar estos precios estarán afectados por el pago de dividendos, lo que significa que luego del pago de dividendos los precios de las acciones disminuyen; por lo tanto, se utilizan los precios ajustados para poder eliminar ese efecto en su cotización.
Para lograr lo dicho, primero se va a separar los precios ajustados de toda la data y luego se usan las funciones “head()” y “tail()” para poder observar el primer y último precio que cotizo TWST entre el periodo estudiado:
## TWST.Adjusted
## 2019-01-02 24.5
## TWST.Adjusted
## 2019-12-31 21
Luego de separar los datos se indicara al programa que estos datos son temporales, para ello se utiliza la función ts() y con la función class() se confirma que los datos ahora son temporales:
## [1] "ts"
Ya teniendo datos de interés con las características deseadas, se pueden hallar los retornos continuos de TWST, ya que al utilizar los retornos discretos se perderían ciertas propiedades estadísticas que son más atractivas en cuanto a su manejo, entonces para hallar los retornos continuos se usara la siguiente ecuación: \[R_{t}=\ln(\frac{P_t}{P_{t-1}})\]
pero aplicando la propiedad de logaritmos la ecuación quedaría de la siguiente forma: \[R_{t}=\ln(P_{t})-\ln(P_{t-1})\]
Por lo tanto, se utilizaran los siguientes códigos, donde se aplica la última ecuación (es decir la diferenciación de logaritmos) con la función “diff(log())” y luego se utiliza la función “head()” para obtener el primer retorno continuo de TWST.
## Time Series:
## Start = c(2019, 2)
## End = c(2019, 2)
## Frequency = 365
## TWST.Adjusted
## [1,] -0.0655
Teniendo los retornos continuos, se pueden obtener los parámetros de interés que serán utilizados en la simulación del MBG, los cuales son:
Para obtenerlo estos parámetros, se utilizaran las funciones “mean()” y “sd()” tal como se muestra en los siguientes códigos:
El Movimiento Browniano Geometrico, describe matemáticamente un proceso aleatorio que caracteriza el comportamiento aleatorio de ciertas variables aleatorias a medida que pasa el tiempo. Este proceso es muy utilizado en los modelos financieros para lograr describir la evolución de los precios a lo largo del tiempo.
Cuando se utiliza el MBG para generar precios, el movimiento browniano geométrico capta el supuesto que la variación de los precios no tienen influencia alguna de sus precios pasado ni influye en los futuros periodos; es decir, el MBG caracteriza el supuesto de la hipótesis del mercado eficiente, el cual anuncia que los precios siguen un camino aleatorio y no dependen de sus precios pasados.
Para generar los datos con el MBG se utiliza la siguiente ecuación:
\[P_t= P_{t-1}*ve^{(\mu-0.5\sigma^2)\Delta{t}+\sigma\sqrt{\Delta t}\epsilon}, \epsilon \sim N(0,1)\]
A continuación, se plantearán los parámetros para poder realizar la simulación de un MBG, que son los siguientes:
Para tener los parámetros, se debe determinar que el tiempo será de \(365\) días, dentro del objeto “t”, el número de simulaciones para cada simulación es de \(10000\) y se guardara dentro del objeto “sim”, además, dentro del objeto “tseq” se guarda la secuencia desde el primer periodo hasta el periodo \(365\).
Por otro lado, el precio de inicio que se guardara en el primer periodo es \(\$21\), el cual es el último precio que presento TWST. Finalmente, se determinan la media y des. estándar de los retornos continuos que presento TWST como parámetros de los datos que se van a simular ( \(-0.00060764\) y 0.037 ). Por lo tanto, se utilizará el siguiente codigo para poder definir los parametros mentionados:
## [1] -0.000608
## [1] 0.0368
Luego de tener los parámetros deseados, se simularan \(10000\) veces con un MBG los movimientos aleatorios que podrían seguir los precios diarios de TWST dentro de un año, para lo cual se seguirán los siguientes paso que seguirá el Código expuesto:
Se crea una matriz con el número de filas igual al número de días que se van a simular, que son 365 días, y con el número de columnas similar al número de simulaciones, lo que representaran los precios por día.
Generamos una función iterativa, la cual primero reemplazara el valor de la primera fila de la matriz creada con un precio inicial , que será 21, y luego se aplicara la ecuación que va a generar los datos simulados usando los parámetros establecidos previamente y que se colocaran a partir de la segunda fila.
m.simu <- matrix(ncol = sim, nrow = t)
for (i in 1:sim) {
m.simu[1,i] <- Po
for (h in 2:t) {
e <- rnorm(1)
m.simu[h, i]<- m.simu[(h-1),i] * exp((media - (des.estandar^2) / 2)* dt + des.estandar * e * sqrt(dt))
}
}Luego de la primera simulación se va a gráfica las simualciones obtenidas, para lo cual como se muestra en el código se ponen todos los datos simulados en dos filas separado el número de simulación y el precio simulado; posteriormente, se grafica los precios simulados. Es decir, se generará una lista como se muestra en la siguiente table:
## Simulacion Precios
## [1,] "simu1" "1"
## [2,] "simu2" "2"
## [3,] "simu3" "3"
## [4,] "simu4" "4"
Entonces es lo que se hará en el código, con la función “mutate()” se elimina el primer dato de la todas las simulaciones y luego con la función “pivot_longer()” genera que las columnas se coloquen debajo de la última final de la primera columna. Luego con la segunda parte del código se genera el grafico que se puede ver que las simulaciones siguen un camino casi aleatorio.
gbm_df <- as.data.frame(m.simu) %>%
dplyr::mutate(ix=1:nrow(m.simu)) %>%
tidyr::pivot_longer(-ix, names_to = 'Simu', values_to = 'Precio')
gbm_df %>%
ggplot(aes(x=ix, y=Precio, color=Simu)) +
geom_line() +
theme(legend.position = 'none')A continuación, se va hallar la perdida máxima esperada de una cartera de \(\$100000\) con tres niveles de confianza distintos: \(\alpha = 0.01\), \(\alpha = 0.05\), \(\alpha = 0.1\) .
Por lo tanto, se va a utilizar un Movimiento Browniano Geometrico para simular \(10000\) veces la perdida máxima esperada para cada nivel de confianza, en la siguiente sección se harán los análisis para cada VaR Montecarlo hallados en esta sección.
Para determinar el Var Montecarlo con un nivel de confianza de \(99\%\), y se van a utilizar los siguientes parámetros:
El número de simulaciones, que será \(10000\), y el valor de guardar en el objeto “sim”.
El tiempo que es 365 días y se guardara en el objeto “t”.
La secuencia de los días, es decir desde el día 1 hasta el día 365, y se guardara en el objeto “tseq”.
\(\Delta t\) , que es la velocidad de cambio de los precios. (0.003)
El precio en el periodo 1, que será \(\$21\), que es el último precio que presento TWST y se guardara en el objeto “Po”.
La media de los retornos de TWST, que es \(-0.00060764\).
La desviación estándar de los retornos de TWST, que es \(0.036819\).
Los parámetros anunciados, se logran observar en el siguiente código:
## [1] -0.000608
## [1] 0.0368
Luego de tener los parámetros, se crearán una matriz llamada “simulaciones.99” de dimensión 365 x \(10000\), en el cual se guardara las simulaciones generadas y en el objeto “VAR.99”, se guardaran los datos del VaR, que luego serán analizados.
Después, en el siguiente Código se va a realizar la simulación de \(10000\) distribuciones, para lo cual se va a utilizar un MBG. Primero, se ejecuta el código que va a generar \(10000\) simulaciones sobre cómo se podría comportar la acción de TWST, usando la misma ecuación planteada en la sección anterior.
for (i in 1:sim) {
simulaciones.99[1,i] <- Po
for (h in 2:t) {
e <- rnorm(1)
simulaciones.99[h , i] <- simulaciones.99[(h - 1), i] * exp((media - (des.estandar^2) / 2)* dt + des.estandar * e * sqrt(dt))
}
}Se grafican las simulaciones obtenidas, para ello se sigue la misma idea que se explicó en la anterior sección para obtener el grafico, y se logra ver que a partir del ultimo precio que cotizo TWST .
A continuación, luego de obtener las simulaciones deseadas, se hallara el VaR con un nivel de confianza de \(99\%\) para cada simulación y se guardaran en el objeto VAR.99; por lo que, en el objeto VAR.99 se tendrán una distribución de las perdidas máximas esperadas para una cartera de \(\$100000\), teniendo de esta manera se puede saber la media de la perdida máxima esperada y otros parámetros.
for(i in 1:sim){
vec <- simulaciones.99[, i]
sim.R <- diff(log(vec))
sim.q <- quantile(sim.R, 0.01, na.rm = TRUE)
sim.var <- exp(sim.q) - 1
VAR.99[i] <- sim.var
}Como se logra ver en el gráfico de la distribución creada a partir de las perdidas máximas esperada, la distribución de las perdidas máximas esperadas esta concentrada al rededor de la media con una kurtosis que seria similar a la curtosis de una distriucion normal.
Para determinar el Var Montecarlo con un nivel de confianza de \(95\%\), y se van a utilizar los siguientes parámetros:
El número de simulaciones, que será \(10000\), y el valor de guardar en el objeto “sim”.
El tiempo que es 365 días y se guardara en el objeto “t”.
La secuencia de los días, es decir desde el día 1 hasta el día 365, y se guardara en el objeto “tseq”.
\(\Delta t\) , que es la velocidad de cambio de los precios. (0.003)
El precio en el periodo 1, que será \(\$21\), que es el último precio que presento TWST y se guardara en el objeto “Po”.
La media de los retornos de TWST, que es \(-0.00060764\).
La desviación estándar de los retornos de TWST, que es \(0.036819\).
Los parámetros anunciados, se logran observar en el siguiente código:
## [1] -0.000608
## [1] 0.0368
Luego de tener los parámetros, se creara una matriz llamada “simulaciones.95” de dimensión 365 x \(10000\), en el cual se guardaran las simulaciones generadas y en el objeto “VAR.95”, se guardaran los datos del VaR, que luego serán analizados.
Después, en el siguiente código se va a realizar la simulación de \(10000\) distribuciones, para lo cual se va a utilizar un MBG. Primero, se ejecuta el código que va a generar \(10000\) simulaciones sobre cómo se podría comportar la acción de TWST.
for (i in 1:sim) {
simulaciones.95[1,i] <- Po
for (h in 2:t) {
e <- rnorm(1)
simulaciones.95[h , i] <- simulaciones.95[(h - 1), i] * exp((media - (des.estandar^2) / 2)* dt + des.estandar * e * sqrt(dt))
}
}Se grafica las simulaciones obtenidas siguiendo la misma idea que se explicó en la sección anterior.
A continuación, luego de obtener las simulaciones deseadas, se hallara el VaR con un nivel de confianza del \(95\%\) para cada simulación y se guardaran en el objeto VAR.95; por lo que, en el objeto VAR.95 se tendrán una distribución de las perdidas máximas esperadas para una cartera de \(\$100000\), teniendo esta distribución se puede saber la media de la perdida esperada y otros parámetros.
for(i in 1:sim){
vec <- simulaciones.95[, i]
sim.R <- diff(log(vec))
sim.q <- quantile(sim.R, 0.05, na.rm = TRUE)
sim.var <- exp(sim.q) - 1
VAR.95[i] <- sim.var
}Como se logra ver en el gráfico, la distribución de perdidas máximas esperadas tiene la mayoria de datos al rededor de la media por lo que se podria suponer que esta distribucion obtenida seguiria una distribucion similar a la de una distribucion normal.
Para determinar el Var Montecarlo con un nivel de confianza de \(90\%\), y se van a utilizar los siguientes parámetros:
El número de simulaciones, que será \(10000\), y el valor de guardar en el objeto “sim”.
El tiempo que es 365 días y se guardara en el objeto “t”.
La secuencia de los días, es decir desde el día 1 hasta el día 365, y se guardara en el objeto “tseq”.
\(\Delta t\) , que es la velocidad de cambio de los precios. (0.003)
El precio en el periodo 1, que será \(\$21\), que es el último precio que presento TWST y se guardara en el objeto “Po”.
La media de los retornos de TWST, que es \(-0.00060764\).
La desviación estándar de los retornos de TWST, que es \(0.036819\).
Los parámetros anunciados, se logran observar en el siguiente código:
## [1] -0.000608
## [1] 0.0368
Luego de tener los parámetros, se creara una matriz llamada “simulaciones.90” de dimensión 365 x \(10000\) en el cual se guardara las simulaciones generadas y en el objeto “VAR.90”, se guardaran los datos del VaR, que luego serán analizados.
Después, en el siguiente código se va a realizar la simulación de \(10000\) distribuciones, para lo cual se va a utilizar un MBG. Primero, se ejecuta el código que va a generar \(10000\) simulaciones sobre cómo se podría comportar la accion de TWST.
for (i in 1:sim) {
simulaciones.90[1,i] <- Po
for (h in 2:t) {
e <- rnorm(1)
simulaciones.90[h , i] <- simulaciones.90[(h - 1), i] * exp((media - (des.estandar^2) / 2)* dt + des.estandar * e * sqrt(dt))
}
}Se grafica las simulaciones obtenidas usando el mismo código que sigue la idea que se planteó en la sección anterior.
A continuación, luego de obtener las simulaciones deseadas se hallará el VaR con un nivel de confianza de \(90\%\) para cada simulación y se guardarán en el objeto VAR.90; por lo que, en el objeto VAR.90 se tendrán una distribución de las perdidas máximas esperadas para una cartera de \(\$100000\), teniendo las perdidas máximas esperadas de esta manera se puede saber la media de la perdida esperada y otros parámetros.
for(i in 1:sim){
vec <- simulaciones.90[, i]
sim.R <- diff(log(vec))
sim.q <- quantile(sim.R, 0.1, na.rm = TRUE)
sim.var <- exp(sim.q) - 1
VAR.90[i] <- sim.var
}Como se logra ver en el gráfico, la distribución de perdidas máximas esperadas estaría siguiendo una distribución similar a una distribución normal, pues visualmente se ve que la mayoría de los datos se encuentran concentrados en el medio de la distribución.
A continuación, se va analizar la perdida máxima de una cartera de \(\$ 100000\) con tres niveles de confianza distintos: \(\alpha = 0.01\), \(\alpha = 0.05\), \(\alpha = 0.1\) .
Este análisis consta de estudiar el promedio, desviación estándar y el los intervalos de confianza usando los percentiles 0.025 y 0.0975 a partir de los datos obtenidos en la sección anterior.
Primero, se hallan y se exponen los resultados al ejecutar las funciones de media (mean()), desviación estándar (sd()) y los intervalos de confianza de \(0.025\) y \(0.975\) aplicando la función quantile().
## [1] -0.00437
## [1] 0.000343
## 2.5%
## -0.00507
## 97.5%
## -0.00374
Sin embargo, no se puede usar los datos directamente, a pesar ya de ser valores discretos pero se debe de analizar usando valores en unidades monetarias, por lo cual se volverán en valores monetarios como se logra ver en el siguiente código, multiplicando el parámetro con la cantidad de nuestra cartera que es \(\$100000\) pero con un signo negativo pues para fines de poder describir los tiene más sentido utilizar valores positivos:
m.m99 <- round(m.99 * -100000, 6)
m.s99 <- round(s.99 * 100000, 6)
m.q99.025 <- round(q99.025 * -100000, 6)
m.q99.975 <- round(q99.975 * -100000, 6)Por lo tanto, teniendo una cartera de \(\$100000\) a un nivel de confianza de \(99\%\), se puede decir que la máxima perdida media esperada será de 436.885 dólares y las perdidas máximas se pueden desviar más o menos de la perdida máxima media esperada en 34.338 dólares; además, la perdida máxima esperada con el nivel de confianza mencionado (\(99\%\)) está entre 507.488 y 374.005 dólares.
Primero, se hallan y se exponen los resultados al ejecutar las funciones de media (mean()), desviación estándar (sd()) y los intervalos de confianza de \(0.025\) y \(0.975\) aplicando la función quantile().
## [1] -0.00314
## [1] 0.000213
## 2.5%
## -0.00357
## 97.5%
## -0.00274
Sin embargo, no se puede usar los datos directamente, a pesar ya de ser valores discretos pero se debe de analizar usando valores en unidades monetarias, por lo cual se volveran en valores monetarios como se logra ver en el siguiente codigo, multiplicando el parametro con la cantidad de nuestra cartera que es \(\$100000\) pero con un signo negativo pues para fines de poder describir los tiene mas sentido utilizar valores positivos:
m.m95 <- round(m.95 * -100000, 6)
m.s95 <- round(s.95 * 100000, 6)
m.q95.025 <- round(q95.025 * -100000, 6)
m.q95.975 <- round(q95.975 * -100000, 6)Por lo tanto, teniendo una cartera de \(\$100000\) a un nivel de confianza de \(95\%\), se puede decir que la máxima perdida media esperada será de 314.073 dólares y las perdidas maximas se pueden desviar más o menos de la perdida máxima media esperada en 21.306 dólares; además, la perdida máxima esperada con el nivel de confianza mencionado (\(95\%\)) esta entre 356.928 y 274.165 dólares.
Primero, se hallan y se exponen los resultados al ejecutar las funciones de media (mean()), desviación estándar (sd()) y los intervalos de confianza de \(0.025\) y \(0.975\) aplicando la función quantile().
## [1] -0.00246
## [1] 0.000173
## 2.5%
## -0.0028
## 97.5%
## -0.00213
Sin embargo, no se puede usar los datos directamente, a pesar ya de ser valores discretos pero se debe de analizar usando valores en unidades monetarias, por lo cual se volverán en valores monetarios como se logra ver en el siguiente código, multiplicando el parámetro con la cantidad de nuestra cartera que es \(\$100000\) pero con un signo negativo pues para fines de poder describir los tiene más sentido utilizar valores positivos:
m.m90 <- round(m.90 * -100000, 6)
m.s90 <- round(s.90 * 100000, 6)
m.q90.025 <- round(q90.025 * -100000, 6)
m.q90.975 <- round(q90.975 * -100000, 6) Por lo tanto, teniendo una cartera de \(\$100000\) a un nivel de confianza de \(90\%\), se puede decir que la máxima perdida media esperada será de 245.512 dólares y las perdidas máximas se pueden desviar más o menos de la perdida máxima media esperada en 17.291 dólares; además, la perdida máxima esperada con el nivel de confianza mencionado (\(90\%\)) está entre 507.488 y 374.005 dólares.