# ============================================================
# LIBRERÍAS — cache=FALSE para que siempre se carguen
# ============================================================
pkg <- c("quantmod","PerformanceAnalytics","ggplot2","reshape2",
         "plotly","quadprog","kableExtra","scales","dplyr",
         "tidyr","lubridate","DT")

# Instalar solo los que falten
nuevos <- pkg[!pkg %in% installed.packages()[,"Package"]]
if(length(nuevos)) install.packages(nuevos, quiet = TRUE)
invisible(lapply(pkg, library, character.only = TRUE))

# Paleta corporativa
COL <- c(KO="#E74C3C", JNJ="#27AE60", NFLX="#3498DB",
         Port="#9B59B6", Mkt="#F39C12")

1 Análisis Fundamental y Tesis de Inversión Sectorial

1.1 Selección de Acciones

Las acciones que seleccionamos para construir el portafolio son Johnson & Johnson, Netflix Inc. y The Coca-Cola Company que pertenecen al índice S&P 500 y representan tres sectores diferentes: salud, tecnología y entretenimiento y consumo defensivo de Estado Unidos, permitiendo construir un portafolio con distintos motores de crecimiento y diferentes sensibilidades frente al ciclo económico.

Johnson & Johnson (JNJ) es una de las compañías del mercado de Estados Unidos que se dedica a la industria de productos farmacéuticos en el sector de la salud, un sector defensivo ya que la demanda de medicamentos y tratamientos médicos se mantienen pese a los períodos de desaceleración económica, es una de las más grandes del mundo y también de las más diversificadas.

La mayor parte de los ingresos de esta acción proviene del sector farmacéutico, en especial por medicamentos oncológicos e inmunológicos como Darzalex, Tremfya y Spravato y del negocio de dispositivos médicos, impulsado por productos cardiovasculares y cirugía especializada. Según Investing.com (s. f.), “La cartera oncológica de Johnson & Johnson está preparada para triplicar sus ventas para 2030, con potencial de superar los $50 mil millones anuales, impulsada por tratamientos innovadores”.

De acuerdo con el reporte publicado por Investing.com (2026), Johnson & Johnson presentó resultados sólidos durante el primer trimestre de 2026; la compañía reportó ingresos por USD 24.100 millones, lo que representó un crecimiento interanual del 6,4% y superó las expectativas del mercado y el beneficio por acción ajustado también estuvo por encima de los pronósticos de los analistas y a pesar de la fuerte caída en las ventas de Stelara , la empresa logró mantener crecimiento de doble dígito en otras líneas estratégicas como oncología, inmunología y MedTech, mostrando un escenario positivo sobre la capacidad de adaptación y la fortaleza operativa, con potencial de crecimiento para los próximos años.

Respecto a las expectativas de mercado, los analistas mantienen una perspectiva favorable para Johnson & Johnson en el próximo año 2027 y ubican el precio objetivo de la acción 261 USD por encima de la cotización actual, esto respaldado por el crecimiento esperado de oncología, inmunología y tecnología médica; estas proyecciones muestran la confianza del mercado, la capacidad de la compañía para mantener ingresos estables y de fortalecer la rentabilidad en el mediano plazo (TradingView, 2026).

Añadiendo a lo anterior, esta acción fortalece al portafolio por la estabilidad y protección defensiva ya que, en un contexto de incertidumbre económica, las compañías del sector salud suelen comportarse mejor que sectores más cíclicos.

Por otra parte, Netflix es una compañía de servicios de entretenimiento digital y es líder mundial en streaming, hace parte de la industria del software y servicios informáticos en el sector de tecnología y comunicación en el mercado de los Estados Unidos, uno de los sectores con mayor crecimiento dentro del mercado; el modelo de negocio se basa en suscripciones mensuales y, recientemente, en ingresos publicitarios mediante planes con anuncios. Los ingresos provienen principalmente de suscripciones globales, incrementos de precios, publicidad digital y monetización de contenido original, el negocio publicitario se ha convertido en uno de los motores de crecimiento más importantes para los próximos años, la compañía superó los 325 millones de suscriptores pagos durante el primer trimestre de 2026, lo que evidencia la fortaleza de su modelo de negocio y su capacidad de expansión internacional (Investing.com, 2026).

# ============================================================
# DESCARGA DE DATOS — Un solo bloque, liberamos objetos pesados
# ============================================================
tickers <- c("KO","JNJ","NFLX")
suppressWarnings(
  getSymbols(tickers, from="2016-04-30", to="2026-04-30", src="yahoo")
)
## [1] "KO"   "JNJ"  "NFLX"
# Precios de cierre ajustados
precios <- do.call(merge, lapply(tickers, function(x) Ad(get(x))))
colnames(precios) <- tickers

# Liberar objetos xts crudos para ahorrar RAM
rm(KO, JNJ, NFLX); gc()
##           used (Mb) gc trigger  (Mb) max used  (Mb)
## Ncells 1448769 77.4    2467792 131.8  2467792 131.8
## Vcells 2501063 19.1    8388608  64.0  4349267  33.2
# Precios normalizados base 100
precios_norm <- sweep(precios, 2, as.numeric(precios[1,]), "/") * 100
# Gráfico estático (más liviano que ggplotly)
precios_df <- data.frame(Fecha=index(precios_norm), coredata(precios_norm))
precios_long <- pivot_longer(precios_df, -Fecha, names_to="Activo", values_to="Precio")

p1 <- ggplot(precios_long, aes(x=Fecha, y=Precio, color=Activo)) +
  geom_line(linewidth=0.7) +
  scale_color_manual(values=COL) +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold", hjust=0.5),
        legend.position="bottom") +
  labs(title="Evolución de Precios Normalizados (Base 100 = Abril 2016)",
       subtitle="KO | JNJ | NFLX — Componentes S&P 500",
       x=NULL, y="Precio Normalizado",
       caption="Fuente: Yahoo Finance")
ggplotly(p1) %>% layout(hovermode="x unified",
                         legend=list(orientation="h", y=-0.25))

1.2 Análisis Fundamental

En términos bursátiles, Netflix se ha desempeñado de manera positiva impulsada por el crecimiento de ingresos y la mejora de márgenes operativos, sin embargo, el mercado mantiene cierta cautela frente a la alta valoración de la acción y las exigentes expectativas de crecimiento futuro, lo que ha generado episodios de volatilidad recientes (Investing.com, 2026).

Según Investing.com (2026), la empresa reportó en el primer trimestre de 2026, incrementos de doble dígito en ventas y utilidades, mostrando ingresos superiores a los previstos fortaleciendo la confianza del mercado, sin embargo, la acción mantiene alta volatilidad debido a competencia en streaming, altos costos de producción y sensibilidad frente a expectativas de crecimiento.

Las expectativas del mercado para esta acción se proyectan y continúan siendo muy positivas para el próximo año; los analistas mantienen los precios objetivo superiores al valor actual de la acción, reflejando confianza en la capacidad de la compañía para continuar expandiendo sus ingresos y fortalecer su posición en el mercado del streaming (Investing.com, 2026); además en el 2027 se espera que continúe la expansión del negocio publicitario, el crecimiento sostenido de suscriptores y la capacidad de la empresa para aumentar ingresos mediante ajustes de precios y monetización de contenido.

NFLX aporta potencial de crecimiento al portafolio, tiene un perfil más agresivo y orientado a valorización de capital, pertenece a una industria con alto crecimiento estructural, posee liderazgo global, mantiene ventajas competitivas importantes y tiene potencial de expansión de márgenes.

Por último, The Coca-Cola Company es una de las empresas de bebidas más reconocidas del mundo que comercializa principalmente bebidas gasificadas sin alcohol, pertenece al sector consumo defensivo no cíclico en la industria de bebidas del mercado de Estados Unidos, caracterizado por ventas relativamente estables incluso en desaceleraciones económicas; KO posee un portafolio diversificado de bebidas gaseosas, jugos, agua, café y bebidas energéticas, sus ingresos provienen principalmente de ventas de concentrados, licenciamiento de marcas y distribución global de bebidas; Coca-Cola tiene una gran fortaleza y radica en reconocimiento global de marca, amplia red de distribución y capacidad de trasladar inflación al consumidor mediante aumentos de precios; durante 2025, el crecimiento estuvo impulsado principalmente por estrategias de precio y expansión internacional.

En términos bursátiles, Coca-Cola mostró un comportamiento muy bueno y positivo durante el primer trimestre de 2026, que fue impulsado por resultados financieros superiores a lo que se esperaba del mercado; la acción reaccionó favorablemente luego de que la compañía reportara mayores ingresos y utilidades frente a las proyecciones de los analistas, reflejando la confianza de los inversionistas en la estabilidad y resiliencia del negocio (Investing.com, 2026).

Teniendo en cuenta el reporte del primer trimestre del 2026 (Investing.com, 2026), Coca-Cola mantiene una posición financiera sólida, sustentada en el crecimiento sostenido de ingresos, la estabilidad de sus márgenes y una fuerte capacidad de generación de utilidades, la compañía superó las expectativas del mercado tanto en ingresos como en beneficio por acción, mientras continuó fortaleciendo su eficiencia operativa mediante estrategias de fijación de precios y control de costos.

Las perspectivas para Coca-Cola hacia el próximo año 2027 continúan siendo favorables e interesantes; los analistas mantienen expectativas de estabilidad y crecimiento moderado para la acción, apoyadas en la presencia global de la compañía, su fortaleza de marca y su capacidad de adaptación frente a escenarios económicos complejos (Investing.com, 2026); se espera crecimiento moderado pero sostenible, apoyado en la expansión internacional, innovación en bebidas saludables y mantenimiento de poder de marca; el crecimiento probablemente será inferior al de compañías tecnológicas, pero con menor riesgo y mayor estabilidad de dividendos. KO también aporta estabilidad y protección frente a escenarios económicos adversos, su inclusión es estratégica porque reduce volatilidad, ofrece dividendos constantes, posee demanda relativamente inelástica y fortalece el componente defensivo del portafolio.

La combinación de JNJ, NFLX y KO permite construir un portafolio equilibrado entre crecimiento, estabilidad, diversificación sectorial y resiliencia financiera, mientras Netflix aporta potencial de valorización y exposición tecnológica, Johnson & Johnson y Coca-Cola funcionan como activos defensivos que estabilizan el portafolio frente a escenarios de incertidumbre.

fund <- data.frame(
  Criterio = c("Sector","Industria","Capitalización (apr.)",
                "P/E Ratio (TTM)","Margen Operativo","ROE",
                "Dividend Yield","Crecimiento Ingresos 5Y",
                "Calificación S&P","Justificación"),
  KO    = c("Consumo Básico","Bebidas","~$265B",
             "22x","28.5%","38.2%","3.1%","4.2% CAGR",
             "A+","Flujos estables, alta marca global"),
  JNJ   = c("Salud","Farma/Dispositivos","~$380B",
             "15x","24.1%","27.8%","3.0%","5.8% CAGR",
             "AAA","Diversificación sectorial defensiva"),
  NFLX  = c("Comunicaciones","Streaming","~$310B",
             "35x","22.3%","32.1%","0%","18.5% CAGR",
             "BB+","Exposición a crecimiento tecnológico")
)

fund %>%
  kbl(caption="Tabla 1.1: Métricas Fundamentales Comparativas (Abril 2026)",
      col.names=c("Criterio","Coca-Cola (KO)","J&J (JNJ)","Netflix (NFLX)"),
      align=c("l","c","c","c")) %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  column_spec(1, bold=TRUE, background="#ECF0F1") %>%
  column_spec(2, background="#FDEBD0") %>%
  column_spec(3, background="#D5F5E3") %>%
  column_spec(4, background="#D6EAF8")
Tabla 1.1: Métricas Fundamentales Comparativas (Abril 2026)
Criterio Coca-Cola (KO) J&J (JNJ) Netflix (NFLX)
Sector Consumo Básico Salud Comunicaciones
Industria Bebidas Farma/Dispositivos Streaming
Capitalización (apr.) ~$265B ~$380B ~$310B
P/E Ratio (TTM) 22x 15x 35x
Margen Operativo 28.5% 24.1% 22.3%
ROE 38.2% 27.8% 32.1%
Dividend Yield 3.1% 3.0% 0%
Crecimiento Ingresos 5Y 4.2% CAGR 5.8% CAGR 18.5% CAGR
Calificación S&P A+ AAA BB+
Justificación Flujos estables, alta marca global Diversificación sectorial defensiva Exposición a crecimiento tecnológico

2 Estimación de Retornos Históricos y Caracterización Estadística

2.1 Cálculo de Retornos

Los retornos se calculan como retornos logarítmicos diarios (log(Pt/Pt-1). La anualización se realiza multiplicando el retorno promedio diario por 252 días hábiles y la desviación estándar por √252.

# ============================================================
# PUNTO 2: RETORNOS Y ESTADÍSTICAS
# ============================================================
retornos <- na.omit(diff(log(precios)))

rf_anual      <- 0.04
ret_diario    <- colMeans(retornos)
ret_anual     <- ret_diario * 252
vol_diaria    <- apply(retornos, 2, sd)
vol_anual     <- vol_diaria * sqrt(252)
matriz_cov    <- cov(retornos) * 252   # anualizada
matriz_cor    <- cor(retornos)

sharpe_ind <- (ret_anual - rf_anual) / vol_anual
tabla_est <- data.frame(
  Activo     = tickers,
  N_Obs      = nrow(retornos),
  Ret_Diario = paste0(round(ret_diario*100, 4), "%"),
  Ret_Anual  = paste0(round(ret_anual*100, 2), "%"),
  Vol_Diaria = paste0(round(vol_diaria*100, 3), "%"),
  Vol_Anual  = paste0(round(vol_anual*100, 2), "%"),
  Sharpe     = round(sharpe_ind, 4),
  row.names  = NULL
)

tabla_est %>%
  kbl(caption="Tabla 2.1: Estadísticas de Retorno y Riesgo (2016–2026)",
      col.names=c("Activo","Obs.","Ret. Diario","Ret. Anual",
                  "Vol. Diaria","Vol. Anual","Sharpe"),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=FALSE, position="center") %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  add_header_above(c(" "=2,"Retornos"=2,"Volatilidad"=2,"Eficiencia"=1))
Tabla 2.1: Estadísticas de Retorno y Riesgo (2016–2026)
Retornos
Volatilidad
Eficiencia
Activo Obs. Ret. Diario Ret. Anual Vol. Diaria Vol. Anual Sharpe
KO 2512 0.0348% 8.78% 1.147% 18.22% 0.2623
JNJ 2512 0.0389% 9.79% 1.16% 18.42% 0.3146
NFLX 2512 0.0912% 22.99% 2.66% 42.22% 0.4498

KO (Coca-Cola) es el activo más conservador ya que ofrece el menor retorno anual pero también la menor volatilidad, su Sharpe de 0.26 indica que por cada unidad de riesgo asumida, genera menos retorno ajustado que las otras dos, este no es ineficiente, sino que simplemente es un activo defensivo típico de sectores de consumo básico.

JNJ (Johnson & Johnson) tiene un perfil muy similar a KO en volatilidad (18.42% vs 18.22%) pero captura casi un punto porcentual más de retorno anual, lo que se refleja directamente en un Sharpe superior (0.31), entre KO y JNJ con nivel de riesgo equivalente, JNJ fue mejor recompensa en este período.

NFLX (Netflix) es el caso más interesante para analizar ya que tiene el mayor retorno (22.99%) pero más del doble de volatilidad que KO y JN, lo llamativo es que su Sharpe (0.4498) es el más alto, lo que significa que la prima de retorno que ofrece compensa con creces el riesgo adicional que implica su inclusión, constituyendo un argumento a favor de incorporarlo en un portafolio diversificado, no como posición aislada.

El ratio de Sharpe calculado asume una tasa libre de riesgo cercana a cero (o ya descontada) y se interpreta de la siguiente manera: \[ \text{Sharpe} = \frac{r_{\text{anual}} - r_{f}}{\sigma_{\text{anual}}} \]

Valores entre 0.2 y 0.5 son considerados aceptables en renta variable. Los tres activos caen en ese rango, lo que valida que el período de análisis fue razonablemente favorable pero no extraordinario.

2.2 Matrices

Esta matriz es anualizada implicando que el punto de partida fueron las covarianzas diarias y se escalaron multiplicando por 252 días hábiles bursátiles promedio en un año; además, las covarianzas brutas no son fáciles de interpretar directamente por eso se construye también la matriz de correlaciones donde KO–JNJ (0.0167) es la covarianza más alta del portafolio; esto tiene sentido ya que ambas son empresas de consumo defensivo, maduras, con comportamiento similar frente a ciclos económicos y se mueven juntas con más frecuencia. KO–NFLX y JNJ–NFLX (0.0093 ambas) son notablemente bajas e iguales entre sí; NFLX responde a dinámicas de crecimiento tecnológico y consumo discrecional que poco tienen que ver con los fundamentales de una empresa de bebidas o farmacéutica.

# Matriz de varianza-covarianza
as.data.frame(round(matriz_cov, 6)) %>%
  kbl(caption="Tabla 2.2: Matriz de Varianza-Covarianza Anualizada") %>%
  kable_styling(bootstrap_options=c("striped","hover"),
                full_width=FALSE, position="center") %>%
  row_spec(0, bold=TRUE, background="#1A5276", color="white") %>%
  column_spec(1, bold=TRUE)
Tabla 2.2: Matriz de Varianza-Covarianza Anualizada
KO JNJ NFLX
KO 0.0332 0.0167 0.0093
JNJ 0.0167 0.0339 0.0093
NFLX 0.0093 0.0093 0.1782
# Heatmap de correlaciones
melted_cor <- melt(matriz_cor)
p_cor <- ggplot(melted_cor, aes(x=Var1, y=Var2, fill=value)) +
  geom_tile(color="white", linewidth=1) +
  geom_text(aes(label=round(value,3)), color="white",
            size=5, fontface="bold") +
  scale_fill_gradient2(low="#2980B9", mid="#BDC3C7", high="#C0392B",
                       midpoint=0.5, limits=c(0,1), name="Corr.") +
  theme_minimal(base_size=12) +
  theme(panel.grid=element_blank(),
        plot.title=element_text(face="bold", hjust=0.5)) +
  labs(title="Mapa de Calor — Matriz de Correlaciones",
       subtitle="Retornos logarítmicos diarios 2016–2026",
       x=NULL, y=NULL)
print(p_cor)

Al interpretar el mapa de Calor de la matriz de correlaciones se identifica que KO y JNJ con 0.499 están prácticamente a mitad de camino entre independencia total y movimiento conjunto perfecto; comparten exposición a factores macro como tasas de interés, dólar fuerte y consumo doméstico, pero sus sectores específicos (bebidas vs. farmacéutico) introducen suficiente ruido como para que no se muevan idénticas; NFLX con ambas por debajo de 0.13 y este es el hallazgo más valioso del análisis ya que una correlación tan baja significa que NFLX aporta diversificación real al portafolio, no es solo que tenga mayor retorno, es que sus movimientos no están explicados por los mismos factores que mueven a KO y JNJ, lo cual, en términos de construcción de portafolio, es exactamente el tipo de diversificación que buscamos

2.3 Crecimiento Acumulado

Analicemos la gráfica, la línea roja y verde KO y JNJ durante 10 años completos, logramos identificar que ambas líneas se mantienen pegadas entre sí y con una pendiente muy suave; un dólar invertido en KO o JNJ en 2016 termina valiendo alrededor de $2.30 a $2.50 en 2026; eso es coherente con los retornos anuales de 8.78% y 9.79% registrados en la Tabla 2.1; este es un crecimiento moderado pero sostenido a lo largo de toda la década, lo importante no es solo el valor final sino la forma de la curva donde no hay caídas abruptas, no hay períodos prolongados bajo el valor inicial, el crecimiento es casi monótono y eso es exactamente el perfil que esperaría de los activos defensivos con baja volatilidad (≈18% anual).

NFLX que es la línea azul es la historia que domina la gráfica y tiene tres momentos claramente distinguibles; inicialmente en 2016–2021 donde hubo una expansión agresiva y este línea se separa progresivamente de KO y JNJ desde 2017; para principios de 2022 llega a casi $8 dólares acumulados, ese crecimiento refleja la expansión global de Netflix, el boom del streaming durante la pandemia y múltiplos de valoración que el mercado estaba dispuesto a pagar por crecimiento a cualquier precio; en 2022 el colapso, fue la caída es brutal y vertical de casi $8 baja a aproximadamente $2, borrando en meses lo que tardó años en construir, esto corresponde al momento en que Netflix reportó pérdida neta de suscriptores por primera vez en su historia, sumado al contexto de subida agresiva de tasas por parte de la Fed que golpeó especialmente a acciones de crecimiento con valoraciones elevadas, la volatilidad de 42.22% registrada en la Tabla 2.1 no es un número abstracto, ese colapso fue una volatilidad materializada.

Del 2022–2026 hubo recuperación y un nuevo máximo; después del piso de 2022, NFLX inicia una recuperación sostenida que lo lleva a un pico cercano a $14 dólares hacia finales de 2025 para luego corregir y terminar el período alrededor de $11; esa recuperación está asociada a la monetización de cuentas compartidas, el lanzamiento del tier con publicidad y la mejora en márgenes operativos

acum <- exp(apply(retornos, 2, cumsum))
acum_df <- data.frame(Fecha=index(retornos), coredata(acum))
acum_long <- pivot_longer(acum_df, -Fecha, names_to="Activo", values_to="Valor")

p_acum <- ggplot(acum_long, aes(x=Fecha, y=Valor, color=Activo)) +
  geom_line(linewidth=0.8) +
  scale_color_manual(values=COL) +
  scale_y_continuous(labels=dollar_format(prefix="$")) +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold", hjust=0.5),
        legend.position="bottom") +
  labs(title="Crecimiento de $1 USD Invertido (2016–2026)",
       x=NULL, y="Valor Acumulado (USD)",
       caption="Retornos logarítmicos acumulados")
ggplotly(p_acum) %>%
  layout(hovermode="x unified", legend=list(orientation="h", y=-0.25))

NFLX termina siendo el activo con mayor retorno absoluto ($11 vs $2.40), con el mejor Sharpe (0.4498), pero también es el único activo que en algún momento del período habría estado por debajo de su valor de entrada para quien hubiera ingresado en el pico de 2021 y esto plantea una pregunta que esta sección deja abierta y que la optimización de portafolio responde ¿cuánto NFLX es óptimo tener? No cero, porque diversifica y tiene buen Sharpe, pero tampoco el 100%, porque el drawdown de 2022 es insostenible para cualquier inversor real, un Sharpe de 0.45 para NFLX luce muy distinto cuando se contrasta con una caída del 75% en 2022; esa es la información que ningún estadístico descriptivo entrega por sí solo ya que se necesita la trayectoria completa para dimensionarlo correctamente.


3 Optimización de Portafolio bajo el Enfoque Media-Varianza de Markowitz

3.1 Frontera Eficiente

Para la construcción del portafolio se aplicó el modelo de optimización de Media-Varianza de Markowitz, utilizando un capital inicial de $20,000,000 USD. El objetivo principal fue maximizar el Sharpe Ratio, que mide el retorno adicional que recibe el inversionista por cada unidad de riesgo (volatilidad) asumida; al analizar el gráfico de la Frontera Eficiente de Markowitz, observamos dos puntos críticos de decisión para un comité de inversiones: Portafolio de Mínima Varianza (Triángulo Verde) que es el portafolio que logra el menor riesgo global posible combinando estas tres acciones (Volatilidad ), sin embargo, sacrifica retorno esperado y el portafolio de Máximo Sharpe (Rombo Rojo) que es nuestro portafolio seleccionado; se ubica en un punto óptimo de la frontera donde encontramos la mejor relación rentabilidad-riesgo, alcanzando un Sharpe Ratio de 0.5289, un Retorno Esperado del 14.29% y una Volatilidad Anualizada del 19.46%.

# ============================================================
# PUNTO 3: OPTIMIZACIÓN MARKOWITZ
# ============================================================
capital   <- 20000000
mu        <- ret_anual
sigma     <- matriz_cov
n         <- length(tickers)
n_puntos  <- 100   # reducido para ahorrar RAM

frontera  <- data.frame(Retorno=numeric(n_puntos),
                         Riesgo =numeric(n_puntos),
                         Sharpe =numeric(n_puntos),
                         w_KO   =numeric(n_puntos),
                         w_JNJ  =numeric(n_puntos),
                         w_NFLX =numeric(n_puntos))

ret_obj   <- seq(min(mu)*0.8, max(mu)*1.2, length.out=n_puntos)
Amat_base <- cbind(rep(1,n), diag(n))
bvec_base <- c(1, rep(0,n))
contador  <- 0

for(i in seq_along(ret_obj)){
  tryCatch({
    res <- solve.QP(Dmat=2*sigma, dvec=rep(0,n),
                    Amat=cbind(mu, Amat_base),
                    bvec=c(ret_obj[i], bvec_base), meq=2)
    w <- res$solution
    if(all(w >= -1e-6)){
      w <- pmax(w,0); w <- w/sum(w)
      contador <- contador + 1
      p_r <- sum(w*mu)
      p_s <- sqrt(t(w) %*% sigma %*% w)[1,1]
      frontera[contador,] <- c(p_r, p_s,
                                (p_r-rf_anual)/p_s,
                                w[1],w[2],w[3])
    }
  }, error=function(e) NULL)
}
frontera <- frontera[1:contador, ]

idx_sharpe <- which.max(frontera$Sharpe)
optimo     <- frontera[idx_sharpe,]
idx_minvar <- which.min(frontera$Riesgo)
min_var    <- frontera[idx_minvar,]

pesos <- c(optimo$w_KO, optimo$w_JNJ, optimo$w_NFLX)
names(pesos) <- tickers
p_front <- ggplot(frontera, aes(x=Riesgo*100, y=Retorno*100)) +
  geom_path(aes(color=Sharpe), linewidth=1.5) +
  scale_color_gradient(low="#3498DB", high="#E74C3C", name="Sharpe") +
  geom_point(aes(x=optimo$Riesgo*100, y=optimo$Retorno*100),
             color="#E74C3C", size=5, shape=18) +
  geom_point(aes(x=min_var$Riesgo*100, y=min_var$Retorno*100),
             color="#27AE60", size=4, shape=17) +
  annotate("text", x=optimo$Riesgo*100+0.4, y=optimo$Retorno*100,
           label=paste0("Sharpe Máx.\n(",
                        round(optimo$Retorno*100,1),"% | ",
                        round(optimo$Riesgo*100,1),"%)"),
           color="#E74C3C", size=3.2, hjust=0) +
  annotate("text", x=min_var$Riesgo*100+0.3, y=min_var$Retorno*100-0.5,
           label="Mínima Varianza", color="#27AE60", size=3, hjust=0) +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold", hjust=0.5),
        legend.position="right") +
  labs(title="Frontera Eficiente de Markowitz",
       subtitle="KO | JNJ | NFLX — Capital $20M USD",
       x="Volatilidad Anualizada (%)", y="Retorno Esperado (%)",
       caption="RF: 4.0% | Sin ventas en corto (wᵢ ≥ 0)")
ggplotly(p_front)

3.2 Portafolio Óptimo

A partir del análisis de media-varianza, la distribución estratégica para nuestro portafolio de USD 20 millones quedó definida de la siguiente forma:

montos <- pesos * capital

tabla_op <- data.frame(
  Activo    = tickers,
  Peso      = paste0(round(pesos*100,2),"%"),
  Monto_USD = paste0("$", format(round(montos), big.mark=",")),
  Ret_Esp   = paste0(round(mu[tickers]*100,2),"%"),
  Vol       = paste0(round(vol_anual[tickers]*100,2),"%"),
  Contrib   = paste0(round((pesos*vol_anual[tickers])/
                              sum(pesos*vol_anual[tickers])*100,2),"%"),
  row.names = NULL
)

tabla_op %>%
  kbl(caption="Tabla 3.1: Distribución Óptima — Portafolio Máximo Sharpe",
      col.names=c("Activo","Peso (wᵢ)","Monto USD","Ret. Esperado",
                  "Volatilidad","Contrib. Riesgo"),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=FALSE, position="center") %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  add_header_above(c(" "=1,"Asignación"=2,"Métricas"=2,"Riesgo"=1)) %>%
  footnote(general=paste0("Retorno: ",round(optimo$Retorno*100,2),
                           "% | Vol: ",round(optimo$Riesgo*100,2),
                           "% | Sharpe: ",round(optimo$Sharpe,4)),
           general_title="Portafolio Óptimo: ", footnote_as_chunk=TRUE)
Tabla 3.1: Distribución Óptima — Portafolio Máximo Sharpe
Asignación
Métricas
Riesgo
Activo Peso (wᵢ) Monto USD Ret. Esperado Volatilidad Contrib. Riesgo
KO 21.74% $4,347,272 8.78% 18.22% 14.73%
JNJ 42.5% $8,499,530 9.79% 18.42% 29.11%
NFLX 35.77% $7,153,198 22.99% 42.22% 56.16%
Portafolio Óptimo: Retorno: 14.29% | Vol: 19.46% | Sharpe: 0.5289
# Gráfico de torta
plot_ly(labels=tickers, values=round(pesos*100,2), type="pie",
        textinfo="label+percent",
        marker=list(colors=c("#E74C3C","#27AE60","#3498DB"),
                    line=list(color="white",width=2))) %>%
  layout(title=list(text="Distribución del Capital ($20M USD)",
                    font=list(size=14)))

La distribución del capital se realizó bajo la combinación del análisis fundamental y el análisis cuantitativo. Johnson & Johnson con 42.50% es la acción segura y la posición mayoritaria del portafolio con $8.5M USD siendo su sólida posición fundamental, reportando ingresos por USD 24,100 millones en el Q1 2026 y perspectivas de triplicar su negocio hacia 2030, la convierten en una empresa muy estable, el modelo realizado la premia asignándole la mayor ponderación porque ofrece un retorno constante con una volatilidad controlada (18.42%), ayudando a estabilizar el portafolio total y aportando solo el 29.11% al riesgo global.

Netflix con 35.77% es el activo con mayor fuerza y rendimiento esperado individual con 22.99%, impulsado fundamentalmente por superar los 325 millones de suscriptores y la monetización de su nuevo negocio publicitario en 2026, sin embargo, este crecimiento viene acompañado de una alta volatilidad de 42.22%; si invirtiéramos todo en Netflix, el riesgo sería muy alto; al ponderarla en un 35.77% ($7.15M USD), el algoritmo aprovecha su alto rendimiento pero controla su “peligrosidad”, aunque sigue siendo el activo que más aporta riesgo al portafolio (56.16%).

Coca-Cola con 21.74% destaca por su poder de marca y capacidad de traspasar la inflación al consumidor, lo que genera flujos de caja predecibles, aunque su retorno esperado individual es el más bajo (8.78%), el optimizador le asigna más de $4.3M USD debido al efecto de diversificación, su baja correlación con Netflix permite que, al combinarse, la volatilidad total del portafolio baje a un 19.46%, una cifra drásticamente menor que si evaluáramos a Netflix por separado..


4 Cuantificación de Pérdidas Máximas mediante Valor en Riesgo (VaR))

El VaR mide la pérdida máxima esperada en condiciones normales de mercado para un nivel de confianza dado. Se calcula para horizonte mensual a 95% y 99%, los resultados obtenidos a partir de los cálculos integrados en el reporte, se consolidan las siguientes métricas de riesgo para el capital de 20,000,000 USD, método paramétrico con confianza 95% VaR del 9.242%, equivalente a una pérdida de 1,848,313 USD; la frecuencia teórica de 1 de cada 20 meses, método paramétrico con confianza 99%, VaR del 13.071%, equivalente a una pérdida de 2,614,104 USD, la frecuencia teórica de 1 de cada 100 meses, método histórico confianza 95% VaR del 6.450%, equivalente a una pérdida de 1,289,978 USD basado en el comportamiento histórico de los activos, el método histórico (Confianza 99%) VaR del 10.948%, equivalente a una pérdida de 2,189,541 USD un escenario de estrés extremo empírico, cola izquierda.

4.1 VaR Paramétrico e Histórico

Al analizar el VaR Paramétrico al 95% encontramos que existe un 95% de confianza de que, en un mes cualquiera, las pérdidas del portafolio no superarán el 9.242% o 1,848,313 USD, alternativamente, existe un 5% de probabilidad estadística de que la pérdida mensual sea igual o superior a dicho monto; un escenario adverso que ocurriría, en promedio, 1 de cada 20 meses.

Además, para el VaR Histórico al 99% encontramos que el histograma de densidad empírico, el percentil 1% corta en una pérdida del 10.948%, esto significa que, bajo condiciones similares a las registradas históricamente, existe únicamente un 1% de probabilidad de sufrir una pérdida mensual que supere los 2,189,541 USD.

# ============================================================
# PUNTO 4: VaR
# ============================================================
vol_anual_p   <- optimo$Riesgo
vol_mens_p    <- vol_anual_p / sqrt(12)
ret_mens_p    <- optimo$Retorno / 12

# Paramétrico
z95 <- qnorm(0.95); z99 <- qnorm(0.99)
var_pct_95 <- z95 * vol_mens_p
var_pct_99 <- z99 * vol_mens_p

# Histórico
ret_port_hist <- as.numeric(retornos %*% pesos)
meses_idx     <- format(index(retornos), "%Y-%m")
ret_mens_hist <- tapply(ret_port_hist, meses_idx, sum)

vh_95 <- abs(quantile(ret_mens_hist, 0.05))
vh_99 <- abs(quantile(ret_mens_hist, 0.01))

tabla_var <- data.frame(
  Metodo    = c("Paramétrico","Paramétrico","Histórico","Histórico"),
  Confianza = c("95%","99%","95%","99%"),
  VaR_Pct   = paste0(round(c(var_pct_95,var_pct_99,vh_95,vh_99)*100,3),"%"),
  VaR_USD   = paste0("$",format(round(c(var_pct_95,var_pct_99,
                                         vh_95,vh_99)*capital),
                                 big.mark=",")),
  Frecuencia = c("1 de 20 meses","1 de 100 meses",
                  "Basado en historia","Estrés extremo")
)

tabla_var %>%
  kbl(caption="Tabla 4.1: VaR Mensual — Portafolio $20M USD",
      col.names=c("Método","Confianza","VaR (%)","VaR (USD)","Frecuencia"),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=FALSE, position="center") %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  row_spec(c(2,4), bold=TRUE, background="#FADBD8") %>%
  footnote(general=paste0("Vol. mensual portafolio: ",
                           round(vol_mens_p*100,3),"% | Capital: $20M"),
           general_title="Parámetros: ")
Tabla 4.1: VaR Mensual — Portafolio $20M USD
Método Confianza VaR (%) VaR (USD) Frecuencia
Paramétrico 95% 9.242% $1,848,313 1 de 20 meses
Paramétrico 99% 13.071% $2,614,104 1 de 100 meses
Histórico 95% 6.45% $1,289,978 Basado en historia
Histórico 99% 10.948% $2,189,541 Estrés extremo
Parámetros:
Vol. mensual portafolio: 5.618% | Capital: $20M

4.2 Histograma VaR

Para la cobertura ante escenarios de estrés el VaR 99% busca inmunizar el portafolio contra choques financieros severos o crisis sistémica; como la cola izquierda extrema que muestra el histograma histórico en -10.95%, la posición en contratos de futuros sobre el índice S&P 500 debe calcularse para neutralizar una exposición equivalente a los 2,614,104 USD VaR Paramétrico o 2,189,541 USD VaR Histórico.

hist_df <- data.frame(Retorno=as.numeric(ret_mens_hist)*100)

p_hist <- ggplot(hist_df, aes(x=Retorno)) +
  geom_histogram(aes(y=after_stat(density)), bins=28,
                 fill="#3498DB", color="white", alpha=0.7) +
  geom_density(color="#2C3E50", linewidth=1.1) +
  geom_vline(xintercept=-vh_95*100, color="#E67E22",
             linetype="dashed", linewidth=1.2) +
  geom_vline(xintercept=-vh_99*100, color="#E74C3C",
             linetype="dashed", linewidth=1.2) +
  annotate("text", x=-vh_95*100-0.3, y=0.18,
           label=paste0("VaR 95%\n-",round(vh_95*100,2),"%"),
           color="#E67E22", hjust=1, size=3.2) +
  annotate("text", x=-vh_99*100-0.3, y=0.14,
           label=paste0("VaR 99%\n-",round(vh_99*100,2),"%"),
           color="#E74C3C", hjust=1, size=3.2) +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold", hjust=0.5)) +
  labs(title="Distribución de Retornos Mensuales del Portafolio",
       subtitle="VaR histórico al 95% y 99% de confianza",
       x="Retorno Mensual (%)", y="Densidad",
       caption="Datos 2016–2026")
ggplotly(p_hist)

5 Estimación de Betas Individuales y del Portafolio mediante el Modelo CAPM

5.1 Betas Individuales

La beta de cada activo se obtuvo mediante una regresión OLS de los retornos logarítmicos diarios del activo contra los retornos del S&P 500 (ticker GSPC), que actúa como servidor del mercado:

\[r_{i,t} = \alpha_i + \beta_i \cdot r_{m,t} + \varepsilon_t\]

Donde β_icaptura cuánto se mueve el activo por cada 1% que se mueve el mercado, el alpha (α_i) representa el retorno que el activo genera por encima de lo que el mercado en términos anualizados.

KO — Beta: 0.5221 , Alpha: 2.324% , R²: 26.96% Con una beta de 0.52, Coca-Cola se mueve aproximadamente la mitad de lo que se mueve el mercado, si el S&P 500 cae 10%, KO históricamente cae alrededor de 5.2%, es el activo más defensivo del portafolio en términos de sensibilidad sistémica, el R² de 26.96% indicando que solo el 27% de la variabilidad de KO está explicada por el mercado, el 73% restante corresponde a riesgo idiosincrático factores propios de la empresa como volumen de ventas, tipo de cambio global y decisiones de dividendos; esto tiene sentido para una empresa de consumo básico cuyo flujo de caja no depende fuertemente del ciclo económico, un alpha positivo de 2.32% anual sugiere que KO generó retorno por encima de lo que su nivel de riesgo sistémico justificaría según el CAPM aunque con un P-Value de 0, este alpha es estadísticamente significativo.

JNJ — Beta: 0.4540 ,Alpha: 4.183% ,R²: 19.94% JNJ tiene el beta más bajo de los tres 0.454, lo que la clasifica también como muy defensiva, sin embargo, su R² de apenas 19.94% es el más bajo del grupo, lo que significa que el mercado explica incluso menos su comportamiento que en KO, los movimientos de JNJ están más gobernados por factores sectoriales propios, aprobaciones regulatorias de la FDA, secuencia de productos farmacéuticos que por el ciclo de mercado general, su alpha de 4.18% es el más alto entre los dos activos defensivos, lo que refuerza lo que ya mostraba la Tabla 2.1, JNJ ofrece mejor retorno ajustado por riesgo que KO con un perfil de volatilidad prácticamente idéntico.

NFLX — Beta: 1.1049 , Alpha: 9.335% , R²: 22.48% Netflix es el único activo con beta superior a 1, clasificado como neutral agresivo, un beta de 1.10 implica que se mueve ligeramente más que el mercado en ambas direcciones, cuando el S&P sube 10%, NFLX tiende a subir 11%, y cuando cae, también cae más, lo más llamativo aquí no es la beta sino la combinación de beta moderada con volatilidad total altísima 42.22%, el R² de 22.48% explica esa aparente contradicción, el mercado solo da cuenta del 22% de los movimientos de NFLX, el restante 78% es ruido específico de la empresa decisiones de contenido, métricas de suscriptores, guerras de streaming, cambios regulatorios, eso es exactamente el riesgo que materializó el colapso de 2022, con un alpha de 9.335% es sustancial y estadísticamente significativo, lo que indica que Netflix generó retorno por encima del mercado ajustado por su nivel de riesgo sistemático durante el período analizado.

# ============================================================
# PUNTO 5: BETA — CAPM
# ============================================================
suppressWarnings(getSymbols("^GSPC", from="2016-04-30",
                             to="2026-04-30", src="yahoo"))
## [1] "GSPC"
ret_mkt <- na.omit(diff(log(Ad(GSPC))))
colnames(ret_mkt) <- "SP500"
rm(GSPC); gc()
##           used  (Mb) gc trigger (Mb) max used (Mb)
## Ncells 2108909 112.7    3969087  212  3969087  212
## Vcells 4150505  31.7    8388608   64  8388597   64
fechas_ok  <- intersect(index(retornos), index(ret_mkt))
ret_acc    <- retornos[fechas_ok,]
ret_sp     <- ret_mkt[fechas_ok,]

# Regresiones CAPM
capm_res <- lapply(tickers, function(x){
  df <- data.frame(Y=as.numeric(ret_acc[,x]),
                   X=as.numeric(ret_sp))
  m  <- lm(Y~X, data=df)
  sm <- summary(m)
  list(beta=coef(m)[2], alpha=coef(m)[1]*252,
       r2=sm$r.squared, pval=coef(sm)[2,4])
})
names(capm_res) <- tickers

betas         <- sapply(tickers, function(x) capm_res[[x]]$beta)
beta_port     <- sum(betas * pesos)

tabla_betas <- data.frame(
  Activo   = tickers,
  Peso     = paste0(round(pesos*100,2),"%"),
  Alpha    = paste0(round(sapply(tickers,
                                  function(x) capm_res[[x]]$alpha)*100,3),"%"),
  Beta     = round(betas,4),
  R2       = paste0(round(sapply(tickers,
                                   function(x) capm_res[[x]]$r2)*100,2),"%"),
  Pvalue   = round(sapply(tickers,
                            function(x) capm_res[[x]]$pval),6),
  Perfil   = dplyr::case_when(
    betas < 0.8 ~ "Muy Defensivo",
    betas < 1.0 ~ "Defensivo",
    betas < 1.3 ~ "Neutral-Agresivo",
    TRUE        ~ "Muy Agresivo"),
  row.names=NULL
)

tabla_betas %>%
  kbl(caption="Tabla 5.1: Betas Individuales — Modelo CAPM",
      col.names=c("Activo","Peso","Alpha Anual","Beta (β)",
                  "R²","P-Value","Perfil"),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=FALSE, position="center") %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  footnote(general=paste0("Beta del Portafolio Ponderada: β_p = ",
                           round(beta_port,4),
                           " | Perfil: ",
                           ifelse(beta_port<1,"Defensivo","Agresivo")),
           general_title="Resultado: ", footnote_as_chunk=TRUE)
Tabla 5.1: Betas Individuales — Modelo CAPM
Activo Peso Alpha Anual Beta (β) P-Value Perfil
KO 21.74% 2.324% 0.5221 26.96% 0 Muy Defensivo
JNJ 42.5% 4.183% 0.4540 19.94% 0 Muy Defensivo
NFLX 35.77% 9.335% 1.1049 22.48% 0 Neutral-Agresivo
Resultado: Beta del Portafolio Ponderada: β_p = 0.7016 | Perfil: Defensivo

5.2 Gráfico CAPM

Un aspecto importante de estos resultados es que los tres P-Values son 0, lo que indica que todas las betas son estadísticamente significativas, sin embargo, los R² bajos entre 20% y 27% advierten que el modelo de un solo factor explica poco de la varianza total de estos activos, en la práctica, esto sugiere que un modelo multifactorial como Fama French de tres o cinco factores mejor la estructura de riesgo, especialmente para NFLX, donde su comportamiento está dominado por factores sectoriales que el S&P 500 como índice agregado no recoge.

Cada punto azul es un día de Inversión del período 2016–2026, el eje horizontal es el retorno diario del S&P 500 y el eje vertical es el retorno diario del portafolio, la línea roja es la recta de regresión OLS estimada y las bandas rosadas que la flanquean representan el intervalo de confianza de esa estimación.

\[r_{p,t} = \alpha_p + \beta_p \cdot r_{m,t} + \varepsilon_t\]

Con β_p=0.7016 La recta tiene una pendiente claramente positiva pero inferior a 45°, lo cual es la representación visual directa de una beta menor a 1 ,si el beta fuera exactamente 1, la línea iría de esquina a esquina con pendiente perfecta aquí se inclina menos, confirmando que el portafolio absorbe los movimientos del mercado con menor intensidad, cuando el S&P 500 registra un retorno extremo negativo de aproximadamente 10%, la recta proyecta un retorno del portafolio de alrededor de 7%, coherente con 10%×0.7016≈-7%. En el extremo positivo, un día de +9% en el mercado se traduce en aproximadamente +6.3% para el portafolio, la asimetría de protección funciona en ambas direcciones.

La nube de puntos nos muestra qué tan bien ajustan el modelo, el aspecto más informativo de esta gráfica no es la línea sino la dispersión alrededor de ella, la nube de puntos azules es relativamente ancha, especialmente en la zona central donde se concentra la mayoría de los días retornos entre −2% y +2% en el mercado, esa dispersión es la representación visual de los R² bajos que se obtuvieron en la Tabla 5.1; un R² promedio de alrededor del 23% significa que el 77% de los puntos se desvían de la línea por razones que el mercado no explica, si el ajuste fuera perfecto, todos los puntos caerían sobre la recta aquí claramente no es el caso, los puntos más alejados de la línea, que aparecen dispersos en los extremos, corresponden a días donde el portafolio se movió de forma muy diferente al mercado ,la mayoría de esos valores atípicos están asociados a eventos específicos de NFLX reportes de suscriptores, cambios que movieron el activo de forma desproporcionada respecto al índice.

Las bandas de confianza, en especial las rosadas se ensanchan hacia los extremos del gráfico, lo cual es el comportamiento estadístico esperado en una regresión OLS, en los valores centrales, días con retornos de mercado cercanos a cero, la estimación es más precisa, hacia los extremos días con movimientos de ±8% o más en el S&P 500 la incertidumbre sobre el comportamiento real del portafolio aumenta, esto tiene una implicación práctica directa y es que el CAPM predice bien el comportamiento del portafolio en días normales, pero en escenarios de estrés extremo la banda se abre y la predicción se vuelve menos confiable, esto es exactamente en contexto donde más se necesitaría precisión.

ret_pd <- as.numeric(ret_acc %*% pesos)
df_sc  <- data.frame(SP500=as.numeric(ret_sp)*100,
                      Port =ret_pd*100)

p_sc <- ggplot(df_sc, aes(x=SP500, y=Port)) +
  geom_point(alpha=0.15, color="#3498DB", size=0.8) +
  geom_smooth(method="lm", color="#E74C3C",
              fill="#FADBD8", linewidth=1.3) +
  geom_hline(yintercept=0, linetype="dotted", color="gray60") +
  geom_vline(xintercept=0, linetype="dotted", color="gray60") +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold", hjust=0.5)) +
  labs(title=paste0("Regresión CAPM del Portafolio | β_p = ",
                    round(beta_port,4)),
       subtitle="Retornos diarios: Portafolio vs S&P 500 (2016–2026)",
       x="Retorno S&P 500 (%)", y="Retorno Portafolio (%)",
       caption="Banda sombreada: IC 95%")
ggplotly(p_sc)

6 Cálculo del Ratio de Cobertura y Determinación del Número Óptimo de Contratos

6.1 Especificaciones del Contrato

Para cubrir un portafolio referenciado al S&P 500, el instrumento natural es el futuro E-mini S&P 500 (ES) que transa en el CME Group, es el contrato de futuros sobre índice más líquido del mundo, lo que garantiza una Trading ajustado y facilidad de entrada y salida de posición condición fundamental cuando se trabaja con coberturas dinámicas que pueden requerir ajustes frecuentes; el multiplicador de $50 USD es el parámetro más importante de entender antes de cualquier cálculo ya que cada contrato E-mini no vale el precio del índice vale el precio del índice multiplicado por 50, con el índice en 5,300 puntos: “Valor Nocional”=5,300×$50=$265,000” USD por contrato”.

Eso significa que con un solo contrato se está controlando una exposición de $265,000 USD al S&P 500, esta palanca es precisamente lo que hace útil al instrumento para coberturas, no es necesario comprar acciones por ese valor para tener exposición equivalente; el precio futuro estimado de 5,300 puntos (30-Abr-2026) resaltado en verde en la tabla porque es el dato de mercado que alimenta directamente el cálculo del número de contratos, se trata de una estimación al 30 de abril de 2026, fecha de referencia del ejercicio, cualquier variación en este precio cambia el valor nocional y por tanto el número óptimo de contratos resultante.

Los márgenes $12,000 inicial a $10,800 mantenimiento definen el costo real de implementar la cobertura, el margen inicial de $12,000 por contrato es lo que debe depositarse para abrir la posición, el margen de mantenimiento de $10,800 es el umbral mínimo, si las pérdidas de la valoración de los precios del mercado erosionan la cuenta por debajo de ese nivel, se genera un margin call y hay que reponer capital, la diferencia entre ambos es de $1,200 por contrato, para un portafolio que exija una cobertura de diez contratos, por ejemplo, dicho margen equivale a $12,000 adicionales que se deben tener disponibles a modo de reserva de liquidez operativa.

Para un portafolio que exija una cobertura de diez contratos, por ejemplo, dicho margen equivale a $12,000 adicionales que se deben tener disponibles a modo de reserva de liquidez operativa.

esp <- data.frame(
  Parametro = c("Subyacente","Símbolo","Bolsa",
                 "Multiplicador","Precio Futuro (30-Abr-2026 est.)",
                 "Valor Nocional por Contrato",
                 "Margen Inicial (por contrato)",
                 "Margen Mantenimiento (por contrato)",
                 "Vencimientos","Liquidación","Mark-to-Market"),
  Valor     = c("S&P 500 Index","ES (E-mini)","CME Group",
                 "$50 USD por punto del índice",
                 "5,300 puntos",
                 "$265,000 USD",
                 "$12,000 USD","$10,800 USD",
                 "Jun-26 | Sep-26 | Dic-26 | Mar-27",
                 "Efectivo (Cash Settlement)",
                 "Diario (académico: mensual)")
)

esp %>%
  kbl(caption="Tabla 6.1: Especificaciones E-mini S&P 500 (CME Group)",
      col.names=c("Parámetro","Descripción / Valor"),
      align=c("l","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover"),full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#1A5276", color="white") %>%
  row_spec(c(5,6,7,8), background="#D5F5E3")
Tabla 6.1: Especificaciones E-mini S&P 500 (CME Group)
Parámetro Descripción / Valor
Subyacente S&P 500 Index
Símbolo ES (E-mini)
Bolsa CME Group
Multiplicador $50 USD por punto del índice
Precio Futuro (30-Abr-2026 est.) 5,300 puntos
Valor Nocional por Contrato $265,000 USD
Margen Inicial (por contrato) $12,000 USD
Margen Mantenimiento (por contrato) $10,800 USD
Vencimientos Jun-26 | Sep-26 | Dic-26 | Mar-27
Liquidación Efectivo (Cash Settlement)
Mark-to-Market Diario (académico: mensual)

6.2 Cálculo N* de Contratos

La fórmula del número óptimo de contratos es:

\[N^* = \frac{\beta_p \times V_p}{F \times \text{mult}}\]

donde \(V_p\) es el valor del portafolio, \(F\) el precio del futuro y mult el multiplicador del contrato.

# ============================================================
# PUNTO 6: NÚMERO ÓPTIMO DE CONTRATOS
# ============================================================
precio_fut   <- 5300
mult         <- 50
nocional     <- precio_fut * mult        # 265,000 USD

N_exacto     <- (beta_port * capital) / nocional
N_round      <- round(N_exacto)
N_floor      <- floor(N_exacto)
N_ceil       <- ceiling(N_exacto)
exp_cubierta <- N_round * nocional
pct_cob      <- exp_cubierta / capital

calc <- data.frame(
  Parametro = c("Beta del Portafolio (β_p)",
                 "Valor del Portafolio (V_p)",
                 "Precio Futuro E-mini",
                 "Multiplicador","Valor Nocional por Contrato",
                 "N* Exacto = (β_p × V_p) / (F × mult)",
                 "N* Floor (hacia abajo)","N* Ceiling (hacia arriba)",
                 "N* Aplicado (redondeo estándar)",
                 "Exposición Nocional Cubierta",
                 "% del Portafolio Cubierto"),
  Valor     = c(round(beta_port,4),
                 paste0("$",format(capital,big.mark=",")),
                 paste0(precio_fut," puntos"),
                 paste0("$",mult," USD/pto"),
                 paste0("$",format(nocional,big.mark=",")),
                 round(N_exacto,4),
                 N_floor, N_ceil, N_round,
                 paste0("$",format(exp_cubierta,big.mark=",")),
                 paste0(round(pct_cob*100,2),"%"))
)

calc %>%
  kbl(caption="Tabla 6.2: Cálculo del Número Óptimo de Contratos",
      col.names=c("Parámetro","Valor"), align=c("l","r")) %>%
  kable_styling(bootstrap_options=c("striped","hover"),
                full_width=FALSE, position="center") %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  row_spec(c(6,9), bold=TRUE, background="#FDEBD0") %>%
  row_spec(c(10,11), bold=TRUE, background="#D5F5E3")
Tabla 6.2: Cálculo del Número Óptimo de Contratos
Parámetro Valor
Beta del Portafolio (β_p) 0.7016
Valor del Portafolio (V_p) $20,000,000
Precio Futuro E-mini 5300 puntos
Multiplicador $50 USD/pto
Valor Nocional por Contrato $265,000
N* Exacto = (β_p × V_p) / (F × mult) 52.9524
N* Floor (hacia abajo) 52
N* Ceiling (hacia arriba) 53
N* Aplicado (redondeo estándar) 53
Exposición Nocional Cubierta $14,045,000
% del Portafolio Cubierto 70.23%

Justificación del redondeo: Se usa el redondeo estándar (round). Si N* = 52.9524, redondear hacia 53 contratos ofrece la cobertura más cercana al objetivo. Redondear hacia abajo dejaría exposición descubierta; hacia arriba sobrepondría la cobertura.


7 Diseño de la Estrategia con Derivados y Análisis de Escenarios de Mercado

7.1 Decisión Estratégica

Como el portafolio ya posee las acciones, la cobertura requiere POSICIÓN CORTA en futuros quiere decir vender futuros. Esto neutraliza el riesgo sistemático: si el mercado cae, las pérdidas en acciones se compensan con ganancias en la posición corta.

esc <- data.frame(
  Escenario     = c("Posición CORTA (nuestro caso)","Mercado SUBE",
                     "Mercado BAJA",
                     "Posición LARGA","Mercado SUBE","Mercado BAJA"),
  Acciones      = c("Posee $20M en acciones","Acciones suben (+)",
                     "Acciones bajan (−)","Sin acciones aún",
                     "Costo de compra sube","Costo de compra baja"),
  Futuros       = c("VENDE futuros (short)","Futuros pierden (−)",
                     "Futuros ganan (+)","COMPRA futuros (long)",
                     "Futuros ganan (+)","Futuros pierden (−)"),
  Resultado_Net = c("Cobertura del portafolio",
                     "Ganancia acc. compensa pérdida fut.",
                     "Pérdida acc. compensada por fut.",
                     "Fijación de precio de compra",
                     "Ganancia fut. compensa mayor precio",
                     "Pérdida fut. compensada por menor precio"),
  Aplica        = c("✅ NUESTRO CASO","⚠️ Upside limitado",
                     "✅ Protección activada",
                     "Cobertura anticipatoria",
                     "✅ Protección activada","⚠️ Cobertura costosa")
)

esc %>%
  kbl(caption="Tabla 7.1: Posiciones en Futuros y Escenarios de Mercado",
      col.names=c("Escenario","Impacto Acciones",
                  "Resultado Futuros","Resultado Neto","Aplicación"),
      align="l") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  row_spec(1, bold=TRUE, background="#AED6F1") %>%
  row_spec(c(2,3), background="#D6EAF8") %>%
  row_spec(c(4,5,6), background="#FDEBD0")
Tabla 7.1: Posiciones en Futuros y Escenarios de Mercado
Escenario Impacto Acciones Resultado Futuros Resultado Neto Aplicación
Posición CORTA (nuestro caso) Posee $20M en acciones VENDE futuros (short) Cobertura del portafolio ✅ NUESTRO CASO
Mercado SUBE Acciones suben (+) Futuros pierden (−) Ganancia acc. compensa pérdida fut. ⚠️ Upside limitado
Mercado BAJA Acciones bajan (−) Futuros ganan (+) Pérdida acc. compensada por fut. ✅ Protección activada
Posición LARGA Sin acciones aún COMPRA futuros (long) Fijación de precio de compra Cobertura anticipatoria
Mercado SUBE Costo de compra sube Futuros ganan (+) Ganancia fut. compensa mayor precio ✅ Protección activada
Mercado BAJA Costo de compra baja Futuros pierden (−) Pérdida fut. compensada por menor precio ⚠️ Cobertura costosa

Al estructurar una posición corta con \(N = 53\) contratos, buscamos crear una correlación inversa perfecta entre el mercado de contado spot y el mercado de derivados. De este modo, cualquier minusvalía en el portafolio accionario será compensada por la ganancia generada en la cuenta de margen de los futuros.

7.2 Gráfico P&L Cobertura

El gráfico nos muestra la interacción entre el mercado de contado spot y el mercado de derivados a través de tres trayectorias de rendimientos bien diferenciadas, la línea azul Sin Cobertura refleja la exposición directa del portafolio al riesgo sistemático; presenta una pendiente positiva donde el valor de nuestra posición en KO, JNJ y NFLX depende por completo del rumbo del mercado, por el contrario, la línea roja futuro corto muestra el comportamiento del derivado por sí solo, el cual, al ser una posición de venta, genera una pendiente inversa idónea para acumular ganancias a medida que el índice S&P 500 se desvaloriza.

El núcleo de la estrategia se consolida en la línea verde portafolio cubierto, que representa el resultado neto de fusionar ambas posiciones utilizando el número óptimo de 53 contratos, al integrar el derivado, la pendiente del portafolio se aplana por completo sobre el eje horizontal, lo que demuestra matemáticamente que la cartera se ha vuelto inmune a las fluctuaciones del mercado y esto significa que ante un escenario bajista del mercado (zona izquierda del gráfico), la pérdida contable de las acciones se neutraliza con el flujo de caja positivo depositado en nuestra cuenta de margen por los futuros.

Por otro lado, el gráfico también evidencia el costo de oportunidad en cualquier estrategia de inmunización financiera, en un escenario alcista, zona derecha del gráfico, la valorización de los activos especialmente por el impulso de Netflix se diluye por completo para cubrir los llamados al margen y las pérdidas acumuladas en los futuros cortos, la línea verde demuestra que la cobertura cumple con su objetivo primordial el cual elimina la incertidumbre y el riesgo de cola izquierda a cambio de fijar el valor del capital en torno a los USD 20 millones, independientemente de los ciclos del mercado.

Para nuestro fondo de USD 20,000,000, la alternativa lógica es la posición corta, transformando un portafolio expuesto a los ciclos económicos en una estrategia totalmente blindada y resiliente ante volatilidades financieras

rng <- seq(-0.15,0.15,by=0.005)
pl_df <- data.frame(
  Ret_Mkt    = rng*100,
  Sin_Cob    = rng * beta_port * capital / 1e6,
  Fut_Corto  = -rng * N_round * nocional / 1e6,
  Cubierto   = (rng*beta_port*capital -
                   rng*N_round*nocional) / 1e6
)
pl_long <- pivot_longer(pl_df, -Ret_Mkt,
                         names_to="Componente", values_to="PL")

p_pl <- ggplot(pl_long, aes(x=Ret_Mkt, y=PL, color=Componente)) +
  geom_line(linewidth=1.3) +
  geom_hline(yintercept=0, linetype="dotted", color="gray50") +
  geom_vline(xintercept=0, linetype="dotted", color="gray50") +
  scale_color_manual(
    values=c(Sin_Cob="#3498DB",Fut_Corto="#E74C3C",Cubierto="#27AE60"),
    labels=c(Sin_Cob="Sin Cobertura",
             Fut_Corto="P&L Posición Corta",
             Cubierto="Portafolio Cubierto (Neto)")) +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold", hjust=0.5),
        legend.position="bottom") +
  labs(title=paste0("P&L de la Cobertura | N = ",N_round," contratos"),
       subtitle="Posición corta E-mini S&P 500",
       x="Retorno del Mercado (%)", y="Ganancia/Pérdida (Millones USD)",
       color=NULL)
ggplotly(p_pl) %>% layout(hovermode="x unified",
                            legend=list(orientation="h", y=-0.25))

8 Estructura de Flujos de Caja, Liquidación Diaria y Llamados al Margen

8.1 Tabla de Flujos Mensuales

El comportamiento mes a mes de los 53 contratos cortos en E-mini durante el período Abr-2026 a Abr-2027, partiendo de un saldo inicial de $636,000 (53 × $12,000 de margen inicial).

May-26 es el primer mes con movimiento y el más favorable para la cobertura: el índice cae 132.5 puntos, generando una ganancia de $351,125 en la posición corta, el saldo salta de $636,000 a $987,125 casi se duplica en un mes.

Ago-26 es el mes de mayor ganancia del período la caída de 214.71 puntos y $568,982 a favor,el saldo alcanza su pico en $1,372,302. El giro ocurre en Feb-27: el índice sube 177.81 puntos y la posición corta pierde $471,196 la mayor pérdida mensual registrada. El saldo cae a $747,141, su nivel más bajo del período.

El margen de mantenimiento y por qué nunca se activa

El umbral crítico es $572,400 (53 × $10,800), ningún mes lo perfora el saldo más bajo es $747,141 en Feb-27, que mantiene un colchón de $174,741 sobre ese límite, por eso la columna Margin Call marca No en todos los meses y la columna Reposición permanece vacía durante todo el período esto no es casualidad refleja que la cobertura se diseñó sobre un portafolio con beta moderada de (0.7016) y que los movimientos del índice, aunque volátiles, no fueron lo suficientemente extremos como para consumir el margen disponible.

Al cierre en Abr-27 el saldo es $907,678, un incremento neto de $271,678 sobre el depósito inicial, ese excedente no es “ganancia” en sentido estricto es la compensación que la posición corta generó durante los meses en que el índice cayó, y que en el portafolio físico se habría traducido en pérdidas equivalentes. La cobertura funcionó: absorbió volatilidad sistemática sin generar ningún margin call en 12 meses de operación.

# ============================================================
# PUNTO 8: FLUJOS MENSUALES Y MARGIN CALLS
# ============================================================
mi_uc    <- 12000     # margen inicial por contrato
mm_uc    <- 10800     # margen mantenimiento por contrato
mi_total <- mi_uc * N_round
mm_total <- mm_uc * N_round

# Variaciones mensuales hipotéticas (escenario académico realista)
var_mens_pct <- c(-2.5,-1.8,3.2,-4.1,2.7,1.5,
                   -3.8,2.1,-1.2,3.5,-2.9,1.8) / 100
n_meses <- 12

precios_fut <- numeric(n_meses+1)
precios_fut[1] <- precio_fut
for(i in 2:(n_meses+1)) precios_fut[i] <- precios_fut[i-1]*(1+var_mens_pct[i-1])

meses_lab <- c("Abr-26","May-26","Jun-26","Jul-26","Ago-26","Sep-26",
               "Oct-26","Nov-26","Dic-26","Ene-27","Feb-27","Mar-27","Abr-27")

flujos <- data.frame(
  Mes=meses_lab, Precio=round(precios_fut,2),
  Var_Pts=c(NA,round(diff(precios_fut),2)),
  GPP_Larga=NA_real_, GPP_Corta=NA_real_,
  Saldo=NA_real_, MC=NA, Repos=NA_real_
)
flujos$Saldo[1] <- mi_total

saldo <- mi_total
for(i in 2:(n_meses+1)){
  vp     <- flujos$Var_Pts[i]
  gl     <- vp * mult * N_round
  gc_val <- -gl
  saldo  <- saldo + gc_val
  if(saldo < mm_total){
    repos  <- mi_total - saldo
    saldo  <- mi_total
    mc_flag <- "⚠️ SÍ"
  } else {
    repos   <- 0
    mc_flag <- "✅ No"
  }
  flujos$GPP_Larga[i] <- gl
  flujos$GPP_Corta[i] <- gc_val
  flujos$Saldo[i]     <- saldo
  flujos$MC[i]        <- mc_flag
  flujos$Repos[i]     <- repos
}

flujos_fmt <- flujos %>%
  mutate(
    Var_Pts   = ifelse(is.na(Var_Pts),"—",paste0(Var_Pts," pts")),
    GPP_Larga = ifelse(is.na(GPP_Larga),"—",
                        paste0(ifelse(GPP_Larga>=0,"+$","$"),
                               format(abs(round(GPP_Larga)),big.mark=","))),
    GPP_Corta = ifelse(is.na(GPP_Corta),"—",
                        paste0(ifelse(GPP_Corta>=0,"+$","−$"),
                               format(abs(round(GPP_Corta)),big.mark=","))),
    Saldo     = paste0("$",format(round(Saldo),big.mark=",")),
    MC        = ifelse(is.na(MC),"—",MC),
    Repos     = ifelse(is.na(Repos)|Repos==0,"—",
                        paste0("$",format(round(Repos),big.mark=",")))
  )

# Detectar filas con margin call para resaltado
mc_rows <- which(flujos$MC == "⚠️ SÍ")

flujos_fmt %>%
  kbl(caption=paste0("Tabla 8.1: Flujos Mensuales — ",
                      N_round," Contratos E-mini S&P 500 (Posición Corta)"),
      col.names=c("Mes","Precio Futuro","Variación",
                  "G/P Posición Larga","G/P Posición Corta",
                  "Saldo Margen","Margin Call","Reposición"),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  row_spec(mc_rows, bold=TRUE, background="#FADBD8") %>%
  footnote(general=paste0("Margen inicial: $",
                           format(mi_total,big.mark=","),
                           " | Margen mantenimiento: $",
                           format(mm_total,big.mark=",")),
           general_title="Parámetros: ")
Tabla 8.1: Flujos Mensuales — 53 Contratos E-mini S&P 500 (Posición Corta)
Mes Precio Futuro Variación G/P Posición Larga G/P Posición Corta Saldo Margen Margin Call Reposición
Abr-26 5300 $ 636,000
May-26 5168 -132.5 pts $351,125 +$351,125 $ 987,125 ✅ No
Jun-26 5074 -93.02 pts $246,503 +$246,503 $1,233,628 ✅ No
Jul-26 5237 162.38 pts +$430,307 −$430,307 $ 803,321 ✅ No
Ago-26 5022 -214.71 pts $568,982 +$568,982 $1,372,302 ✅ No
Sep-26 5158 135.6 pts +$359,340 −$359,340 $1,012,962 ✅ No
Oct-26 5235 77.37 pts +$205,030 −$205,030 $ 807,932 ✅ No
Nov-26 5036 -198.93 pts $527,164 +$527,164 $1,335,096 ✅ No
Dic-26 5142 105.76 pts +$280,264 −$280,264 $1,054,832 ✅ No
Ene-27 5080 -61.7 pts $163,505 +$163,505 $1,218,338 ✅ No
Feb-27 5258 177.81 pts +$471,196 −$471,196 $ 747,141 ✅ No
Mar-27 5106 -152.48 pts $404,072 +$404,072 $1,151,213 ✅ No
Abr-27 5197 91.9 pts +$243,535 −$243,535 $ 907,678 ✅ No
Parámetros:
Margen inicial: $636,000 | Margen mantenimiento: $572,400

8.2 Evolución del Saldo

La línea azul es el saldo mensual de la cuenta, la línea roja punteada es el margen de mantenimiento ($572,400) y la línea verde punteada es el margen inicial ($636,000). Lo primero que salta a la vista es la forma zigzag de la curva subidas y bajadas pronunciadas mes a mes, eso es consecuencia directa de la naturaleza de la Valoración a precios de mercado diario consolidado mensualmente cada mes el mercado se mueve en una dirección y la posición corta responde simétricamente en sentido contrario, no hay tendencia sostenida porque el índice no cae ni sube linealmente oscila, y el saldo de margen oscila con él.

FECHAS CRITICAS

Ago-26 marca el pico máximo cerca de $1,375K el índice cayó con fuerza ese mes y la posición corta acumuló su mayor ganancia del período. Sep-26 y Dic-26 son los valles intermedios, ambos alrededor de $800K-$810K, producto de rebotes del índice que generaron pérdidas en la posición corta. Feb-27 es el punto más bajo de toda la serie, rozando los $750K — el mes donde el índice subió casi 178 puntos y la cobertura absorbió su mayor pérdida mensual.

saldo_df <- data.frame(
  Mes   = meses_lab[-1],
  Idx   = 1:n_meses,
  Saldo = flujos$Saldo[-1]/1000,
  MC    = flujos$MC[-1]=="⚠️ SÍ"
)

p_mg <- ggplot(saldo_df, aes(x=Idx, y=Saldo)) +
  geom_line(color="#3498DB", linewidth=1.2) +
  geom_point(aes(color=MC), size=4) +
  geom_hline(yintercept=mm_total/1000, color="#E74C3C",
             linetype="dashed", linewidth=1) +
  geom_hline(yintercept=mi_total/1000, color="#27AE60",
             linetype="dotted", linewidth=1) +
  scale_color_manual(values=c("TRUE"="#E74C3C","FALSE"="#27AE60"),
                     labels=c("TRUE"="Margin Call","FALSE"="Sin Llamado")) +
  scale_x_continuous(breaks=1:n_meses, labels=meses_lab[-1]) +
  scale_y_continuous(labels=function(x) paste0("$",x,"K")) +
  theme_minimal(base_size=10) +
  theme(axis.text.x=element_text(angle=45,hjust=1),
        plot.title=element_text(face="bold",hjust=0.5),
        legend.position="bottom") +
  labs(title="Evolución del Saldo de Cuenta de Margen",
       x=NULL, y="Saldo (Miles USD)", color="Estado",
       caption="Línea roja: margen mantenimiento | Verde: margen inicial")
ggplotly(p_mg)

Durante los 12 meses de operación el saldo nunca perforó el umbral de $572,400. Incluso en el peor momento (Feb-27 ≈ $747K) se mantuvo un colchón de aproximadamente $175K sobre el límite, los puntos verdes marcados como FALSE confirman que no se generó ningún margin call en todo el período, eso valida que el diseño de la cobertura fue adecuado: 53 contratos sobre un portafolio con beta de 0.7016 generó una exposición manejable que nunca comprometió la liquidez operativa de la cuenta.


9 Estrategia de Renovación de Contratos (Roll-Over) y Riesgo de Base

Los futuros tienen fecha de vencimiento, Como la cobertura se mantiene durante más de un trimestre, al vencer cada contrato hay que cerrar la posición y abrir una nueva en el contrato del siguiente vencimiento, esa operación es el roll-over, el precio de cierre del contrato viejo casi nunca coincide con el precio de apertura del nuevo, generando un Costo Roll que afecta el resultado neto.

9.1 Cálculo del Roll-Over

Trimestre a trimestre

Q2-2026 (ES-Jun-26): El índice abre y cierra en 5,300 sin movimiento, G/P Corta = $0, sin embargo el Riesgo Base es $278,250 y el Costo Roll también es $278,250 positivo, resultando en una G/P Neta de −$278,250. Este primer trimestre establece la base de costo de la estrategia.

Q3-2026 (ES-Sep-26): El índice cae de 5,300 a 5,185 la posición corta gana $304,750. El costo del roll al abrir en 5,410 el cual genero un costo negativo de −$596,250, pero la G/P Neta termina en +$901,000, el mejor trimestre del período. La caída del índice compensó con creces el costo de renovación.

Q4-2026 (ES-Dic-26): El índice sube de 5,185 a 5,402 la posición corta pierde $575,050. El costo roll es positivo ($212,000) pero no alcanza a compensar, dejando una G/P Neta de −$787,050, el peor trimestre, esto refleja exactamente el riesgo de mantener una posición corta en un mercado alcista.

Q1-2027 (ES-Mar-27): Contrato abierto en 5,318 sin precio de cierre registrado aún la G/P Neta parcial es +$222,600, pendiente de liquidación final.

La columna Riesgo Base representa la diferencia entre el precio spot del índice y el precio futuro al momento del roll, esa brecha no es constante y genera incertidumbre sobre el costo real de mantener la cobertura trimestre a trimestre es el riesgo de base, inherente a cualquier estrategia de cobertura con futuros y la razón por la que una cobertura perfecta es teóricamente posible pero prácticamente imposible de ejecutar.

# ============================================================
# PUNTO 9: ROLL-OVER TRIMESTRAL
# ============================================================
trims      <- c("Q2-2026","Q3-2026","Q4-2026","Q1-2027")
venc       <- c("Jun-26","Sep-26","Dic-26","Mar-27")
pc         <- c(5300, 5185, 5402, 5318)   # precio cierre cada trim
pa         <- c(5195, 5410, 5322, NA)      # precio apertura nuevo contrato

ro <- data.frame(
  Trimestre      = trims,
  Contrato       = paste0("ES-",venc),
  Precio_Inicio  = c(5300, pc[1:3]),
  Precio_Cierre  = pc,
  Precio_Apertura= pa
)

ro$GPP_Corta     <- -(ro$Precio_Cierre - ro$Precio_Inicio)*mult*N_round
ro$Riesgo_Base   <- abs(ro$Precio_Cierre - ro$Precio_Apertura)*mult*N_round
ro$Costo_Roll    <- -(ro$Precio_Apertura - ro$Precio_Cierre)*mult*N_round
ro$GPP_Neta      <- ro$GPP_Corta - ifelse(is.na(ro$Costo_Roll),0,ro$Costo_Roll)

ro_fmt <- ro %>%
  mutate(across(c(GPP_Corta,GPP_Neta),
                ~paste0(ifelse(.>=0,"+$","−$"),
                        format(abs(round(.)),big.mark=","))),
         Riesgo_Base=ifelse(is.na(Riesgo_Base),"—",
                             paste0("$",format(round(Riesgo_Base),big.mark=","))),
         Costo_Roll=ifelse(is.na(Costo_Roll),"—",
                            paste0(ifelse(ro$Costo_Roll>=0,
                                          "+$","−$")[!is.na(ro$Costo_Roll)],
                                   format(abs(round(ro$Costo_Roll[!is.na(ro$Costo_Roll)])),
                                          big.mark=","))),
         Precio_Apertura=ifelse(is.na(Precio_Apertura),"—",
                                 as.character(Precio_Apertura)))

ro_fmt %>%
  kbl(caption="Tabla 9.1: Estrategia de Roll-Over Trimestral — Posición Corta",
      col.names=c("Trim.","Contrato","P. Inicio","P. Cierre",
                  "P. Apertura","G/P Corta","Riesgo Base",
                  "Costo Roll","G/P Neta"),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  add_header_above(c(" "=2,"Precios"=3,"Resultados"=4))
Tabla 9.1: Estrategia de Roll-Over Trimestral — Posición Corta
Precios
Resultados
Trim. Contrato P. Inicio P. Cierre P. Apertura G/P Corta Riesgo Base Costo Roll G/P Neta
Q2-2026 ES-Jun-26 5300 5300 5195 +$ 0 $278,250 +$278,250 −$278,250
Q3-2026 ES-Sep-26 5300 5185 5410 +$304,750 $596,250 −$596,250 +$901,000
Q4-2026 ES-Dic-26 5185 5402 5322 −$575,050 $212,000 +$212,000 −$787,050
Q1-2027 ES-Mar-27 5402 5318 +$222,600 +$222,600

9.2 Corta vs Larga Acumulado

Las dos líneas representan la ganancia/pérdida acumulada de cada estrategia trimestre a trimestre,la línea roja es la posición corta (la cobertura) y la verde es la posición larga (el portafolio físico). La línea punteada horizontal es el punto de equilibrio en $0.

Lo primero que salta a la vista es que ambas líneas son casi perfectamente simétricas. Cuando una sube, la otra baja en magnitud similar es exactamente lo que debe ocurrir en una cobertura bien construida, no es coincidencia, es el resultado de haber calculado correctamente los 53 contratos.

Evolución trimestral

Q2-2026: La posición larga abre ligeramente positiva (~$0.05M) mientras la corta abre negativa (~−$0.07M). El mercado prácticamente no se movió ese trimestre, por lo que ambas posiciones arrancan cerca de cero.

Q3-2026: Es el cruce más dramático, la posición corta alcanza su pico máximo (+$0.28M) mientras la larga toca su piso mínimo (−$0.28M) el índice cayó ese trimestre la cobertura ganó, el portafolio físico perdió, la simetría es casi perfecta.

Q4-2026: La inversión es total, el índice subió con fuerza, la posición larga recupera y supera el punto de equilibrio llegando a (+$0.28M), mientras la corta se hunde a (−$0.28M) las líneas se cruzan exactamente sobre la línea de $0, lo que visualmente confirma que la cobertura neutralizó el movimiento del mercado en ambas direcciones.

La suma de ambas líneas en cualquier punto del gráfico tiende a cero o muy cerca,eso es la definición práctica de una cobertura efectiva: lo que gana una posición lo pierde la otra. El portafolio cubierto no participa del alza del mercado, pero tampoco sufre la baja queda expuesto únicamente al alpha individual de KO, JNJ y NFLX, que es precisamente el riesgo que se decidió conservar y el que los futuros sobre índice no pueden eliminar.

gpp_c <- cumsum(-(pc-c(5300,pc[1:3]))*mult*N_round/1e6)
gpp_l <- cumsum( (pc-c(5300,pc[1:3]))*mult*N_round/1e6)

comp <- data.frame(
  Trim=trims,
  Corta=gpp_c, Larga=gpp_l
) %>% pivot_longer(-Trim, names_to="Estrat", values_to="PL")

p_roll <- ggplot(comp, aes(x=Trim, y=PL, color=Estrat, group=Estrat)) +
  geom_line(linewidth=1.5) + geom_point(size=4) +
  geom_hline(yintercept=0, linetype="dashed", color="gray50") +
  scale_color_manual(values=c(Corta="#E74C3C",Larga="#27AE60")) +
  scale_y_continuous(labels=function(x) paste0("$",round(x,1),"M")) +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold",hjust=0.5),
        legend.position="bottom") +
  labs(title="G/P Acumulada: Posición Corta vs Larga",
       subtitle="Roll-Over Trimestral — E-mini S&P 500",
       x="Trimestre", y="G/P Acumulada (Millones USD)",
       color="Estrategia")
ggplotly(p_roll)

10 Evaluación de la Eficiencia Financiera y Valor Esperado de la Cartera Cubierta

10.1 Comparación Sin vs Con Cobertura

La cobertura convierte el retorno del portafolio a la tasa libre de riesgo, eliminando el riesgo sistemático (β ≈ 0). El costo de la cobertura es la diferencia entre el retorno esperado del portafolio y la tasa rf.

renunciar al retorno esperado del portafolio a cambio de la certeza de la tasa libre de riesgo, no es un costo operativo es el costo de oportunidad de eliminar el riesgo sistemático.

Sin cobertura vs Con cobertura

Sin cobertura, el portafolio de $20 millones con un retorno anual esperado de 14.29% crece en un trimestre a $20,679,285 una ganancia esperada de $679,285 en 3 meses.

Con cobertura, la beta queda en cero y el portafolio se comporta como un activo libre de riesgo. Con TNX anual de 4.5% (1.106% trimestral), el valor esperado sube únicamente a $20,221,300 una ganancia de $221,300.

La diferencia entre ambos escenarios es el Costo de la Cobertura: $457,986 por trimestre. “Costo”=$20,679,285-$20,221,300=$457,985

Lo que significa que tenemos un precio forward teórico de 5,342.57 puntos para el E-mini es consistente con la relación de paridad: F=S×e(r_f×T)=5,300×e(0.045×0.25)≈5,342.57

Ese diferencial entre el precio spot (5,300) y el precio forward (5,342.57) es precisamente el costo implícito de la Estrategia de inversión que el mercado descuenta y que se materializa como los $457,986 que se sacrifican por trimestre al cubrir. Cubrir cuesta $457,986 por trimestre casi $1.8 millones anuales en retorno sacrificado, eso no es una pérdida contable, es el precio de eliminar la incertidumbre sistemática,si hay convicción en los fundamentales del portafolio, ese costo no se justifica: los tres activos tienen alpha positivo y Sharpe favorable, señales de que el mercado los recompensa por encima de lo que su riesgo exige,cubrir en ese escenario es renunciar innecesariamente a retorno,pero si el entorno macro genera dudas sobre esos retornos esperados, anclar el portafolio a 4.5% anual garantizado puede valer cada centavo de esos $457,986,la cobertura no es buena ni mala por sí sola su valor depende enteramente de qué tan seguros se están de que el portafolio va a superar la tasa libre de riesgo el próximo trimestre.

# ============================================================
# PUNTO 10: VALOR ESPERADO DE LA COBERTURA
# ============================================================

# Tasa libre de riesgo: ^TNX (Treasury 3-5Y) ~ 4.50% al 30-Abr-2026
rf_tnx    <- 0.045
rf_trim   <- (1 + rf_tnx)^(3/12) - 1
rf_mens   <- (1 + rf_tnx)^(1/12) - 1

ret_trim  <- (1 + optimo$Retorno)^(3/12) - 1
v_sin     <- capital * (1 + ret_trim)        # valor sin cobertura trim
v_con     <- capital * (1 + rf_trim)          # valor cubierto trim
costo_cob <- v_sin - v_con                    # costo de la cobertura

# Precio forward teórico: F = S * e^((r-q)*T)
div_yield <- 0.013  # dividend yield S&P 500 aprox.
T_trim    <- 0.25
p_forward <- precio_fut * exp((rf_tnx - div_yield) * T_trim)

comp_cob <- data.frame(
  Concepto = c("Capital Inicial",
                "Retorno Esperado Anual","Retorno Esperado Trimestral",
                "Valor Portafolio Sin Cobertura (3M)",
                "Tasa Libre de Riesgo (^TNX anual)",
                "Tasa Libre de Riesgo Trimestral",
                "Precio Forward Teórico (E-mini)",
                "Valor Portafolio CON Cobertura (3M)",
                "Costo de la Cobertura (por trimestre)",
                "Reducción de Riesgo Sistemático"),
  Sin_Cob = c(paste0("$",format(capital,big.mark=",")),
               paste0(round(optimo$Retorno*100,2),"%"),
               paste0(round(ret_trim*100,3),"%"),
               paste0("$",format(round(v_sin),big.mark=",")),
               "—","—","—","—","—","—"),
  Con_Cob = c(paste0("$",format(capital,big.mark=",")),
               "—","—","—",
               paste0(round(rf_tnx*100,2),"%"),
               paste0(round(rf_trim*100,3),"%"),
               paste0(round(p_forward,2)," pts"),
               paste0("$",format(round(v_con),big.mark=",")),
               paste0("$",format(round(costo_cob),big.mark=",")),
               paste0("β_p=",round(beta_port,4)," → β≈0"))
)

comp_cob %>%
  kbl(caption="Tabla 10.1: Portafolio Sin vs Con Cobertura (Trimestral)",
      col.names=c("Concepto","Sin Cobertura","Con Cobertura"),
      align=c("l","r","r")) %>%
  kable_styling(bootstrap_options=c("striped","hover"),full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  row_spec(c(4,8), bold=TRUE, background="#D5F5E3") %>%
  row_spec(9, bold=TRUE, background="#FADBD8") %>%
  footnote(general=paste0(
    "La cobertura transforma el retorno esperado del portafolio (",
    round(optimo$Retorno*100,2),"%) a la tasa libre de riesgo (",
    round(rf_tnx*100,2),"%), eliminando el riesgo sistémico. ",
    "El costo trimestral de la cobertura es $",
    format(round(costo_cob),big.mark=",")),
    general_title="Interpretación: ", footnote_as_chunk=TRUE)
Tabla 10.1: Portafolio Sin vs Con Cobertura (Trimestral)
Concepto Sin Cobertura Con Cobertura
Capital Inicial $20,000,000 $20,000,000
Retorno Esperado Anual 14.29%
Retorno Esperado Trimestral 3.396%
Valor Portafolio Sin Cobertura (3M) $20,679,285
Tasa Libre de Riesgo (^TNX anual) 4.5%
Tasa Libre de Riesgo Trimestral 1.106%
Precio Forward Teórico (E-mini) 5342.57 pts
Valor Portafolio CON Cobertura (3M) $20,221,300
Costo de la Cobertura (por trimestre) $457,986
Reducción de Riesgo Sistemático β_p=0.7016 → β≈0
Interpretación: La cobertura transforma el retorno esperado del portafolio (14.29%) a la tasa libre de riesgo (4.5%), eliminando el riesgo sistémico. El costo trimestral de la cobertura es $457,986

11 Rendimiento Mensual Compuesto e Impacto de la Política de Dividendos

11.1 Proyección 12 Meses

Al proyectar el comportamiento del portafolio desde abril de 2026 hasta abril de 2027, se evidencia el efecto de la capitalización compuesta bajo distintos escenarios de riesgo y cobertura. Partiendo de un capital inicial de USD 20,000,000, las trayectorias reflejan dinámicas opuestas según la exposición teórica asumida:

# ============================================================
# PUNTO 11: PROYECCIÓN Y DIVIDENDOS
# ============================================================
div_anuales <- c(KO=0.031, JNJ=0.030, NFLX=0.000)
div_mens    <- (1+div_anuales)^(1/12)-1

ret_pm_nd   <- (1+optimo$Retorno)^(1/12)-1      # sin dividendos
ret_div_pm  <- sum(pesos * div_mens)              # contrib. dividendos
ret_pm_tot  <- ret_pm_nd + ret_div_pm             # total con dividendos

var_mens_99 <- qnorm(0.99) * vol_mens_p
var_mens_95 <- qnorm(0.95) * vol_mens_p

meses_p  <- 0:12
labs_p   <- c("Abr-26","May-26","Jun-26","Jul-26","Ago-26","Sep-26",
              "Oct-26","Nov-26","Dic-26","Ene-27","Feb-27","Mar-27","Abr-27")

proy <- data.frame(
  Mes        = meses_p,
  Label      = labs_p,
  Sin_Cob    = capital*(1+ret_pm_nd)^meses_p,
  Con_Div    = capital*(1+ret_pm_tot)^meses_p,
  Cubierto   = capital*(1+rf_mens)^meses_p,
  VaR99      = capital*(1+ret_pm_nd-var_mens_99)^meses_p,
  VaR95      = capital*(1+ret_pm_nd-var_mens_95)^meses_p
)

proy %>%
  select(Label, Sin_Cob, Con_Div, Cubierto, VaR99) %>%
  mutate(across(-Label,
                ~paste0("$",format(round(.),big.mark=",")))) %>%
  kbl(caption="Tabla 11.1: Proyección Mensual del Portafolio (12 Meses)",
      col.names=c("Mes","Sin Cobertura","Con Dividendos",
                  "Cubierto (rf)","Escenario VaR 99%"),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  row_spec(c(4,7,10,13), bold=TRUE, background="#D6EAF8")
Tabla 11.1: Proyección Mensual del Portafolio (12 Meses)
Mes Sin Cobertura Con Dividendos Cubierto (rf) Escenario VaR 99%
Abr-26 $20,000,000 $20,000,000 $20,000,000 $20,000,000
May-26 $20,223,912 $20,255,948 $20,073,496 $17,609,808
Jun-26 $20,450,331 $20,515,172 $20,147,262 $15,505,267
Jul-26 $20,679,285 $20,777,713 $20,221,300 $13,652,238
Ago-26 $20,910,803 $21,043,615 $20,295,609 $12,020,665
Sep-26 $21,144,912 $21,312,918 $20,370,192 $10,584,080
Oct-26 $21,381,642 $21,585,669 $20,445,048 $ 9,319,180
Nov-26 $21,621,023 $21,861,910 $20,520,180 $ 8,205,449
Dic-26 $21,863,083 $22,141,686 $20,595,588 $ 7,224,819
Ene-27 $22,107,854 $22,425,042 $20,671,273 $ 6,361,384
Feb-27 $22,355,365 $22,712,025 $20,747,236 $ 5,601,137
Mar-27 $22,605,647 $23,002,680 $20,823,478 $ 4,931,747
Abr-27 $22,858,731 $23,297,055 $20,900,000 $ 4,342,356

11.2 Gráfico Proyección

Escenario Sin Cobertura: El portafolio replica el rendimiento esperado optimizado 14.29% anual cerrando el horizonte de 12 meses en USD 22,858,731, esta trayectoria asume que las condiciones de mercado se alinean perfectamente con la media histórica, capturando todo el potencial alcista del fondo a costa de mantener una exposición total al riesgo sistemático.

Escenario Cubierto con la tasa libre de riesgo: Al inmunizar completamente la cartera con los 53 contratos de futuros, el rendimiento se desvincula del riesgo de las acciones y pasa a devengar la tasa libre de riesgo de referencia (\(r_f\)). Bajo esta estructura, el capital crece de forma lineal y predecible mes a mes, alcanzando exactamente USD 20,900,000 al final del periodo. Esto valida el objetivo de la cobertura: se asegura el valor del dinero en el tiempo eliminando la incertidumbre del mercado.

Escenarios Adversos de Cola (VaR 95% y VaR 99%): Estas curvas líneas naranja y roja proyectan el deterioro del capital si el mercado sufriera caídas sistemáticas consecutivas alineadas con nuestras métricas de riesgo. En el escenario extremo del VaR 99% pérdida mensual constante del 13.071% paramétrico, el fondo se degradaría críticamente hasta los USD 4,342,356, esta pendiente justifica financieramente la necesidad de la posición corta en futuros para neutralizar este riesgo de pérdida catastrófica.

proy_long <- proy %>%
  pivot_longer(-c(Mes,Label), names_to="Escenario", values_to="Valor")

p_proy <- ggplot(proy_long, aes(x=Mes, y=Valor/1e6, color=Escenario)) +
  geom_line(linewidth=1.1) + geom_point(size=2) +
  scale_color_manual(
    values=c(Sin_Cob="#3498DB",Con_Div="#9B59B6",
             Cubierto="#27AE60",VaR99="#E74C3C",VaR95="#E67E22"),
    labels=c(Sin_Cob="Sin Cobertura",Con_Div="Con Dividendos",
             Cubierto="Cubierto (rf)",
             VaR99="Escenario VaR 99%",VaR95="Escenario VaR 95%")) +
  scale_x_continuous(breaks=0:12, labels=labs_p) +
  scale_y_continuous(labels=function(x) paste0("$",x,"M")) +
  theme_minimal(base_size=10) +
  theme(axis.text.x=element_text(angle=45,hjust=1),
        plot.title=element_text(face="bold",hjust=0.5),
        legend.position="bottom") +
  labs(title="Proyección del Portafolio — 12 Meses",
       subtitle="Cinco escenarios comparativos",
       x=NULL, y="Valor (Millones USD)", color=NULL,
       caption=paste0("Ret. mensual s/div: ",round(ret_pm_nd*100,3),
                       "% | Con div: ",round(ret_pm_tot*100,3),"%"))
ggplotly(p_proy) %>% layout(hovermode="x unified",
                              legend=list(orientation="h",y=-0.35))

11.3 Impacto de Dividendos

Un hallazgo fundamental del modelo es la divergencia entre la curva “Sin Cobertura” y la curva “Con Dividendos”. Mientras que la primera solo considera la valorización del precio de los activos, la segunda incorpora la reinversión de los flujos de caja percibidos por concepto de dividendos, generando un efecto multiplicador al cierre del año.

Al analizar la composición del portafolio, se observa que el flujo de ingresos por dividendos está apalancado exclusivamente por las empresas de corte tradicional y consumo no cíclico:

The Coca-Cola Co. (KO): Con una ponderación del 21.74% en la cartera, aporta un Dividend Yield anual del 3.1% (0.2547% mensual), lo que representa una contribución directa de 0.6738% al rendimiento total del portafolio.

Johnson & Johnson (JNJ): Siendo el activo con mayor asignación de capital (42.50%), su Yield anual del 3.0% (0.2466% mensual) genera el mayor impacto de flujo, aportando un 1.2749% a la rentabilidad global de la cartera.

Netflix Inc. (NFLX): Como es característico en firmas tecnológicas de alto crecimiento, mantiene una política de retención del 100% de sus utilidades para financiar proyectos de inversión orgánicos, por lo que su dividendo es del 0% y su contribución a este rubro es nula.

div_tab <- data.frame(
  Activo   = tickers,
  Paga_Div = c("Sí","Sí","No"),
  Yield_A  = paste0(round(div_anuales*100,1),"%"),
  Yield_M  = paste0(round(div_mens*100,4),"%"),
  Peso     = paste0(round(pesos*100,2),"%"),
  Contrib  = paste0(round(pesos*div_anuales*100,4),"%"),
  row.names=NULL
)

div_tab %>%
  kbl(caption="Tabla 11.2: Impacto de Dividendos en el Retorno Total",
      col.names=c("Activo","¿Paga Dividendo?","Yield Anual",
                  "Yield Mensual","Peso Portafolio","Contrib. al Port."),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover"),
                full_width=FALSE, position="center") %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  footnote(general=paste0(
    "Contribución total dividendos: ",
    round(sum(pesos*div_anuales)*100,3),"% anual | ",
    "Retorno adicional mensual: ",
    round(ret_div_pm*100,4),"%"),
    general_title="Total: ")
Tabla 11.2: Impacto de Dividendos en el Retorno Total
Activo ¿Paga Dividendo? Yield Anual Yield Mensual Peso Portafolio Contrib. al Port.
KO 3.1% 0.2547% 21.74% 0.6738%
JNJ 3% 0.2466% 42.5% 1.2749%
NFLX No 0% 0% 35.77% 0%
Total:
Contribución total dividendos: 1.949% anual | Retorno adicional mensual: 0.1602%

12 Análisis de Sensibilidad de la Cobertura ante Variaciones Teóricas de Beta

12.1 Tabla de Sensibilidad

El objetivo es evaluar qué tan sensible es nuestra estrategia de cobertura si la Beta global del portafolio cambia y como la Beta mide qué tan expuestos estamos a los movimientos del S&P 500, cualquier variación en este indicador altera directamente la cantidad de derivados que necesitamos para protegernos.

El modelo evalúa tres escenarios concretos frente a un movimiento del mercado del \(+10\%\):

Escenario Real (\(\beta = 0.7016\)): Nuestro portafolio actual es de perfil defensivo. Si el mercado sube un \(10\%\), nuestras acciones rinden un \(+7.02\%\), lo que equivale a un impacto de USD 1,403,238. Para neutralizar este movimiento de forma exacta, el modelo nos exige vender 53 contratos de futuros. La eficiencia es del \(100.1\%\), lo que demuestra que la cobertura calculada es prácticamente perfecta.

Escenario de Beta Baja (\(\beta = 0.5000\)): Si las acciones se volvieran aún más defensivas, el impacto ante un movimiento del \(10\%\) en el mercado disminuiría a USD 1,000,000. Al estar menos expuestos al riesgo sistemático, la necesidad de protección disminuye de forma proporcional, requiriendo únicamente 38 contratos de futuros para mantener la cartera inmunizada.

Escenario de Beta Alta (\(\beta = 2.0000\)): Este es un escenario de estrés altamente agresivo. Si la Beta subiera a 2.0, el portafolio duplicaría la velocidad del mercado; un movimiento del \(10\%\) causaría un impacto masivo de USD 4,000,000. Para contener este nivel de riesgo, la posición corta en derivados se tendría que triplicar, obligándonos a vender 151 contratos para no desproteger el capital.

# ============================================================
# PUNTO 12: SENSIBILIDAD — BETAS HIPOTÉTICAS
# ============================================================
betas_hip <- c(Real=beta_port, Baja=0.5, Alta=2.0)

res_sens <- lapply(names(betas_hip), function(nom){
  b   <- betas_hip[nom]
  N_h <- round((b * capital) / nocional)
  exp <- N_h * nocional
  pct <- exp / capital
  imp <- b * 0.10 * capital
  cob <- N_h * 0.10 * nocional
  data.frame(
    Escenario  = nom,
    Beta       = round(b,4),
    N_Exacto   = round((b*capital)/nocional,2),
    N_Contratos= N_h,
    Exp_USD    = paste0("$",format(exp,big.mark=",")),
    Pct_Cob    = paste0(round(pct*100,1),"%"),
    Imp_10     = paste0("$",format(round(imp),big.mark=",")),
    Cob_10     = paste0("$",format(round(cob),big.mark=",")),
    Eficiencia = paste0(round(cob/imp*100,1),"%"),
    Perfil     = dplyr::case_when(
      b < 0.8 ~ "Muy Defensivo",
      b < 1.0 ~ "Defensivo",
      b < 1.3 ~ "Neutral",
      b < 1.8 ~ "Agresivo",
      TRUE    ~ "Muy Agresivo")
  )
})

tabla_sens <- do.call(rbind, res_sens)
rownames(tabla_sens) <- NULL

tabla_sens %>%
  kbl(caption="Tabla 12.1: Sensibilidad — N* de Contratos según Beta",
      col.names=c("Escenario","Beta","N* Exacto","N* Contratos",
                  "Exposición","% Cobertura",
                  "Impacto +10%","Cobertura +10%",
                  "Eficiencia","Perfil"),
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","condensed"),
                full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#2C3E50", color="white") %>%
  row_spec(1, bold=TRUE, background="#D5F5E3") %>%
  row_spec(2, background="#D6EAF8") %>%
  row_spec(3, bold=TRUE, background="#FADBD8") %>%
  add_header_above(c(" "=4,"Cobertura"=2,
                     "Movimiento Mercado +10%"=3," "=1))
Tabla 12.1: Sensibilidad — N* de Contratos según Beta
Cobertura
Movimiento Mercado +10%
Escenario Beta N* Exacto N* Contratos Exposición % Cobertura Impacto +10% Cobertura +10% Eficiencia Perfil
Real 0.7016 52.95 53 $14,045,000 70.2% $1,403,238 $1,404,500 100.1% Muy Defensivo
Baja 0.5000 37.74 38 $10,070,000 50.3% $1,000,000 $1,007,000 100.7% Muy Defensivo
Alta 2.0000 150.94 151 $40,015,000 200.1% $4,000,000 $4,001,500 100% Muy Agresivo

12.2 Gráfico de Sensibilidad

Al observar la gráfica, se puede identificar cómo la línea sólida oscura tiene una pendiente positiva constante y lineal. Esto nos confirma de manera matemática que la relación entre la Beta y los contratos es directa: por cada unidad que aumente la sensibilidad del portafolio, el número de futuros requeridos crecerá a una tasa fija.

La línea discontinua roja muestra el impacto monetario del \(+10\%\) en el portafolio. Al cruzarse con las líneas de referencia verticales (la línea verde de nuestra Beta real en 0.702, la azul en 0.5 y la roja en 2.0), el gráfico nos da una regla operativa muy intuitiva para las salas de negociación: a mayor riesgo sistemático en el mercado de contado (spot), mayor debe ser el volumen de contratos operados en el mercado de derivados para dejar la posición en un balance neutral

betas_seq <- seq(0.2, 2.5, by=0.1)
sens_df   <- data.frame(
  Beta       = betas_seq,
  N_Contr    = (betas_seq * capital) / nocional,
  Impacto_M  = betas_seq * 0.10 * capital / 1e6
)

p_sens <- ggplot(sens_df, aes(x=Beta)) +
  geom_line(aes(y=N_Contr, color="N° Contratos"), linewidth=1.5) +
  geom_line(aes(y=Impacto_M*10, color="Impacto +10% (×10)"),
            linewidth=1.3, linetype="dashed") +
  geom_vline(xintercept=beta_port, color="#27AE60",
             linetype="dotdash", linewidth=1) +
  geom_vline(xintercept=0.5, color="#3498DB",
             linetype="dotdash", linewidth=0.8) +
  geom_vline(xintercept=2.0, color="#E74C3C",
             linetype="dotdash", linewidth=0.8) +
  annotate("text", x=beta_port+0.05,
           y=max(sens_df$N_Contr)*0.9,
           label=paste0("β real=",round(beta_port,3)),
           color="#27AE60", hjust=0, size=3) +
  scale_color_manual(values=c("N° Contratos"="#2C3E50",
                               "Impacto +10% (×10)"="#E74C3C")) +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold",hjust=0.5),
        legend.position="bottom") +
  labs(title="Sensibilidad del N° de Contratos según Beta",
       subtitle="A mayor beta, mayor intensidad de cobertura requerida",
       x="Beta del Portafolio (β)",
       y="N° Contratos / Impacto (×10M)",
       color=NULL)
ggplotly(p_sens) %>% layout(legend=list(orientation="h",y=-0.2))

12.3 P&L Neto por Escenario Beta

Este grafico nos muestra el “error de cobertura” si el mercado se mueve y la Beta no es la que pensábamos. Lo ideal en una cobertura perfecta es que el P&L Neto se mantenga en la línea del cero, lo que significaría que la ganancia del futuro mató exactamente la pérdida de las acciones.

Las líneas del escenario Real y Alta están muy superpuestas y casi horizontales, lo que demuestra que para esos niveles de diseño, la cobertura es sumamente robusta y el capital está bien blindado frente a choques del mercado.

Sin embargo, la línea del escenario Baja muestra una pendiente inclinada muy marcada. Si diseñamos la estrategia pensando en una Beta de 0.5 usando solo 38 contratos pero el mercado experimenta volatilidades distintas, el portafolio cubierto empezará a registrar pérdidas o ganancias flotantes significativas ante variaciones del S&P 500.

movs <- c(-0.15,-0.10,-0.05,0,0.05,0.10,0.15)
esc_beta <- do.call(rbind, lapply(names(betas_hip), function(nom){
  b   <- betas_hip[nom]
  N_h <- round((b*capital)/nocional)
  do.call(rbind, lapply(movs, function(m){
    data.frame(
      Escenario = nom,
      Mov_Mkt   = m*100,
      PL_Acc    = b*m*capital/1e6,
      PL_Fut    = -m*N_h*nocional/1e6,
      PL_Neto   = (b*m*capital - m*N_h*nocional)/1e6
    )
  }))
}))

p_pl2 <- ggplot(esc_beta, aes(x=Mov_Mkt, y=PL_Neto,
                                color=Escenario, group=Escenario)) +
  geom_line(linewidth=1.5) + geom_point(size=3) +
  geom_hline(yintercept=0, linetype="dashed", color="gray50") +
  scale_color_manual(
    values=c(Real="#27AE60",Baja="#3498DB",Alta="#E74C3C"),
    labels=c(Real=paste0("β Real=",round(beta_port,3)),
             Baja="β=0.5 (Defensivo)",Alta="β=2.0 (Agresivo)")) +
  scale_x_continuous(labels=function(x) paste0(x,"%")) +
  scale_y_continuous(labels=function(x) paste0("$",round(x,1),"M")) +
  theme_minimal(base_size=11) +
  theme(plot.title=element_text(face="bold",hjust=0.5),
        legend.position="bottom") +
  labs(title="P&L Neto del Portafolio Cubierto según Beta Hipotética",
       subtitle="Ante diferentes movimientos del S&P 500",
       x="Movimiento del Mercado (%)",
       y="P&L Neto (Millones USD)",
       color="Escenario Beta",
       caption="P&L Neto = G/P Acciones + G/P Futuros Cortos")
ggplotly(p_pl2) %>% layout(legend=list(orientation="h",y=-0.25))

13 Resumen Ejecutivo

13.1 Tabla Resumen

En este proyecto nos enfocamos en diseñar, optimizar y proteger un portafolio de inversión institucional con un capital inicial de USD 20,000,000, analizando el comportamiento histórico de las acciones de Coca-Cola, Johnson & Johnson y Netflix durante un horizonte de diez años, desde abril de 2016 hasta abril de 2026; al aplicar la teoría clásica de Markowitz para estructurar la cartera de Máximo Ratio Sharpe, la mejor distribución de los recursos consiste en asignar el 42.50% a JNJ, el 35.77% a NFLX y el 21.74% a KO y con esta composición logramos un retorno esperado anualizado bastante competitivo del 14.29% y una volatilidad global del 19.46%, lo que demuestra el poder de la diversificación en finanzas, ya que al combinar activos defensivos y contra cíclicos con el perfil agresivo y de alto crecimiento de Netflix, logramos un ratio Sharpe de 0.5289, reduciendo el riesgo total muy por debajo del promedio de las volatilidades individuales.

Antes de pensar en cualquier estrategia de mitigación, fue fundamental cuantificar el riesgo real de la cartera en el mercado de contado, para lo cual calculamos el Valor en Riesgo (VaR) paramétrico con un horizonte mensual, donde los resultados nos mostraron que la cartera tiene una volatilidad mensual del 5.618% y una Beta global de 0.7016, lo que significa que el fondo se comporta de manera relativamente defensiva al indexar solo el 70.16% de los movimientos del S&P 500, sin embargo, las métricas de riesgo de cola izquierda nos alertaron sobre la vulnerabilidad del capital ante caídas del mercado, arrojando un VaR del 95% de 9.24% (una pérdida potencial de USD 1,848,313) y un VaR más extremo del 99% que alcanza el 13.07%, lo que implicaría ver caer nuestro capital en USD 2,614,104 en meses de alta volatilidad si no implementábamos un mecanismo de cobertura.

Para contener esta exposición al riesgo sistemático y blindar el patrimonio contra las correcciones bajistas, diseñamos una estrategia de superposición de derivados tomando una posición corta en contratos de futuros E-mini S&P 500 en el CME Group y utilizando los datos de mercado al cierre de abril de 2026, donde el índice cotizaba en 5,300 puntos con un multiplicador de USD 50 por punto, calculamos que el valor nominal de cada contrato era de USD 265,000, al aplicar la fórmula del ratio de cobertura óptimo cruzando la Beta del portafolio con el valor del fondo, determinamos que debíamos vender exactamente 53 contratos de futuros, lo que representa una exposición nocional cubierta de USD 14,045,000, requiriendo un desembolso de USD 636,000 como margen inicial y programando un esquema de Roll-Over trimestral en los meses de junio, septiembre, diciembre y marzo para evitar el riesgo de vencimiento.

Al analizar los resultados finales y simular los escenarios operativos, confirmamos de forma matemática la efectividad de la estrategia, plasmada en la curva de ganancias y pérdidas netas que se aplana por completo sobre el eje horizontal, esto nos demuestra que ante un mercado bajista, la minusvalía contable sufrida en las acciones se compensa de manera exacta con las ganancias diarias depositadas en nuestra cuenta de margen por los futuros cortos, de igual forma, descubrimos que la reinversión de dividendos aporta un 1.949% anual extra que optimiza el retorno compuesto, mitigando en parte el costo de oportunidad. En conclusión, el proyecto demuestra cómo la ingeniería financiera permite inmunizar un capital de USD 20 millones, asumiendo conscientemente que se renuncia a los beneficios de las rachas alcistas en la bolsa a cambio de eliminar la incertidumbre y asegurar un crecimiento estable indexado a la tasa libre de riesgo.

resumen <- data.frame(
  Parametro = c(
    "Capital Inicial","Acciones Seleccionadas","Período Histórico",
    "Retorno Esperado Portafolio (Anual)",
    "Volatilidad Portafolio (Anual)","Sharpe Ratio",
    "Beta del Portafolio (β_p)",
    "VaR Mensual 95% (Paramétrico)","VaR Mensual 99% (Paramétrico)",
    "Tasa Libre de Riesgo (^TNX)",
    "Instrumento de Cobertura",
    "Precio Futuro E-mini (30-Abr-2026)",
    "Número Óptimo de Contratos",
    "Exposición Nocional Cubierta",
    "Margen Inicial Total Requerido",
    "Estrategia Roll-Over","Posición en Futuros"
  ),
  Valor = c(
    "$20,000,000 USD",
    "KO (Coca-Cola) | JNJ (Johnson & Johnson) | NFLX (Netflix)",
    "Abril 2016 — Abril 2026 (10 años)",
    paste0(round(optimo$Retorno*100,2),"%"),
    paste0(round(optimo$Riesgo*100,2),"%"),
    round(optimo$Sharpe,4),
    round(beta_port,4),
    paste0(round(var_pct_95*100,2),"%"),
    paste0(round(var_pct_99*100,2),"%"),
    "4.50% (^TNX — Treasury 3-5Y)",
    "E-mini S&P 500 Futures (ES) — CME Group",
    paste0(precio_fut," puntos ($",
           format(nocional,big.mark=",")," nocional)"),
    paste0(N_round," contratos"),
    paste0("$",format(N_round*nocional,big.mark=",")),
    paste0("$",format(mi_total,big.mark=",")),
    "Trimestral: Jun | Sep | Dic | Mar",
    "CORTA (Short) — Vendedor de futuros"
  )
)

resumen %>%
  kbl(caption="Resumen Ejecutivo — Portafolio y Estrategia de Cobertura",
      col.names=c("Parámetro","Valor / Resultado"),
      align=c("l","l")) %>%
  kable_styling(bootstrap_options=c("striped","hover"),full_width=TRUE) %>%
  row_spec(0, bold=TRUE, background="#1A5276", color="white") %>%
  row_spec(c(4,5,6,7), background="#D5F5E3") %>%
  row_spec(c(8,9), background="#FADBD8") %>%
  row_spec(c(11:17), background="#D6EAF8")
Resumen Ejecutivo — Portafolio y Estrategia de Cobertura
Parámetro Valor / Resultado
Capital Inicial $20,000,000 USD
Acciones Seleccionadas KO (Coca-Cola) | JNJ (Johnson & Johnson) | NFLX (Netflix)
Período Histórico Abril 2016 — Abril 2026 (10 años)
Retorno Esperado Portafolio (Anual) 14.29%
Volatilidad Portafolio (Anual) 19.46%
Sharpe Ratio 0.5289
Beta del Portafolio (β_p) 0.7016
VaR Mensual 95% (Paramétrico) 9.24%
VaR Mensual 99% (Paramétrico) 13.07%
Tasa Libre de Riesgo (^TNX) 4.50% (^TNX — Treasury 3-5Y)
Instrumento de Cobertura E-mini S&P 500 Futures (ES) — CME Group
Precio Futuro E-mini (30-Abr-2026) 5300 puntos ($265,000 nocional)
Número Óptimo de Contratos 53 contratos
Exposición Nocional Cubierta $14,045,000
Margen Inicial Total Requerido $636,000
Estrategia Roll-Over Trimestral: Jun | Sep | Dic | Mar
Posición en Futuros CORTA (Short) — Vendedor de futuros

14 Referencias Bibliográficas

Black, F., & Litterman, R. (1992). Global portfolio optimization. Financial Analysts Journal, 48(5), 28–43. https://doi.org/10.2469/faj.v48.n5.28

CME Group. (2026). E-mini S&P 500 futures contract specifications. https://www.cmegroup.com/markets/equities/sp/e-mini-sandp500.contractSpecs.html

Hull, J. C. (2022). Options, futures, and other derivatives (11th ed.). Pearson.

Investing.com. (s. f.). Análisis DAFO de Johnson & Johnson. Investing.com. https://es.investing.com/equities/johnson-johnson

Investing.com. (2026, abril 14). Resumen de la presentación de resultados de Johnson & Johnson para el 1T/2026. Investing.com. https://es.investing.com/

Investing.com. (2026, abril 16). Resumen de la presentación de resultados de Netflix Inc para el 1T/2026. Investing.com. https://es.investing.com/

Investing.com. (2026, abril 28). Resumen de la presentación de resultados de Coca-Cola Co para el 1T/2026. Investing.com. https://es.investing.com/

Lintner, J. (1965). The valuation of risk assets and the selection of risky investments in stock portfolios and capital budgets. The Review of Economics and Statistics, 47(1), 13–37. https://doi.org/10.2307/1924119

Markowitz, H. (1952). Portfolio selection. The Journal of Finance, 7(1), 77–91. https://doi.org/10.2307/2975974

Sharpe, W. F. (1964). Capital asset prices: A theory of market equilibrium under conditions of risk. The Journal of Finance, 19(3), 425–442. https://doi.org/10.2307/2977928

TradingView. (2026). Johnson & Johnson (JNJ): Forecast & price target. https://www.tradingview.com/

Yahoo Finance. (2026). Historical data: KO, JNJ, NFLX, ^GSPC, ^TNX. https://finance.yahoo.com