Introducción

Las técnicas de simulación suponen una herramienta de alto valor para el análisis prospectivo, puesto que permiten modelar el comportamiento de sistemas complejos y analizar diferentes escenarios y políticas en un entorno simulado (Pérez, 2023). La simulación implica la construcción de un modelo que representa, por un lado, las variables y relaciones importantes de un sistema y, por otro lado, la realización de simulaciones para observar cómo se comporta el sistema en diferentes situaciones (Pérez, 2023).

Entre las diferentes tecnicas de simulación existentes, se encuentra la simulación de Montecarlo. Este método fue inventado por John von Neumann y Stanislaw Ulam durante la Segunda Guerra Mundial para mejorar la toma de decisiones en condiciones de incertidumbre y tiene el nombre de un conocido barrio de Mónaco célebre por su casino, ya que el elemento de la suerte es la base del enfoque de modelado, similar a un juego de ruleta (Pérez, 2023; Ibm.com, s. f.).

La simulación de Montecarlo es una técnica matemática que se utiliza para estimar los posibles resultados de un suceso incierto (Ibm.com, s. f.). Para ello, crea un modelo de resultados posibles aprovechando una distribución de probabilidad, por ejemplo, una distribución uniforme o normal, para cualquier variable que tenga una incertidumbre inherente. A continuación, vuelve a calcular los resultados repetidamente, utilizando cada vez un conjunto diferente de números aleatorios entre los valores mínimo y máximo (Ibm.com, s. f.). En definitiva, este método se basa en la generación de un gran número de muestras aleatorias y en la utilización de técnicas estadísticas para analizar y resumir los resultados obtenidos (Pérez, 2023).

Esta técnica es muy útil para el análisis de riesgos y la toma de decisiones en condiciones de incertidumbre. En un contexto empresarial, se puede aplicar para realizar proyecciones financieras y evaluar el riesgo asociado con diferentes escenarios. Por ejemplo, una empresa de inversión podría usar la simulación de Montecarlo para modelar el rendimiento de una cartera de inversiones en diferentes condiciones económicas, lo que les permitiría evaluar el riesgo y tomar decisiones informadas (Pérez, 2023).

Por su parte, se presenta el Movimiento Browniano Geométrico (MBG), un proceso aleatorio que describe el comportamiento de ciertas variables aleatorias a medida que se desplazan en el tiempo y se utiliza frecuentemente en los modelos financieros para describir la evolución de los precios a lo largo del tiempo (Moreno C., S. f.). Cuando se aplica a los precios, el movimiento browniano da por supuesto que el cambio de un período de tiempo al siguiente no está relacionado ni con el nivel de precios ni con las series pasadas de cambios de precio. Es decir, cada cambio de precio es independiente de los cambios de precio anteriores y la volatilidad de los cambios de precio es constante (Moreno C., S. f.).

Para la simulación del precio de acciones es común suponer que estas siguen un paseo aleatorio, el cual puede ser representado con un proceso estocástico Browniano geométrico.

El presente trabajo tiene como finalidad simular el precio de las acciones de una empresa y, para ello, se va a proceder a modelizar el Movimiento Browniano Geométrico por el método de Montecarlo. Para ello, se obtiene la serie temporal de los precios diarios comprendida entre el día 06/06/2022 y el 02/06/2023 a la que llamaremos serie real y a partir de la cual se obtienen los valores para crear las simulaciones posteriores. De esta manera, una vez dibujadas las series simuladas, se compararán con la serie real. Posteriormente, se lleva a cabo la técnica VaR para medir los posibles riesgos de sufrir una pérdida monetaria, utilizando el método de Montecarlo a partir de las simulaciónes creadas basadas en el Movimiento Browniano Geométrico.

Cabe tener en cuenta que es muy dificil predecir con exactitud cualquier movimiento en la bolsa de valores, pero si utilizamos una simulación de Montecarlo podríamos obtener una aproximación del comportamiento de los activos financieros según diferentes situaciones, generando múltiples escenarios que podríamos entrar a valorar y estudiar (Software DELSOL, 2020). Es por ello que, en el presente trabajo, se crean las simulaciones en un periodo del pasado partiendo de un día incial, con el fin de comparar el grado de acierto de estas con respecto a la evolución real de los activos financieros.

Carga de las librerias

librerias <- c("tidyverse", "readxl","data.table",
               "knitr", "tables", "kableExtra",
               "moments", "ggplot2", "LSMRealOptions")

for (pkg in librerias)
  {
  if (!(pkg %in% installed.packages()))
      install.packages(pkg, repos = "http://cran.r-project.org")
 
  library(pkg, character.only = TRUE)
}

1- Descarga de la serie de precios diarios.

Se ha descargado la serie de precios diarios de las acciones de una de las empresas del IBEX35 del último año, en concreto, de la empresa Grifols, S.A.

Url para acceder a los datos: https://es.finance.yahoo.com/quote/GRF.MC?p=GRF.MC&.tsrc=fin-srch

Datos:

grifols <- structure(list(Date = structure(c(1654473600, 1654560000, 1654646400, 
1654732800, 1654819200, 1655078400, 1655164800, 1655251200, 1655337600, 
1655424000, 1655683200, 1655769600, 1655856000, 1655942400, 1656028800, 
1656288000, 1656374400, 1656460800, 1656547200, 1656633600, 1656892800, 
1656979200, 1657065600, 1657152000, 1657238400, 1657497600, 1657584000, 
1657670400, 1657756800, 1657843200, 1658102400, 1658188800, 1658275200, 
1658361600, 1658448000, 1658707200, 1658793600, 1658880000, 1658966400, 
1659052800, 1659312000, 1659398400, 1659484800, 1659571200, 1659657600, 
1659916800, 1660003200, 1660089600, 1660176000, 1660262400, 1660521600, 
1660608000, 1660694400, 1660780800, 1660867200, 1661126400, 1661212800, 
1661299200, 1661385600, 1661472000, 1661731200, 1661817600, 1661904000, 
1661990400, 1662076800, 1662336000, 1662422400, 1662508800, 1662595200, 
1662681600, 1662940800, 1663027200, 1663113600, 1663200000, 1663286400, 
1663545600, 1663632000, 1663718400, 1663804800, 1663891200, 1664150400, 
1664236800, 1664323200, 1664409600, 1664496000, 1664755200, 1664841600, 
1664928000, 1665014400, 1665100800, 1665360000, 1665446400, 1665532800, 
1665619200, 1665705600, 1665964800, 1666051200, 1666137600, 1666224000, 
1666310400, 1666569600, 1666656000, 1666742400, 1666828800, 1666915200, 
1667174400, 1667260800, 1667347200, 1667433600, 1667520000, 1667779200, 
1667865600, 1667952000, 1668038400, 1668124800, 1668384000, 1668470400, 
1668556800, 1668643200, 1668729600, 1668988800, 1669075200, 1669161600, 
1669248000, 1669334400, 1669593600, 1669680000, 1669766400, 1669852800, 
1669939200, 1670198400, 1670284800, 1670371200, 1670457600, 1670544000, 
1670803200, 1670889600, 1670976000, 1671062400, 1671148800, 1671408000, 
1671494400, 1671580800, 1671667200, 1671753600, 1672099200, 1672185600, 
1672272000, 1672358400, 1672617600, 1672704000, 1672790400, 1672876800, 
1672963200, 1673222400, 1673308800, 1673395200, 1673481600, 1673568000, 
1673827200, 1673913600, 1.674e+09, 1674086400, 1674172800, 1674432000, 
1674518400, 1674604800, 1674691200, 1674777600, 1675036800, 1675123200, 
1675209600, 1675296000, 1675382400, 1675641600, 1675728000, 1675814400, 
1675900800, 1675987200, 1676246400, 1676332800, 1676419200, 1676505600, 
1676592000, 1676851200, 1676937600, 1677024000, 1677110400, 1677196800, 
1677456000, 1677542400, 1677628800, 1677715200, 1677801600, 1678060800, 
1678147200, 1678233600, 1678320000, 1678406400, 1678665600, 1678752000, 
1678838400, 1678924800, 1679011200, 1679270400, 1679356800, 1679443200, 
1679529600, 1679616000, 1679875200, 1679961600, 1680048000, 1680134400, 
1680220800, 1680480000, 1680566400, 1680652800, 1680739200, 1681171200, 
1681257600, 1681344000, 1681430400, 1681689600, 1681776000, 1681862400, 
1681948800, 1682035200, 1682294400, 1682380800, 1682467200, 1682553600, 
1682640000, 1682985600, 1683072000, 1683158400, 1683244800, 1683504000, 
1683590400, 1683676800, 1683763200, 1683849600, 1684108800, 1684195200, 
1684281600, 1684368000, 1684454400, 1684713600, 1684800000, 1684886400, 
1684972800, 1685059200, 1685318400, 1685404800, 1685491200, 1685577600, 
1685664000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    Close = c(19.110001, 19.16, 19.059999, 18.629999, 18.245001, 
    17.799999, 17.615, 17.809999, 17.584999, 17.9, 18.5, 18.424999, 
    18.07, 18.615, 18.530001, 19.155001, 19.379999, 16.99, 18.035, 
    18.635, 17.834999, 17.559999, 16.945, 16.965, 16.9, 17.07, 
    16.73, 16.275, 15.44, 15.98, 16.195, 16.295, 16.190001, 16.280001, 
    16.434999, 16.094999, 16.424999, 16.315001, 14.57, 14.22, 
    13.46, 13.095, 13.38, 14.085, 14.075, 13.95, 14, 13.72, 13.84, 
    13.755, 13.78, 13.795, 13.555, 13.315, 13.22, 13.165, 12.75, 
    12.735, 12.77, 12.42, 12.105, 12.08, 12.045, 11.625, 11.82, 
    11.505, 11.45, 11.42, 11.87, 12.47, 12.47, 12.515, 12.185, 
    12.05, 11.755, 11.685, 11.79, 11.52, 10.88, 10.025, 10.09, 
    9.588, 9.082, 8.834, 8.882, 8.978, 9, 8.568, 8.712, 8.518, 
    8.52, 8.582, 8.284, 8.248, 8.316, 8.58, 8.642, 8.38, 8.574, 
    8.132, 8.116, 8.374, 8.696, 8.4, 8.41, 8.606, 8.908, 8.766, 
    8.664, 8.852, 9.186, 9.728, 9.588, 9.812, 10.235, 10.685, 
    10.285, 9.916, 9.738, 9.73, 10, 10.14, 10.35, 10.405, 10.335, 
    10.18, 9.944, 10.155, 10.55, 10.615, 11, 10.44, 10.29, 9.978, 
    10.19, 10.03, 10.545, 10.825, 10.73, 10.395, 10.17, 10.15, 
    10.665, 10.775, 10.905, 10.65, 10.635, 10.93, 10.77, 11.225, 
    11.5, 11.8, 11.575, 11.78, 11.9, 11.675, 12.15, 12.145, 12.47, 
    12.54, 12.215, 12.36, 12.06, 12.14, 12.225, 12.21, 12.365, 
    12.56, 12.525, 12.195, 12.125, 12.14, 13.265, 13.645, 13.53, 
    13.875, 14.27, 13.925, 13.61, 13.355, 13.55, 13.585, 13.92, 
    14.28, 14.2, 14.355, 12.84, 12.9, 12.605, 12.685, 11.535, 
    11.635, 11.51, 11.36, 10.95, 10.915, 10.625, 10.315, 10.265, 
    10.005, 10.06, 9.474, 8.956, 8.8, 8.412, 8.882, 8.648, 9.018, 
    8.702, 9.042, 8.934, 8.894, 9.15, 9.108, 9.08, 8.918, 9.036, 
    9.24, 9.34, 9.462, 9.566, 9.39, 9.526, 9.35, 9.422, 9.332, 
    9.444, 9.36, 9.128, 9.01, 9.058, 9.32, 9.124, 8.964, 8.964, 
    9.5, 9.528, 10.42, 10.68, 11.02, 11.11, 11.34, 11.195, 11.005, 
    11.205, 11.515, 11.71, 11.565, 11.175, 11.18, 11.345, 11.505, 
    11.265, 10.845, 10.845, 11.55)), class = c("tbl_df", "tbl", 
"data.frame"), row.names = c(NA, -256L))

Los datos, del últmimo año, comprenden desde el día 06/06/2022 hasta el día 02/06/2023.

Se cargan los datos y se convierte la columna que contiene los precios de cierre Close en una serie temporal.

grifols <- read_excel("GRF.xlsx")
precios<- ts(grifols$Close,start = c(2022-06-06,1),frequency=365)
ggplot(grifols, aes(x=Date)) + 
  geom_line(aes(y = Close), color = "steelblue")+
  xlab("Fecha") + ylab("Precio") +
  labs(title = "Precios Grifols,S.A. (06/06/2022 - 02/06/2023)") +
  theme_classic()

2- Cálculo de \(\Delta S_i\) y de \(\frac{\Delta S_i}{S_i}\)

Se calculan los incrementos \(\Delta S_i = S_{i+1}-S_i\) a partir de los valores del precio de la acción al cierre (\(S_i \equiv\) precio al cierre dia i). Dividiendo por \(S_i\) se obtienen los retornos \(\frac{\Delta S_i}{S_i}\) de la muestra.

Para ello, se hace un bucle for en el que se calculan los datos \(\frac{\Delta S_i}{S_i}\) y se almacenan en un objeto que se llama s

s<-0
n<-grifols$Close
for (i in 1:(length(n) - 1)) {
  s[i] <- (n[i + 1]-n[i])/n[i]
}

Se convierte la variable s en un dataframe y se añade una columna con las fechas para dar contexto a los valores calculados. Además, la última observación devuelve un NA, ya que no se puede calcular el incremento al no haber un precio \(S_{i+1}\) por lo que se elimina dicha observación y dibujamos las variaciones porcentuales obtenidas.

ds<-as.data.frame(s)
ds<-ds%>%
  filter(!is.na(ds) == TRUE )
date<-grifols$Date[-256]
retornos<-cbind(date,ds)

ggplot(retornos, aes(x=date)) + 
  geom_line(aes(y = s), color="steelblue") +
  xlab("Fecha") + ylab("s") +
  labs(title = "Retornos Grifols,S.A. (06/06/2022 - 02/06/2023)") +
  theme_bw()

También se podría haber calculado \(\frac{\Delta S_i}{S_i}\) a partir de las diferencias de la serie de datos con logaritmo. Ya que \(\Delta\log (S)= \frac{\Delta S}{S}\). De esta manera, solo es necesaria una línea de código usando la función diff:

ret<-diff(log(precios)) # deltaS/S

Si se juntan las variaciones porcentuales obtenidas de las dos maneras en un dataframe y se dibujan en el mismo gráfico, se observa que estas se superponen, dan exactamente el mismo resultado.

deltaS_S<-as.data.frame(ret)
colnames(deltaS_S)<-"deltaS_S"
rets<-cbind(retornos,deltaS_S)

rets <- rets %>%
  select(date, deltaS_S, s) %>%
  gather(key = "variable", value = "value", -date)


ggplot(rets, aes(x = date, y = value)) + 
  geom_line(aes(color = variable, linetype = variable)) + 
  scale_color_manual(values = c("darkred", "steelblue"))+
  xlab("Fecha") + ylab("Retornos") +
  labs(title = "Retornos Grifols,S.A. (06/06/2022 - 02/06/2023)") +
  theme_bw()

3- Cálculo de los estimadores \(\overline{\mu}\) y \(\overline{\sigma}\)

Se calculan los estimadores \(\overline{\mu}\) y \(\overline{\sigma}\) de las fórmulas anteriores.

3.1- Estimación de \(\overline{\mu}\)

Partiendo de la fórmula \(\overline{\mu} \Delta t = \frac{1}{n} \sum \frac{\Delta S_i}{S_i}\) es posible obtener \(\overline{\mu} \Delta t\) a partir de la media de \(\frac{\Delta S_i}{S_i}\) obtenida en el apartado anterior y, dividiendo por \(\Delta t\), se obtiene \(\overline{\mu}\).

DeltaT <- 1/256 # considerando 256 dias laborables (los dias que tiene la serie)
muDeltaT <- mean(ret)
(mu<- muDeltaT/DeltaT)
## [1] -0.505501

El resultado obtenido es una media negativa, concretamente, -0.505501.

3.2- Estimación de \(\overline{\sigma}\)

Partiendo de la fórmula \(\overline{\sigma}^2 \Delta t = \frac{1}{(n-1)} \sum (\frac{\Delta S_i}{S_i}-\overline{\mu} \Delta t)^2, \Delta S_i=S_{i+1}-S_i\) se calcula la varianza y a continuación, se obtiene la desviación típica \(\overline{\sigma}\) a partir de la raíz cuadrada de la varianza:

(sigma<- sqrt(var(ret)/DeltaT))
## [1] 0.4789486

El resultado obtenido es una desviación típica de 0.4789486.

4- Series temporales usando un MBG

Con los valores estimados para \(\overline{\mu}\) y \(\overline{\sigma}\) se dibujan algunas series temporales para la acción, usando el modelo browniano geométrico, es decir, \(\Delta S_i= S_i(\overline{\mu}\Delta t + \overline{\sigma}\Delta w)\) con \(S_0\) el valor inicial de la serie real, y se comparan las series generadas con la real.

4.1- Representación series temporales.

Se declara la variable \(\Delta w\) que sigue una distribución normal con media cero y sigue una derviación estándar \(\sqrt{\Delta t}\). Con los demás valores, calculados previamente, se crea una función y se dibujan las diferentes simulaciones partiendo de \(S_0\). Para obtener las mismas simulaciones se fija una semilla con el comando set.seed().

s0<-precios[1] # el valor inicial de la acción (en €)
DeltaW <- rnorm(1, 0, sqrt(DeltaT)) 

set.seed(17)

generate_random_process <- function(days, initial_S_value = s0) {
  df <- data.frame(t=0, Svalue=initial_S_value, DeltaW=0)
  S <- initial_S_value
  for (i in 1:days) {
    df[i, 1] <- i/260
    df[i, 2] <- S 
    DeltaW <- rnorm(1, 0, sqrt(DeltaT))
    S <- S + S*(mu*DeltaT + sigma*DeltaW)
    df[i, 3] <- DeltaW
  }
  return (df)
}

# pintamos varias series temporales juntas y agregamos una variable con las fechas para dar contexto.
days <- 255 # pintamos hasta 255 dias
Tf <- 256 # tiempo final en años
sim1 <- cbind(date,generate_random_process(days))
sim2 <- cbind(date,generate_random_process(days))
sim3 <- cbind(date,generate_random_process(days))


ggplot() +
  geom_line(data=sim1, aes(x=date, y=Svalue),col="red") + 
  geom_line(data=sim2, aes(x=date, y=Svalue),col="green") + 
  geom_line(data=sim3, aes(x=date, y=Svalue),col="blue") +
  xlab("Tiempo") + ylab("Precio de la acción") +
  labs(title = "Representación series temporales (1 año)") +
  theme_classic()

4.2- Comparación con la serie real.

Es posible dibujar de nuevo las series temporales obtenidas utilizando el modelo browniano geométrico (representadas en líneas discontinuas de colroes) junto con la serie para la acción real (representada de color negro):

ggplot() +
  geom_line(data=sim1, aes(x=date, y=Svalue),col="red", linetype = "longdash") + 
  geom_line(data=sim2, aes(x=date, y=Svalue),col="green", linetype = "longdash") + 
  geom_line(data=sim3, aes(x=date, y=Svalue),col="blue", linetype = "longdash") +
  geom_line(data=grifols, aes(x=Date, y=Close),col="black", lwd=1) +
  xlab("Tiempo") + ylab("Precio de la acción") +
  labs(title = "Series temporales vs real (1 año)") +
  theme_classic()

Se puede apreciar que, a simple vista, las series temporales y la real tienen trayectorias similares. También se puede calcular los valores de \(\overline{\mu}\) y de \(\overline{\sigma}\) para las diferentes series obtenidas y comparar dichos valores:

DeltaT <- 1/260 # considerando 260 dias laborables (los dias que tiene la serie)

# Simulación 1
retSim1<-diff(log(sim1$Svalue))
muDeltaTsim1 <- mean(retSim1)
muSim1<- muDeltaTsim1/DeltaT
sigmaSim1<- sqrt(var(retSim1)/DeltaT)

# Simulación 2
retSim2<-diff(log(sim2$Svalue))
muDeltaTsim2 <- mean(retSim2)
muSim2<- muDeltaTsim2/DeltaT
sigmaSim2<- sqrt(var(retSim2)/DeltaT)

# Simulación 3
retSim3<-diff(log(sim3$Svalue))
muDeltaTsim3 <- mean(retSim3)
muSim3<- muDeltaTsim3/DeltaT
sigmaSim3<- sqrt(var(retSim3)/DeltaT)

col1<-cbind(mu,muSim1,muSim2,muSim3)
col2<-cbind(sigma,sigmaSim1,sigmaSim2,sigmaSim3)

tabla<-rbind(col1,col2)
rownames(tabla) <- c("mu", "sigma")
colnames(tabla) <- c("Serie real", "Serie 1", "Serie 2","Serie 3")

kbl(tabla) %>%
  kable_styling(c("striped","bordered"))%>%
  column_spec(1:5, bold = T)%>%
  add_header_above(c("COMPARACIÓN SERIES GENERADAS CON LA REAL" = 5),background = "blue",color = "white")
COMPARACIÓN SERIES GENERADAS CON LA REAL
Serie real Serie 1 Serie 2 Serie 3
mu -0.5055010 -0.8204317 -0.7052277 -0.5083458
sigma 0.4789486 0.5191530 0.5201990 0.4701963

Si se comparan los valores de \(\overline{\mu}\) y de \(\overline{\sigma}\) que toman las series generadas usando el Movimiento Browniano Geométrico y la serie real, se observa que la serie 3, representada en color azul en el gráfico, es la que más se asemeja a la real.

Es posible crear y representar miles de simulaciones, pero para ello resulta más conveniente la utilización de otros métodos que permitan agilizar esta tarea, como por ejemplo, el método de Montecarlo.

5- Método de Montecarlo usando un MBG

A continuación se procede a emplear el método de Montecarlo para crear y representar numerosas simulaciones a la vez. En concreto, simular el precio de la acción para un total de 255 días (los que abarca nuestra serie temporal) utilizando un Movimiento Browniano Geométrico.

Para crear diferentes siumlaciones meidante el método de Montecarlo, primero se asignan las variables necesarias, las cuales son recuperadas de los apartados anteriores, y se crea una matriz en la que almacenar la simulación. En el cálculo del Movimiento Browiano Geométrico se utiliza la media y la varianza de los retornos continuos. En este caso, se va a realizar 10000 simulaciones.

Posteriormente, se hace uso de un bucle for que calculará el precio de la acción para cada día a partir del proceso del Movimiento Browniano Geométrico que viene dado por la siguiente fórmula:

set.seed(254)
nsim <- 10000
S0 <- s0
mu <- mu
sigma <- sigma
t = 255
gbm <- matrix(ncol = nsim, nrow = t)


for (simu in 1:nsim) {
        for (day in 2:t) {
                epsilon <- rnorm(t)
                dt = 1 / t
                gbm[1, simu] <- S0
                gbm[day, simu] <- exp((mu - sigma^2 / 2) * dt + sigma * epsilon[day] * sqrt(dt))
        }
}
gbm <- apply(gbm, 2, cumprod)


date<-grifols$Date[-256]
fechas<- as.data.frame(date)


gbm_df <-cbind(fechas, gbm)

ggplot(tidyr::pivot_longer(gbm_df,-date),aes(date, value, color = name))+
  geom_line()+
  xlab("Fecha") + ylab("Precio de la acción") +
  labs(title = "Simulación de Montecarlo: Movimiento Browniano Geométrico") +
  theme_classic()+
   theme(legend.position="none")

El gráfico muestra las 10000 simulaciones para el precio de la acción. ggplot2prefiere los datos en formato largo, por lo que usamos la función pivot_longer de la librería tidyr. Una de las características del Movimiento Browniano Geométrico es que la volatilidad es proporcional a la S, lo que garantiza que el precio de las acciones nunca será negativo. En el gráfico se observa como a medida que el precio de las acciones cae, su variación disminuye, de manera que disminuyen los movimientos descendientes evitando que el precio alcance valores negativos.

Es posible añadir la serie real al gráfico anterior.

set.seed(254)
nsim <- 10000
S0 <- s0
mu <- mu
sigma <- sigma
t = 255
gbm <- matrix(ncol = nsim, nrow = t)


for (simu in 1:nsim) {
        for (day in 2:t) {
                epsilon <- rnorm(t)
                dt = 1 / t
                gbm[1, simu] <- S0
                gbm[day, simu] <- exp((mu - sigma^2 / 2) * dt + sigma * epsilon[day] * sqrt(dt))
        }
}
gbm <- apply(gbm, 2, cumprod)



date<-grifols$Date[-256]
fechas<- as.data.frame(date)


gbm_df <-cbind(fechas, gbm)

ggplot(tidyr::pivot_longer(gbm_df,-date),aes(date, value, color = name))+
  geom_line()+
  geom_line(data=grifols, aes(x=Date, y=Close),col="black", lwd=1) +
  xlab("Fecha") + ylab("Precio de la acción") +
  labs(title = "Simulación de Montecarlo: Movimiento Browniano Geométrico") +
  theme_classic()+
   theme(legend.position="none")

Se puede apreciar que la mayoría de las simulaciones creadas, ubicadas en la franja de color más densa y rojiza, coinciden en cierta manera con la serie real.

6- VaR Montecarlo

El VaR o Valor en Riesgo es una técnica estadística para medir la probabilidad de sufrir un pérdida monetaria dado unos niveles de significación (Acuña, 2020).

Por su parte, el VaR Montecarlo es un método para estimar el VaR que utiliza un software informático para generar miles de posibles resultados según datos iniciales introducidos (Sevilla, 2016).

En línea con lo realizado en este trabajo, en este apartado se realiza un VaR Montecarlo a partir de las simulaciones creadas en el apartado anterior. Para ello, se hace el cálculo para un nivel de significación del 90%

set.seed(2106)

VAR <- numeric(length=nsim)
for (i in 1:nsim) {
  vec<-gbm[,i]
  sim.R <- diff(log(vec))
  sim.q <- quantile(sim.R, 0.10, na.rm = TRUE)
  sim.VAR <- exp(sim.q)-1
  VAR[i] <- sim.VAR
}

mean(VAR)
## [1] -0.03976408
sd(VAR)
## [1] 0.003061734

Se va a suponer que la inversión en este activo es de 100000 euros, por lo que multiplicando por este número, es posible obtener la media y la desviación típica en términos monetarios.

#Valores discretos

mean.monet<-c(mean(VAR)*100000)
sd.monet<-c(sd(VAR)*100000)
mean.monet
## [1] -3976.408
sd.monet
## [1] 306.1734

Los resultados muestran que, para un nivel de confianza del 90%, y asumiendo que el valor total es del activo es de 100000 euros, la mayor pérdida media esperada es de 3976.408€. Asimismo, la desviación típica es de 306.1734€.

VAR_DF <- as.data.frame(VAR)
 ggplot(VAR_DF, aes(x = VAR)) + 
  geom_histogram(aes(y = ..density..),
                 fill= "deepskyblue", colour="blue") +
    geom_density(color="red",lwd=1.5)+
    labs(title="Histograma y densidad ", x="Valores",y="Densidad") +
    theme_light()

A continuación se calculan los cuantiles 0.025 y 0.975

q.1.025<-quantile(VAR,0.025)
q.1.975<-quantile(VAR,0.975)

quantile.1.025<- c(q.1.025*100000)
quantile.1.97.5<- c(q.1.975*100000)

quantile.1.97.5
##     97.5% 
## -3383.722
quantile.1.025
##      2.5% 
## -4578.271

Los resultados indican que la pérdida máxima se encontraria entre los 3383.722€ y los 4578.271€.

Conclusión

El método de Montecarlo es una técnica de simulación de escenarios que se utiliza para la simulación de escenarios a partir de una distribución de probabilidad. Esta técnica se basa en la generación de un gran número de muestras aleatorias y utiliza técnias estadísticas para analizar y resumir los resultados obtenidos (Pérez, 2023).

A través del método de Montecarlo se pueden realizar miles de simulaciones y se puede aplicar en diferentes ámbitos como puede ser el económico-financiero. Por ejemplo, para modelizar el Movimiento Browniano Geométrico o para el análisis de riesgos VaR.

A pesar de que es difícil predecir con exactitud cualquier movimiento en la bolsa de valores,la simulación de Montecarlo puede ofrecer una aproximación del comportamiento de los activos financieros según diferentes situaciones, generando múltiples escenarios que podríamos entrar a valorar y estudiar (Software DELSOL, 2020).

Bibliografía

Pérez, V. (2023, 5 febrero). Tema 6. Técnicas de simulación. https://www.uv.es/pegivir/BIA_APSE_2223/tema6_web.html#pr%C3%A1ctica-3

Ibm.com (s. f.). ¿Qué es la simulación Montecarlo? Recuperado 3 de junio de 2023, de https://www.ibm.com/es-es/topics/monte-carlo-simulation

Software DELSOL. (2020, 6 julio). Simulación de Montecarlo. Sdelsol.com. https://www.sdelsol.com/glosario/simulacion-de-montecarlo/

Moreno, C. (S. f.). Wordpress.com. Recuperado 3 de junio de 2023, de https://unimorenocarlos.files.wordpress.com/2012/07/movimiento-geomc3a9trico-browniano.pdf

Acuña, E. (2020, 20 junio). VAR MONTECARLO- MBG. Rpubs.com. Recuperado 8 de junio de 2023, de https://rpubs.com/EsmeraldaAN/dos

Sevilla, A. (2016, 15 de junio). VaR por Montecarlo. Economipedia.com https://economipedia.com/definiciones/var-monte-carlo.html