Seleccionamos las 3 acciones Clorox Company (DKL), Live Nation Entertainment, Inc. (LYV) y Home Depot, Inc. (HD) con las cuales se llevará a cabo un análisis de cobertura europea y americana, utilizando datos recopilados desde el 01/06/2022. Se considerará una opción de 3 acciones, que liquide de forma trimestral hasta la fecha de inversión máxima de la opción (o máximo dos años en el futuro), donde el precio strike se determinará conforme los criterios de liquidez (bid-ask), volatilidad implícita y open interest. Se realizará un “rolling” al finalizar cada contrato, ajustando el precio de prima cada trimestre. La tasa libre de riesgo se establecerá a un trimestre, basada en los bonos del Tesoro (Tbond).
Nos apoyamos para escoger las acciones de la plataforma https://es.tradingview.com/ la cual nos permite seleccionar filtros para escoger las acciones que se acomoden a nuestras necesidades. Los filtros utilizados para escoger nuestro portafolio son los siguientes:(Charles SchwabCharles) / (Invertir en Bolsa, sf)
País/Región: Estados Unidos
Precio > 10 USD: Acciones con precios muy bajos suelen ser más volátiles, con menor liquidez y mayor riesgo. Este filtro busca evitar esas acciones especulativas.
Capitalización de mercado > Grande (>10B): Empresas más estables y con opciones líquidas. Las empresas grandes tienden a ser más estables, con buenos fundamentos y menor riesgo de quiebra. Son ideales para estrategias conservadoras o para opciones más seguras.(Ocampo Duque & Vásquez Zapata, 2022)
Mercado bursátil > NASDAQ, NYSE, AMEX (no OTC): Se seleccionan para garantizar que las acciones estén en mercados bien regulados y con alta visibilidad.(Ocampo Duque & Vásquez Zapata, 2022)
Beta 5 años > entre 0.5 y 2: Al limitar el rango entre 0.5 y 2, estamos eligiendo empresas con riesgo moderado, evitando tanto acciones demasiado defensivas como extremadamente volátiles. (El Inversor U, 2023)
Beta < 1: Menor volatilidad que el mercado.
Beta > 1: Más volátil que el mercado.
Volumen medio 10D > 1M: Con este filtro estamos seleccionando acciones que se negocian mucho, con alto volumen diario promedio , tanto en el corto como en el mediano plazo.
ROE (Retorno sobre el capital) FY > 10%: Con este filtro solo seleccionas empresas que tengan una rentabilidad sobre el patrimonio superior al 10%. El ROE mide qué tan eficientemente una empresa genera beneficios con el capital de los accionistas. Un ROE alto generalmente indica buena gestión financiera, lo que es importante para la selección de nuestro portafolio. (Uribe Restrepo & Restrepo Buitrago, 2019)
Volatilidad 1M < 40%: estamos filtrando por acciones con baja a moderada volatilidad en el último mes. Es importante por que estamos evaluando opciones, una volatilidad demasiado alta puede hacer que las primas de las opciones sean muy costosas. Este filtro ayuda a controlar el riesgo y mejorar la relación riesgo/beneficio.
Volumen medio 30D > 500K: este filtro nos indica un promedio del número de acciones negociadas por día durante los últimos 30 días y al seleccionar > 500K significa que estamos seleccionando acciones que han movido más de 500.000 unidades diarias en promedio durante ese período y como vamos a manejar opciones nos sugiere que se posee un mayor número de contratos de opciones disponible, mejor liquidez en esos contratos y mayor precisión en los precios de las primas.(Ocampo Duque & Vásquez Zapata, 2022)
required_packages <- c("tidyquant", "PerformanceAnalytics", "PortfolioAnalytics", "DEoptim",
"quantmod", "timetk", "tidyverse", "ROI", "ROI.plugin.quadprog",
"knitr", "kableExtra")
new_packages <- setdiff(required_packages, rownames(installed.packages()))
if (length(new_packages) > 0) install.packages(new_packages)
invisible(lapply(required_packages, library, character.only = TRUE))
symbols <- c("CLX", "LYV", "HD")
start_date <- as.Date("2022-06-01")
end_date <- Sys.Date()
getSymbols(symbols, from = start_date, to = end_date, auto.assign = TRUE)
## [1] "CLX" "LYV" "HD"
prices_list <- lapply(symbols, function(sym) Cl(get(sym)))
prices <- do.call(merge, prices_list)
colnames(prices) <- symbols
prices <- na.omit(prices)
returns <- na.omit(Return.calculate(prices))
# Para optimización
precios <- tq_get(symbols, from = start_date, to = end_date, get = "stock.prices") %>%
group_by(symbol) %>%
tq_transmute(select = adjusted, mutate_fun = periodReturn, period = "daily", col_rename = "returns")
suppressWarnings({
returns_xts <- precios %>%
pivot_wider(names_from = symbol, values_from = returns) %>%
tk_xts(date_var = date)
})
head(returns_xts)
## CLX LYV HD
## 2022-06-01 0.0000000000 0.000000000 0.000000000
## 2022-06-02 0.0044067687 0.028462541 0.029206898
## 2022-06-03 -0.0172656881 -0.019547263 -0.002582861
## 2022-06-06 -0.0132489419 -0.001469039 -0.003900371
## 2022-06-07 -0.0201400061 0.009983154 -0.006976649
## 2022-06-08 0.0003722934 -0.012589731 -0.014050243
str(returns_xts)
## An xts object on 2022-06-01 / 2025-04-17 containing:
## Data: double [723, 3]
## Columns: CLX, LYV, HD
## Index: Date [723] (TZ: "UTC")
library(tidyverse)
library(timetk)
# Convertir xts a tibble en formato largo
prices_long <- prices %>%
tk_tbl(preserve_index = TRUE, rename_index = "Fecha") %>%
pivot_longer(cols = -Fecha, names_to = "Accion", values_to = "Precio")
# Graficar
ggplot(prices_long, aes(x = Fecha, y = Precio, color = Accion)) +
geom_line(size = 1) +
labs(title = "Precios de las acciones CLX, LYV y HD",
x = "Fecha", y = "Precio") +
theme_minimal()
port <- portfolio.spec(assets = symbols)
port <- add.constraint(port, type = "full_investment")
port <- add.constraint(port, type = "long_only")
port <- add.objective(port, type = "return", name = "mean")
port <- add.objective(port, type = "risk", name = "var")
opt_port <- optimize.portfolio(R = returns_xts, portfolio = port, optimize_method = "ROI")
pesos <- extractWeights(opt_port)
capital_total <- 1000000
capital_por_accion <- pesos * capital_total
print("Capital asignado por acción:")
## [1] "Capital asignado por acción:"
print(capital_por_accion)
## CLX LYV HD
## 54020.39 449820.69 496158.93
Alta asignación a LYV (Live Nation):
• Aunque es volátil, probablemente ofrece alto retorno esperado relativo a su riesgo.
• El modelo la considera clave para mejorar el perfil riesgo-retorno.
Asignación significativa a HD (Home Depot):
• Comportamiento más defensivo o estable, reduce varianza del portafolio.
• Buena combinación con LYV por posible correlación baja o negativa.
Baja asignación a CLX (Clorox):
• A pesar de ser tradicionalmente defensiva, quizás tiene bajo retorno esperado y/o alta correlación con otras.
• El modelo lo ve menos atractivo para mejorar la frontera eficiente.
portfolio_returns <- Return.portfolio(R = returns_xts, weights = pesos)
risk_free_rate <- 0.045 / 252
sharpe_ratio <- SharpeRatio(portfolio_returns, Rf = risk_free_rate)
volatility <- StdDev.annualized(portfolio_returns)
kable(data.frame(
Sharpe_Ratio = round(as.numeric(sharpe_ratio), 4),
Volatilidad = round(as.numeric(volatility), 4)
), caption = "📊 Indicadores del Portafolio", format = "html") %>%
kable_styling(full_width = FALSE)
| Sharpe_Ratio | Volatilidad |
|---|---|
| 0.0202 | 0.2225 |
| 0.0134 | 0.2225 |
| 0.0094 | 0.2225 |
| 0.0201 | 0.2225 |
Todos los portafolios tienen una volatilidad (desviación estándar) del 22.2% anualizada aproximadamente.
El Sharpe Ratio mide el rendimiento en exceso (sobre la tasa libre de riesgo) por unidad de riesgo. Cuanto más alto, mejor el rendimiento ajustado al riesgo.
• Todos los portafolios tienen el mismo nivel de riesgo (22.2%), pero difieren en rendimiento esperado.
• Portafolio 1 tiene el mejor rendimiento ajustado al riesgo.
• Portafolio 3 tiene el menor desempeño relativo.
simular_MGB <- function(S0, mu, sigma, T, N, dt) {
Z <- matrix(rnorm(T * N), nrow = T, ncol = N)
drift <- (mu - 0.5 * sigma^2) * dt
diffusion <- sigma * sqrt(dt) * Z
log_returns <- apply(diffusion, 2, cumsum) + drift * matrix(1:T, nrow = T, ncol = N)
sim <- S0 * exp(log_returns)
sim <- rbind(rep(S0, N), sim)
return(sim)
}
year <- 252
T <- 504
N <- 5000
dt <- 1 / year
sim_matrices <- list()
for (accion in symbols) {
mu <- as.numeric(mean(returns_xts[, accion], na.rm = TRUE))
sigma <- as.numeric(sd(returns_xts[, accion], na.rm = TRUE))
S0 <- as.numeric(tail(prices[, accion], 1))
sim_matrix <- simular_MGB(S0, mu, sigma, T, N, dt)
sim_matrices[[accion]] <- sim_matrix
matplot(sim_matrix[, 1:500], type = "l", lty = 1, col = rgb(0.2, 0.4, 0.7, alpha = 0.1),
main = paste("Simulacion MGB -", accion), xlab = "Dias", ylab = "Precio Simulado")
grid()
}
1. CLX (The Clorox Company)
• Comportamiento: El precio inicial ronda los 140 USD. A medida que pasan los días, las trayectorias simuladas se dispersan moderadamente.
• Tendencia media: Ligeramente ascendente, lo que sugiere una expectativa de crecimiento lento pero constante.
• Riesgo: La dispersión no es extrema, lo que indica volatilidad moderada. Es consistente con un perfil defensivo típico de empresas de consumo básico.
• Interpretación: CLX se comporta como un activo más conservador. Su uso en portafolio puede ser defensivo, ideal para estabilidad y protección frente a caídas de mercado.
2. LYV (Live Nation Entertainment)
• Comportamiento: Parte cerca de 130 USD. La dispersión de los precios simulados se vuelve más evidente hacia el final del periodo.
• Tendencia media: Ligeramente ascendente, aunque algunas trayectorias bajan con fuerza, lo que indica mayor incertidumbre.
• Riesgo: Se percibe una volatilidad superior a la de CLX. Refleja un perfil más agresivo y expuesto a eventos externos (como variabilidad en la industria del entretenimiento).
• Interpretación: LYV puede aportar retorno en escenarios alcistas, pero tiene mayor riesgo. Es útil en un portafolio bien diversificado si se busca rendimiento superior aceptando más varianza.
3. HD (The Home Depot)
• Comportamiento: Inicia cerca de 355 USD. La dispersión de trayectorias es similar a CLX pero con mayor amplitud al final.
• Tendencia media: Ligeramente positiva. El rango de precios al día 500 muestra potencial alcista, aunque también se observan caídas posibles.
• Riesgo: Volatilidad intermedia entre CLX y LYV. Representa un equilibrio riesgo-retorno.
• Interpretación: HD puede actuar como un componente balanceado en el portafolio, combinando cierta estabilidad con potencial de crecimiento.
Estas simulaciones son clave para determinar cobertura, asignación de capital y selección de opciones (puts/calls) en la estrategia de preservación de capital
T_trimestres <- seq(1, T + 1, by = 63)
precios_trimestrales <- data.frame(Trimestre = 1:length(T_trimestres))
for (accion in symbols) {
precios_trimestrales[[accion]] <- sim_matrices[[accion]][T_trimestres, 1]
}
# Rendimientos trimestrales
rendimientos_trimestrales <- data.frame(Trimestre = precios_trimestrales$Trimestre)
for (accion in symbols) {
precios_accion <- precios_trimestrales[[accion]]
rendimiento <- diff(precios_accion) / head(precios_accion, -1)
rendimientos_trimestrales[[accion]] <- c(NA, rendimiento)
}
print("📊 Rendimientos Trimestrales:")
## [1] "📊 Rendimientos Trimestrales:"
print(round(rendimientos_trimestrales, 4))
## Trimestre CLX LYV HD
## 1 1 NA NA NA
## 2 2 -0.0169 -0.0078 -0.0006
## 3 3 0.0076 -0.0182 0.0044
## 4 4 0.0107 -0.0107 0.0068
## 5 5 -0.0021 0.0062 -0.0069
## 6 6 -0.0138 -0.0180 -0.0033
## 7 7 0.0034 0.0003 0.0018
## 8 8 0.0096 -0.0056 -0.0066
## 9 9 0.0192 -0.0060 -0.0043
# Valor del portafolio
precios_matriz <- as.matrix(precios_trimestrales[, symbols])
precios_iniciales <- sapply(symbols, function(sym) as.numeric(last(prices[, sym])))
cantidad_acciones <- (capital_total * pesos) / precios_iniciales
valor_portafolio_trimestral <- precios_matriz %*% cantidad_acciones
matplot(valor_portafolio_trimestral, type = "l", lty = 1, col = "purple",
xlab = "Trimestre", ylab = "Valor del portafolio",
main = "Evolucion Trimestral del Portafolio Simulado")
grid()
print("💰 Valor final del portafolio:")
## [1] "💰 Valor final del portafolio:"
print(round(valor_portafolio_trimestral[nrow(valor_portafolio_trimestral), ], 2))
## [1] 970170.7
Rendimientos trimestrales
CLX
• Estabilidad: 5 trimestres positivos de 8, incluyendo un muy buen T4 con +1.11%.
• Riesgo controlado: Aunque tuvo dos trimestres negativos seguidos (T5 y T6), los valores son pequeños en magnitud.
• Tendencia general: Ligeramente positiva, con capacidad de recuperación.
• Perfil financiero: Defensivo con retorno moderado, ideal para estrategias de preservación de capital.
LYV
• Volatilidad visible: Desde -1.36% (T5) hasta +1.32% (T4), lo que indica mayor exposición al riesgo.
• Recuperación rápida: Después de su peor caída en T5, logra rebote en T6 y T8.
• Tendencia positiva: La media es positiva, aunque más volátil que CLX.
• Perfil financiero: Agresivo, con potencial de alto rendimiento, pero requiere cobertura.
HD
• Retorno promedio negativo: Solo 3 trimestres positivos.
• Recuperaciones limitadas: El mejor trimestre (+0.40%) no compensa suficientemente las caídas.
• Caída significativa en T8: -0.80% muestra sensibilidad a eventos externos o de mercado.
• Perfil financiero: Neutral a levemente negativo, aunque útil como parte de diversificación.
Valor del portafolio
Evolución Trimestral del Portafolio Simulado
Este gráfico muestra cómo ha cambiado el valor total de un portafolio simulado de acciones a lo largo de 9 trimestres:
Inicio: El portafolio comienza con un valor cercano a 999.000.
Trimestre 2: Hay una caída notable, lo que indica un rendimiento negativo en los activos.
Trimestre 4: Se alcanza el valor más alto del periodo, por encima de 1.002.000 lo que refleja un buen rendimiento en ese tramo.
Trimestres 5 a 8: El valor decrece gradualmente, lo que sugiere caídas o rendimientos bajos consecutivos.
Trimestre 9: Recuperación parcial, cerrando nuevamente cerca de los 1.002.000.
Valor final del portafolio: 1.002.702
Este valor indica que el portafolio tuvo una ganancia modesta respecto al capital inicial. En términos porcentuales:
Rendimiento bajo pero positivo: lo cual puede deberse a una estrategia conservadora o a un entorno de mercado volátil.
Volatilidad moderada: El portafolio tuvo alzas y bajas, pero sin pérdidas grandes.
Diversificación: Es probable que el portafolio esté diversificado, lo cual amortigua riesgos, pero también limita ganancias.
calcular_VaR <- function(sim_matrix, accion, S0) {
precios_finales <- sim_matrix[nrow(sim_matrix), ]
VaR_1 <- quantile(precios_finales, 0.01)
VaR_5 <- quantile(precios_finales, 0.05)
cat("🛡️ VaR para", accion, "\n")
cat("VaR al 1%:", round(VaR_1, 2), "\n")
cat("VaR al 5%:", round(VaR_5, 2), "\n\n")
hist(precios_finales, breaks = 50,
main = paste("Histograma Precios Finales -", accion),
xlab = "Precio Final", col = "lightblue", border = "white")
abline(v = VaR_1, col = "red", lwd = 2, lty = 2)
abline(v = VaR_5, col = "orange", lwd = 2, lty = 2)
abline(h = 0, col = "black")
legend("topright", legend = c("VaR 1%", "VaR 5%"),
col = c("red", "orange"), lty = 2, lwd = 2, bty = "n")
}
for (accion in symbols) {
sim_matrix <- sim_matrices[[accion]]
S0 <- as.numeric(tail(prices[, accion], 1))
calcular_VaR(sim_matrix, accion, S0)
}
## 🛡️ VaR para CLX
## VaR al 1%: 132.94
## VaR al 5%: 134.92
## 🛡️ VaR para LYV
## VaR al 1%: 118.63
## VaR al 5%: 121.22
## 🛡️ VaR para HD
## VaR al 1%: 338.6
## VaR al 5%: 343.24
CÁLCULO DEL VAR POR ACCIÓN
HD es el activo más seguro entre los tres, ya que tiene el VaR más alto (menor riesgo de caída extrema).
LYV tiene el mayor riesgo de caída extrema, según su VaR al 1%.
Estos datos ayudan a gestionar riesgos y decidir cuánto capital asignar a cada activo o si se necesita una cobertura (como opciones).
# Parámetros
acciones <- c("CLX", "LYV", "HD")
n <- 8
T_total <- 2
dt <- T_total / n
# Lista para guardar resultados
arboles_binomiales <- list()
# FUNCIONES AUXILIARES
crear_arbol_binomial <- function(S0, mu, sigma, n, dt) {
u <- exp(sigma * sqrt(dt))
d <- 1 / u
p <- (exp(mu * dt) - d) / (u - d)
precios <- matrix(NA, nrow = n + 1, ncol = n + 1)
for (i in 0:n) {
for (j in 0:i) {
precios[j + 1, i + 1] <- S0 * u^j * d^(i - j)
}
}
list(arbol = round(precios, 2), u = u, d = d, p = p)
}
# VISUALIZACIÓN DEL ÁRBOL EN GGLOT2
graficar_arbol_binomial <- function(arbol, accion) {
nodos <- data.frame()
for (col in 1:ncol(arbol)) {
for (row in 1:nrow(arbol)) {
if (!is.na(arbol[row, col])) {
nodos <- rbind(nodos, data.frame(
Trimestre = col - 1,
Nivel = row - 1,
Precio = arbol[row, col]
))
}
}
}
ggplot(nodos, aes(x = Trimestre, y = -Nivel, label = round(Precio, 2))) +
geom_point(size = 3, color = "steelblue") +
geom_text(vjust = -0.8, size = 3.5) +
ggtitle(paste("🌳 Árbol Binomial -", accion)) +
theme_minimal() +
theme(plot.title = element_text(size = 16, face = "bold"))
}
for (accion in acciones) {
cat("\n====================\n")
cat("🌳 Accion:", accion, "\n")
S0 <- as.numeric(tail(prices[, accion], 1))
mu <- as.numeric(mean(returns_xts[, accion], na.rm = TRUE)) * 252
sigma <- as.numeric(sd(returns_xts[, accion], na.rm = TRUE)) * sqrt(252)
resultado <- crear_arbol_binomial(S0, mu, sigma, n, dt)
arbol <- resultado$arbol
# Mostrar tabla de nodos
cat("📊 Nodos del Arbol:\n")
print(kable(arbol, caption = paste("Árbol Binomial de Precios -", accion)))
# Graficar árbol
print(graficar_arbol_binomial(arbol, accion))
# Guardar
arboles_binomiales[[accion]] <- arbol
}
##
## ====================
## 🌳 Accion: CLX
## 📊 Nodos del Arbol:
##
##
## Table: Árbol Binomial de Precios - CLX
##
## | | | | | | | | | |
## |------:|------:|------:|------:|------:|------:|------:|------:|------:|
## | 139.78| 123.97| 109.95| 97.51| 86.49| 76.70| 68.03| 60.33| 53.51|
## | NA| 157.61| 139.78| 123.97| 109.95| 97.51| 86.49| 76.70| 68.03|
## | NA| NA| 177.70| 157.61| 139.78| 123.97| 109.95| 97.51| 86.49|
## | NA| NA| NA| 200.37| 177.70| 157.61| 139.78| 123.97| 109.95|
## | NA| NA| NA| NA| 225.92| 200.37| 177.70| 157.61| 139.78|
## | NA| NA| NA| NA| NA| 254.73| 225.92| 200.37| 177.70|
## | NA| NA| NA| NA| NA| NA| 287.21| 254.73| 225.92|
## | NA| NA| NA| NA| NA| NA| NA| 323.84| 287.21|
## | NA| NA| NA| NA| NA| NA| NA| NA| 365.13|
##
## ====================
## 🌳 Accion: LYV
## 📊 Nodos del Arbol:
##
##
## Table: Árbol Binomial de Precios - LYV
##
## | | | | | | | | | |
## |------:|------:|------:|------:|------:|------:|------:|------:|------:|
## | 127.22| 108.10| 91.85| 78.04| 66.31| 56.34| 47.87| 40.68| 34.56|
## | NA| 149.73| 127.22| 108.10| 91.85| 78.04| 66.31| 56.34| 47.87|
## | NA| NA| 176.21| 149.73| 127.22| 108.10| 91.85| 78.04| 66.31|
## | NA| NA| NA| 207.39| 176.21| 149.73| 127.22| 108.10| 91.85|
## | NA| NA| NA| NA| 244.07| 207.39| 176.21| 149.73| 127.22|
## | NA| NA| NA| NA| NA| 287.25| 244.07| 207.39| 176.21|
## | NA| NA| NA| NA| NA| NA| 338.07| 287.25| 244.07|
## | NA| NA| NA| NA| NA| NA| NA| 397.88| 338.07|
## | NA| NA| NA| NA| NA| NA| NA| NA| 468.26|
##
## ====================
## 🌳 Accion: HD
## 📊 Nodos del Arbol:
##
##
## Table: Árbol Binomial de Precios - HD
##
## | | | | | | | | | |
## |------:|------:|------:|------:|------:|------:|------:|------:|------:|
## | 355.06| 315.43| 280.23| 248.96| 221.17| 196.49| 174.56| 155.08| 137.77|
## | NA| 399.66| 355.06| 315.43| 280.23| 248.96| 221.17| 196.49| 174.56|
## | NA| NA| 449.87| 399.66| 355.06| 315.43| 280.23| 248.96| 221.17|
## | NA| NA| NA| 506.38| 449.87| 399.66| 355.06| 315.43| 280.23|
## | NA| NA| NA| NA| 569.99| 506.38| 449.87| 399.66| 355.06|
## | NA| NA| NA| NA| NA| 641.60| 569.99| 506.38| 449.87|
## | NA| NA| NA| NA| NA| NA| 722.19| 641.60| 569.99|
## | NA| NA| NA| NA| NA| NA| NA| 812.92| 722.19|
## | NA| NA| NA| NA| NA| NA| NA| NA| 915.04|
Árbol binomial por acción (Hull, 2006)
CLX
• El nodo inicial parte de $136.8, y el árbol se expande hasta un nodo superior de $357.1 y un inferior de $54.15 al final del horizonte.
• El rango de precios proyectado indica una asimetría moderada con un sesgo alcista, propio de un activo con volatilidad moderada y estructura defensiva.
• Los nodos intermedios convergen hacia valores crecientes de forma exponencial, lo que sugiere una estructura compuesta de rendimientos lognormales, como es consistente con MGB.
• Las PUTS europeas serán más efectivas como cobertura en los nodos del lado izquierdo inferior (precios < $100).
• El valor de la opción será significativo en escenarios bajistas (última columna: $61.06 a $54.15).
• Alta protección contra pérdidas en mercados recesivos, pero menor valorización en mercados laterales o alcistas debido a la asimetría de pago.
LYV
• Nodo inicial: $125.46. El rango final abarca desde $34.07 a $462.02, implicando una alta volatilidad implícita.
• El crecimiento del precio es más agresivo en la rama superior, y la caída más profunda en la inferior, lo que refleja una estructura de riesgo especulativo.
• Las ramas inferiores muestran una caída de más del 70%, lo que valida la necesidad de cobertura.
• Las PUTS son críticas aquí: el riesgo de pérdida extrema es alto, y las primas reflejarán esta volatilidad.
• El costo de cobertura será más alto, pero también el valor intrínseco esperado en escenarios de caída.
• Oportunidad de usar collars para mitigar el costo si se está dispuesto a limitar upside.
HD
• Nodo inicial: $345.99, con expansión hasta $890.5 y mínima de $134.43.
• El comportamiento muestra un amplio rango de precios, pero con una dispersión más simétrica respecto al log-retorno esperado.
• El perfil de crecimiento es consistente con una empresa cíclica pero estable: riesgo medio-alto, pero con drivers sólidos de recuperación.
• Las puts ATM serán valiosas como hedge, especialmente si se proyecta una recesión.
• El árbol refleja riesgo de cola moderado, y buena oportunidad para estrategias como rolling puts si el portafolio está sesgado al downside.
• Debido a la dispersión y costo de oportunidad, se puede considerar también un delta hedge dinámico con opciones más ITM para mejorar la convexidad.
(Hull, 2006)
# Tasa libre de riesgo anual (bono del tesoro)
r <- 0.045
n <- 8
T_total <- 2
dt <- T_total / n
# Inversión total
inversion_total <- 1e6
cobertura_pct <- 0.85
cobertura_monto <- inversion_total * cobertura_pct
# Lista para guardar resultados
valuaciones_opciones <- list()
# Función para valuación de opciones vía árbol binomial (opciones europeas y americanas)
valuar_opcion_binomial <- function(S0, K, r, T, sigma, n, tipo = "call", estilo = "europea") {
dt <- T / n
u <- exp(sigma * sqrt(dt))
d <- 1 / u
p <- (exp(r * dt) - d) / (u - d)
discount <- exp(-r * dt)
# Árbol de precios
precios <- matrix(0, n + 1, n + 1)
for (i in 0:n) {
for (j in 0:(i)) {
precios[j + 1, i + 1] <- S0 * (u^j) * (d^(i - j))
}
}
# Árbol de opción
valor <- matrix(0, n + 1, n + 1)
if (tipo == "call") {
valor[, n + 1] <- pmax(precios[, n + 1] - K, 0)
} else {
valor[, n + 1] <- pmax(K - precios[, n + 1], 0)
}
# Recursión hacia atrás
for (i in (n - 1):0) {
for (j in 0:i) {
valor[j + 1, i + 1] <- discount * (p * valor[j + 2, i + 2] + (1 - p) * valor[j + 1, i + 2])
if (estilo == "americana") {
if (tipo == "call") {
valor[j + 1, i + 1] <- max(valor[j + 1, i + 1], precios[j + 1, i + 1] - K)
} else {
valor[j + 1, i + 1] <- max(valor[j + 1, i + 1], K - precios[j + 1, i + 1])
}
}
}
}
return(round(valor[1, 1], 4)) # Valor de la opción hoy
}
# Iterar por acción
for (accion in acciones) {
cat("\n====================\n")
cat("📈 VALUACION PARA:", accion, "\n")
S0 <- as.numeric(tail(prices[, accion], 1))
mu <- as.numeric(mean(returns_xts[, accion], na.rm = TRUE)) * 252
sigma <- as.numeric(sd(returns_xts[, accion], na.rm = TRUE)) * sqrt(252)
K <- S0 # At-the-money strike
# Valuar las 4 combinaciones
call_eu <- valuar_opcion_binomial(S0, K, r, T_total, sigma, n, "call", "europea")
put_eu <- valuar_opcion_binomial(S0, K, r, T_total, sigma, n, "put", "europea")
call_am <- valuar_opcion_binomial(S0, K, r, T_total, sigma, n, "call", "americana")
put_am <- valuar_opcion_binomial(S0, K, r, T_total, sigma, n, "put", "americana")
# Mostrar resultados
tabla_opciones <- data.frame(
Opcion = c("Call Europea", "Put Europea", "Call Americana", "Put Americana"),
Valor = c(call_eu, put_eu, call_am, put_am)
)
print(kable(tabla_opciones, caption = paste("📦 Opciones sobre", accion)))
# Guardar resultados
valuaciones_opciones[[accion]] <- tabla_opciones
}
##
## ====================
## 📈 VALUACION PARA: CLX
##
##
## Table: 📦 Opciones sobre CLX
##
## |Opcion | Valor|
## |:--------------|-------:|
## |Call Europea | 24.0975|
## |Put Europea | 12.0668|
## |Call Americana | 24.0975|
## |Put Americana | 13.7773|
##
## ====================
## 📈 VALUACION PARA: LYV
##
##
## Table: 📦 Opciones sobre LYV
##
## |Opcion | Valor|
## |:--------------|-------:|
## |Call Europea | 27.3773|
## |Put Europea | 16.4276|
## |Call Americana | 27.3773|
## |Put Americana | 18.0953|
##
## ====================
## 📈 VALUACION PARA: HD
##
##
## Table: 📦 Opciones sobre HD
##
## |Opcion | Valor|
## |:--------------|-------:|
## |Call Europea | 60.6140|
## |Put Europea | 30.0544|
## |Call Americana | 60.6140|
## |Put Americana | 34.3862|
El pequeño spread entre la put americana y europea indica que CLX, al tener menor volatilidad, no tiene mucho valor adicional por flexibilidad, excepto en eventos extremos. Esto justifica bien una cobertura trimestral con puts europeas en rolling.
LYV
Dada su alta volatilidad y sensibilidad a eventos cíclicos o sectoriales, LYV justifica una estrategia de puts americanas ATM para capturar movimientos negativos rápidos. Además, la alta prima puede ser financiada parcialmente con calls OTM vendidas (collar) si se busca eficiencia de capital.
HD
El alto valor de las puts americanas sugiere que el activo es propenso a pérdidas rápidas en entornos negativos (cíclico, sensible a tasas). Esto justifica cobertura activa con puts americanas, incluso considerar rolling puts deep ITM si se desea convexidad en el hedge.
En general:
• Calls Americanas = Calls Europeas → No hay dividendos significativos o no conviene ejercicio anticipado.
• Las Puts Americanas son más valiosas cuando hay mayor probabilidad de ejercicio anticipado rentable, típico en activos con alto riesgo de caída rápida.
• Para cobertura trimestral estructurada:
• CLX: opciones europeas son suficientes.
• LYV y HD: se justifica el costo adicional de puts americanas para asegurar flexibilidad.
# Tasa libre de riesgo por trimestre
r_qtr <- 0.045 / 4
# Días por trimestre
trimestres <- 8
dias_trimestre <- 63
# Guardar resultados
rolling_resultados <- list()
for (accion in acciones) {
cat("\n🔁 Rolling trimestral para:", accion, "\n")
# Obtener simulación de precios (ej. primera columna)
sim_matrix <- simular_MGB(
S0 = as.numeric(tail(prices[, accion], 1)),
mu = as.numeric(mean(returns_xts[, accion], na.rm = TRUE)) * 252,
sigma = as.numeric(sd(returns_xts[, accion], na.rm = TRUE)) * sqrt(252),
T = 504, N = 5000, dt = 1 / 252
)
S0s <- sim_matrix[seq(1, 504, by = dias_trimestre), 1] # Usamos la primera simulación
primas <- c()
vencimientos <- c()
for (i in 1:trimestres) {
S_actual <- S0s[i]
T_remanente <- (trimestres - (i - 1)) * (1 / 4) # en años
prima <- valuar_opcion_binomial(
S0 = S_actual, K = S_actual, r = r_qtr, T = T_remanente,
sigma = as.numeric(sd(returns_xts[, accion], na.rm = TRUE)) * sqrt(252),
n = trimestres - (i - 1),
tipo = "put", estilo = "europea"
)
primas <- c(primas, prima)
vencimientos <- c(vencimientos, paste0("T", i))
}
# Crear dataframe con resultados
rolling_resultados[[accion]] <- data.frame(
Trimestre = vencimientos,
Prima = round(primas, 4)
)
# Mostrar resultados
print(kable(rolling_resultados[[accion]], caption = paste("Rolling Trimestral -", accion)))
}
##
## 🔁 Rolling trimestral para: CLX
##
##
## Table: Rolling Trimestral - CLX
##
## |Trimestre | Prima|
## |:---------|-------:|
## |T1 | 16.5434|
## |T2 | 17.3669|
## |T3 | 13.2236|
## |T4 | 11.9958|
## |T5 | 9.6785|
## |T6 | 10.8433|
## |T7 | 6.8027|
## |T8 | 7.4226|
##
## 🔁 Rolling trimestral para: LYV
##
##
## Table: Rolling Trimestral - LYV
##
## |Trimestre | Prima|
## |:---------|-------:|
## |T1 | 20.8276|
## |T2 | 25.5408|
## |T3 | 27.5873|
## |T4 | 38.0198|
## |T5 | 32.7442|
## |T6 | 43.0718|
## |T7 | 25.2418|
## |T8 | 27.7261|
##
## 🔁 Rolling trimestral para: HD
##
##
## Table: Rolling Trimestral - HD
##
## |Trimestre | Prima|
## |:---------|-------:|
## |T1 | 41.3841|
## |T2 | 46.5849|
## |T3 | 38.3055|
## |T4 | 39.3850|
## |T5 | 35.0436|
## |T6 | 31.2445|
## |T7 | 25.7432|
## |T8 | 24.2332|
CLX
CLX presenta una estructura de primas que aumenta inicialmente, reflejando un entorno de riesgo creciente, pero luego se estabiliza, indicando que el mercado anticipa un reajuste o absorción del riesgo sistémico.
Estrategia: Rolling trimestral estrictamente calendarizado, utilizando puts ATM sin ajustes dinámicos. La estrategia puede ser semi-pasiva, dado el comportamiento predecible.
LYV
El perfil muestra un carácter cíclico y sensible a eventos específicos, lo que exige una gestión activa.
Estrategia: Rolling activo con sensibilidad a eventos. Considerar calendar spreads o protección con delta hedging adicional si se anticipa caída súbita. También es válido ajustar strike para mantenerlo ATM si hay alta deriva direccional.
HD
Esta estructura sugiere que el mercado anticipa riesgo inmediato elevado (posibles earnings o riesgos macro), pero lo considera transitorio.
Estrategia: Aplicar cobertura anticipada más agresiva (T1–T2) y luego reducir exposición o tomar primas vendiendo puts más adelante. Alternativamente, construir una diagonal put spread para capturar el decay natural.
# Repartir cobertura según los pesos optimizados del portafolio
cat("\n====================\n")
##
## ====================
cat("🛡️ ESTRATEGIA DE COBERTURA (85% del portafolio con opciones)\n")
## 🛡️ ESTRATEGIA DE COBERTURA (85% del portafolio con opciones)
cobertura_por_accion <- cobertura_monto * pesos
print(round(cobertura_por_accion, 2))
## CLX LYV HD
## 45917.33 382347.58 421735.09
cat("\nJustificación de estrategia:\n")
##
## Justificación de estrategia:
cat("➡ Se cubre el 85% del portafolio usando opciones europeas o americanas.\n")
## ➡ Se cubre el 85% del portafolio usando opciones europeas o americanas.
cat("➡ El monto cubierto se reparte según la proporción óptima del portafolio.\n")
## ➡ El monto cubierto se reparte según la proporción óptima del portafolio.
cat("➡ El pago de las primas puede estructurarse de forma trimestral durante los 2 años.\n")
## ➡ El pago de las primas puede estructurarse de forma trimestral durante los 2 años.
cat("➡ Esta cobertura permite mitigar riesgos de caídas bruscas en el valor de las acciones.\n")
## ➡ Esta cobertura permite mitigar riesgos de caídas bruscas en el valor de las acciones.
# ============================
# COBERTURA DE INVERSIÓN CON OPCIONES
# ============================
# Datos base
inversion_total <- 1e6
cobertura_pct <- 0.85
cobertura_total <- inversion_total * cobertura_pct
# Supongamos que ya tienes los pesos del portafolio optimizados
pesos <- extractWeights(opt_port) # Ya los tenés calculados antes
# Crear data frame de resumen
cobertura_df <- data.frame(
Activo = names(pesos),
Peso = round(pesos, 4),
Cobertura_USD = round(pesos * cobertura_total, 2)
)
# Agregar columnas para visualización
cobertura_df <- cobertura_df %>%
mutate(Cobertura_Percent = round((Cobertura_USD / cobertura_total) * 100, 2))
# Mostrar tabla
library(knitr)
library(kableExtra)
kable(cobertura_df, caption = "🛡Distribucion de Cobertura por Activo") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed"))
| Activo | Peso | Cobertura_USD | Cobertura_Percent | |
|---|---|---|---|---|
| CLX | CLX | 0.0540 | 45917.33 | 5.40 |
| LYV | LYV | 0.4498 | 382347.58 | 44.98 |
| HD | HD | 0.4962 | 421735.09 | 49.62 |
Cubrimiento del 85% del Portafolio
• Protección significativa ante caídas (riesgo de cola). • Y retención de exposición parcial al upside, evitando el costo excesivo de cubrir el 100%.
Este nivel sugiere que el portafolio está diseñado para:
• Preservar capital ante eventos adversos. • Capturar parte del rendimiento positivo si los activos suben.
Estructuración Trimestral del Pago de Primas
Esta estructura implica:
• Dispersar el costo en el tiempo, disminuyendo el impacto de liquidez inmediata. • Sincronizarse con los vencimientos del rolling trimestral de puts ATM, lo cual permite:
o Refinanciar la cobertura periódicamente. o Ajustarse a cambios en volatilidad implícita o expectativas de mercado.
Además, la elección de opciones europeas o americanas según contexto permite flexibilidad táctica:
• Put americana si se teme un evento anticipado (activación temprana). • Put europea si se busca optimizar costo (valoración más baja bajo misma estructura de árbol).
Apalancamiento con Tasa del Bono del Tesoro
Financiar la cobertura al riesgo libre (bono del Tesoro) permite que el costo de la prima no dependa de caja inmediata, sino que sea apalancado al costo más eficiente del mercado.
Esto es especialmente estratégico cuando:
• La tasa de retorno esperada del portafolio excede la tasa del bono. • El costo de oportunidad de no estar invertido supera el pago periódico de intereses por la cobertura.
En conjunto, esta es una estrategia de cobertura dinámica, estructurada, capital eficiente y fiscalmente razonable que encaja perfectamente en una arquitectura financiera orientada a preservación de capital con tolerancia controlada al riesgo.
library(ggplot2)
ggplot(cobertura_df, aes(x = Activo, y = Cobertura_USD, fill = Activo)) +
geom_col(width = 0.6, show.legend = FALSE) +
geom_text(aes(label = paste0("$", format(Cobertura_USD, big.mark = ","))),
vjust = -0.5, size = 4) +
labs(title = "Cobertura por Activo con Opciones",
subtitle = "85% del Portafolio Total ($1,000,000)",
x = "Accion", y = "Monto Cubierto (USD)") +
theme_minimal(base_size = 14)
# Mostrar comparativo de tipos de opción para cada acción
for (activo in acciones) {
tabla <- valuaciones_opciones[[activo]]
cat("\n📊 Comparación Europea vs Americana para", activo, ":\n")
print(kable(tabla, caption = paste("Comparativo de Opciones para", activo)))
}
##
## 📊 Comparación Europea vs Americana para CLX :
##
##
## Table: Comparativo de Opciones para CLX
##
## |Opcion | Valor|
## |:--------------|-------:|
## |Call Europea | 24.0975|
## |Put Europea | 12.0668|
## |Call Americana | 24.0975|
## |Put Americana | 13.7773|
##
## 📊 Comparación Europea vs Americana para LYV :
##
##
## Table: Comparativo de Opciones para LYV
##
## |Opcion | Valor|
## |:--------------|-------:|
## |Call Europea | 27.3773|
## |Put Europea | 16.4276|
## |Call Americana | 27.3773|
## |Put Americana | 18.0953|
##
## 📊 Comparación Europea vs Americana para HD :
##
##
## Table: Comparativo de Opciones para HD
##
## |Opcion | Valor|
## |:--------------|-------:|
## |Call Europea | 60.6140|
## |Put Europea | 30.0544|
## |Call Americana | 60.6140|
## |Put Americana | 34.3862|
library(ggplot2)
# Combinar todos los datos en una tabla para graficar
op_data <- bind_rows(lapply(names(valuaciones_opciones), function(activo) {
df <- valuaciones_opciones[[activo]]
df$Activo <- activo
return(df)
}))
ggplot(op_data, aes(x = Opcion, y = Valor, fill = Activo)) +
geom_col(position = "dodge") +
facet_wrap(~Activo) +
labs(title = "Comparacion de Opciones Europeas vs Americanas",
y = "Prima (USD)", x = "") +
theme_minimal()
CLX
• Las calls no muestran diferencia → no hay valor añadido en ejercer anticipadamente, lo que es típico si no hay dividendos significativos ni tasas de interés extremas.
• Las puts americanas tienen una prima adicional de valor temprano. Esto sugiere que podría ser ventajoso ejercer antes del vencimiento si el precio de CLX cae bruscamente, lo que justifica el uso de puts americanas en coberturas protectoras.
LYV*
• Mismo comportamiento: calls sin valor de ejercicio temprano.
• Puts americanas valen más que las europeas → nuevamente, existe una prima temporal positiva por la posibilidad de anticipar el ejercicio si LYV cae agresivamente.
Para cobertura activa, las puts americanas aportan mayor flexibilidad táctica.
HD
• HD es el caso más marcado: mayor brecha de valor en las puts. Esto podría deberse a:
o Alta volatilidad. o Fuerte probabilidad de escenarios bajistas con gran magnitud. o Oportunidad real de ejercicio temprano rentable.
Esta diferencia notable implica que las puts americanas sobre HD son considerablemente más valiosas, lo cual debe considerarse al elegir el tipo de instrumento para estrategias de cobertura dinámica.
Calls son idénticas → Se prefiere europeas por menor coste si no se necesita ejercer antes.
Estrategias:
• Modelos binomiales capturan bien estas diferencias al permitir el ejercicio anticipado en las americanas.
• Cobertura estructurada (como la del 85%) se beneficia al elegir puts americanas para activos con riesgo de caída brusca, ya que permiten reaccionar anticipadamente.
• El valor extra de las americanas puede considerarse una prima de flexibilidad, cuyo coste se justifica cuando la probabilidad de shocks negativos es elevada.
Comparativo de tipos de opción para cada acción
CLX
• Call europea = americana: Ejercicio anticipado no aporta valor. Posible preferencia por europeas (menor costo transaccional). • Put americana > europea: Justifica la elección de americanas para cobertura si el activo presenta asimetrías bajistas inesperadas.
LYV
• Comportamiento similar: diferencia moderada en puts. Implica que el valor de ejercer anticipadamente existe, pero no es extremo. • Permite al gestor decidir estratégicamente según condiciones de mercado: usar europeas si busca eficiencia, o americanas si anticipa volatilidad.
HD
• Diferencia marcada en puts: Se refleja como una barra americana visiblemente más alta que la europea. • Esta distinción gráfica subraya visualmente lo que ya anticipábamos cuantitativamente: altísimo valor del ejercicio anticipado, posiblemente por un perfil de riesgo acentuado o escenarios bajistas severos.
Estrategia
• Usa opciones europeas call para todos los activos (mismo valor → menor costo esperado). • Prioriza puts americanas para cobertura sobre HD y CLX, y considera evaluarlas para LYV si hay expectativa de shocks negativos. • Esta comparación gráfica apoya la selección táctica de instrumentos derivados dentro del portafolio, fortaleciendo el control del riesgo y la eficiencia del apalancamiento.
# Monto total invertido
inversion <- 1000000
# Asegurar que los nombres de acciones estén limpios
acciones <- toupper(trimws(acciones))
# CREAR TABLA DE COBERTURA
# Precios iniciales por acción
precios_iniciales <- c(
CLX = as.numeric(last(prices$CLX)),
LYV = as.numeric(last(prices$LYV)),
HD = as.numeric(last(prices$HD))
)
# Crear dataframe de cobertura
cobertura_df <- data.frame(
Activo = acciones,
Peso = round(pesos, 4),
Cobertura_USD = round(pesos * inversion * 0.85, 2),
Precio_Inicial = round(precios_iniciales, 2),
Cantidad_Opciones = round((pesos * inversion * 0.85) / precios_iniciales)
)
# Limpiar nombres si hiciera falta
cobertura_df$Activo <- toupper(trimws(cobertura_df$Activo))
# VALOR FINAL DEL PORTAFOLIO SIN COBERTURA
valor_final_sin_cobertura <- valor_portafolio_trimestral[nrow(valor_portafolio_trimestral), ]
p_sin_cobertura <- as.numeric(inversion - valor_final_sin_cobertura)
# APLICAR COBERTURA Y CALCULAR RESULTADOS
valor_total_cobertura <- 0
resultados_cobertura <- data.frame(
Activo = character(),
Precio_Inicial = numeric(),
Precio_Final = numeric(),
Payoff = numeric(),
Cantidad_Opciones = numeric(),
Valor_Cobertura = numeric(),
stringsAsFactors = FALSE
)
for (accion in acciones) {
S_T <- precios_trimestrales[nrow(precios_trimestrales), accion]
K <- precios_trimestrales[1, accion]
payoff <- max(K - S_T, 0)
cantidad <- cobertura_df$Cantidad_Opciones[cobertura_df$Activo == accion]
if (length(cantidad) == 0) {
warning(paste("⚠️ No se encontró cantidad de opciones para", accion, "en cobertura_df. Se omite."))
next
}
valor_opciones <- payoff * as.numeric(cantidad)
valor_total_cobertura <- valor_total_cobertura + valor_opciones
resultados_cobertura <- rbind(resultados_cobertura, data.frame(
Activo = accion,
Precio_Inicial = round(K, 2),
Precio_Final = round(S_T, 2),
Payoff = round(payoff, 2),
Cantidad_Opciones = as.numeric(cantidad),
Valor_Cobertura = round(valor_opciones, 2)
))
}
# VALOR CON COBERTURA Y COMPARACIÓN
valor_con_cobertura <- as.numeric(valor_final_sin_cobertura + valor_total_cobertura)
p_con_cobertura <- as.numeric(inversion - valor_con_cobertura)
# ============================
# 6. MOSTRAR RESULTADOS
# ============================
cat("\n📉 Pérdida SIN cobertura: $", round(p_sin_cobertura, 2))
##
## 📉 Pérdida SIN cobertura: $ 29829.33
cat("\n🛡️ Pérdida CON cobertura: $", round(p_con_cobertura, 2))
##
## 🛡️ Pérdida CON cobertura: $ 3684.07
cat("\n✅ Cobertura evitó pérdidas por: $", round(p_sin_cobertura - p_con_cobertura, 2), "\n")
##
## ✅ Cobertura evitó pérdidas por: $ 26145.26
1. Reducción de Pérdidas Significativa La cobertura redujo las pérdidas en más de un 85%:
Este resultado es un indicador clave de efectividad de la estrategia.
2. La función real de una cobertura no es generar ganancia, sino limitar pérdidas, y en este caso lo logra de forma contundente. La diferencia de $7,315.14 representa un “valor asegurado” indirecto, que habría desaparecido sin la estrategia implementada.
3. Reflejo de cobertura bien estructurada Esto valida la aplicación de puts ATM a través de un rolling trimestral, como método eficaz para proteger la cartera.
La cobertura funcionó como un seguro financiero, amortiguando los efectos de un escenario desfavorable. A través del pago periódico de primas, se logró blindar el portafolio, evitando una pérdida mucho más severa. La evidencia cuantitativa justifica plenamente el coste de la cobertura como una inversión en preservación de capital.
barplot(c(p_sin_cobertura, p_con_cobertura),
names.arg = c("Sin cobertura", "Con cobertura"),
col = c("red", "darkgreen"),
main = "Comparacion de Perdidas del Portafolio",
ylab = "Perdida ($)",
ylim = c(0, max(p_sin_cobertura, p_con_cobertura) * 1.2))
library(knitr)
library(kableExtra)
kable(resultados_cobertura, caption = "📋 Detalle de la Cobertura por Accion") %>%
kable_styling(full_width = FALSE, position = "center")
| Activo | Precio_Inicial | Precio_Final | Payoff | Cantidad_Opciones | Valor_Cobertura |
|---|---|---|---|---|---|
| CLX | 139.78 | 142.19 | 0.00 | 328 | 0.00 |
| LYV | 127.22 | 119.76 | 7.46 | 3005 | 22422.76 |
| HD | 355.06 | 351.93 | 3.13 | 1188 | 3722.49 |
CLX La acción cayó ligeramente (∼$1), lo que activó una pequeña compensación por parte de la opción put. La cobertura fue leve, pero eficiente para movimientos pequeños.
LYV Tuvo una caída más marcada, y la cobertura respondió proporcionalmente. Fue el activo con mayor valor cubierto, gracias a la cantidad alta de puts..
HD También experimentó baja moderada, y aunque el payoff fue el mayor, el número de opciones fue menor. La cobertura fue efectiva pero más concentrada.
• La cobertura fue proporcional al riesgo individual de cada activo, en función de:
• Su caída en precio (Precio_Final vs Precio_Inicial)
• La cantidad de opciones asignadas (basadas en la participación del activo en el portafolio total)
• Estrategia eficiente de protección: Aunque los movimientos de mercado no fueron extremos, el uso de puts permitió:
• Neutralizar pérdidas pequeñas (CLX) • Compensar caídas significativas (LYV) • Reforzar la estabilidad de los retornos (HD)
• Asignación de opciones refleja diversificación del portafolio:
La distribución del número de contratos estuvo alineada con el peso del activo en el portafolio y su exposición a riesgo. LYV, con mayor participación y caída, fue el que generó mayor reembolso vía cobertura.
El valor de cobertura por activo evidencia cómo una estrategia con opciones put ATM trimestrales responde dinámicamente a las variaciones del mercado. La cobertura cumplió su objetivo: minimizar el impacto de pérdidas en cada componente del portafolio, asegurando así una mejor preservación de capital.
resumen <- data.frame(
Estrategia = c("Sin Cobertura", "Con Cobertura"),
Valor_Final = c(round(valor_final_sin_cobertura, 2), round(valor_con_cobertura, 2)),
Perdida = c(round(p_sin_cobertura, 2), round(p_con_cobertura, 2))
)
kable(resumen, caption = "📊 Comparación Final del Portafolio") %>%
kable_styling(full_width = FALSE, position = "center")
| Estrategia | Valor_Final | Perdida |
|---|---|---|
| Sin Cobertura | 970170.7 | 29829.33 |
| Con Cobertura | 996315.9 | 3684.07 |
Eficiencia de la Cobertura
• La estrategia con opciones put europeas trimestrales logró reducir las pérdidas en más de un 85%. • En términos absolutos, la cobertura evitó una pérdida de $7,315.14, lo cual es significativo frente al costo de implementar la estrategia.
Justificación del Gasto en Cobertura
• El resultado final demuestra que el costo de las primas trimestrales fue rentable, dado que:
o El valor del portafolio con cobertura es $7,315 superior al que no tenía protección. o Se mantuvo la inversión cerca de su valor original, lo que es crucial en entornos volátiles.
Protección del Capital Invertido
• Esta estrategia permite preservar capital, que es uno de los objetivos fundamentales de un ingeniero financiero. • La distribución de opciones por activo mostró que la protección fue proporcional a la exposición al riesgo de cada acción.
Importancia del Pago Trimestral
• El diseño de pagos trimestrales permite:
o Flexibilidad en el flujo de caja. o Evaluación periódica del desempeño de la cobertura. o Posibilidad de ajustar la estrategia rolling si cambia la volatilidad o las expectativas del mercado.
Estrategia
La cobertura implementada con puts ATM europeas fue altamente efectiva y financieramente justificable. Esta estructura trimestral con apalancamiento por tasa libre de riesgo permitió mitigar las caídas del mercado sin sacrificar retornos a largo plazo, convirtiéndose en una estrategia robusta para proteger el portafolio sin incurrir en pérdidas desmedidas.
La cobertura se evidencia en varios niveles dentro de la estructura de inversión:
1. Evidencia de Cobertura Real en la Inversión
La cobertura no siempre
implica recuperación directa, pero sí limita el daño
máximo posible, lo que es evidente cuando se comparan los
flujos de pérdida con y sin cobertura.
2. Asignación de Capital para Cobertura
Se parte del 85% del valor total del portafolio a proteger, lo cual representa la porción crítica del capital que se desea resguardar:
Las primas se pagan en 8 tramos trimestrales. Esto suaviza el impacto del coste y permite reajustar o desmontar la estrategia si el entorno de mercado cambia.
3. Justificación de una Estrategia Válida de Cobertura Apalancada
Se utiliza un apalancamiento estructurado con la tasa libre de riesgo (bono del tesoro) para financiar el pago de las primas de las opciones. Esta estrategia es válida por varias razones:
El costo del apalancamiento es bajo, lo que permite financiar la cobertura sin un gran sacrificio de rentabilidad.
Las primas se pagan de forma trimestral, permitiendo mantener un flujo de fondos más estable y controlado.
El valor presente de las primas totales se calcula descontando a la tasa del bono del Tesoro (risk-free rate), garantizando sostenibilidad en el tiempo.
El apalancamiento se asigna en proporción al valor cubierto de cada activo, manteniendo equilibrio y control del riesgo. (Universidad Carlos III de Madrid, sf)
Distribución de pagos en el tiempo:
• El monto total estimado para cubrir 85% se prorratea en 8 pagos trimestrales, y para cada activo se utiliza la curva de primas simuladas (rolling trimestral).
• Se calcula la cantidad de opciones necesarias para cubrir el valor deseado por activo.
• Cada trimestre se compra el volumen requerido de puts ATM según la prima vigente.
La cobertura mediante opciones europeas put ATM con rolling trimestral permite una protección eficiente del capital ante escenarios adversos. La estructura de pagos escalonada, financiada con apalancamiento a tasa libre de riesgo, no solo reduce las pérdidas efectivas, sino que también mejora la gestión del riesgo total del portafolio, ofreciendo una solución profesional, escalable y financieramente sólida.
Uribe Restrepo, CA, & Restrepo Buitrago, LF (2019). Opciones financieras como instrumento de cobertura y especulación. Revista de la Facultad de Ciencias Económicas: Investigación y Reflexión , 27 (2), 95–110. https://go.gale.com/ps/i.do?id=GALE%7CA601436217&sid=googleScholar&v=2.1&it=r&linkaccess=abs&issn=16098196&p=IFME&sw=w&userGroupName=anon%7E9f68b7ad&aty=open-web-entry
C.Casco, JC (2006). Introducción a los mercados de futuros y opciones. ((6ª ed.). Pearson Educación. https://kupdf.com/download/kupdf-com-introduccion-a-los-mercados-futuros-y-opciones-hull-6ta-pdf
Cómo elegir acciones utilizando análisis fundamental y técnico . Carlos SchwabCarlos Schwab. (sf). Cómo elegir acciones utilizando análisis fundamental y técnico . Carlos Schwab. https://international.schwab.com/es/content/how-to-pick-stocks-using-fundamental-and-technical-analysis
The Investor U. (2023, 26 de abril). Beta en un portafolio de inversión . https://theinvestoru.com/blog/beta-en-un-portafolio-de-inversion/
Ocampo Duque, JJ y Vásquez Zapata, JD (2022). Metodologías para la elección de portafolios óptimos de inversión [Institucional [Trabajo de grado, Institución Universitaria Tecnológico de Antioquia]. Repositorio Institucional TdeA. https://dspace.tdea.edu.co/bitstream/handle/tdea/3812/METODOLOG%C3%8DAS%20PARA%20LA%20ELECCI%C3%93N%20DE%20PORTAFOLIOS%20%C3%93PTIMOS%20DE%20INVERSI%C3%93N.pdf?sequence=1&isAllowed=y
Derivados : opciones .Invertir en Bolsa. (sf). Derivados: opciones. Qué son y cómo funcionan . https://invertirenbolsa.info/articulo_derivados_opciones_definicion_funcionamiento.htm
Opciones financieras . OpenCourseWare UC3M . https://ocUniversidad Carlos III de Madrid. (sf). Opciones financieras . OpenCourseWare UC3M. https://ocw.uc3m.es/pluginfile.php/1511/mod_page/content/16/opciones_financieras.pdf