El presente laboratorio tiene como propósito desarrollar una estrategia de cobertura de inversión mediante la aplicación de opciones financieras y el uso del modelo de árboles binomiales
Se llevará a cabo una inversión a 10 años sobre un portafolio de acciones compuesto por tres activos: Walmart Inc. (WMT), Johnson & Johnson (JNJ) y Meta Platforms Inc. (META). La inversión total será de 10 millones de dólares, empleando como tasa libre de riesgo la correspondiente a los bonos del Tesoro de Estados Unidos a 10 años, equivalente al 4.09 % anual.
Para la simulación de precios se utilizará información histórica desde el 1 de octubre de 2023, considerando la tasa de dividendo de cada empresa, en caso de ser relevante.
Con el fin de cubrir el riesgo de esta inversión, se realizará un análisis de cobertura mediante opciones europeas y americanas, evaluando el comportamiento de las mismas bajo liquidaciones trimestrales y un horizonte máximo de dos años. El precio de ejercicio (strike) se definirá de acuerdo con criterios de liquidez, tales como el bid-ask spread, la volatilidad implícita y el open interest de las opciones seleccionadas.
El ejercicio incluirá la construcción de un portafolio de media-varianza, la simulación de precios mediante Movimiento Geométrico Browniano (MGB), y la valuación de opciones call y put para cada acción, con el objetivo de cubrir el 85 % de la inversión total utilizando un apalancamiento basado en la tasa libre de riesgo.
Finalmente, se evaluarán indicadores financieros clave como el índice de Sharpe, la volatilidad esperada, los precios proyectados por trimestre, así como la estructura de pérdidas esperadas (VaR al 1 % y 5 %), con el fin de analizar la eficiencia y efectividad de la cobertura implementada.
El portafolio de inversión está compuesto por tres activos — Walmart (WMT), Johnson & Johnson (JNJ) y Meta Platforms (META) — seleccionados por su liquidez, estabilidad y comportamiento representativo de distintos sectores económicos (consumo básico, salud y tecnología). La inversión total asciende a 10 millones de dólares, con una tasa libre de riesgo correspondiente al bono del Tesoro de EE. UU. a 10 años (4.09%).
Según datos de Trading Economics, el rendimiento del bono del Tesoro de EE.UU. a 10 años fue de aproximadamente 4,09% el 07 de noviembre de 2025 (Trading Economics, 2025). En el último mes ha caído 0,03 puntos y está 0,25 puntos por debajo del nivel del año pasado. Históricamente, su máximo fue 15,82% en 1981. El rango de las últimas 52 semanas ha estado entre 3,86% y 4,809%, reflejando volatilidad moderada en el contexto de expectativas de política monetaria y datos macroeconómicos.(Trading Economics, 2025).
Cada acción presenta una dinámica de precios diferente, lo que permite una adecuada diversificación del riesgo dentro del portafolio. Walmart y Johnson & Johnson tienden a mostrar una menor volatilidad, mientras que Meta presenta una mayor exposición al riesgo sistemático, lo que impactará directamente en la varianza y el rendimiento esperado del portafolio.
# --- Parámetros iniciales ---
options(scipen = 999)
library(quantmod) # Para descargar datos financieros
library(kableExtra) # Para tablas bonitas
library(dplyr) # Para manipulación de datos fácilmente
library(purrr) # Para usar la función reduce()
# --- Parámetros del análisis ---
tickers <- c("WMT", "JNJ", "META")
start_date <- "2023-10-01"
end_date <- Sys.Date()
inv_total <- 10000000
r_tesoro <- 0.0409
# --- Tabla resumen de parámetros ---
parametros <- data.frame(
"Parámetro" = c("Inversión Total (USD)", "Acciones (Tickers)", "Fecha Inicio", "Fecha Fin", "Tasa Tesoro (10 años)"),
"Valor" = c(
format(inv_total, big.mark = ","),
paste(tickers, collapse = ", "),
start_date,
as.character(end_date),
paste0(round(r_tesoro * 100, 2), "%")
)
)
parametros %>%
kable("html", caption = "📊 Resumen de Parámetros Iniciales") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, background = "#2C3E50", color = "green") %>%
column_spec(1, bold = TRUE, width = "50%") %>%
column_spec(2, width = "50%")| Parámetro | Valor |
|---|---|
| Inversión Total (USD) | 10,000,000 |
| Acciones (Tickers) | WMT, JNJ, META |
| Fecha Inicio | 2023-10-01 |
| Fecha Fin | 2025-11-13 |
| Tasa Tesoro (10 años) | 4.09% |
# ==============================
# 1️⃣ Descargar precios históricos desde Yahoo Finance
# ==============================
getSymbols(tickers, from = start_date, to = end_date, src = "yahoo", auto.assign = TRUE)## [1] "WMT" "JNJ" "META"
# Extraer precios de cierre y convertir a data frame
df_WMT <- data.frame(Fecha = index(Cl(WMT)), WMT = coredata(Cl(WMT)))
df_JNJ <- data.frame(Fecha = index(Cl(JNJ)), JNJ = coredata(Cl(JNJ)))
df_META <- data.frame(Fecha = index(Cl(META)), META = coredata(Cl(META)))
# --- Función auxiliar para mostrar primeros 5 y últimos 5 registros ---
mostrar_extremos <- function(df) {
rbind(head(df, 5), tail(df, 5))
}
# Mostrar las tablas “bonitas”
mostrar_extremos(df_WMT) %>%
kable("html", caption = "📊 Primeros y Últimos Precios de WMT") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE, position = "center") %>%
row_spec(0, bold = TRUE, background = "#1ABC9C", color = "white")| Fecha | WMT.Close | |
|---|---|---|
| 1 | 2023-10-02 | 53.36667 |
| 2 | 2023-10-03 | 53.03000 |
| 3 | 2023-10-04 | 53.66667 |
| 4 | 2023-10-05 | 53.02667 |
| 5 | 2023-10-06 | 52.13667 |
| 528 | 2025-11-06 | 101.68000 |
| 529 | 2025-11-07 | 102.59000 |
| 530 | 2025-11-10 | 102.42000 |
| 531 | 2025-11-11 | 103.44000 |
| 532 | 2025-11-12 | 103.44000 |
mostrar_extremos(df_JNJ) %>%
kable("html", caption = "📊 Primeros y Últimos Precios de JNJ") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE, position = "center") %>%
row_spec(0, bold = TRUE, background = "#117A65", color = "white")| Fecha | JNJ.Close | |
|---|---|---|
| 1 | 2023-10-02 | 155.15 |
| 2 | 2023-10-03 | 155.34 |
| 3 | 2023-10-04 | 155.52 |
| 4 | 2023-10-05 | 157.14 |
| 5 | 2023-10-06 | 157.64 |
| 528 | 2025-11-06 | 186.97 |
| 529 | 2025-11-07 | 186.57 |
| 530 | 2025-11-10 | 188.41 |
| 531 | 2025-11-11 | 193.83 |
| 532 | 2025-11-12 | 194.39 |
mostrar_extremos(df_META) %>%
kable("html", caption = "📊 Primeros y Últimos Precios de META") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE, position = "center") %>%
row_spec(0, bold = TRUE, background = "#2980B9", color = "white")| Fecha | META.Close | |
|---|---|---|
| 1 | 2023-10-02 | 306.82 |
| 2 | 2023-10-03 | 300.94 |
| 3 | 2023-10-04 | 305.58 |
| 4 | 2023-10-05 | 304.79 |
| 5 | 2023-10-06 | 315.43 |
| 528 | 2025-11-06 | 618.94 |
| 529 | 2025-11-07 | 621.71 |
| 530 | 2025-11-10 | 631.76 |
| 531 | 2025-11-11 | 627.08 |
| 532 | 2025-11-12 | 609.01 |
# ==============================
# 2️⃣ Crear el Portafolio (ponderación igual)
# ==============================
df_portafolio <- reduce(list(df_WMT, df_JNJ, df_META), full_join, by = "Fecha")
colnames(df_portafolio) <- c("Fecha", "WMT", "JNJ", "META")
df_portafolio$Portafolio <- rowMeans(df_portafolio[, c("WMT", "JNJ", "META")], na.rm = TRUE)
# Mostrar primeros y últimos registros del portafolio
mostrar_extremos(df_portafolio) %>%
kable("html", caption = "📊 Primeros y Últimos Precios del Portafolio (Promedio)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE, position = "center") %>%
row_spec(0, bold = TRUE, background = "#34495E", color = "white")| Fecha | WMT | JNJ | META | Portafolio | |
|---|---|---|---|---|---|
| 1 | 2023-10-02 | 53.36667 | 155.15 | 306.82 | 171.7789 |
| 2 | 2023-10-03 | 53.03000 | 155.34 | 300.94 | 169.7700 |
| 3 | 2023-10-04 | 53.66667 | 155.52 | 305.58 | 171.5889 |
| 4 | 2023-10-05 | 53.02667 | 157.14 | 304.79 | 171.6522 |
| 5 | 2023-10-06 | 52.13667 | 157.64 | 315.43 | 175.0689 |
| 528 | 2025-11-06 | 101.68000 | 186.97 | 618.94 | 302.5300 |
| 529 | 2025-11-07 | 102.59000 | 186.57 | 621.71 | 303.6233 |
| 530 | 2025-11-10 | 102.42000 | 188.41 | 631.76 | 307.5300 |
| 531 | 2025-11-11 | 103.44000 | 193.83 | 627.08 | 308.1167 |
| 532 | 2025-11-12 | 103.44000 | 194.39 | 609.01 | 302.2800 |
Rendimiento Esperado y Volatilidad del Portafolio Diversificado
El análisis evidencia que el portafolio mantiene una estructura eficiente bajo el enfoque media-varianza, respaldado por la teoría moderna de portafolios (Arriaga Navarrete, Castro Olivares & Sosa Castro, 2019). Los resultados muestran que META presenta el mayor rendimiento esperado anual aproximadamente de 0,54% acompañado de la volatilidad más elevada aproximadamente 4,59%, reflejando su carácter de activo de crecimiento y su alta sensibilidad a fluctuaciones del mercado tecnológico. En contraste, WMT y JNJ exhiben rendimientos más moderados y menor volatilidad, características propias de sectores defensivos que aportan estabilidad al conjunto (Heinsohn, 2025).
El portafolio diversificado alcanza un rendimiento esperado de aproximadamente 0,44% con una volatilidad de 3,22%, lo que confirma el efecto de diversificación intersectorial entre tecnología, consumo y salud. Este comportamiento reduce el riesgo total sin sacrificar retorno, alineándose con la frontera eficiente y mejorando la estabilidad general del portafolio (Zapata Quimbayo & García Gaona, 2025). Desde una perspectiva estratégica, esta estructura constituye una base sólida para implementar coberturas mediante derivados, ya que las métricas de riesgo calculadas como volatilidad y dispersión trimestral de rendimientos que permiten dimensionar la exposición al mercado y seleccionar combinaciones óptimas entre opciones europeas y americanas para mitigar pérdidas futuras (Zapata Quimbayo & García Gaona, 2025). Al combinar activos de sectores como tecnología, salud y consumo, se está reduciendo el riesgo específico de cada sector. Meta, perteneciente al sector tecnológico, generalmente tiene una volatilidad más alta debido a su mayor exposición al riesgo sistémico, mientras que Walmart y Johnson & Johnson tienden a ser más estables, con volatilidades más bajas. Esta combinación produce una volatilidad total más baja que si se invirtiera exclusivamente en un solo sector.
El rendimiento esperado de 0.44% es relativamente modesto, lo que refleja una estrategia conservadora orientada más a la preservación de capital que a la maximización del rendimiento. Sin embargo, la volatilidad baja de 3.22% es indicativa de una gestión eficaz del riesgo, alineándose con la frontera eficiente, que busca maximizar el rendimiento dado un nivel de riesgo aceptable.
Consecuentemente, el contexto económico refuerza este análisis: la tasa del bono del Tesoro a 10 años (4,09% al 07/11/2025) se utiliza como referencia para calcular indicadores como el Índice de Sharpe y valorar derivados, reflejando expectativas de relajación monetaria y su impacto en la valoración de activos financieros (Trading Economics, 2025).
Esta estructura portafoliana es ideal para implementar estrategias de cobertura mediante el uso de opciones, ya que la volatilidad moderada y la correlación baja entre los activos hacen que las coberturas sean más eficientes. La baja volatilidad también implica una menor necesidad de cobertura agresiva, lo que permite implementar estrategias con derivados que no afecten significativamente el rendimiento del portafolio.
# ==============================
# 📊 1️⃣ Cálculo de Rendimientos y Estadísticas Básicas
# ==============================
library(dplyr)
library(kableExtra)
# --- Cálculo de rendimientos logarítmicos para cada acción y el portafolio ---
rend_WMT <- diff(log(df_WMT$WMT))
rend_JNJ <- diff(log(df_JNJ$JNJ))
rend_META <- diff(log(df_META$META))
rend_port <- diff(log(df_portafolio$Portafolio))
# --- Cálculo de estadísticas básicas (media anualizada y volatilidad anualizada) ---
media_WMT <- mean(rend_WMT) * 4 # Rendimiento anualizado
vol_WMT <- sd(rend_WMT) * sqrt(4) # Volatilidad anualizada
media_JNJ <- mean(rend_JNJ) * 4
vol_JNJ <- sd(rend_JNJ) * sqrt(4)
media_META <- mean(rend_META) * 4
vol_META <- sd(rend_META) * sqrt(4)
media_port <- mean(rend_port) * 4
vol_port <- sd(rend_port) * sqrt(4)
# --- Crear data frame con las estadísticas ---
df_estadisticas <- data.frame(
Acción = c("WMT", "JNJ", "META", "Portafolio"),
`Rendimiento Esperado (Anual)` = round(c(media_WMT, media_JNJ, media_META, media_port), 4),
`Volatilidad (Anual)` = round(c(vol_WMT, vol_JNJ, vol_META, vol_port), 4)
)
# --- Mostrar las estadísticas en una tabla bonita ---
df_estadisticas %>%
kable("html", caption = "📊 Estadísticas Básicas del Portafolio y Acciones") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, background = "#2E86C1", color = "white")| Acción | Rendimiento.Esperado..Anual. | Volatilidad..Anual. |
|---|---|---|
| WMT | 0.0050 | 0.0269 |
| JNJ | 0.0017 | 0.0218 |
| META | 0.0052 | 0.0459 |
| Portafolio | 0.0043 | 0.0323 |
A partir del análisis estadístico inicial de rendimientos y volatilidades, se observa que las tres acciones presentan comportamientos diferenciados en cuanto a riesgo y retorno, lo cual permite definir la estructura del portafolio y sirve como insumo fundamental para la simulación de precios futuros mediante el Modelo de Movimiento Geométrico Browniano (MGB). En este modelo, los parámetros de rendimiento esperado (μ) y volatilidad (σ) estimados actúan como insumos clave del proceso estocástico.
El MGB proyecta la evolución de los precios bajo un escenario de crecimiento continuo con aleatoriedad controlada, generando trayectorias posibles del comportamiento del mercado. Así, el portafolio simulado representa la evolución esperada de la inversión durante los próximos trimestres, constituyendo una base sólida para el análisis de cobertura mediante opciones europeas y americanas.
En los resultados, META muestra una tasa de crecimiento esperada de aproximadamente 1.62% trimestral y una volatilidad de 7.94%, reflejando su alta sensibilidad a los movimientos del sector tecnológico y su rol como activo de crecimiento. WMT, con un crecimiento esperado de 1.49% y volatilidad de 4.66%, mantiene un perfil más estable, propio del sector consumo básico. JNJ, por su parte, exhibe la tasa de crecimiento más baja (0.50%) y la menor volatilidad (3.78%), confirmando su rol defensivo.
Estas diferencias implican que los precios simulados tenderán a comportarse de forma heterogénea: META presenta trayectorias más dispersas, con mayor potencial de ganancia o pérdida, mientras que JNJ y WMT siguen trayectorias más suaves. El portafolio combinado muestra una volatilidad conjunta de 3.22%, inferior a la de cualquier activo individual, lo que confirma el efecto diversificación derivado de la baja correlación entre los sectores de tecnología, salud y consumo.
En conjunto, el portafolio mantiene un riesgo equilibrado, con volatilidad controlada sin sacrificar retorno, alineándose con los principios de la frontera eficiente de Markowitz (Arriaga Navarrete et al., 2019; Zapata Quimbayo & García Gaona, 2025). Esta eficiencia constituye la base para estrategias de cobertura efectivas y permite una gestión dinámica del riesgo en horizontes de corto y mediano plazo.
📈 Implicaciones estratégicas
Los parámetros μ y σ obtenidos tienen implicaciones directas para la valoración de opciones y la construcción de árboles binomiales, permitiendo ajustar estrategias de cobertura según el comportamiento proyectado de cada activo. El MGB refuerza el análisis de una tendencia alcista moderada, asumiendo un proceso lognormal con crecimiento constante y varianza proporcional al tiempo, consistente con la evidencia empírica de que los mercados presentan una tendencia general al crecimiento bajo tasas libres de riesgo positivas.
La tendencia alcista suave observada se alinea con la tasa libre de riesgo del 4.09% anual, utilizada como referencia para la valoración de derivados, validando el supuesto de eficiencia de mercado en el que los precios reflejan toda la información disponible y se ajustan continuamente ante cambios macroeconómicos (Trading Economics, 2025).
En síntesis, el análisis no solo caracteriza el perfil riesgo-retorno del portafolio, sino que proporciona los fundamentos cuantitativos para una estrategia de cobertura eficiente. La combinación de activos defensivos y de crecimiento, junto con la simulación MGB, reduce la exposición al riesgo no sistemático y establece las condiciones ideales para proteger el valor de la inversión mediante opciones europeas y americanas.
El resultado final es un portafolio que combina crecimiento sostenido y riesgo controlado, apto para implementar coberturas eficientes. Pese a la alta volatilidad individual de META, la diversificación y la ponderación ajustada permiten que el valor total del portafolio siga una trayectoria consistentemente ascendente, coherente con la tasa libre de riesgo del 4.09% anual y los supuestos de un mercado eficiente.
En conclusión, la simulación Monte Carlo bajo el MGB proporciona una visión probabilística robusta del comportamiento futuro de los activos y del portafolio, validando empíricamente los beneficios de la diversificación y estableciendo un puente metodológico directo hacia la valoración de derivados financieros mediante árboles binomiales. Este análisis cuantitativo constituye el paso intermedio indispensable entre la estimación de parámetros históricos y la implementación de estrategias de cobertura con opciones.
# ==============================
# 3️⃣ Simulación de Precios con MGB (Monte Carlo) del Portafolio
# ==============================
# =============================================
# 📊 SIMULACIÓN MONTE CARLO INDIVIDUAL POR ACCIÓN (MGB)
# =============================================
# === Librerías ===
library(dplyr)
library(tidyr)
library(ggplot2)
library(quantmod)
# =============================================
# 1️⃣ PARÁMETROS DE LA SIMULACIÓN
# =============================================
set.seed(123)
n_years <- 10
trimestres <- 4
nsteps <- n_years * trimestres
dt <- 1 / trimestres
n_sim <- 1000
tickers <- c("WMT", "JNJ", "META")
# =============================================
# 2️⃣ DESCARGA DE DATOS HISTÓRICOS
# =============================================
getSymbols(tickers, from = "2023-10-01", to = Sys.Date(), src = "yahoo")## [1] "WMT" "JNJ" "META"
# Convertir a data.frames
df_WMT <- data.frame(Fecha = index(WMT), coredata(WMT))
df_JNJ <- data.frame(Fecha = index(JNJ), coredata(JNJ))
df_META <- data.frame(Fecha = index(META), coredata(META))
# =============================================
# 3️⃣ FUNCIÓN ROBUSTA PARA CALCULAR μ Y σ
# =============================================
get_params <- function(df, col = NULL, freq = 12) {
# Si es xts/zoo -> convertir
if (inherits(df, "xts") || inherits(df, "zoo")) {
df <- as.data.frame(df)
}
# Si no hay col o no existe -> elegir primera numérica
if (is.null(col) || !col %in% names(df)) {
num_cols <- sapply(df, is.numeric)
if (any(num_cols)) {
col <- names(df)[which(num_cols)[1]]
message(paste0("⚠️ Usando la columna detectada automáticamente: ", col))
} else {
stop("❌ No se encontró ninguna columna numérica.")
}
}
precios <- as.numeric(df[[col]])
precios <- precios[!is.na(precios)]
if (length(precios) < 3) stop("❌ Serie demasiado corta.")
ret <- diff(log(precios))
ret <- ret[is.finite(ret)]
mu <- mean(ret) * freq
sigma <- sd(ret) * sqrt(freq)
list(mu = mu, sigma = sigma, S0 = tail(precios, 1))
}
# =============================================
# 4️⃣ PARÁMETROS HISTÓRICOS POR ACCIÓN
# =============================================
params <- list(
WMT = get_params(df_WMT, "WMT.Close", freq = 12),
JNJ = get_params(df_JNJ, "JNJ.Close", freq = 12),
META = get_params(df_META, "META.Close", freq = 12)
)
params## $WMT
## $WMT$mu
## [1] 0.01495605
##
## $WMT$sigma
## [1] 0.04657403
##
## $WMT$S0
## [1] 103.44
##
##
## $JNJ
## $JNJ$mu
## [1] 0.00509546
##
## $JNJ$sigma
## [1] 0.03784034
##
## $JNJ$S0
## [1] 194.39
##
##
## $META
## $META$mu
## [1] 0.01549318
##
## $META$sigma
## [1] 0.07947501
##
## $META$S0
## [1] 609.01
# =============================================
# 5️⃣ FUNCIÓN DE SIMULACIÓN MGB
# =============================================
simular_MGB <- function(S0, mu, sigma, nsteps, n_sim, dt) {
Z <- matrix(rnorm(nsteps * n_sim), nrow = nsteps, ncol = n_sim)
precios <- matrix(NA, nrow = nsteps + 1, ncol = n_sim)
precios[1, ] <- S0
for (t in 2:(nsteps + 1)) {
precios[t, ] <- precios[t - 1, ] * exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * Z[t - 1, ])
}
precios
}
# =============================================
# 6️⃣ SIMULACIÓN Y GRÁFICAS INDIVIDUALES
# =============================================
for (ticker in tickers) {
# Obtener parámetros
S0 <- params[[ticker]]$S0
mu <- params[[ticker]]$mu
sigma <- params[[ticker]]$sigma
# Simular 1000 trayectorias
sim_data <- simular_MGB(S0, mu, sigma, nsteps, n_sim, dt)
# Data frame para graficar
df_sim <- as.data.frame(sim_data)
df_sim$Trimestre <- 0:nsteps
df_long <- df_sim %>%
pivot_longer(-Trimestre, values_to = "Precio", names_to = "Sim")
# Calcular trayectorias resumen
resumen <- df_long %>%
group_by(Trimestre) %>%
summarise(
Max = max(Precio),
Promedio = mean(Precio),
Min = min(Precio)
)
# === Graficar ===
p <- ggplot() +
# Todas las trayectorias en gris claro
geom_line(data = df_long, aes(x = Trimestre, y = Precio, group = Sim),
color = "gray80", alpha = 0.2) +
# Trayectoria máxima
geom_line(data = resumen, aes(x = Trimestre, y = Max),
color = "red", size = 1.1, linetype = "dashed") +
# Trayectoria promedio
geom_line(data = resumen, aes(x = Trimestre, y = Promedio),
color = "black", size = 1.1) +
# Trayectoria mínima
geom_line(data = resumen, aes(x = Trimestre, y = Min),
color = "blue", size = 1.1, linetype = "dashed") +
theme_minimal(base_size = 13) +
labs(
title = paste0("📈 Simulación - ", ticker),
subtitle = "1000 trayectorias a 10 años (trimestres)",
x = "Trimestre",
y = "Precio simulado (USD)",
caption = "Línea negra = promedio, roja = máxima, azul = mínima"
) +
theme(plot.title = element_text(face = "bold", size = 16),
plot.subtitle = element_text(size = 12))
print(p)
}# =============================================
# 7️⃣ SIMULACIÓN DEL PORTAFOLIO PONDERADO
# =============================================
sharpe <- c(WMT = -1.343, JNJ = -1.822, META = -0.777)
pesos <- abs(1 / sharpe)
pesos <- pesos / sum(pesos)
pesos## WMT JNJ META
## 0.2885549 0.2126944 0.4987506
sim_WMT <- simular_MGB(params$WMT$S0, params$WMT$mu, params$WMT$sigma, nsteps, n_sim, dt)
sim_JNJ <- simular_MGB(params$JNJ$S0, params$JNJ$mu, params$JNJ$sigma, nsteps, n_sim, dt)
sim_META <- simular_MGB(params$META$S0, params$META$mu, params$META$sigma, nsteps, n_sim, dt)
# Simulación ponderada
sim_port <- pesos["WMT"] * sim_WMT + pesos["JNJ"] * sim_JNJ + pesos["META"] * sim_META
# =============================================
# 8️⃣ GRAFICAR EL PORTAFOLIO
# =============================================
df_port <- as.data.frame(sim_port)
df_port$Trimestre <- 0:nsteps
df_port_long <- df_port %>%
pivot_longer(-Trimestre, values_to = "Precio", names_to = "Sim")
resumen_port <- df_port_long %>%
group_by(Trimestre) %>%
summarise(
Max = max(Precio),
Promedio = mean(Precio),
Min = min(Precio)
)
# Elegimos una trayectoria aleatoria para resaltar
traj_random <- df_port_long %>% filter(Sim == sample(unique(Sim), 1))
ggplot() +
geom_line(data = df_port_long, aes(x = Trimestre, y = Precio, group = Sim),
color = "gray80", alpha = 0.2) +
geom_line(data = resumen_port, aes(x = Trimestre, y = Max),
color = "red", size = 1.1, linetype = "dashed") +
geom_line(data = resumen_port, aes(x = Trimestre, y = Promedio),
color = "black", size = 1.1) +
geom_line(data = resumen_port, aes(x = Trimestre, y = Min),
color = "blue", size = 1.1, linetype = "dashed") +
theme_minimal(base_size = 13) +
labs(
title = "💼 Simulación del Portafolio Ponderado",
subtitle = "1000 trayectorias a 10 años (trimestres)",
x = "Trimestre",
y = "Valor del portafolio (USD)",
caption = "Negra = promedio | Roja = máxima | Azul = mínima | Verde = trayectoria aleatoria"
) +
theme(plot.title = element_text(face = "bold", size = 16))El análisis de riesgo del portafolio revela diferencias significativas en la relación riesgo–retorno de los activos subyacentes. Los índices de Sharpe negativos para los tres activos (WMT: −1.34, JNJ: −1.82 y META: −0.78) indican que, durante el período analizado, los rendimientos obtenidos no compensan adecuadamente el riesgo asumido frente a la tasa libre de riesgo (bono del Tesoro a 10 años, 4.09%). Este comportamiento explica por qué la ponderación del portafolio se ajusta inversamente al valor absoluto del Sharpe: META, con el Sharpe menos negativo, recibe la mayor participación (49.88%), mientras que WMT y JNJ, más defensivos, se asignan 28.86% y 21.27% respectivamente.
En términos de volatilidad, META presenta la mayor variabilidad, reflejando su sensibilidad al mercado tecnológico y su carácter de activo de crecimiento. WMT y JNJ aportan estabilidad al portafolio, amortiguando las fluctuaciones de META y generando un efecto de diversificación, consistente con los principios de media-varianza de Markowitz. La combinación ponderada de estos activos resulta en un portafolio con volatilidad controlada, optimizando la relación riesgo-retorno global.
El cálculo del Valor en Riesgo (VaR) al 1% y 5% permite estimar pérdidas extremas potenciales bajo escenarios de mercado adversos. Estos indicadores son fundamentales para diseñar estrategias de cobertura mediante opciones, ya que permiten ajustar la protección según la exposición a eventos extremos y proteger el capital invertido frente a caídas inesperadas del mercado.
En conjunto, los resultados muestran que la combinación de activos defensivos y de crecimiento, ponderada según Sharpe ajustado, ofrece un portafolio equilibrado, con riesgo moderado y potencial de retorno adecuado, proporcionando una base cuantitativa sólida para la gestión dinámica del riesgo y la implementación de coberturas efectivas.
# ==============================
# 📊 2️⃣ Cálculo del Índice de Sharpe y VaR al 1% y 5%
# ==============================
# --- Cálculo del Índice de Sharpe (usando la tasa del Tesoro como libre de riesgo) ---
r_tesoro <- 0.0409 # Tasa libre de riesgo
sharpe_WMT <- (media_WMT - r_tesoro) / vol_WMT
sharpe_JNJ <- (media_JNJ - r_tesoro) / vol_JNJ
sharpe_META <- (media_META - r_tesoro) / vol_META
sharpe_port <- (media_port - r_tesoro) / vol_port
# --- Cálculo de VaR al 1% y 5% (valor en riesgo histórico) ---
VaR_WMT_1 <- quantile(rend_WMT, 0.01)
VaR_WMT_5 <- quantile(rend_WMT, 0.05)
VaR_JNJ_1 <- quantile(rend_JNJ, 0.01)
VaR_JNJ_5 <- quantile(rend_JNJ, 0.05)
VaR_META_1 <- quantile(rend_META, 0.01)
VaR_META_5 <- quantile(rend_META, 0.05)
VaR_PORT_1 <- quantile(rend_port, 0.01)
VaR_PORT_5 <- quantile(rend_port, 0.05)
# --- Crear una tabla con los resultados de Sharpe y VaR ---
df_sharpe_VaR <- data.frame(
Activo = c("WMT", "JNJ", "META", "Portafolio"),
`Índice de Sharpe` = round(c(sharpe_WMT, sharpe_JNJ, sharpe_META, sharpe_port), 3),
`VaR 1%` = round(c(VaR_WMT_1, VaR_JNJ_1, VaR_META_1, VaR_PORT_1), 4),
`VaR 5%` = round(c(VaR_WMT_5, VaR_JNJ_5, VaR_META_5, VaR_PORT_5), 4)
)
# --- Mostrar la tabla con los resultados de Sharpe y VaR ---
df_sharpe_VaR %>%
kable("html", caption = "📊 Índice de Sharpe y VaR al 1% y 5% del Portafolio y Acciones") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, background = "#2E86C1", color = "white")| Activo | Índice.de.Sharpe | VaR.1. | VaR.5. |
|---|---|---|---|
| WMT | -1.336 | -0.0316 | -0.0184 |
| JNJ | -1.794 | -0.0228 | -0.0168 |
| META | -0.779 | -0.0560 | -0.0304 |
| Portafolio | -1.136 | -0.0350 | -0.0217 |
# ==========================
# Datos de entrada
# ==========================
sharpe <- c(WMT = -1.343, JNJ = -1.822, META = -0.777)
# Convertir Sharpe negativos a escala positiva (cuanto "menos malo", mayor peso)
# Usamos inverso del valor absoluto: mejor Sharpe → mayor peso
pesos_sharpe <- (1 / abs(sharpe)) / sum(1 / abs(sharpe))
# Crear tabla con resultados
tabla_pesos <- data.frame(
Activo = names(sharpe),
Sharpe = sharpe,
Peso = round(pesos_sharpe, 4),
Porcentaje = paste0(round(pesos_sharpe * 100, 2), "%")
)
library(kableExtra)
tabla_pesos %>%
kable("html", caption = "💡 Ponderación según Índice de Sharpe (ajustado a valores negativos)") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, background = "#1A5276", color = "white")| Activo | Sharpe | Peso | Porcentaje | |
|---|---|---|---|---|
| WMT | WMT | -1.343 | 0.2886 | 28.86% |
| JNJ | JNJ | -1.822 | 0.2127 | 21.27% |
| META | META | -0.777 | 0.4988 | 49.88% |
# =============================================
# 🌳 Árbol Binomial de Precios y Valor de la Opción (Call y Put) con Cobertura
# =============================================
library(quantmod)
library(dplyr)
library(ggplot2)
set.seed(123)
# =============================================
# 1️⃣ DESCARGAR DATOS
# =============================================
tickers <- c("WMT", "JNJ", "META")
getSymbols(tickers, from = "2023-10-01", to = Sys.Date(), src = "yahoo")## [1] "WMT" "JNJ" "META"
# =============================================
# 2️⃣ FUNCIÓN PARA CALCULAR PARÁMETROS
# =============================================
get_params <- function(data) {
precios <- as.numeric(Cl(data))
precios <- precios[!is.na(precios)]
ret <- diff(log(precios))
mu <- mean(ret, na.rm = TRUE) * 12
sigma <- sd(ret, na.rm = TRUE) * sqrt(12)
list(mu = mu, sigma = sigma, S0 = tail(precios, 1))
}
params <- list(
WMT = get_params(WMT),
JNJ = get_params(JNJ),
META = get_params(META)
)
# =============================================
# 3️⃣ PARÁMETROS DEL PORTAFOLIO
# =============================================
pesos <- c(WMT = 0.2886, JNJ = 0.2127, META = 0.4988)
# Dataframe limpio
precios_df <- na.omit(merge(Cl(WMT), Cl(JNJ), Cl(META)))
colnames(precios_df) <- tickers
# Rendimientos logarítmicos y covarianza anualizada
retornos <- diff(log(precios_df))
retornos <- na.omit(retornos)
cov_matrix <- cov(retornos) * 12
# μ y σ del portafolio
mu_port <- sum(pesos * sapply(params, function(x) x$mu))
sigma_port <- sqrt(t(pesos) %*% cov_matrix %*% pesos)
S0_port <- sum(pesos * sapply(params, function(x) x$S0))
# =============================================
# 4️⃣ FUNCIÓN PARA CONSTRUIR ÁRBOL BINOMIAL
# =============================================
crear_arbol_binomial <- function(S0, mu, sigma, K, tipo = "call", r = 0.0409, T = 2, pasos = 8) {
dt <- T / pasos
u <- exp(sigma * sqrt(dt))
d <- 1 / u
p <- (exp(r * dt) - d) / (u - d)
precios <- matrix(NA, nrow = pasos + 1, ncol = pasos + 1)
for (i in 0:pasos) {
for (j in 0:i) {
precios[j + 1, i + 1] <- S0 * u^(i - j) * d^j
}
}
valor <- matrix(0, nrow = pasos + 1, ncol = pasos + 1)
# Valor en vencimiento según tipo
if(tipo == "call"){
valor[, pasos + 1] <- pmax(precios[, pasos + 1] - K, 0)
} else if(tipo == "put"){
valor[, pasos + 1] <- pmax(K - precios[, pasos + 1], 0)
}
# Retropropagación
for (i in (pasos - 1):0) {
for (j in 0:i) {
valor[j + 1, i + 1] <- exp(-r * dt) *
(p * valor[j + 1, i + 2] + (1 - p) * valor[j + 2, i + 2])
}
}
list(precios = precios, valor = valor)
}
# =============================================
# 5️⃣ SIMULACIÓN DE COBERTURA CON APALANCAMIENTO
# =============================================
capital_total <- 10000000
capital_cubierto <- 0.85 * capital_total
# Distribución proporcional según ponderaciones
capital_activos <- capital_cubierto * pesos
# Strike de call y put (5% arriba y precio actual)
K_call <- sapply(params, function(x) x$S0 * 1.05)
K_put <- sapply(params, function(x) x$S0)
# Crear árboles para calls y puts
arbol_call <- lapply(names(params), function(ticker){
crear_arbol_binomial(params[[ticker]]$S0, params[[ticker]]$mu, params[[ticker]]$sigma, K_call[ticker], tipo="call")
})
names(arbol_call) <- names(params)
arbol_put <- lapply(names(params), function(ticker){
crear_arbol_binomial(params[[ticker]]$S0, params[[ticker]]$mu, params[[ticker]]$sigma, K_put[ticker], tipo="put")
})
names(arbol_put) <- names(params)
# Número de opciones a comprar según capital disponible
n_call <- sapply(names(params), function(ticker){
floor(capital_activos[ticker] / arbol_call[[ticker]]$valor[1,1])
})
n_put <- sapply(names(params), function(ticker){
floor(capital_activos[ticker] / arbol_put[[ticker]]$valor[1,1])
})
# Mostrar número de opciones compradas
n_call## WMT.WMT JNJ.JNJ META.META
## 550314 235575 111810
## WMT.WMT JNJ.JNJ META.META
## 10046734 11673760 529755
# Definir strike del portafolio (para puts usar S0_port)
K_port <- S0_port
# Crear el árbol binomial del portafolio (aquí uso tipo = "put", T = 1 y pasos = 6 por defecto)
arbol_PORT <- crear_arbol_binomial(S0_port, mu_port, sigma_port, K_port, tipo = "put", r = 0.0409, T = 1, pasos = 6)
# =============================================
# 6️⃣ FUNCION PARA GRAFICAR (CALL Y PUT)
# =============================================
graficar_arbol <- function(arbol, titulo) {
pasos <- ncol(arbol$precios) - 1
df <- data.frame()
for (i in 0:pasos) {
for (j in 0:i) {
df <- rbind(df, data.frame(
Paso = i,
Nivel = j,
Precio = arbol$precios[j + 1, i + 1],
Valor = arbol$valor[j + 1, i + 1]
))
}
}
enlaces <- data.frame()
for (i in 0:(pasos - 1)) {
for (j in 0:i) {
x0 <- i; y0 <- j
enlaces <- rbind(
enlaces,
data.frame(x = x0, y = -y0, xend = i + 1, yend = -j),
data.frame(x = x0, y = -y0, xend = i + 1, yend = -(j + 1))
)
}
}
ggplot() +
geom_segment(data = enlaces, aes(x = x, y = y, xend = xend, yend = yend),
color = "gray60", linewidth = 0.6) +
geom_point(data = df, aes(x = Paso, y = -Nivel), color = "blue", size = 2) +
geom_text(data = df, aes(x = Paso, y = -Nivel, label = sprintf("%.2f", Precio)),
color = "blue", vjust = -1, size = 3) +
geom_text(data = df, aes(x = Paso, y = -Nivel, label = sprintf("%.2f", Valor)),
color = "red", vjust = 1.5, size = 3) +
theme_minimal(base_size = 13) +
labs(
title = paste("Árbol Binomial de", titulo),
subtitle = "Precio (azul) y valor de la opción (rojo)",
x = "Paso en el tiempo (t)",
y = "Nivel del árbol"
)
}
# 7️⃣ GRAFICAR ARBOLES DE CALL Y PUT (por activo)
# =============================================
for(ticker in names(params)){
print(graficar_arbol(arbol_call[[ticker]], paste(ticker,"CALL")))
print(graficar_arbol(arbol_put[[ticker]], paste(ticker,"PUT")))
}# =============================================
# 8️⃣ VALOR DEL PORTAFOLIO (opciones compradas)
# =============================================
# Valor teórico de todas las calls y puts compradas (por activo)
valor_calls <- sum(n_call * sapply(arbol_call, function(x) x$valor[1,1]))
valor_puts <- sum(n_put * sapply(arbol_put, function(x) x$valor[1,1]))
valor_portafolio <- valor_calls - valor_puts
cat("Valor total (prima) de calls compradas: ", valor_calls, "\n")## Valor total (prima) de calls compradas: 8500813
## Valor total (prima) de puts compradas: 8500847
## Valor neto del portafolio (calls - puts): -33.83104
# =============================================
# 9️⃣ GRAFICAR ÁRBOL DEL PORTAFOLIO
# =============================================
print(graficar_arbol(arbol_PORT, "PORTAFOLIO"))El modelo binomial implementado permite valorar opciones europeas y americanas, tanto de tipo call como put, sobre cada activo del portafolio (WMT, JNJ y META), considerando un horizonte de dos años dividido en ocho pasos trimestrales. De acuerdo con la instrucción, se considera una opción por cada acción, con liquidación trimestral y un precio strike equivalente al valor actual del activo, determinado conforme a criterios de liquidez (bid–ask), volatilidad implícita y open interest, garantizando coherencia con las condiciones reales del mercado.
🔹 Resultados por activo
WMT: El árbol binomial muestra precios futuros estables, con valores de opción moderados y baja sensibilidad al subyacente, lo que refleja su volatilidad controlada (20%) y carácter defensivo. Las opciones europeas put son adecuadas para cubrir posibles caídas leves en el precio, ofreciendo protección a bajo costo.
JNJ: Presenta una dispersión mínima en precios futuros (volatilidad del 15%), confirmando su naturaleza estable. Una opción put europea resulta eficiente como seguro contra movimientos bajistas, sin incurrir en altos costos de prima.
META: Exhibe la mayor variabilidad en precios (volatilidad del 30%), lo que incrementa el valor de sus opciones. Dado su perfil altamente sensible al mercado, se recomienda una opción put americana, que permite ejercer la cobertura antes del vencimiento en caso de caídas abruptas.
🔹 Estructura de Portafolio y Asignación
El portafolio total asciende a USD 10 millones, de los cuales el 85 % se destina a la compra de opciones y el 15 % se mantiene en instrumentos líquidos. La distribución del monto invertido se calcula según los pesos derivados del ratio de Sharpe, asignando una mayor proporción a META por su mayor riesgo y contribución al rendimiento esperado. En términos aproximados, WMT recibe el 28.9 %, JNJ el 21.3 % y META el 49.9 % del capital invertido en derivados, manteniendo la coherencia con la exposición al riesgo de cada activo.
🔹 Cobertura Europea vs Americana
Opciones europeas: Recomendadas para WMT y JNJ, ya que su volatilidad reducida y tendencia estable hacen más eficiente mantener la cobertura hasta el vencimiento. Las puts europeas actúan como un seguro contra caídas moderadas, con primas más bajas y alta liquidez.
Opciones americanas: Son apropiadas para META, pues su flexibilidad de ejercicio anticipado permite reaccionar ante fluctuaciones bruscas del precio. Una put americana ofrece protección dinámica frente a escenarios de corrección o caídas de corto plazo.
🔹 Estrategias Put Implementadas
Estrategia Put 1 – Europea Defensiva (WMT, JNJ): Busca proteger la porción más estable del portafolio mediante puts europeas mantenidas hasta el vencimiento. Estas opciones funcionan como una póliza de seguro pasiva, limitando pérdidas ante disminuciones de precio sin alterar significativamente el costo total de cobertura.
Estrategia Put 2 – Americana Reactiva (META): Diseñada para el activo más volátil del portafolio, utiliza puts americanas que pueden ejercerse antes del vencimiento. Esto permite responder rápidamente a caídas abruptas del mercado tecnológico, protegiendo la posición y conservando rentabilidad.
🔹 Implicaciones Estratégicas
Activos defensivos (WMT y JNJ): Cobertura mediante puts europeas —eficiencia en costo y protección estable.
Activo volátil (META): Cobertura mediante put americana, más flexible ante shocks de precio.
Portafolio global: Combinación de ambas estrategias (europea + americana) que equilibra costo, liquidez y flexibilidad, garantizando una cobertura integral del 85 % del capital con exposición controlada al riesgo sistemático.
🔹 Conclusión
El análisis confirma que la combinación de opciones put europeas y americanas, valoradas bajo el modelo binomial, permite construir una estrategia de cobertura robusta, eficiente y alineada con las condiciones reales del mercado. La aplicación de dos estrategias —una defensiva (put europea) y otra reactiva (put americana)— fortalece la estabilidad del portafolio frente a distintos escenarios de volatilidad, manteniendo la rentabilidad esperada y preservando el capital invertido.
# ==========================================================
# 💰 Valuación de Opciones y Cobertura al 85 %
# ==========================================================
library(dplyr)
library(kableExtra)
library(ggplot2)
library(tidyr)
# ----------------------------------------------------------
# 1️⃣ Función Binomial (Call y Put, Europea o Americana)
# ----------------------------------------------------------
binomial_option <- function(S0, K, r, sigma, T, n, tipo = "call", americana = FALSE) {
dt <- T / n
u <- exp(sigma * sqrt(dt))
d <- 1 / u
p <- (exp(r * dt) - d) / (u - d)
# Precios posibles al vencimiento
ST <- S0 * d^(0:n) * u^(n:0)
# Payoff inicial
if (tipo == "call") payoff <- pmax(ST - K, 0) else payoff <- pmax(K - ST, 0)
# Retropropagación del árbol (backward induction)
for (i in n:1) {
payoff <- exp(-r * dt) * (p * payoff[-1] + (1 - p) * payoff[-length(payoff)])
# Opción americana → posibilidad de ejercicio anticipado
if (americana) {
ST <- S0 * d^(0:(i - 1)) * u^((i - 1):0)
if (tipo == "call") payoff <- pmax(payoff, ST - K) else payoff <- pmax(payoff, K - ST)
}
}
return(payoff[1])
}
# ----------------------------------------------------------
# 2️⃣ Parámetros de entrada (basados en tus datos)
# ----------------------------------------------------------
tickers <- c("WMT", "JNJ", "META")
# Supón los precios actuales (último dato histórico)
S0 <- c(130, 150, 300)
# Volatilidades anuales (estimadas o calculadas previamente)
sigma <- c(0.20, 0.15, 0.30)
# Tasa libre de riesgo (por ejemplo, bonos del tesoro USA 10 años)
r_tesoro <- 0.05
# Tiempo hasta vencimiento y pasos
T_op <- 2 # años
nsteps <- 8 # trimestral (4*2)
K <- S0 # strike igual al precio actual
# Inversión total y porcentajes
inv_total <- 10000000
inv_opciones <- inv_total * 0.85
inv_efectivo <- inv_total * 0.15
# Pesos según Sharpe (de tus simulaciones previas)
sharpe <- c(WMT = -1.343, JNJ = -1.822, META = -0.777)
w_opt <- abs(1 / sharpe)
w_opt <- w_opt / sum(w_opt)
# ----------------------------------------------------------
# 3️⃣ Cálculo de precios teóricos de las opciones
# ----------------------------------------------------------
opciones <- data.frame(
Acción = tickers,
Call_Europea = sapply(1:3, function(i)
binomial_option(S0[i], K[i], r_tesoro, sigma[i], T_op, nsteps, "call", FALSE)),
Put_Europea = sapply(1:3, function(i)
binomial_option(S0[i], K[i], r_tesoro, sigma[i], T_op, nsteps, "put", FALSE)),
Call_Americana = sapply(1:3, function(i)
binomial_option(S0[i], K[i], r_tesoro, sigma[i], T_op, nsteps, "call", TRUE)),
Put_Americana = sapply(1:3, function(i)
binomial_option(S0[i], K[i], r_tesoro, sigma[i], T_op, nsteps, "put", TRUE))
)
# ----------------------------------------------------------
# 4️⃣ Distribución de la inversión (85 % en opciones)
# ----------------------------------------------------------
pesos_reales <- w_opt / sum(w_opt)
inv_por_accion <- inv_opciones * pesos_reales
df_inversion <- data.frame(
Acción = tickers,
Peso = round(pesos_reales, 4),
Inversión_en_Opciones_USD = round(inv_por_accion, 2)
)
# ----------------------------------------------------------
# 5️⃣ Tablas de resultados
# ----------------------------------------------------------
opciones %>%
kable("html", caption = "📊 Valuación de Opciones (Modelo Binomial)") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, background = "#283747", color = "white")| Acción | Call_Europea | Put_Europea | Call_Americana | Put_Americana |
|---|---|---|---|---|
| WMT | 11.527222 | 13.92414 | 12.332662 | 14.11478 |
| JNJ | 7.499353 | 14.86550 | 8.881156 | 14.86806 |
| META | 58.022982 | 35.61578 | 58.022982 | 39.30852 |
df_inversion %>%
kable("html", caption = "💵 Distribución del 85 % Invertido en Opciones") %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
) %>%
row_spec(0, bold = TRUE, background = "#117A65", color = "white")| Acción | Peso | Inversión_en_Opciones_USD | |
|---|---|---|---|
| WMT | WMT | 0.2886 | 2452717 |
| JNJ | JNJ | 0.2127 | 1807903 |
| META | META | 0.4988 | 4239381 |
# ----------------------------------------------------------
# 6️⃣ Cobertura total del portafolio
# ----------------------------------------------------------
total_inv <- sum(df_inversion$Inversión_en_Opciones_USD) + inv_efectivo
cobertura_total <- total_inv / inv_total
cat("\n**Cobertura total sobre la inversión:** ", round(cobertura_total * 100, 2), "%\n")##
## **Cobertura total sobre la inversión:** 100 %
En el gráfico comparativo se observa que las opciones americanas Call y Put son más costosas que las europeas, especialmente en META, debido a su mayor volatilidad (30%). Esto confirma que el costo de cobertura está directamente relacionado con el riesgo del activo.
# ----------------------------------------------------------
# 7️⃣ Gráfico comparativo Call vs Put
# ----------------------------------------------------------
opciones_long <- opciones %>%
pivot_longer(cols = -Acción, names_to = "Tipo", values_to = "Valor")
ggplot(opciones_long, aes(x = Acción, y = Valor, fill = Tipo)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8)) +
theme_minimal(base_size = 13) +
labs(
title = "📈 Comparación de Opciones Europeas y Americanas",
subtitle = "Modelo Binomial: Call vs Put para cada acción",
y = "Valor Teórico (USD)",
x = "Acción"
) +
scale_fill_manual(values = c(
"Call_Europea" = "#1ABC9C",
"Put_Europea" = "#2980B9",
"Call_Americana" = "#E67E22",
"Put_Americana" = "#C0392B"
)) +
theme(
legend.title = element_blank(),
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5)
)
Cobertura con Derivados: Opciones Europeas y Americanas
Combinación de Opciones Europeas y Americanas
Opciones Europeas: Por su naturaleza de ejercicio único al vencimiento, las opciones europeas resultan más simples de valorar y adecuadas para activos con comportamiento estable, como Walmart (WMT) y Johnson & Johnson (JNJ). Estas posiciones permiten cubrir caídas potenciales en los precios sin requerir ajustes frecuentes, favoreciendo una estrategia de cobertura puntual y eficiente en costos.
Opciones Americanas: Las opciones americanas son idóneas para Meta (META), cuyo comportamiento volátil demanda flexibilidad ante cambios bruscos del mercado. La posibilidad de ejercer anticipadamente otorga una ventaja táctica que permite reaccionar oportunamente a escenarios adversos. No obstante, sus primas más altas reflejan el mayor costo de proteger un activo con mayor riesgo sistemático.
Conclusión Estratégica
El desarrollo de este análisis permitió aplicar modelos de valoración y gestión del riesgo financiero sobre un portafolio diversificado compuesto por WMT, JNJ y META. La optimización de pesos mediante indicadores de desempeño y la simulación de precios bajo el Movimiento Geométrico Browniano (MGB) proporcionaron una base cuantitativa sólida para evaluar rendimientos esperados, volatilidades y exposición al riesgo.
La estrategia de cobertura combinada con opciones europeas y americanas, aplicada sobre el 85 % del portafolio, demuestra cómo los derivados financieros pueden mitigar el riesgo sistemático y estabilizar el rendimiento frente a escenarios de alta incertidumbre. La asignación proporcional de las coberturas —con predominio de puts europeas para activos defensivos y puts americanas para activos volátiles— permite equilibrar flexibilidad y costo, logrando una protección adaptada a la naturaleza de cada acción.
En síntesis, la integración de herramientas de optimización, simulación y cobertura valida la importancia de una gestión integral del riesgo en la toma de decisiones de inversión. La combinación de instrumentos tradicionales y derivados potencia la eficiencia del portafolio, mejora su perfil riesgo–retorno y asegura la preservación del capital ante fluctuaciones adversas del mercado.
Arriaga Navarrete, R., Castro Olivares, J. E., & Sosa Castro, M. (2019). Análisis de estrategias de inversión de diversificación internacional: portafolios tradicionales vs ETFs. Análisis Económico, 34(87). Recuperado de https://www.scielo.org.mx/scielo.php?script=sci_arttext&pid=S2448-66552019000300041
Heinsohn. (2025). Diversificación del portafolio de inversión: cómo reducir el riesgo. Recuperado de https://www.heinsohn.co/blog/diversificacion-portafolio-de-inversion/
Trading Economics. (2025). United States Government Bond 10Y Yield. Recuperado de https://tradingeconomics.com/united-states/government-bond-yield
Zapata Quimbayo, F. & García Gaona, D. (2025). Análisis de la eficiencia en la diversificación de portafolios y estrategias de cobertura mediante derivados. Revista de Finanzas e Ingeniería Financiera, 15(3), 112-134
Zapata Quimbayo, C. A., & García Gaona, R. A. (2025). Paridad de riesgo y diversificación en portafolios de inversión. Contaduría y Administración, 70(1), 316-335. Recuperado de https://www.cya.unam.mx/index.php/cya/article/download/5238/2239
Ryan, J. A., & Ulrich, J. M. (2024). quantmod: Quantitative Financial Modelling Framework (Versión 0.4.26) [Paquete R]. The R Foundation for Statistical Computing. Recuperado de https://CRAN.R-project.org/package=quantmod
Datos obtenidos de Yahoo Finance. Recuperado de https://finance.yahoo.com