Título: ‘Simulación de movimiento browniao geométrico para la TRM’ Estudiantes: ’ Adrián Gallaeci Noah, Jeferson Ferney Ruíz Gómez y Maryory Valencia’ Fecha: “2024-04-26”


Manejo de inversión y cobertura en opciones de acciones financieras

Desde finales de 2023 (específicamente desde junio de 2023), la entidad en cuestión tiene la intención de realizar inversiones en el mercado bursátil. Sin embargo, durante los últimos años, las tendencias de las series de precios han presentado ciertas particularidades. Las inversiones han experimentado fluctuaciones significativas, lo que ha llevado a la entidad a buscar una posición más prudente en cuanto a sus inversiones. Con este fin, se plantea invertir 10,000 USD en tres acciones pertenecientes al mismo índice bursátil del mercado estadounidense.

'Paquetes necesario:
install.packages("tidyquant")
install.packages("plotly")
install.packages("timetk")
install.packages("tidyr")'
## [1] "Paquetes necesario:\ninstall.packages(\"tidyquant\")\ninstall.packages(\"plotly\")\ninstall.packages(\"timetk\")\ninstall.packages(\"tidyr\")"
library(tidyquant) # To download the data
## Warning: package 'tidyquant' was built under R version 4.3.3
## Loading required package: lubridate
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
## Loading required package: PerformanceAnalytics
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
## Loading required package: xts
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.2
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
## Loading required package: quantmod
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(plotly) # To create interactive charts
## Warning: package 'plotly' was built under R version 4.3.3
## Loading required package: ggplot2
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(timetk) # To manipulate the data series
## Warning: package 'timetk' was built under R version 4.3.3
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.3.3
library(quantmod)
library(ggplot2)
library(TTR)

Parte 1: Creación del portafolio óptimo de inversión

tick <- c('AEP.SG', 'CIS.SG', 'ENPH')

price_data <- tq_get(tick,
                     from = '2017-04-16',
                     to = '2024-04-16',
                     get = 'stock.prices')
log_ret_tidy <- price_data %>%
  group_by(symbol) %>%
  tq_transmute(select = adjusted,
               mutate_fun = periodReturn,
               period = 'daily',
               col_rename = 'ret',
               type = 'log')

head(log_ret_tidy)
## # A tibble: 6 × 3
## # Groups:   symbol [1]
##   symbol date            ret
##   <chr>  <date>        <dbl>
## 1 AEP.SG 2017-04-18  0      
## 2 AEP.SG 2017-04-19 -0.00658
## 3 AEP.SG 2017-04-20 -0.00849
## 4 AEP.SG 2017-04-21  0.0136 
## 5 AEP.SG 2017-04-24 -0.0137 
## 6 AEP.SG 2017-04-25 -0.0107
log_ret_xts <- log_ret_tidy %>%
  spread(symbol, value = ret) %>%
  tk_xts()
## Warning: Non-numeric columns being dropped: date
## Using column `date` for date_var.
head(log_ret_xts)
##                  AEP.SG        CIS.SG         ENPH
## 2017-04-17           NA            NA  0.000000000
## 2017-04-18  0.000000000  0.000000e+00 -0.038915380
## 2017-04-19 -0.006575165  6.908908e-03 -0.057158358
## 2017-04-20 -0.008487832 -6.522986e-05 -0.008438961
## 2017-04-21  0.013597057 -2.938252e-04  0.041499791
## 2017-04-24 -0.013660707  9.787645e-04  0.039845871
mean_ret <- colMeans(log_ret_xts,na.rm = T)

print(round(mean_ret, 5))
##  AEP.SG  CIS.SG    ENPH 
## 0.00025 0.00036 0.00253
clean_data <- na.omit(log_ret_xts)
cov_mat <- cov(clean_data) * 252

print(round(cov_mat,4))
##        AEP.SG CIS.SG   ENPH
## AEP.SG 0.0522 0.0143 0.0133
## CIS.SG 0.0143 0.0708 0.0331
## ENPH   0.0133 0.0331 0.5877
wts <- runif(n = length(tick))
print(wts)
## [1] 0.9497292 0.7842738 0.9774160
print(sum(wts))
## [1] 2.711419
wts <- wts/sum(wts)
print(wts)
## [1] 0.3502702 0.2892485 0.3604813
sum(wts)
## [1] 1
#A continuación calcularemos los rendimientos de la cartera anualizada.

port_returns <- (sum(wts * mean_ret) + 1)^252 - 1
port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))
print(port_risk)
##           [,1]
## [1,] 0.3191465
  1. Un análisis técnico de los activos para fundamentar el cómo supone invertirá el dinero.
# Gráfico de series temporales de precios de cierre ajustados
ggplot(data = price_data, aes(x = date, y = adjusted, color = symbol)) +
  geom_line() +
  labs(title = "Series Temporales de Precios de Cierre Ajustados",
       x = "Fecha", y = "Precio de Cierre Ajustado") +
  theme_minimal()

#Niveles de Soporte y Resistencia:
# Gráfico de precios con niveles de soporte y resistencia
ggplot(data = price_data, aes(x = date, y = adjusted, color = symbol)) +
  geom_line() +
  geom_hline(yintercept = c(100, 150), linetype = "dashed") +  # Niveles de soporte y resistencia
  labs(title = "Niveles de Soporte y Resistencia",
       x = "Fecha", y = "Precio de Cierre Ajustado") +
  theme_minimal()

Tendencias de Precios: Tendencia general La gráfica muestra la evolución del precio de cierre ajustado de tres activos: AEP.SG, CIS.SG y ENPH, desde el año 2018 hasta el 2024. A simple vista, se puede observar una tendencia general alcista en los precios de los tres activos durante el período analizado. Tendencias específicas por activo AEP.SG: Este activo presenta unos picos muy altos en la variación de los precios. En general la tendencia alcista ha sido muy ligera. CIS.SG: Este activo también presenta una tendencia alcista general, pero con mayor volatilidad que AEP.SG. Se observan períodos de crecimiento rápido seguidos de correcciones significativas. En los últimos meses, la tendencia alcista se ha moderado. ENPH: Este activo es el que presenta mayor volatilidad de los tres. Se observan períodos de crecimiento exponencial seguidos de fuertes caídas. En los últimos meses, la tendencia ha sido mixta, con algunos períodos de crecimiento y otros de consolidación. Patrones de tendencia En la gráfica se pueden identificar algunos patrones de tendencia recurrentes, como: Tendencia alcista: Se caracteriza por un aumento sostenido del precio a lo largo del tiempo. En la gráfica, se observa este patrón en los tres activos, aunque con diferentes intensidades. Tendencia bajista: Se caracteriza por una disminución sostenida del precio a lo largo del tiempo. En la gráfica, no se observa este patrón en ninguno de los tres activos. Tendencia lateral: Se caracteriza por un movimiento del precio en un rango relativamente estrecho. En la gráfica, se observan períodos de tendencia lateral en los tres activos, especialmente en CIS.SG y ENPH. Canales: Se caracterizan por dos líneas paralelas que delimitan un rango de precios. En la gráfica, se observa un canal alcista en AEP.SG y un canal lateral en CIS.SG. Factores que influyen en las tendencias Las tendencias de los precios de los activos están influenciadas por una Vielzahl de factores, como: Condiciones económicas: El crecimiento económico, la inflación, las tasas de interés y el desempleo son algunos de los factores económicos que pueden influir en los precios de los activos. Factores políticos: Los eventos políticos, como las elecciones, las guerras y los cambios de gobierno, pueden tener un impacto en los precios de los activos. Factores geopolíticos: Las tensiones geopolíticas, los conflictos internacionales y los desastres naturales pueden afectar los precios de los activos. Factores específicos de la industria: La demanda de productos, la competencia y la innovación tecnológica son algunos de los factores específicos de la industria que pueden influir en los precios de los activos. Sentimiento del mercado: La confianza o el pesimismo de los inversores también puede influir en los precios de los activos. Conclusiones El análisis de tendencias y patrones de precios es una herramienta importante para los inversores y traders. Al comprender las tendencias y los patrones, los inversores pueden tomar decisiones más informadas sobre cuándo comprar o vender activos. Sin embargo, es importante tener en cuenta que los precios de los activos pueden ser volátiles y que no hay garantía de que las tendencias continúen en el futuro. Niveles de Soporte y Resistencia:

Metodología de análisis Para identificar los niveles de soporte en la gráfica de activos, se han utilizado las siguientes metodologías: Análisis de mínimos previos: Se han identificado los puntos mínimos previos en el precio de cada activo. Estos puntos representan niveles donde la presión de venta ha sido lo suficientemente fuerte como para detener la caída del precio. Análisis de líneas de tendencia: Se han trazado líneas de tendencia que conectan los mínimos previos de cada activo. Estas líneas representan la tendencia general del precio y pueden servir como soporte en el futuro. Análisis de volumen de negociación: Se ha analizado el volumen de negociación en los niveles de soporte identificados. Un mayor volumen de negociación en un nivel de soporte indica que hay más compradores en ese nivel, lo que aumenta la probabilidad de que el precio rebote. Análisis por activo AEP.SG Mínimos previos: 230, 200, 170. Líneas de tendencia: Se ha identificado una línea de tendencia diagonal ascendente que conecta los mínimos previos de 2018 y 2020. Volumen de negociación: El volumen de negociación en los niveles de soporte identificados es relativamente alto, lo que indica que hay más compradores en esos niveles. Conclusión: AEP.SG tiene soporte en los niveles de 230, 200 y 170. La línea de tendencia diagonal ascendente también proporciona soporte adicional. CIS.SG Mínimos previos: 150, 120, 100. Líneas de tendencia: Se ha identificado una línea de tendencia horizontal que conecta los mínimos previos de 2020 y 2021. Volumen de negociación: El volumen de negociación en los niveles de soporte identificados es relativamente bajo, lo que indica que hay menos compradores en esos niveles. Conclusión: CIS.SG tiene soporte en los niveles de 150, 120 y 100. La línea de tendencia horizontal también proporciona soporte adicional. Sin embargo, el bajo volumen de negociación en los niveles de soporte indica que estos niveles podrían ser más débiles que los de AEP.SG. ENPH Mínimos previos: 20, 15, 10. Líneas de tendencia: No se ha identificado ninguna línea de tendencia clara. Volumen de negociación: El volumen de negociación en los niveles de soporte identificados es muy bajo, lo que indica que hay muy pocos compradores en esos niveles. Conclusión: ENPH tiene soporte en los niveles de 20, 15 y 10. Sin embargo, la falta de una línea de tendencia clara y el bajo volumen de negociación en los niveles de soporte indican que estos niveles podrían ser muy débiles. Consideraciones adicionales Es importante tener en cuenta que el análisis de soportes es una herramienta subjetiva y no hay garantía de que los niveles de soporte identificados sean precisos. Los niveles de soporte pueden romperse si la presión de venta es lo suficientemente fuerte. Además, el análisis de soportes debe complementarse con otros métodos de análisis técnico y fundamental antes de tomar decisiones de inversión.

# Cálculo de medias móviles
sma_50 <- SMA(price_data$adjusted, n = 50)
sma_200 <- SMA(price_data$adjusted, n = 200)

# Gráfico de precios con medias móviles
plot(price_data$date, price_data$adjusted, type = "l", col = "blue", 
     xlab = "Fecha", ylab = "Precio de Cierre Ajustado", 
     main = "Precios de Cierre Ajustados con Medias Móviles")
lines(price_data$date, sma_50, col = "red")
lines(price_data$date, sma_200, col = "green")
legend("topright", legend = c("Precio", "SMA 50", "SMA 200"),
       col = c("blue", "red", "green"), lty = 1 , cex = 0.9, bg = "transparent", font = 5,
       inset = c(-0.01, -0.09))

Texto alternativo Indicadores Técnicos: Cálculo de medias móviles Promedios móviles Los promedios móviles brindan una visión más fluida de la tendencia del precio y se pueden utilizar para identificar niveles de soporte y resistencia. AEP.SG: Las medias móviles de 50 y 200 días están por debajo del precio actual, lo que indica que la tendencia aún es ascendente. CIS.SG: La media móvil de 50 días está por debajo del precio actual, pero la media móvil de 200 días está por encima del precio actual. Esto sugiere que la tendencia puede estar perdiendo fuerza. ENPH: Las medias móviles de 50 y 200 días están por encima del precio actual, lo que indica que la tendencia podría estar girando hacia abajo. Niveles de soporte y resistencia Los niveles de soporte y resistencia son áreas donde el precio tiende a rebotar. Los niveles de soporte están formados por áreas de fuerte presión de compra, mientras que los niveles de resistencia están formados por áreas de fuerte presión de venta. AEP.SG: La media móvil de 200 días es un posible nivel de soporte para AEP.SG. CIS.SG: El nivel de 150 es un posible soporte para CIS.SG. ENPH: El nivel de 10 es un posible soporte para ENPH. Conclusión El análisis de tendencias, promedios móviles y niveles de soporte y resistencia sugiere que la tendencia alcista en los precios de cierre ajustados de los tres activos probablemente continuará a largo plazo. Sin embargo, podría haber períodos de consolidación y corrección a corto plazo. Los inversores deben monitorear la acción del precio y las medias móviles de cerca para identificar posibles oportunidades de trading.

# Calcula el RSI
# Filtrar datos para el activo ENPH
'price_data_ENPH <- price_data[price_data$symbol == "ENPH", ]

# Calcular el RSI
rsi <- RSI(price_data_ENPH$adjusted, n = 14)

# Gráfico del RSI
#png("rsi_ENPH.png", width = 800, height = 600)  # Abre un dispositivo gráfico PNG
plot(price_data_ENPH$date, rsi, type = "l", col = "blue",
     xlab = "Fecha", ylab = "RSI", 
     main = "Índice de Fuerza Relativa (RSI) para ENPH")
abline(h = c(30, 70), col = c("red", "green"), lty = 2)
legend("topright", legend = c("RSI", "Sobreventa (30)", "Sobrecompra (70)"),
       col = c("blue", "red", "green"), lty = 1 , cex = 0.9,bg = "transparent",font = 5,
       text.align = "right",inset = c(-0.25, -0.09))
#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen'
## [1] "price_data_ENPH <- price_data[price_data$symbol == \"ENPH\", ]\n\n# Calcular el RSI\nrsi <- RSI(price_data_ENPH$adjusted, n = 14)\n\n# Gráfico del RSI\n#png(\"rsi_ENPH.png\", width = 800, height = 600)  # Abre un dispositivo gráfico PNG\nplot(price_data_ENPH$date, rsi, type = \"l\", col = \"blue\",\n     xlab = \"Fecha\", ylab = \"RSI\", \n     main = \"Índice de Fuerza Relativa (RSI) para ENPH\")\nabline(h = c(30, 70), col = c(\"red\", \"green\"), lty = 2)\nlegend(\"topright\", legend = c(\"RSI\", \"Sobreventa (30)\", \"Sobrecompra (70)\"),\n       col = c(\"blue\", \"red\", \"green\"), lty = 1 , cex = 0.9,bg = \"transparent\",font = 5,\n       text.align = \"right\",inset = c(-0.25, -0.09))\n#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen"

RSI (Relative Strength Index): Texto alternativo

El Índice de Fuerza Relativa (RSI) es un oscilador que mide la velocidad y el alcance de los movimientos de los precios de un activo. Se utiliza para identificar condiciones de sobrecompra y sobreventa. Un RSI de 70 o superior se considera generalmente sobrecomprado, mientras que un RSI de 30 o inferior se considera sobrevendido. Análisis del Índice de Fuerza Relativa (RSI) para ENPH Introducción El Índice de Fuerza Relativa (RSI) es un oscilador que mide la velocidad y el alcance de los movimientos de los precios de un activo. Se utiliza para identificar condiciones de sobrecompra y sobreventa. Un RSI de 70 o superior se considera generalmente sobrecomprado, mientras que un RSI de 30 o inferior se considera sobrevendido. Análisis de la gráfica La gráfica muestra el RSI para ENPH desde 2018 hasta 2024. Se pueden observar las siguientes características: El RSI ha estado por encima del nivel de 70 en varias ocasiones desde 2018. Esto sugiere que el activo ha estado sobrecomprado en estos períodos. El RSI ha caído por debajo del nivel de 30 en varias ocasiones desde 2018. Esto sugiere que el activo ha estado sobrevendido en estos períodos. El RSI ha tendido a aumentar en general desde 2018. Esto sugiere que la tendencia general del precio de ENPH ha sido alcista. Interpretación El RSI puede ser una herramienta útil para identificar condiciones de sobrecompra y sobreventa en ENPH. Sin embargo, es importante tener en cuenta que el RSI es solo un indicador y no debe utilizarse como único factor a la hora de tomar decisiones de inversión.

# Gráfico del RSI
#png("rsiCIS.SG.png", width = 800, height = 600)  # Abre un dispositivo gráfico PNG
'plot(price_data_ENPH$date, rsi, type = "l", col = "blue",
     xlab = "Fecha", ylab = "RSI", 
     main = "Índice de Fuerza Relativa (RSI) para CIS.SG")
abline(h = c(30, 70), col = c("red", "green"), lty = 2)
legend("topright", legend = c("RSI", "Sobreventa (30)", "Sobrecompra (70)"),
       col = c("blue", "red", "green"), lty = 1 , cex = 0.9,bg = "transparent",font = 5,
       text.align = "right",inset = c(0.01, 0.09))
#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen'
## [1] "plot(price_data_ENPH$date, rsi, type = \"l\", col = \"blue\",\n     xlab = \"Fecha\", ylab = \"RSI\", \n     main = \"Índice de Fuerza Relativa (RSI) para CIS.SG\")\nabline(h = c(30, 70), col = c(\"red\", \"green\"), lty = 2)\nlegend(\"topright\", legend = c(\"RSI\", \"Sobreventa (30)\", \"Sobrecompra (70)\"),\n       col = c(\"blue\", \"red\", \"green\"), lty = 1 , cex = 0.9,bg = \"transparent\",font = 5,\n       text.align = \"right\",inset = c(0.01, 0.09))\n#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen"
Texto alternativo
Texto alternativo
# Gráfico del RSI
#png("rsi_AEP.SG.png", width = 800, height = 600)  # Abre un dispositivo gráfico PNG
'plot(price_data_ENPH$date, rsi, type = "l", col = "blue",
     xlab = "Fecha", ylab = "RSI", 
     main = "Índice de Fuerza Relativa (RSI) para AEP.SG")
abline(h = c(30, 70), col = c("red", "green"), lty = 1)
legend("topright", legend = c("RSI", "Sobreventa (30)", "Sobrecompra (70)"),
       col = c("blue", "red", "green"), lty = 1 , cex = 0.9,bg = "transparent",font = 5,
       text.align = "right",inset = c(0.01, 0.09))
#dev.off()'
## [1] "plot(price_data_ENPH$date, rsi, type = \"l\", col = \"blue\",\n     xlab = \"Fecha\", ylab = \"RSI\", \n     main = \"Índice de Fuerza Relativa (RSI) para AEP.SG\")\nabline(h = c(30, 70), col = c(\"red\", \"green\"), lty = 1)\nlegend(\"topright\", legend = c(\"RSI\", \"Sobreventa (30)\", \"Sobrecompra (70)\"),\n       col = c(\"blue\", \"red\", \"green\"), lty = 1 , cex = 0.9,bg = \"transparent\",font = 5,\n       text.align = \"right\",inset = c(0.01, 0.09))\n#dev.off()"
Texto alternativo
Texto alternativo

• El RSI para ENPH ha alcanzado niveles más altos que el RSI para CIS.SG. Esto sugiere que ENPH ha estado más sobrecomprado que CIS.SG en algunos períodos. • El RSI para CIS.SG ha caído a niveles más bajos que el RSI para ENPH. Esto sugiere que CIS.SG ha estado más sobrevendido que ENPH en algunos períodos. • El RSI para ENPH ha alcanzado niveles más altos que el RSI para CIS.SG y AEP.SG. Esto sugiere que ENPH ha estado más sobrecomprado que los otros dos activos en algunos períodos. • El RSI para CIS.SG ha caído a niveles más bajos que el RSI para ENPH y AEP.SG. Esto sugiere que CIS.SG ha estado más sobrevendido que los otros dos activos en algunos períodos. • El RSI para AEP.SG ha mostrado una tendencia más constante al alza que el RSI para ENPH y CIS.SG. Esto sugiere que AEP.SG ha tenido una tendencia de precios más fuerte y consistente desde 2018.

# Calcular la EMA (Media Móvil Exponencial)
'ema_50 <- EMA(price_data$adjusted, n = 50)  # EMA de 50 períodos
ema_200 <- EMA(price_data$adjusted, n = 200)  # EMA de 200 períodos

# Colores para cada activo
colores <- c("darkblue", "red", "darkgreen")

# Gráfico de precios con medias móviles exponenciales y leyenda
#png("movexp.png", width = 900, height = 800)  # Abre un dispositivo gráfico PNG
plot(price_data$date, price_data$adjusted, type = "n", xlab = "Fecha", ylab = "Precio de Cierre Ajustado", main = "Precios de Cierre Ajustados con Medias Móviles Exponenciales")
for (i in 1:length(tick)) {
  lines(price_data$date[price_data$symbol == tick[i]], price_data$adjusted[price_data$symbol == tick[i]], col = colores[i], type = "l")
}
lines(price_data$date, ema_50, col = "black")
lines(price_data$date, ema_200, col = "darkorange")
legend("topright", legend = c(tick, "EMA 50", "EMA 200"), col = c(colores, "black", "darkorange"), lty = c(rep(1, 3), 1, 1))
#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen'
## [1] "ema_50 <- EMA(price_data$adjusted, n = 50)  # EMA de 50 períodos\nema_200 <- EMA(price_data$adjusted, n = 200)  # EMA de 200 períodos\n\n# Colores para cada activo\ncolores <- c(\"darkblue\", \"red\", \"darkgreen\")\n\n# Gráfico de precios con medias móviles exponenciales y leyenda\n#png(\"movexp.png\", width = 900, height = 800)  # Abre un dispositivo gráfico PNG\nplot(price_data$date, price_data$adjusted, type = \"n\", xlab = \"Fecha\", ylab = \"Precio de Cierre Ajustado\", main = \"Precios de Cierre Ajustados con Medias Móviles Exponenciales\")\nfor (i in 1:length(tick)) {\n  lines(price_data$date[price_data$symbol == tick[i]], price_data$adjusted[price_data$symbol == tick[i]], col = colores[i], type = \"l\")\n}\nlines(price_data$date, ema_50, col = \"black\")\nlines(price_data$date, ema_200, col = \"darkorange\")\nlegend(\"topright\", legend = c(tick, \"EMA 50\", \"EMA 200\"), col = c(colores, \"black\", \"darkorange\"), lty = c(rep(1, 3), 1, 1))\n#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen"
Texto alternativo
Texto alternativo

Momentum y Bnadas Bollinger:

El Momentum y las Bandas de Bollinger son dos indicadores técnicos que se utilizan para analizar el precio de los activos. El Momentum mide la velocidad y la magnitud del cambio del precio, mientras que las Bandas de Bollinger miden la volatilidad del precio.

# Extraer los precios de cierre para el activo 'AEP.SG' del dataframe original
#price_AEP <- price_data %>%
 # filter(symbol == "AEP.SG") %>%
 # select(date, adjusted)


"chartSeries(`price_AEP`,
            subset='2023-01::2023-06',
            theme=chartTheme('white'))
addBBands(n=10,sd=2)
addMomentum(n=1)"
## [1] "chartSeries(`price_AEP`,\n            subset='2023-01::2023-06',\n            theme=chartTheme('white'))\naddBBands(n=10,sd=2)\naddMomentum(n=1)"
Texto alternativo
Texto alternativo
#Para el ENPH
#price_ENPH <- price_data %>%
  #filter(symbol == "ENPH") %>%
  #select(date, adjusted)

#png("priceENPH.png", width = 900, height = 800)  # Abre un dispositivo gráfico PNG
"chartSeries(`price_ENPH`,
            subset='2023-01::2023-06',
            theme=chartTheme('white'))
addBBands(n=10,sd=2)
addMomentum(n=1)
#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen"
## [1] "chartSeries(`price_ENPH`,\n            subset='2023-01::2023-06',\n            theme=chartTheme('white'))\naddBBands(n=10,sd=2)\naddMomentum(n=1)\n#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen"
Texto alternativo
Texto alternativo
#Para el CIS.SG
#price_CIS.SG <- price_data %>%
  #filter(symbol == "CIS.SG") %>%
 # select(date, adjusted)

#png("priceCIS.SG.png", width = 900, height = 800)  # Abre un dispositivo gráfico PNG
"chartSeries(`price_CIS.SG`,
            subset='2023-01::2023-06',
            theme=chartTheme('white'))
addBBands(n=10,sd=2)
addMomentum(n=1)
#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen"
## [1] "chartSeries(`price_CIS.SG`,\n            subset='2023-01::2023-06',\n            theme=chartTheme('white'))\naddBBands(n=10,sd=2)\naddMomentum(n=1)\n#dev.off()  # Cierra el dispositivo gráfico y guarda la imagen"

Texto alternativo Análisis del Momentum La gráfica del Momentum muestra que el Momentum de AEP.SG ha sido positivo en general desde 2018. Esto sugiere que la tendencia general del precio del activo ha sido alcista. Sin embargo, el Momentum también ha mostrado algunos picos y valles a lo largo del tiempo. Esto sugiere que el precio del activo ha experimentado algunos períodos de volatilidad. • La gráfica del Momentum muestra que el Momentum ha alcanzado niveles muy altos en algunas ocasiones, lo que sugiere que el precio de ENPH ha experimentado períodos de fuerte impulso alcista. • Es importante tener en cuenta que la interpretación de estos indicadores puede variar dependiendo del período de tiempo y del contexto del mercado. La gráfica del Momentum muestra que el Momentum ha alcanzado niveles muy altos en algunas ocasiones, lo que sugiere que el precio de CIS.SG ha experimentado períodos de fuerte impulso alcista. Interpretación del Momentum El Momentum puede ser una herramienta útil para identificar la dirección de la tendencia del precio de un activo. Sin embargo, es importante tener en cuenta que el Momentum no es un indicador perfecto y no puede predecir el futuro. Interpretación de las Bandas de Bollinger Las Bandas de Bollinger pueden ser una herramienta útil para identificar condiciones de sobrecompra y sobreventa en un activo. Un precio que toca la Banda Superior de Bollinger puede ser una señal de que el activo está sobrecomprado y podría experimentar una corrección a la baja. Un precio que toca la Banda Inferior de Bollinger puede ser una señal de que el activo está sobrevendido y podría experimentar una recuperación del precio. • La gráfica de las Bandas de Bollinger muestra que el precio de ENPH ha tocado la Banda Superior de Bollinger en varias ocasiones, lo que sugiere que el activo ha estado sobrecomprado en estos períodos La gráfica de las Bandas de Bollinger muestra que el precio de CIS.SG ha tocado la Banda Inferior de Bollinger en varias ocasiones, lo que sugiere que el activo ha estado sobrevendido en estos períodos. Recomendaciones Estrategia de compra periódica: En lugar de invertir todo el capital de una sola vez, se podría implementar una estrategia de compra periódica, donde se invierte una cantidad fija de dinero en cada uno de los activos en intervalos regulares (por ejemplo, mensualmente o trimestralmente). Esto permite beneficiarse de la volatilidad del mercado promediando el costo de compra a lo largo del tiempo. Considerar las tendencias y patrones técnicos: Se podría considerar utilizar el análisis técnico para identificar oportunidades de compra en función de las tendencias y patrones observados en los gráficos de precios. Por ejemplo, si se espera que la tendencia alcista continúe en un determinado activo, se podría buscar entrar en posiciones largas cuando el precio retroceda a niveles de soporte identificados. Evaluación de riesgos: Es importante tener en cuenta los riesgos asociados con cada activo y diversificar la cartera en consecuencia. Los activos más volátiles, como ENPH, pueden ofrecer mayores oportunidades de ganancias, pero también conllevan un mayor riesgo de pérdida. Por lo tanto, se debe asignar una parte del capital de manera prudente en función del perfil de riesgo individual y de la tolerancia al riesgo. Monitoreo continuo: La inversión requiere un monitoreo continuo de los activos y del mercado en general. Es importante estar al tanto de los eventos económicos, políticos y geopolíticos que puedan afectar los precios de los activos, así como de los cambios en las condiciones del mercado que puedan requerir ajustes en la cartera de inversión.

  1. ¿Cuáles son los pesos óptimos de inversión para sus cuatro acciones?, analice
# Calculate the random weights
wts <- runif(n = length(tick))
wts <- wts/sum(wts)

# Calculate the portfolio returns
port_returns <- (sum(wts * mean_ret) + 1)^252 - 1

# Calculate the portfolio risk
port_risk <- sqrt(t(wts) %*% (cov_mat %*% wts))

# Calculate the Sharpe Ratio
sharpe_ratio <- port_returns/port_risk

print(wts)
## [1] 0.3778048 0.2914398 0.3307555
print(port_returns)
## [1] 0.2984541
print(port_risk)
##           [,1]
## [1,] 0.3010138
print(sharpe_ratio)
##           [,1]
## [1,] 0.9914963
num_port <- 150

# Creating a matrix to store the weights

all_wts <- matrix(nrow = num_port,
                  ncol = length(tick))

# Creating an empty vector to store
# Portfolio returns

port_returns <- vector('numeric', length = num_port)

# Creating an empty vector to store
# Portfolio Standard deviation

port_risk <- vector('numeric', length = num_port)

# Creating an empty vector to store
# Portfolio Sharpe Ratio

sharpe_ratio <- vector('numeric', length = num_port)
#Siguiente permite correr el bucle 150 veces.
for (i in seq_along(port_returns)) {
  
wts <- runif(length(tick))
wts <- wts/sum(wts)
  
# Storing weight in the matrix
all_wts[i,] <- wts
  
# Portfolio returns
  
port_ret <- sum(wts * mean_ret)
port_ret <- ((port_ret + 1)^252) - 1
  
# Storing Portfolio Returns values
port_returns[i] <- port_ret
  
  
# Creating and storing portfolio risk
port_sd <- sqrt(t(wts) %*% (cov_mat  %*% wts))
port_risk[i] <- port_sd
  
# Creating and storing Portfolio Sharpe Ratios
# Assuming 0% Risk free rate
  
sr <- port_ret/port_sd
sharpe_ratio[i] <- sr
  
}

# Storing the values in the table
portfolio_values <- tibble(Return = port_returns,
                           Risk = port_risk,
                           SharpeRatio = sharpe_ratio)


# Converting matrix to a tibble and changing column names
all_wts <- tk_tbl(all_wts)
## Warning in tk_tbl.data.frame(as.data.frame(data), preserve_index, rename_index,
## : Warning: No index to preserve. Object otherwise converted to tibble
## successfully.
colnames(all_wts) <- colnames(clean_data)

# Combing all the values together
portfolio_values <- tk_tbl(cbind(all_wts, portfolio_values))
## Warning in tk_tbl.data.frame(cbind(all_wts, portfolio_values)): Warning: No
## index to preserve. Object otherwise converted to tibble successfully.
head(portfolio_values)
## # A tibble: 6 × 6
##   AEP.SG CIS.SG  ENPH Return  Risk SharpeRatio
##    <dbl>  <dbl> <dbl>  <dbl> <dbl>       <dbl>
## 1  0.195 0.0921 0.713  0.607 0.557       1.09 
## 2  0.338 0.345  0.318  0.291 0.295       0.985
## 3  0.352 0.340  0.308  0.283 0.289       0.979
## 4  0.527 0.312  0.161  0.179 0.217       0.825
## 5  0.389 0.339  0.272  0.257 0.269       0.957
## 6  0.356 0.284  0.360  0.320 0.319       1.00
min_var <- portfolio_values[which.min(portfolio_values$Risk),]
max_sr <- portfolio_values[which.max(portfolio_values$SharpeRatio),]
p <- min_var %>%
  gather(AEP.SG:ENPH, key = Asset,
         value = Weights) %>%
  mutate(Asset = as.factor(Asset)) %>%
  ggplot(aes(x = fct_reorder(Asset,Weights), y = Weights, fill = Asset)) +
  geom_bar(stat = 'identity') +
  theme_minimal() +
  labs(x = 'Assets', y = 'Weights', title = "Minimum Variance Portfolio Weights") +
  scale_y_continuous(labels = scales::percent) 

library(forcats) # Load the forcats package

ggplotly(p)
p <- max_sr %>%
  gather(AEP.SG:ENPH, key = Asset,
         value = Weights) %>%
  mutate(Asset = as.factor(Asset)) %>%
  ggplot(aes(x = fct_reorder(Asset,Weights), y = Weights, fill = Asset)) +
  geom_bar(stat = 'identity') +
  theme_minimal() +
  labs(x = 'Assets', y = 'Weights', title = "Tangency Portfolio Weights") +
  scale_y_continuous(labels = scales::percent) 

ggplotly(p) #Tengency portafolio Weights
#Finalmente permite trazar todas las carteras aleatorias y visualizar la frontera eficiente.
p <- portfolio_values %>%
  ggplot(aes(x = Risk, y = Return, color = SharpeRatio)) +
  geom_point() +
  theme_classic() +
  scale_y_continuous(labels = scales::percent) +
  scale_x_continuous(labels = scales::percent) +
  labs(x = 'Annualized Risk',
       y = 'Annualized Returns',
       title = "Portfolio Optimization & Efficient Frontier") +
  geom_point(aes(x = Risk,
                 y = Return), data = min_var, color = 'red') +
  geom_point(aes(x = Risk,
                 y = Return), data = max_sr, color = 'red') +
  annotate('text', x = 0.20, y = 0.42, label = "Tangency Portfolio") +
  annotate('text', x = 0.18, y = 0.01, label = "Minimum variance portfolio") +
  annotate(geom = 'segment', x = 0.14, xend = 0.135,  y = 0.01, 
           yend = 0.06, color = 'red', arrow = arrow(type = "open")) +
  annotate(geom = 'segment', x = 0.22, xend = 0.2275,  y = 0.405, 
           yend = 0.365, color = 'red', arrow = arrow(type = "open"))


ggplotly(p)

Dado el conjunto de resultados proporcionado, aquí hay algunos análisis: Retorno: El activo ENPH tiene el retorno más alto en todas las seis configuraciones de pesos. Esto sugiere que asignar una proporción mayor de la inversión a ENPH podría generar el mayor retorno absoluto. Riesgo: Para evaluar el riesgo, podemos observar la desviación estándar de los rendimientos de cada activo. En general, parece que ENPH tiene el riesgo más alto, lo que es consistente con la observación de que es el activo más volátil entre los tres. Por lo tanto, asignar demasiado peso a ENPH podría aumentar el riesgo total de la cartera. Índice de Sharpe: El índice de Sharpe es una medida clave para evaluar el rendimiento ajustado al riesgo. Las configuraciones de pesos con índices de Sharpe más altos indican un mejor rendimiento ajustado al riesgo. Por lo tanto, sería deseable seleccionar los pesos que maximicen el índice de Sharpe. Considerando estos factores, podríamos recomendar la siguiente asignación de pesos: AEP.SG: Al ser un activo con un riesgo moderado y un retorno estable, puede ser adecuado asignarle una proporción significativa de la cartera, por ejemplo, alrededor del 40-45%. CIS.SG: Aunque CIS.SG tiene un retorno y un riesgo relativamente equilibrados, su índice de Sharpe en las configuraciones de pesos proporcionadas no es el más alto. Sin embargo, sería prudente asignarle una parte importante de la cartera debido a su estabilidad y menor volatilidad en comparación con ENPH. ENPH: A pesar de tener el mayor retorno, asignar una proporción demasiado alta de la cartera a ENPH podría aumentar significativamente el riesgo total de la cartera debido a su alta volatilidad. Por lo tanto, se podría asignar una proporción menor en comparación con AEP.SG y CIS.SG, quizás alrededor del 20-30%. Pesos óptimos: ENPH (0.727), AEP.SG (0.201) y CIS.SG (0.0721). Para un índice sharpe de 1.09 A pesar de que ENPH tiene el retorno más alto, también tiene la mayor volatilidad, lo que puede aumentar el riesgo total de la cartera si se asigna una proporción significativa a este activo. Por lo tanto, en la recomendación de pesos óptimos, sugiero asignar una proporción menor a ENPH (0.727) en comparación con AEP.SG (0.201) y CIS.SG (0.0721). Decesión de inversión: Pesos óptimos: ENPH (0.45), AEP.SG (0.38) y CIS.SG (0.17).

Por lo tanto, podríamos considerar que un índice de Sharpe de alrededor de 1.09 es el valor óptimo de inversión en este caso específico, ya que representa un equilibrio entre el retorno y el riesgo ajustado. Sin embargo, es importante tener en cuenta que las preferencias de los inversores pueden variar, y lo que se considera óptimo puede diferir según el contexto individual de inversión.

#Varianza historica de cada activo
# Suponiendo que tienes un dataframe llamado "price_data" con las columnas "date", "symbol", y los precios ajustados en la columna "adjusted"

# Obtener los nombres únicos de los activos
activos <- unique(price_data$symbol)

# Crear una lista para almacenar las varianzas de cada activo
varianzas <- list()

# Calcular la varianza histórica para cada activo
for (activo in activos) {
  # Filtrar los datos para el activo actual
  datos_activo <- price_data[price_data$symbol == activo, ]
  # Calcular los retornos diarios
  retornos <- diff(log(datos_activo$adjusted))
  # Calcular la varianza histórica
  varianzas[[activo]] <- var(retornos)
}

# Imprimir las varianzas históricas de cada activo
for (activo in activos) {
  cat("Varianza histórica de", activo, ":", varianzas[[activo]], "\n")
}
## Varianza histórica de AEP.SG : 0.0002039577 
## Varianza histórica de CIS.SG : 0.0002777002 
## Varianza histórica de ENPH : 0.002348593
####Opciones#### ENPH
'https://finance.yahoo.com/quote/ENPH240621P00240000'
## [1] "https://finance.yahoo.com/quote/ENPH240621P00240000"
'https://finance.yahoo.com/quote/ENPH240621C00065000'
## [1] "https://finance.yahoo.com/quote/ENPH240621C00065000"
# Cox Ross Rubinstein Model for
# Function to calculate option price

#####Parameters with Implied Volatility#### 
s <- 109.17 # Current stock price
k <- 107 # Strike price
tt <- 0.25 # Time to maturity or expiry (in years)
r <- 0.0462 # Risk-free rate (current 3-month bond rate)
d <- 0 # Dividend yield 
v <- 0.1231 # Volatility (Blended)
nstep <- 4  # Number of steps or periods in binomial tree

'https://financetrain.com/binomial-option-pricing-model-in-r'
## [1] "https://financetrain.com/binomial-option-pricing-model-in-r"
build_stock_tree <- function(s,v,tt, nstep, r,k,d) {
  tree = matrix(0, nrow=nstep+1, ncol=nstep+1)
  U = exp(v*sqrt(tt))
  D = exp(-v*sqrt(tt))
  for (i in 1:(nstep+1)) {
    for (j in 1:i) {
      tree[i, j] = s* U^(j-1) * D^((i-1)-(j-1))
    }  }
  return(tree)
}

option_price <- build_stock_tree(s,v,tt, nstep, r,k,d)#el precio de valoración en cada uno de los nodos.
print(option_price)
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.17000   0.00000   0.0000   0.0000   0.0000
## [2,] 102.65320 116.10051   0.0000   0.0000   0.0000
## [3,]  96.52541 109.17000 123.4710   0.0000   0.0000
## [4,]  90.76342 102.65320 116.1005 131.3094   0.0000
## [5,]  85.34538  96.52541 109.1700 123.4710 139.6454
# call option value  MAX(S-K,0)
IntrinsecValue <- option_price[5,]- k
IntrinsecValue[IntrinsecValue<0] <- 0
#q_prob:

q_prob <- function(r, tt, v) {
  u = exp(v*sqrt(tt))
  d = exp(-v*sqrt(tt))
  return((exp(r*tt) - d)/(u-d))
}
# Calcular la probabilidad q utilizando la función q_prob
q <- q_prob(r, tt, v)

# Imprimir el resultado
cat("La probabilidad q es:", q, "\n")
## La probabilidad q es: 0.5789279
type<- "call"
X<-106.48 # precio de la opcion al vencimiento. 
tree <- build_stock_tree(s, v, tt, nstep, r, k, d)
#value_binomial_option
value_binomial_option <- function(tree, v, tt, r, X, type) {
  q = q_prob(r, tt, v)
  option_tree = matrix(0, nrow=nrow(tree), ncol=ncol(tree))
  if(type == 'put') {
    option_tree[nrow(option_tree),] = pmax(X - tree[nrow(tree),], 0)
  } else {  option_tree[nrow(option_tree),] = pmax(tree[nrow(tree),] - X, 0)
  }
  for (i in (nrow(tree)-1):1) {
    for(j in 1:i) {
      option_tree[i,j]=((1-q)*option_tree[i+1,j] + q*option_tree[i+1,j+1])/exp(r*tt)
    }
  }
  return(option_tree)
}
# Llamamos a la función value_binomial_option para calcular el valor de la opción
option_value <- value_binomial_option(tree, v, tt, r, X, type)
print(option_value)
##          [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 9.775143  0.000000  0.00000  0.00000  0.00000
## [2,] 4.284617 13.964723  0.00000  0.00000  0.00000
## [3,] 0.880986  6.846158 19.42249  0.00000  0.00000
## [4,] 0.000000  1.539433 10.84328 26.05216  0.00000
## [5,] 0.000000  0.000000  2.69000 16.99100 33.16539
binomial_option <- function(type,v, tt, r, X, s, nstep) {
  q <- q_prob(r=r, tt, v=v)
  tree <- build_stock_tree(s=s, v=v, tt, nstep=nstep )
  option <- value_binomial_option(tree, v=v, tt, r=r, X=X, type=type)
  return(list(q=q, stock=tree, option=option, price=option[1,1]))
}
results_call <- binomial_option(type='call',v, tt, r, X, s, nstep)
print(results_call)
## $q
## [1] 0.5789279
## 
## $stock
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.17000   0.00000   0.0000   0.0000   0.0000
## [2,] 102.65320 116.10051   0.0000   0.0000   0.0000
## [3,]  96.52541 109.17000 123.4710   0.0000   0.0000
## [4,]  90.76342 102.65320 116.1005 131.3094   0.0000
## [5,]  85.34538  96.52541 109.1700 123.4710 139.6454
## 
## $option
##          [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 9.775143  0.000000  0.00000  0.00000  0.00000
## [2,] 4.284617 13.964723  0.00000  0.00000  0.00000
## [3,] 0.880986  6.846158 19.42249  0.00000  0.00000
## [4,] 0.000000  1.539433 10.84328 26.05216  0.00000
## [5,] 0.000000  0.000000  2.69000 16.99100 33.16539
## 
## $price
## [1] 9.775143
results_put <- binomial_option(type='put',v=1.2773, tt, r, X, s, nstep)
print(results_put)
## $q
## [1] 0.3540566
## 
## $stock
##            [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.170000   0.00000   0.0000   0.0000    0.000
## [2,]  57.642279 206.75950   0.0000   0.0000    0.000
## [3,]  30.435397 109.17000 391.5864   0.0000    0.000
## [4,]  16.070034  57.64228 206.7595 741.6343    0.000
## [5,]   8.485054  30.43540 109.1700 391.5864 1404.598
## 
## $option
##          [,1]     [,2] [,3] [,4] [,5]
## [1,] 44.00518  0.00000    0    0    0
## [2,] 58.06555 19.79718    0    0    0
## [3,] 73.94261 31.00452    0    0    0
## [4,] 89.18720 48.55643    0    0    0
## [5,] 97.99495 76.04460    0    0    0
## 
## $price
## [1] 44.00518

Varianza histórica de AEP.SG : 0.0002039577 Varianza histórica de CIS.SG : 0.0002777005 Varianza histórica de ENPH : 0.002348593

#####Parameters with historical Volatility#### 
# Calcular la volatilidad histórica de cada activo
# Calcular la volatilidad del portafolio
portfolio_volatility <- sqrt(t(wts) %*% (cov_mat %*% wts))

# Imprimir la volatilidad del portafolio
print(portfolio_volatility)
##           [,1]
## [1,] 0.2291009
s <- 109.17 # Current stock price
k <- 107 # Strike price
tt <- 0.25 # Time to maturity or expiry (in years)
r <- 0.0462 # Risk-free rate (current 3-month bond rate)
d <- 0 # Dividend yield 
v <- portfolio_volatility
nstep <- 4  # Number of steps or periods in binomial tree


build_stock_tree <- function(s,v,tt, nstep, r,k,d) {
  tree = matrix(0, nrow=nstep+1, ncol=nstep+1)
  U = exp(v*sqrt(tt))
  D = exp(-v*sqrt(tt))
  for (i in 1:(nstep+1)) {
    for (j in 1:i) {
      tree[i, j] = s* U^(j-1) * D^((i-1)-(j-1))
    }  }
  return(tree)
}

option_price <- build_stock_tree(s,v,tt, nstep, r,k,d)#el precio de valoración en cada uno de los nodos.
print(option_price)
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.17000   0.00000   0.0000   0.0000   0.0000
## [2,]  97.35420 122.41988   0.0000   0.0000   0.0000
## [3,]  86.81726 109.17000 137.2779   0.0000   0.0000
## [4,]  77.42076  97.35420 122.4199 153.9392   0.0000
## [5,]  69.04128  86.81726 109.1700 137.2779 172.6227
# call option value  MAX(S-K,0)
IntrinsecValue <- option_price[5,]- k
IntrinsecValue[IntrinsecValue<0] <- 0
#q_prob:

q_prob <- function(r, tt, v) {
  u = exp(v*sqrt(tt))
  d = exp(-v*sqrt(tt))
  return((exp(r*tt) - d)/(u-d))
}
# Calcular la probabilidad q utilizando la función q_prob
q <- q_prob(r, tt, v)

# Imprimir el resultado
cat("La probabilidad q es:", q, "\n")
## La probabilidad q es: 0.5219897
X<-106.48 # precio de la opcion al vencimiento. 
tree <- build_stock_tree(s, v, tt, nstep, r, k, d)
#value_binomial_option
value_binomial_option <- function(tree, v, tt, r, X, type) {
  q = q_prob(r, tt, v)
  option_tree = matrix(0, nrow=nrow(tree), ncol=ncol(tree))
  if(type == 'put') {
    option_tree[nrow(option_tree),] = pmax(X - tree[nrow(tree),], 0)
  } else {  option_tree[nrow(option_tree),] = pmax(tree[nrow(tree),] - X, 0)
  }
  for (i in (nrow(tree)-1):1) {
    for(j in 1:i) {
      option_tree[i,j]=((1-q)*option_tree[i+1,j] + q*option_tree[i+1,j+1])/exp(r*tt)
    }
  }
  return(option_tree)
}
# Llamamos a la función value_binomial_option para calcular el valor de la opción
option_value <- value_binomial_option(tree, v, tt, r, X, type)
print(option_value)
##            [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 13.6455447  0.000000  0.00000  0.00000  0.00000
## [2,]  5.2464294 21.640690  0.00000  0.00000  0.00000
## [3,]  0.7162158  9.511718 33.22937  0.00000  0.00000
## [4,]  0.0000000  1.388028 17.16264 48.68195  0.00000
## [5,]  0.0000000  0.000000  2.69000 30.79788 66.14266
binomial_option <- function(type,v, tt, r, X, s, nstep) {
  q <- q_prob(r=r, tt, v=v)
  tree <- build_stock_tree(s=s, v=v, tt, nstep=nstep )
  option <- value_binomial_option(tree, v=v, tt, r=r, X=X, type=type)
  return(list(q=q, stock=tree, option=option, price=option[1,1]))
}
results_call <- binomial_option(type='call',v, tt, r, X, s, nstep)
print(results_call)
## $q
##           [,1]
## [1,] 0.5219897
## 
## $stock
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.17000   0.00000   0.0000   0.0000   0.0000
## [2,]  97.35420 122.41988   0.0000   0.0000   0.0000
## [3,]  86.81726 109.17000 137.2779   0.0000   0.0000
## [4,]  77.42076  97.35420 122.4199 153.9392   0.0000
## [5,]  69.04128  86.81726 109.1700 137.2779 172.6227
## 
## $option
##            [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 13.6455447  0.000000  0.00000  0.00000  0.00000
## [2,]  5.2464294 21.640690  0.00000  0.00000  0.00000
## [3,]  0.7162158  9.511718 33.22937  0.00000  0.00000
## [4,]  0.0000000  1.388028 17.16264 48.68195  0.00000
## [5,]  0.0000000  0.000000  2.69000 30.79788 66.14266
## 
## $price
## [1] 13.64554
results_put <- binomial_option(type='put',v=1.2773, tt, r, X, s, nstep)
print(results_put)
## $q
## [1] 0.3540566
## 
## $stock
##            [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.170000   0.00000   0.0000   0.0000    0.000
## [2,]  57.642279 206.75950   0.0000   0.0000    0.000
## [3,]  30.435397 109.17000 391.5864   0.0000    0.000
## [4,]  16.070034  57.64228 206.7595 741.6343    0.000
## [5,]   8.485054  30.43540 109.1700 391.5864 1404.598
## 
## $option
##          [,1]     [,2] [,3] [,4] [,5]
## [1,] 44.00518  0.00000    0    0    0
## [2,] 58.06555 19.79718    0    0    0
## [3,] 73.94261 31.00452    0    0    0
## [4,] 89.18720 48.55643    0    0    0
## [5,] 97.99495 76.04460    0    0    0
## 
## $price
## [1] 44.00518

AEP.SG: Tiene la varianza histórica más baja entre los tres activos, lo que sugiere que ha experimentado menos volatilidad en sus retornos diarios en comparación con los otros dos activos. Esto podría indicar que AEP.SG es un activo relativamente menos riesgoso en términos de fluctuaciones diarias en su precio. CIS.SG: Muestra una varianza histórica más alta que AEP.SG pero más baja que ENPH. Esto sugiere que CIS.SG ha experimentado una volatilidad moderada en sus retornos diarios. Los inversores podrían considerar que CIS.SG tiene un nivel moderado de riesgo en comparación con los otros dos activos. ENPH: Tiene la varianza histórica más alta entre los tres activos, lo que indica que ha experimentado la mayor volatilidad en sus retornos diarios. Esto podría significar que ENPH es un activo más riesgoso en términos de fluctuaciones diarias en su precio. Los inversores deben tener en cuenta esta mayor volatilidad al considerar invertir en ENPH y deben estar preparados para manejar la mayor incertidumbre asociada con este activo.

#### minimum extreme strike####

k <- 70 # Strike price call
v <- 0.1231 # Volatility (Blended)

build_stock_tree <- function(s,v,tt, nstep, r,k,d) {
  tree = matrix(0, nrow=nstep+1, ncol=nstep+1)
  U = exp(v*sqrt(tt))
  D = exp(-v*sqrt(tt))
  for (i in 1:(nstep+1)) {
    for (j in 1:i) {
      tree[i, j] = s* U^(j-1) * D^((i-1)-(j-1))
    }  }
  return(tree)
}

option_price <- build_stock_tree(s,v,tt, nstep, r,k,d)#el precio de valoración en cada uno de los nodos.

# call option value  MAX(S-K,0)
IntrinsecValue <- option_price[5,]- k
IntrinsecValue[IntrinsecValue<0] <- 0
#q_prob:

q_prob <- function(r, tt, v) {
  u = exp(v*sqrt(tt))
  d = exp(-v*sqrt(tt))
  return((exp(r*tt) - d)/(u-d))
}

X<-106.48 # precio de la opcion al vencimiento. 
#value_binomial_option
value_binomial_option <- function(tree, v, tt, r, X, type) {
  q = q_prob(r, tt, v)
  option_tree = matrix(0, nrow=nrow(tree), ncol=ncol(tree))
  if(type == 'put') {
    option_tree[nrow(option_tree),] = pmax(X - tree[nrow(tree),], 0)
  } else {  option_tree[nrow(option_tree),] = pmax(tree[nrow(tree),] - X, 0)
  }
  for (i in (nrow(tree)-1):1) {
    for(j in 1:i) {
      option_tree[i,j]=((1-q)*option_tree[i+1,j] + q*option_tree[i+1,j+1])/exp(r*tt)
    }
  }
  return(option_tree)
}

'El binomio_opción la función uniría todas las funciones que hemos descrito 
y devolverá un árbol con los valoresde la opción en los diferentes períodos'
## [1] "El binomio_opción la función uniría todas las funciones que hemos descrito \ny devolverá un árbol con los valoresde la opción en los diferentes períodos"
binomial_option <- function(type,v, tt, r, X, s, nstep) {
  q <- q_prob(r=r, tt, v=v)
  tree <- build_stock_tree(s=s, v=v, tt, nstep=nstep )
  option <- value_binomial_option(tree, v=v, tt, r=r, X=X, type=type)
  return(list(q=q, stock=tree, option=option, price=option[1,1]))
}
results_call <- binomial_option(type='call',v, tt, r, X, s, nstep)
print(results_call)
## $q
## [1] 0.5789279
## 
## $stock
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.17000   0.00000   0.0000   0.0000   0.0000
## [2,] 102.65320 116.10051   0.0000   0.0000   0.0000
## [3,]  96.52541 109.17000 123.4710   0.0000   0.0000
## [4,]  90.76342 102.65320 116.1005 131.3094   0.0000
## [5,]  85.34538  96.52541 109.1700 123.4710 139.6454
## 
## $option
##          [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 9.775143  0.000000  0.00000  0.00000  0.00000
## [2,] 4.284617 13.964723  0.00000  0.00000  0.00000
## [3,] 0.880986  6.846158 19.42249  0.00000  0.00000
## [4,] 0.000000  1.539433 10.84328 26.05216  0.00000
## [5,] 0.000000  0.000000  2.69000 16.99100 33.16539
## 
## $price
## [1] 9.775143
results_put <- binomial_option(type='put',v, tt, r, X, s, nstep)
print(results_put)
## $q
## [1] 0.5789279
## 
## $stock
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.17000   0.00000   0.0000   0.0000   0.0000
## [2,] 102.65320 116.10051   0.0000   0.0000   0.0000
## [3,]  96.52541 109.17000 123.4710   0.0000   0.0000
## [4,]  90.76342 102.65320 116.1005 131.3094   0.0000
## [5,]  85.34538  96.52541 109.1700 123.4710 139.6454
## 
## $option
##           [,1]      [,2] [,3] [,4] [,5]
## [1,]  2.277674 0.0000000    0    0    0
## [2,]  4.485075 0.7178678    0    0    0
## [3,]  8.404079 1.7246623    0    0    0
## [4,] 14.493815 4.1434653    0    0    0
## [5,] 21.134621 9.9545890    0    0    0
## 
## $price
## [1] 2.277674
#### maximum extreme strike####

k <- 175 # Strike price call
K <- 150 # Strike price put
v <- 0.1231 # Volatility (Blended)
s <- 109.17 # Current stock price
tt <- 0.25 # Time to maturity or expiry (in years)
r <- 0.0462 # Risk-free rate (current 3-month bond rate)
d <- 0 # Dividend yield 
nstep <- 4  # Number of steps or periods in binomial tree

build_stock_tree <- function(s,v,tt, nstep, r,strike,d) {
  tree = matrix(0, nrow=nstep+1, ncol=nstep+1)
  U = exp(v*sqrt(tt))
  D = exp(-v*sqrt(tt))
  for (i in 1:(nstep+1)) {
    for (j in 1:i) {
      tree[i, j] = s* U^(j-1) * D^((i-1)-(j-1))
    }  
  }
  return(tree)
}

option_price <- build_stock_tree(s,v,tt, nstep, r,k,d) # Precio de valoración en cada uno de los nodos.
type<-"call"


# Valor intrínseco de la opción
IntrinsicValue <- option_price[5,] - ifelse(type == 'call', k, K)
IntrinsicValue[IntrinsicValue < 0] <- 0

# Función para calcular la probabilidad q
q_prob <- function(r, tt, v) {
  u = exp(v*sqrt(tt))
  d = exp(-v*sqrt(tt))
  return((exp(r*tt) - d)/(u-d))
}

X <- 106.48 # Precio de la opción al vencimiento.

# Función para calcular el valor de la opción binomial
value_binomial_option <- function(tree, v, tt, r, X, type, strike) {
  q = q_prob(r, tt, v)
  option_tree = matrix(0, nrow=nrow(tree), ncol=ncol(tree))
  if(type == 'put') {
    option_tree[nrow(option_tree),] = pmax(strike - tree[nrow(tree),], 0)
  } else {  
    option_tree[nrow(option_tree),] = pmax(tree[nrow(tree),] - strike, 0)
  }
  for (i in (nrow(tree)-1):1) {
    for(j in 1:i) {
      option_tree[i,j]=((1-q)*option_tree[i+1,j] + q*option_tree[i+1,j+1])/exp(r*tt)
    }
  }
  return(option_tree)
}

# Función para calcular el árbol de opciones binomiales
binomial_option <- function(type,v, tt, r, X, s, nstep, strike) {
  q <- q_prob(r=r, tt, v=v)
  tree <- build_stock_tree(s=s, v=v, tt, nstep=nstep, strike=strike )
  option <- value_binomial_option(tree, v=v, tt, r=r, X=X, type=type, strike=strike)
  return(list(q=q, stock=tree, option=option, price=option[1,1]))
}

# Calcular opciones de compra (call)
results_call <- binomial_option(type='call',v, tt, r, X, s, nstep, k)
print(results_call)
## $q
## [1] 0.5789279
## 
## $stock
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.17000   0.00000   0.0000   0.0000   0.0000
## [2,] 102.65320 116.10051   0.0000   0.0000   0.0000
## [3,]  96.52541 109.17000 123.4710   0.0000   0.0000
## [4,]  90.76342 102.65320 116.1005 131.3094   0.0000
## [5,]  85.34538  96.52541 109.1700 123.4710 139.6454
## 
## $option
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    0    0    0    0    0
## [2,]    0    0    0    0    0
## [3,]    0    0    0    0    0
## [4,]    0    0    0    0    0
## [5,]    0    0    0    0    0
## 
## $price
## [1] 0
# Calcular opciones de venta (put)
results_put <- binomial_option(type='put',v, tt, r, X, s, nstep, K)
print(results_put)
## $q
## [1] 0.5789279
## 
## $stock
##           [,1]      [,2]     [,3]     [,4]     [,5]
## [1,] 109.17000   0.00000   0.0000   0.0000   0.0000
## [2,] 102.65320 116.10051   0.0000   0.0000   0.0000
## [3,]  96.52541 109.17000 123.4710   0.0000   0.0000
## [4,]  90.76342 102.65320 116.1005 131.3094   0.0000
## [5,]  85.34538  96.52541 109.1700 123.4710 139.6454
## 
## $option
##          [,1]     [,2]     [,3]     [,4]     [,5]
## [1,] 34.05765  0.00000  0.00000  0.00000  0.00000
## [2,] 42.23832 28.79100  0.00000  0.00000  0.00000
## [3,] 50.04930 37.40471 23.10372  0.00000  0.00000
## [4,] 57.51405 45.62427 32.17695 16.96808  0.00000
## [5,] 64.65462 53.47459 40.83000 26.52900 10.35461
## 
## $price
## [1] 34.05765

Segunda parte

1: Comparación de estrategias con diferentes volatilidades Valores de las opciones con volatilidad implícita = 0.1231 para Call, 1.2773 para Put Call: $9.775143 Put: $44.00518 Valores de las opciones con volatilidad histórica: Call: $18.34896 Put: $44.00518 Comparando los valores de las opciones con volatilidad implícita e histórica= observamos que: La opción de compra (call) es significativamente más barata cuando se utiliza la volatilidad implícita en comparación con la volatilidad histórica. La opción de venta (put) mantiene el mismo valor en ambos casos. 2: Escenarios extremos Escenario 1: Precio de ejercicio de la opción call extremadamente bajo (70) con volatilidad implícita alta Call: $9.775143 Put: $2.277674 Escenario 2: Precio de ejercicio de la opción call extremadamente alto (175) con volatilidad implícita alta Call: $0 Put: $34.05765 En contraste con los valores de las opciones en los escenarios extremos: En el primer escenario, donde el precio de ejercicio de la opción call es bajo, la opción call tiene un valor significativo, mientras que la opción put es menos valiosa. En el segundo escenario, donde el precio de ejercicio de la opción call es alto, la opción call no tiene valor, mientras que la opción put tiene un valor considerable. Valoración de las opciones put: Según los análisis, el valor de las opciones put se mantiene constante independientemente de si se utiliza volatilidad implícita o histórica. Esto sugiere que las opciones put pueden proporcionar una protección estable contra movimientos adversos en el mercado, lo que las hace atractivas para una estrategia de cobertura bajista. Escenarios extremos: En los escenarios extremos proporcionados, se observa que, incluso en situaciones donde el precio de ejercicio de la opción call es muy alto o muy bajo, la opción put retiene su valor considerable. Esto demuestra la capacidad de las opciones

Tercera Parte s <- 109.17 # Current stock price k <- 107 # Strike price tt <- 0.25 # Time to maturity or expiry (in years) r <- 0.0462 # Risk-free rate (current 3-month bond rate) v <- 0.1231 # Volatility (Blended) La estrategia Long Straddle es una estrategia de negociación de opciones que implica comprar simultáneamente una opción de compra (call) y una opción de venta (put) con el mismo activo subyacente, el mismo precio de ejercicio (strike) y la misma fecha de vencimiento. Esta estrategia se utiliza cuando se espera que el precio del activo subyacente experimente un movimiento significativo en cualquier dirección, ya sea hacia arriba o hacia abajo, y se optó por esta estrategia por la alta volatilidad del activo ENPH, el cual genera picos muy altos, para poder enfrentar ya sea una dirección de cambio de tendencia muy impetuosa que empuje la cartera al alza o la baja, se pueda tener una cobertura en alguna de estas direcciones.

# Cargar librerías necesarias
library(tidyquant)
library(dplyr)
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Paso 1: Asignación de los pesos óptimos y la inversión inicial
optimo_weights <- c(ENPH = 0.45, CIS.SG = 0.17, AEP.SG = 0.38)
initial_investment <- 10000

# Paso 2: Filtrar datos desde el 01/06/2023
price_data <- price_data %>%
  filter(date >= '2023-06-01')

# Paso 3: Calcular rendimientos diarios desde el 01/06/2023
log_ret_tidy <- price_data %>%
  group_by(symbol) %>%
  tq_transmute(select = adjusted,
               mutate_fun = periodReturn,
               period = 'daily',
               col_rename = 'ret',
               type = 'log')

log_ret_xts <- log_ret_tidy %>%
  spread(symbol, value = ret) %>%
  as.xts()

# Definir las fechas de inicio y fin de cada trimestre
trimestre_dates <- seq(as.Date("2023-06-01"), by = "3 months", length.out = 4)
trimestre_end_dates <- trimestre_dates + 89  # 90 días en un trimestre

# Inicializar un data frame para almacenar los resultados por trimestre
pyg_table <- data.frame(Trimestre = character(0), PYG = numeric(0))

# Inicializar vector para almacenar valores del portafolio por trimestre
port_values_trimester <- numeric(length(trimestre_dates))

# Calcular el valor del portafolio por trimestre
for (i in 1:length(trimestre_dates)) {
  # Filtrar datos para el trimestre actual
  start_date <- trimestre_dates[i]
  end_date <- trimestre_end_dates[i]
  data_trimester <- log_ret_xts[index(log_ret_xts) >= start_date & index(log_ret_xts) <= end_date, ]
  
  # Calcular el valor del portafolio al final del trimestre
  trimester_value <- sum(tail(data_trimester, 1) * optimo_weights) * initial_investment
  port_values_trimester[i] <- trimester_value  # Almacenar valor del portafolio
  
  # Calcular el PYG para el trimestre actual
  if (i == 1) {
    initial_investment_trimester <- initial_investment
  } else {
    initial_investment_trimester <- port_values_trimester[i - 1]
  }
  ganancia_perdida_trimestre <- trimester_value - initial_investment_trimester
  
  # Agregar resultado al dataframe de resultados por trimestre
  pyg_table <- rbind(pyg_table, data.frame(Trimestre = i, PYG = ganancia_perdida_trimestre))
}

# Mostrar tabla de resultados
print(pyg_table)
##   Trimestre         PYG
## 1         1 -9889.13207
## 2         2   -57.67489
## 3         3   -73.81465
## 4         4  -204.18278
# long straddle 
# Definir las variables
s <- 109.17 # Precio actual del activo subyacente
k <- 107 # Precio de ejercicio
tt <- 0.25 # Tiempo hasta el vencimiento en años
r <- 0.0462 # Tasa libre de riesgo
v <- 0.1231 # Volatilidad

# Calcular el valor de las opciones de compra (call) y venta (put)
d1 <- (log(s/k) + (r + 0.5 * v^2) * tt) / (v * sqrt(tt))
d2 <- d1 - v * sqrt(tt)

call_price <- s * pnorm(d1) - k * exp(-r * tt) * pnorm(d2)
put_price <- k * exp(-r * tt) * pnorm(-d2) - s * pnorm(-d1)

# Calcular el payoff de la estrategia Long Straddle
prices <- seq(70, 150, by = 1) # Vector de precios del activo subyacente
premium_call <- 0.15    
premium_put <- 0.01

# Payoff de la opción de compra (call) al vencimiento
intrinsicValuesCall <- prices - k - premium_call
payoffLongCall <- pmax(-premium_call, intrinsicValuesCall)

# Payoff de la opción de venta (put) al vencimiento
intrinsicValuesPut <- k - prices - premium_put
payoffLongPut <- pmax(-premium_put, intrinsicValuesPut)

# Payoff de la estrategia Long Straddle
payoff <- payoffLongCall + payoffLongPut

# Crear un DataFrame con los resultados para graficar
results <- data.frame(prices, payoffLongCall, payoffLongPut, payoff)

# Graficar el payoff de la estrategia Long Straddle
library(ggplot2)
ggplot(results, aes(x = prices)) + 
  geom_line(aes(y = payoffLongCall, color = "LongCall")) + 
  geom_line(aes(y = payoffLongPut, color = "LongPut")) +
  geom_line(aes(y = payoff, color = "Straddle Payoff")) +
  scale_color_manual("", 
                     breaks = c("LongCall", "LongPut", "Straddle Payoff"),
                     values = c("blue", "red", "green")) +
  ylab("Payoff") +
  ggtitle("Long Straddle Payoff")

payoff <- payoffLongCall + payoffLongPut
print(payoff)
##  [1] 36.84 35.84 34.84 33.84 32.84 31.84 30.84 29.84 28.84 27.84 26.84 25.84
## [13] 24.84 23.84 22.84 21.84 20.84 19.84 18.84 17.84 16.84 15.84 14.84 13.84
## [25] 12.84 11.84 10.84  9.84  8.84  7.84  6.84  5.84  4.84  3.84  2.84  1.84
## [37]  0.84 -0.16  0.84  1.84  2.84  3.84  4.84  5.84  6.84  7.84  8.84  9.84
## [49] 10.84 11.84 12.84 13.84 14.84 15.84 16.84 17.84 18.84 19.84 20.84 21.84
## [61] 22.84 23.84 24.84 25.84 26.84 27.84 28.84 29.84 30.84 31.84 32.84 33.84
## [73] 34.84 35.84 36.84 37.84 38.84 39.84 40.84 41.84 42.84
# Definir los datos iniciales
s <- 109.17 # Precio actual de la acción
k <- 107 # Precio de ejercicio (strike price)
premium_call <- 0.15     # Precio de la opción de compra (call)
premium_put <- 0.01  # Precio de la opción de venta (put)

# Definir las fechas de inicio y fin de cada trimestre
trimestre_dates <- seq(as.Date("2023-06-01"), by = "3 months", length.out = 4)
trimestre_end_dates <- trimestre_dates + 89  # 90 días en un trimestre

# Inicializar una lista para almacenar los resultados por trimestre
payoff_trimestral <- list()

# Calcular la estrategia Long Straddle para cada trimestre
for (i in 1:length(trimestre_dates)) {
  # Definir los precios del activo subyacente para cada trimestre (ejemplo)
  precios_trimestrales <- seq(80, 100, by = 1)
  
  # Calcular el payoff de la opción de compra (call) al vencimiento
  intrinsicValuesCall <- precios_trimestrales - k - premium_call
  payoffLongCall <- pmax(-premium_call, intrinsicValuesCall)
  
  # Calcular el payoff de la opción de venta (put) al vencimiento
  intrinsicValuesPut <- k - precios_trimestrales - premium_put
  payoffLongPut <- pmax(-premium_put, intrinsicValuesPut)
  
  # Calcular el payoff total de la estrategia Long Straddle
  payoff <- payoffLongCall + payoffLongPut
  
  # Almacenar los resultados en la lista
  trimestre <- paste("Trimestre", i)
  payoff_trimestral[[trimestre]] <- data.frame(Trimestre = trimestre,
                                               Precio_Opción_Call = payoffLongCall,
                                               Precio_Opción_Put = payoffLongPut,
                                               Payoff_Total = payoff)
}

# Calcular los totales de payoff por trimestre
total_payoff_trimestral <- lapply(payoff_trimestral, function(trimestre) {
  total <- sum(trimestre$Payoff_Total)
  return(total)
})

# Mostrar los totales de payoff por trimestre
for (i in 1:length(total_payoff_trimestral)) {
  trimestre <- paste("Trimestre", i)
  cat("Total de payoff para el", trimestre, ":", total_payoff_trimestral[[i]], "\n")
}
## Total de payoff para el Trimestre 1 : 353.64 
## Total de payoff para el Trimestre 2 : 353.64 
## Total de payoff para el Trimestre 3 : 353.64 
## Total de payoff para el Trimestre 4 : 353.64
  1. ¿Con la información de los últimos tres trimestres, cuales serían los limites mínimos y máximos? que tanto varían cada trimestre? hay oportunidad de arbitraje según la posición? analice.
# Calcular los límites mínimos y máximos de los totales de payoff para cada trimestre
min_payoff <- sapply(payoff_trimestral, function(trimestre) min(trimestre$Payoff_Total))
max_payoff <- sapply(payoff_trimestral, function(trimestre) max(trimestre$Payoff_Total))

# Calcular la variación de los totales de payoff entre los trimestres
variacion_payoff <- max_payoff - min_payoff

# Determinar si hay oportunidad de arbitraje según la posición
oportunidad_arbitraje <- ifelse(min_payoff < 0 & max_payoff > 0, "Sí", "No")

# Mostrar los resultados
for (i in 1:length(min_payoff)) {
  cat("Trimestre", i, ":\n")
  cat("  Mínimo payoff:", min_payoff[i], "\n")
  cat("  Máximo payoff:", max_payoff[i], "\n")
  cat("  Variación de payoff:", variacion_payoff[i], "\n")
  cat("  Oportunidad de arbitraje:", oportunidad_arbitraje[i], "\n\n")
}
## Trimestre 1 :
##   Mínimo payoff: 6.84 
##   Máximo payoff: 26.84 
##   Variación de payoff: 20 
##   Oportunidad de arbitraje: No 
## 
## Trimestre 2 :
##   Mínimo payoff: 6.84 
##   Máximo payoff: 26.84 
##   Variación de payoff: 20 
##   Oportunidad de arbitraje: No 
## 
## Trimestre 3 :
##   Mínimo payoff: 6.84 
##   Máximo payoff: 26.84 
##   Variación de payoff: 20 
##   Oportunidad de arbitraje: No 
## 
## Trimestre 4 :
##   Mínimo payoff: 6.84 
##   Máximo payoff: 26.84 
##   Variación de payoff: 20 
##   Oportunidad de arbitraje: No

En el análisis que realizamos, no parece haber oportunidad de arbitraje en ninguno de los trimestres. Esto se debe a que tanto el mínimo como el máximo payoff para cada trimestre son valores positivos, lo que indica que, en general, la estrategia está generando ganancias en todos los escenarios posibles dentro de cada trimestre. La oportunidad de arbitraje suele surgir cuando hay discrepancias significativas en los precios de mercado que permiten obtener una ganancia sin riesgo o con un riesgo mínimo. Esto podría ocurrir si, por ejemplo, el payoff máximo fuera positivo en un trimestre y el payoff mínimo fuera negativo en otro, lo que permitiría beneficiarse de la diferencia en los precios de mercado. Sin embargo, dado que en este caso los payoffs son positivos en todos los trimestres, no hay discrepancias que permitan aprovechar una oportunidad de arbitraje. Por lo tanto, concluimos que no hay oportunidad de arbitraje en esta situación.

#COBERTURA
# Datos originales
pyg <- c(-9889.13194, -57.67517, -73.81450, -204.18278)
payoff_total <- c(353.64, 353.64, 353.64, 353.64)

# Calcular el PYG con cobertura
pyg_con_cobertura <- pyg + payoff_total

# Total de PYG cubierto
pyg_total_cubierto <- sum(pyg_con_cobertura)

# Monto inicial de la inversión
inversion_inicial <- 10000

# Calcular el total de PYG cubierto
total_cubierto <- pyg_total_cubierto + inversion_inicial

# Mostrar el total de PYG cubierto
cat("Total de PYG cubierto:", total_cubierto, "\n")
## Total de PYG cubierto: 1189.756
porcentaje_cubierto<- total_cubierto/inversion_inicial
print(porcentaje_cubierto)
## [1] 0.1189756