APLICACIÓN DE COBERTURA CON FUTUROS SOBRE ÍNDICE BURSÁTIL

El gerente de la entidad donde trabajan les solicita realizar inversiones en bolsa con objeto de inversión a 4 años. El objetivo es establecer un portafolio de inversión utilizando 3 acciones de preferencia del mismo índice bursátil. Se dispone de un capital de 35 millones de dólares para realizar inversiones en acciones desde el 30 de octubre de 2026. Para construir un portafolio óptimo de mínima varianza, se considerarán entre 6 y 10 años de información histórica hasta la fecha de inicio de las inversiones (30 de octubre de 2026).

PUNTO 1_ SELECCIÓN DE TRES ACCIONES Y ANÁLISIS FUNDAMENTAL

Microsoft (MSFT), operando en el Nasdaq desde 13 marzo 1986.

Empresa y sector: tecnología, software y nube. Vende sobre todo servicios en la nube (Azure), Microsoft 365, licencias de software, publicidad y videojuegos.

Ingresos y situación financiera: En el trimestre de julio a septiembre de 2026 los ingresos subieron 19 % a USD 92.3 mil millones, y la utilidad operativa creció 21 % a USD 45.9 mil millones. Azure creció 48 % y generó USD 33.2 mil millones. Los contratos ya firmados, pero aún no facturados subieron 73 % a USD 677 mil millones. La contracara es la inversión: la empresa prevé gastos de capital superiores a USD 50 mil millones en el siguiente trimestre. Windows y Xbox van a la baja, pero pesan poco frente a la nube. Microsoft FY27 Q1 Revenue Hits Record $92.3 Billion as Azure Grows 48% +3

Precio reciente: la acción pasó de un mínimo cercano a USD 349 a finales de junio a más de USD 490 tras los resultados de julio. Cerró el 30/10/2026 en USD 521.91, según tus datos. capital Expectativas a un año: antes del reporte, varios bancos subieron sus precios objetivo en octubre de 2026: Guggenheim USD 586, BMO USD 600, Bernstein USD 662 y UBS USD 675. Frente a USD 521.91, eso implica entre 12 % y 29 % de alza. benzinga

Justificación de inclusión: Elegí Microsoft como base del portafolio porque es una empresa más solida y estable de las tres, Es una empresa grande y consolidada pues lleva 40 años en el mercado Nasdaq y su negocio de nube crece con fuerza: en el último trimestre vendió USD 92.3 mil millones y solo Azure generó USD 33.2 mil millones Su acción pasó de unos USD 349 a fines de junio a USD 521,91 el 30 de octubre de 2026, y varios bancos elevaron sus precios objetivo por encima de ese nivel (Benzinga, 2026). En mis cálculos fue la acción con mejor retorno por unidad de riesgo (Sharpe individual de 0,80), con la menor volatilidad (22,3 %) y la única beta inferior a 1 (0,82). Por todo esto le asigné el mayor peso, 70 % ayudando a minimizar el riesgo del portafolio.

Tesla (TSLA), operando en el Nasdaq 29 de julio 2010

Empresa y sector: automotriz y energía. Vende vehículos eléctricos, almacenamiento de energía, software de conducción (FSD) y servicios.

Ingresos y situación financiera: Tesla tuvo ingresos de USD 28.05 mil millones, estables frente al año anterior, y una utilidad neta de USD 787 millones. El segmento automotriz facturó USD 20.56 mil millones, 3 % menos, y la energía cayó 16 %. Lo positivo fue la rentabilidad: el margen operativo fue de 5.8 % frente a 2.5 % esperado, y el flujo de caja libre fue de USD 3.99 mil millones cuando se esperaba uno negativo. app.getquin.com +3

Precio reciente: a fines de octubre cotizaba cerca de 25 % por debajo de su máximo de 52 semanas, con una relación precio-utilidad de unas 417 veces. Cerró el 30/10/2026 en USD 399.81. getquin.Expectativas a un año: el precio objetivo promedio era de USD 415.07, con un rango enorme de USD 24.86 a USD 550 y recomendaciones divididas entre compra, mantener y venta. Frente a USD 399.81, el alza promedio es de solo 4 %, y la dispersión de opiniones es la más alta del grupo. getquin

Justificación de inclusión: Elegí Tesla por se de alto potencial de crecimiento y porque aporta diversificacion para el portafolio Cotiza en el Nasdaq desde junio de 2010 y, aunque sus ventas no crecen, su rentabilidad sorprendió al mercado: generó USD 3,99 mil millones de flujo de caja libre cuando se esperaba uno negativo (InvestingLive, 2026). Su acción cerró en USD 399,81 el 30 de octubre de 2026, y el precio objetivo promedio de los analistas ronda los USD 415 (Getquin, 2026). Tiene el mayor retorno histórico de las tres (34,1 % anual), pero también la mayor volatilidad (59,3 %) y la beta más alta (1,75), y los analistas están divididos entre comprar, mantener y vender. Su correlación con Microsoft es la más baja (0,33), así que ayuda a diversificar. Por su riesgo, la incluí con el peso mínimo de 15 %.aunque los analistas están entre comprar, mantener y vender. Su valoración exige que el negocio de autonomía y robótica se materialice.

Amazon (AMZN), operando en el Nasdaq 15 mayo 1997

Empresa y sector comercio electrónico y nube. Vende por su tienda en línea, publicidad, suscripciones (Prime) y servicios de nube (AWS).

Ingresos y situación financiera: los ingresos subieron 12 % a USD 201.9 mil millones y la utilidad operativa fue de USD 28.1 mil millones, con un margen de 13.9 %, el más alto de su historia. AWS creció 39.3 %, su mayor ritmo en casi cinco años. Los contratos pendientes de AWS suman USD 578 mil millones. Aquí también está el costo: en el trimestre invirtió USD 77.3 mil millones en infraestructura, casi 20 mil millones por encima de lo esperado.Amazon.com Announces Third Quarter Results +3

Precio reciente: subió 15 % en julio y después cayó con fuerza tras el reporte de octubre, por la preocupación por la inversión y el flujo de caja. Cerró el 30/10/2026 en USD 240.35. pepperstonekucoinExpectativas a un año: JPMorgan fijó un objetivo de USD 365. 24/7 Wall St. estima USD 328.35. Eso implica alzas de 37 % a 52 % desde USD 240.35, pero son las proyecciones más optimistas del grupo y dependen de que el gasto en infraestructura se convierta en ingresos. kucoin247wallst

Justificación de inclusión: “Elegí Amazon porque combina crecimiento y diversificación de negocios. Cotiza en el Nasdaq desde 1997 y en el trimestre reciente vendió USD 201,9 mil millones, con el mayor margen operativo de su historia (13,9 %) y un crecimiento de AWS de 39,3 %, su mayor ritmo en casi cinco años (Amazon.com, 2026). Después de reportar, su acción cayó por la preocupación por la inversión en infraestructura, y cerró el 30 de octubre de 2026 en USD 240,35. Lo vi como un punto de entrada, porque los analistas proyectan precios objetivo muy superiores, como USD 365 de JPMorgan (KuCoin, 2026). Tiene riesgo y retorno intermedios (volatilidad de 30,4 %, beta de 1,22), y además de la nube tiene comercio electrónico y publicidad, lo que la diferencia en parte de Microsoft. Le asigné el 15 %. ya que vendió 201.9 mil millones USD en el trimestre, obtuvo una utilidad operativa de USD 28.1 mil millones y alcanzó su margen operativo más alto de la historia. Su negocio de nube, tuvo su mayor ritmo de crecimiento en casi cinco años, y tiene contratos pendientes por USD 578 mil millones. Además, no depende solo de la nube, porque también vende por su tienda en línea y publicidad, lo que la diferencia en parte de Microsoft.

# LABORATORIO #2 - Aplicacion de cobertura con futuros sobre indice bursatil
# Acciones: MSFT, TSLA, AMZN (Nasdaq) | Indice: Nasdaq-100 (^NDX) | Futuro: NQ (CME)

# install.packages(c("quantmod", "xts"))     # solo la primera vez
suppressPackageStartupMessages({ library(quantmod); library(xts) })
options(timeout = 60, scipen = 999)

# ------------------------------------------------------------------------------
# 0. PARAMETROS GENERALES
# ------------------------------------------------------------------------------
tickers  <- c("MSFT", "TSLA", "AMZN")
nombres  <- c("Microsoft", "Tesla", "Amazon")
capital  <- 35e6                      # capital inicial (USD)
f_ini    <- as.Date("2026-10-30")     # fecha inicial de inversion
f_desde  <- as.Date("2016-10-30")     # 10 anios de historia (permitido: 6 a 10)
m_anio   <- 12                        # frecuencia mensual -> factor de anualizacion
conf     <- c(0.95, 0.99)             # VaR al 5% y al 1%
w_min    <- 0.15                      # peso minimo por accion (diversificacion)
anios    <- 4
n_meses  <- anios * 12
n_trim   <- n_meses / 3

# Contrato de futuros: E-mini Nasdaq-100 (NQ), CME
S0   <- 28384.85      # cierre del Nasdaq-100 el 30/10/2026 (Yahoo Finance)
F0   <- 28534.0       # precio del futuro NQ el 30/10/2026 (Yahoo Finance, NQ=F)
mult <- 20            # USD por punto del indice
tick <- 0.25          # tamano del tick (puntos) -> USD 5 por contrato

# !!! MARGENES: REEMPLAZAR CON LOS DEL CME (por contrato NQ) !!!
IM <- 26000           # margen inicial          <- VERIFICAR en cmegroup.com
MM <- 23500           # margen de mantenimiento <- VERIFICAR en cmegroup.com

costo_roll     <- 5      # USD por contrato en cada apertura (supuesto: 1 tick de deslizamiento)
reajustar_N    <- FALSE  # FALSE = cobertura corta absoluta (N fijo); TRUE = recalcula N cada trimestre
retirar_exceso <- FALSE  # TRUE = al abrir cada contrato se retira lo que supere el margen inicial

# Dividendo trimestral por accion (USD). MSFT: 0.98 (ex-dividendo 19/11/2026). TSLA y AMZN: no pagan.
div_trim <- c(MSFT = 0.98, TSLA = 0, AMZN = 0)

# Carpeta y utilidades para graficas
dir_graf <- "graficas_lab2"
dir.create(dir_graf, showWarnings = FALSE)
cols <- c(MSFT = "#1f77b4", TSLA = "#d62728", AMZN = "#ff7f0e", NDX = "grey40")
graficar <- function(archivo, f, ancho = 1100, alto = 700) {
  try(f(), silent = TRUE)                               # se muestra en el panel Plots (si el panel es muy pequeno, ampliarlo)
  png(file.path(dir_graf, archivo), width = ancho, height = alto, res = 130)
  f(); invisible(dev.off())                             # y se guarda como PNG
}

# ------------------------------------------------------------------------------
# 0.1 DATOS
# ------------------------------------------------------------------------------
getSymbols(c(tickers, "^NDX"), src = "yahoo", from = f_desde, to = f_ini + 1)
## [1] "MSFT" "TSLA" "AMZN" "NDX"
getSymbols("^TNX", src = "yahoo", from = f_ini - 10, to = f_ini + 1)
## [1] "TNX"
adj   <- do.call(merge, lapply(c(tickers, "NDX"), function(s) Ad(get(s))))
colnames(adj) <- c(tickers, "NDX")
adj_m <- apply.monthly(adj, last)                       # cierre de cada mes (precios ajustados)
adj_m <- adj_m[index(adj_m) <= f_ini]

cierre_ini <- sapply(tickers, function(s) as.numeric(last(Cl(get(s)))))
names(cierre_ini) <- tickers


fund <- data.frame(
  Accion        = tickers,
  Empresa       = nombres,
  Sector        = c("Tecnologia: software y nube", "Automotriz y energia", "Comercio electronico y nube"),
  Precio_30oct  = round(cierre_ini, 2),
  Objetivo_analistas = c("USD 586 - 675", "USD 415 (promedio)", "USD 328 - 365"),
  Dividendo     = c("Si (USD 0.98 trimestral)", "No", "No")
)
cat("\n===== PUNTO 1: resumen del analisis fundamental =====\n")
## 
## ===== PUNTO 1: resumen del analisis fundamental =====
print(fund, row.names = FALSE)
##  Accion   Empresa                      Sector Precio_30oct Objetivo_analistas
##    MSFT Microsoft Tecnologia: software y nube       521.91      USD 586 - 675
##    TSLA     Tesla        Automotriz y energia       399.81 USD 415 (promedio)
##    AMZN    Amazon Comercio electronico y nube       240.35      USD 328 - 365
##                 Dividendo
##  Si (USD 0.98 trimestral)
##                        No
##                        No
g_precios <- function() {
  base100 <- sweep(coredata(adj_m), 2, coredata(adj_m)[1, ], "/") * 100
  par(mar = c(4, 4, 3, 1))
  matplot(index(adj_m), base100, type = "l", lty = 1, lwd = 2, col = cols[colnames(adj_m)],
          log = "y", xlab = "", ylab = "Base 100 (oct-2016), escala log",
          main = "Evolucion de precios (cierre mensual ajustado)")
  legend("topleft", legend = colnames(adj_m), col = cols[colnames(adj_m)], lty = 1, lwd = 2, bty = "n")
}
graficar("01_precios.png", g_precios)

PUNTO 2_ RETORNOS, VOLATILIDAD, VARIANZAS-COVARIANZAS Y CORRELACIONES

# ==============================================================================
# Frecuencia mensual; retornos logaritmicos; anualizacion: media x 12, desviacion x raiz(12)
# ==============================================================================
ret   <- na.omit(diff(log(adj_m)))
r_acc <- ret[, tickers]
r_mkt <- as.numeric(ret[, "NDX"])
mu_idx  <- mean(r_mkt)
sig_idx <- sd(r_mkt)
cat("\n===== PUNTO 2 =====\nObservaciones mensuales:", nrow(r_acc), "\n")
## 
## ===== PUNTO 2 =====
## Observaciones mensuales: 120
mu_anual    <- colMeans(r_acc) * m_anio
sigma_anual <- apply(r_acc, 2, sd) * sqrt(m_anio)
S           <- cov(r_acc) * m_anio
R           <- cor(r_acc)

print(round(data.frame(Retorno_anual = mu_anual, Vol_anual = sigma_anual), 4))
##      Retorno_anual Vol_anual
## MSFT        0.2283    0.2230
## TSLA        0.3412    0.5929
## AMZN        0.1806    0.3042
cat("\nMatriz var-cov (anual):\n"); print(round(S, 5))
## 
## Matriz var-cov (anual):
##         MSFT    TSLA    AMZN
## MSFT 0.04974 0.04402 0.04556
## TSLA 0.04402 0.35151 0.07650
## AMZN 0.04556 0.07650 0.09255
cat("\nMatriz de correlaciones:\n"); print(round(R, 3))
## 
## Matriz de correlaciones:
##       MSFT  TSLA  AMZN
## MSFT 1.000 0.333 0.672
## TSLA 0.333 1.000 0.424
## AMZN 0.672 0.424 1.000
g_corr <- function() {
  par(mar = c(4, 5, 3, 1))
  z <- t(R)[, 3:1]
  image(1:3, 1:3, z, col = hcl.colors(20, "Blues", rev = TRUE), axes = FALSE, xlab = "", ylab = "",
        main = "Matriz de correlaciones (retornos mensuales)")
  axis(1, 1:3, tickers); axis(2, 1:3, rev(tickers), las = 1)
  for (i in 1:3) for (j in 1:3) text(j, 4 - i, sprintf("%.2f", R[i, j]), cex = 1.5)
}
graficar("02_correlaciones.png", g_corr)

Se utilizaron precios de cierre mensuales ajustados entre octubre de 2016 y octubre de 2026 (120 observaciones). Los retornos periódicos se calcularon en forma logarítmica. El retorno anual promedio se obtuvo multiplicando el promedio mensual por 12, y la desviación estándar anualizada multiplicando la desviación mensual por √12.

Los retornos anuales promedio de Microsoft fue de 22.8% y su volatilidad 22.3%, en tesla el retorno anual promedio 34.1% y volatilidad de 59.3% y Amazon retorno 18.1% y volatilidad 20.4%. tesla nos muestra como tiene un riesgo casi tres veces mayor que el de Microsoft.

Matriz de varianzas y covarianzas Todas son positivas, lo que significa que las tres tienden a moverse en la misma dirección.

Matriz de correlaciones MSFT y AMZN (0.67): se mueven bastante juntas, porque las dos dependen de la nube. MSFT y TSLA (0.33): se mueven poco juntas. Esa es la pareja que más ayuda a diversificar

PUNTO 3_ OPTIMIZACIÓN MEDIA-VARIANZA, PESOS ÓPTIMOS Y ASIGNACIÓN DE CAPITAL

rf <- as.numeric(last(Cl(TNX))) / 100        # ^TNX al 30/10/2026
cat("\n===== PUNTO 3 =====\nTasa libre de riesgo (^TNX):", round(rf * 100, 3), "% anual\n")
## 
## ===== PUNTO 3 =====
## Tasa libre de riesgo (^TNX): 4.929 % anual
a_pesos <- function(x) w_min + (1 - length(x) * w_min) * exp(x) / sum(exp(x))
ret_p   <- function(w) sum(w * mu_anual)
vol_p   <- function(w) sqrt(drop(t(w) %*% S %*% w))

neg_sharpe <- function(x) { w <- a_pesos(x); -(ret_p(w) - rf) / vol_p(w) }
w_sharpe   <- a_pesos(optim(rep(0, 3), neg_sharpe, method = "BFGS")$par)
w_minvar   <- a_pesos(optim(rep(0, 3), function(x) vol_p(a_pesos(x))^2, method = "BFGS")$par)

w <- setNames(w_sharpe, tickers)             # portafolio elegido (cambiar a w_minvar si el docente lo exige)
tabla_pesos <- data.frame(
  Peso         = round(w, 4),
  Monto_USD    = round(w * capital, 0),
  Precio_30oct = round(cierre_ini, 2),
  Acciones     = floor(w * capital / cierre_ini)
)
print(tabla_pesos)
##      Peso Monto_USD Precio_30oct Acciones
## MSFT 0.70  24500000       521.91    46942
## TSLA 0.15   5250000       399.81    13131
## AMZN 0.15   5250000       240.35    21843
ret_port <- ret_p(w); vol_port <- vol_p(w)
cat("\nRetorno esperado del portafolio:", round(ret_port * 100, 2), "%\n")
## 
## Retorno esperado del portafolio: 23.81 %
cat("Desviacion estandar del portafolio:", round(vol_port * 100, 2), "%\n")
## Desviacion estandar del portafolio: 23.8 %
cat("Sharpe Ratio:", round((ret_port - rf) / vol_port, 4), "\n")
## Sharpe Ratio: 0.7935
cat("(Referencia) Pesos de minima varianza:", round(w_minvar, 3), "\n")
## (Referencia) Pesos de minima varianza: 0.699 0.15 0.151
g_pesos <- function() {
  par(mar = c(4, 4, 3, 1))
  b <- barplot(w * 100, col = cols[tickers], ylim = c(0, 100), ylab = "Peso (%)",
               main = "Portafolio optimo: pesos y montos")
  text(b, w * 100, labels = paste0(round(w * 100), "%\nUSD ", round(w * capital / 1e6, 2), " M"), pos = 3)
}
g_rr <- function() {
  par(mar = c(4, 4, 3, 1))
  x <- c(sigma_anual, vol_port) * 100; y <- c(mu_anual, ret_port) * 100
  plot(x, y, pch = 19, cex = 1.8, col = c(cols[tickers], "black"),
       xlab = "Volatilidad anual (%)", ylab = "Retorno anual esperado (%)",
       main = "Riesgo y retorno: acciones y portafolio",
       xlim = c(0, max(x) * 1.15), ylim = c(0, max(y) * 1.15))
  text(x, y, labels = c(tickers, "Portafolio"), pos = 3, offset = 0.8)
  abline(h = rf * 100, lty = 2, col = "grey50")
  text(max(x) * 1.1, rf * 100, "tasa libre", pos = 3, cex = 0.8, col = "grey40")
}
graficar("03_pesos.png", g_pesos)

graficar("03_riesgo_retorno.png", g_rr)

La asignación del capital estará distribuida tal como muestra la tabla la cual nos indica que Microsoft tiene el mayor peso consolidansose como base del portafolio también nos muestra el total de 81916 acciones de nuestro portafolio.

Retorno esperado del portafolio: 23.81 %: se espera obtener una ganancia de USD 23,81.Si tomamos los 35 millones USD de inversión y lo multiplicamos por 23.81% significa que la ganancia esperada sería de aproximadamente USD 8.333.500, suponiendo que el rendimiento calculado se materialice.

Desviación estándar del portafolio: 23.8 %: con este valor vemos que hay una alta volatilidad respecto a los rendimientos. Lo que nos indica que asi como puede tener una rentabilidad elevada también en fluctuaciones.

Sharpe Ratio: 0.7935 indica una relación moderada entre rentabilidad y riesgo. El portafolio ofrece una rentabilidad atractiva.

Pesos de mínima varianza: 0.699 0.15 0.151: son prácticamente iguales a los pesos actuales, lo que indica que la distribución está muy cerca de la combinación que minimiza el riesgo según el modelo utilizado.con estos resultados podemos decir que hay una rentabilidad y riesgo moderado

PUNTO 4_ VAR MENSUAL DEL PORTAFOLIO AL 99% Y 95% COMO BASE DE COBERTURA

mu_pm   <- ret_port / m_anio
sig_pm  <- vol_port / sqrt(m_anio)
r_port  <- as.numeric(as.matrix(r_acc) %*% w)          # retornos mensuales historicos del portafolio

var_param <- -(mu_pm + qnorm(1 - conf) * sig_pm)       # parametrico (normal)
var_hist  <- as.numeric(-quantile(r_port, 1 - conf))   # historico

tabla_var <- data.frame(
  Confianza     = c("95% (VaR 5%)", "99% (VaR 1%)"),
  VaR_param_pct = round(var_param * 100, 2), VaR_param_USD = round(var_param * capital, 0),
  VaR_hist_pct  = round(var_hist * 100, 2),  VaR_hist_USD  = round(var_hist * capital, 0)
)
cat("\n===== PUNTO 4: VaR mensual =====\n"); print(tabla_var)
## 
## ===== PUNTO 4: VaR mensual =====
##      Confianza VaR_param_pct VaR_param_USD VaR_hist_pct VaR_hist_USD
## 1 95% (VaR 5%)          9.31       3260020         8.93      3126847
## 2 99% (VaR 1%)         14.00       4898441        14.37      5031199
g_var <- function() {
  m <- rbind(Parametrico = var_param, Historico = var_hist) * capital / 1e6
  par(mar = c(4, 4, 3, 1))
  b <- barplot(m, beside = TRUE, names.arg = c("95% (VaR 5%)", "99% (VaR 1%)"),
               col = c("steelblue", "lightblue"), ylab = "USD millones",
               main = "VaR mensual del portafolio", ylim = c(0, max(m) * 1.2),
               legend.text = TRUE, args.legend = list(x = "topleft", bty = "n"))
  text(b, m, labels = sprintf("%.2f", m), pos = 3)
}
graficar("04_var.png", g_var)

El resultado del VaR paramétrico y el VaR histórico muestran que, con un nivel de confianza del 95 %, el VaR paramétrico es del 9,31 %, equivalente a USD 3.260.021, mientras que el VaR histórico es del 8,93 %, correspondiente a USD 3.126.854. Esto indica que ambos métodos presentan estimaciones relativamente similares de las pérdidas potenciales en condiciones habituales de mercado. Por otra parte, con un nivel de confianza del 99 %, el VaR paramétrico alcanza el 14 %, equivalente a USD 4.898.442, mientras que el VaR histórico llega al 14,37 %, correspondiente a USD 5.031.203. podemos concluir que el portafolio presenta una exposición considerable al riesgo de mercado, ya que las pérdidas estimadas pueden variar entre aproximadamente USD 3,13 y USD 5,03 millones.la estrategia a utilizar sería una posición corta (vendedora) en futuros para compensar parcialmente las posibles pérdidas que podría experimentar el portafolio ante una caída del mercado.

PUNTO 5_ ESTIMACIÓN DE BETAS CAPM INDIVIDUALES Y BETA DEL PORTAFOLIO

rf_m  <- rf / m_anio
exc_m <- r_mkt - rf_m
betas <- sapply(tickers, function(s) coef(lm(I(as.numeric(r_acc[, s]) - rf_m) ~ exc_m))[2])
betas <- setNames(unname(betas), tickers)
beta_port <- sum(w * betas)
cat("\n===== PUNTO 5: betas CAPM =====\n"); print(round(betas, 3))
## 
## ===== PUNTO 5: betas CAPM =====
##  MSFT  TSLA  AMZN 
## 0.821 1.753 1.216
cat("Beta del portafolio (promedio ponderado):", round(beta_port, 3), "\n")
## Beta del portafolio (promedio ponderado): 1.02
g_betas <- function() {
  b <- c(betas, Portafolio = beta_port)
  par(mar = c(4, 4, 3, 1))
  p <- barplot(b, col = c(cols[tickers], "black"), ylim = c(0, max(b) * 1.2), ylab = "Beta",
               main = "Betas CAPM frente al Nasdaq-100")
  abline(h = 1, lty = 2, col = "grey40")
  text(p, b, labels = sprintf("%.2f", b), pos = 3)
}
graficar("05_betas.png", g_betas)

Los resultados muestran que Microsoft presenta una beta de 0,821 inferior a 1, lo que indica que en promedio, sus rendimientos tienden a reaccionar menos a los movimientos del mercado. Esto indica que Microsoft tiene una exposición al riesgo sistemático relativamente menor que las otras dos acciones.

Tesla con una beta 1,753 es el activo con mayor exposición al riesgo sistemático dentro del portafolio. a pesar de representar solamente el 15 % de la inversión, tiene una contribución importante a la beta total debido a su elevada sensibilidad al mercado. Amazon tiene una beta de 1,216. presenta una exposición al riesgo sistemático intermedia entre Microsoft y Tesla.

Al aplicar los pesos óptimos de 69,9 %, 15 % y 15,1 %, respectivamente, se obtiene una beta del portafolio de 1,020445. Este resultado indica que el portafolio tiene una exposición sistemática ligeramente superior a la del mercado. Con rendimientos con mayor sensibilidad aproximadamente 2,04 % Al comparar la beta calculada con los pesos originales (1,0234) y la obtenida con los pesos óptimos (1,020445), el portafolio presenta una exposición sistemática cercana a la del índice de mercado, pero ligeramente superior. Por tanto, aunque la optimización permite minimizar la varianza bajo los supuestos establecidos no es suficiente para eliminar el riesgo sistemático.

PUNTO 6_ NÚMERO ÓPTIMO DE CONTRATOS DE FUTUROS SOBRE ÍNDICE

V              <- capital
valor_contrato <- F0 * mult
expo_sist      <- beta_port * V
N_opt          <- expo_sist / valor_contrato
cand           <- c(floor(N_opt), ceiling(N_opt))
comp6 <- data.frame(
  Contratos      = cand,
  Valor_futuros  = cand * valor_contrato,
  Cobertura_pct  = round(cand * valor_contrato / expo_sist * 100, 2),
  Diferencia_USD = round(cand * valor_contrato - expo_sist, 0)
)
N  <- round(N_opt)                                     # entero mas cercano
N0 <- N
cat("\n===== PUNTO 6: contratos =====\n")
## 
## ===== PUNTO 6: contratos =====
cat("Valor de un contrato (USD):", format(valor_contrato, big.mark = ","), "\n")
## Valor de un contrato (USD): 570,680
cat("Exposicion sistematica beta x V (USD):", format(round(expo_sist), big.mark = ","), "\n")
## Exposicion sistematica beta x V (USD): 35,691,374
cat("N* (sin redondear):", round(N_opt, 2), "\n"); print(comp6)
## N* (sin redondear): 62.54
##   Contratos Valor_futuros Cobertura_pct Diferencia_USD
## 1        62      35382160         99.13        -309214
## 2        63      35952840        100.73         261466
cat("Contratos elegidos:", N, "(posicion CORTA)\n")
## Contratos elegidos: 63 (posicion CORTA)
g_contratos <- function() {
  par(mar = c(4, 4, 3, 1))
  b <- barplot(comp6$Cobertura_pct, names.arg = paste(comp6$Contratos, "contratos"),
               col = c("lightblue", "steelblue"), ylim = c(0, 110), ylab = "Cobertura de la exposicion (%)",
               main = sprintf("Redondeo de N* = %.2f", N_opt))
  abline(h = 100, lty = 2, col = "red")
  text(b, comp6$Cobertura_pct, labels = paste0(comp6$Cobertura_pct, "%"), pos = 3)
}
graficar("06_contratos.png", g_contratos)

Alternativa de 62 contratos: Cubre el 99,13 % de la exposición sistemática, deja una exposición sin cubrir de 309.220 USD, representa una cobertura ligeramente inferior al 100 %. Alternativa de 63 contratos Cubre el 100,73 % de la exposición sistemática, Supera la exposición que se busca cubrir en USD 261.460, representa una pequeña sobre cobertura.

Se seleccionan los 63 contratos al redondeo mediante una posición corta, es decir, vendiendo contratos de futuros. Si el mercado cae, el portafolio tiende a perder valor, pero la posición corta en futuros puede generar ganancias y de esta manera, las ganancias de los futuros pueden compensar parcialmente las pérdidas del portafolio, Asimismo, se determinó que cada movimiento de un tick de 0,25 puntos genera una variación de USD 315 en el resultado de los 63 contratos.

PUNTO 7_ POSICION EN FUTUROS (CORTA) Y ESCENARIOS MEDIDOS EN TICKS

valor_tick <- tick * mult
cat("\n===== PUNTO 7 =====\nValor de un tick (1 contrato): USD", valor_tick,
    "| con", N, "contratos: USD", N * valor_tick, "\n")
## 
## ===== PUNTO 7 =====
## Valor de un tick (1 contrato): USD 5 | con 63 contratos: USD 315
escenarios     <- c(-0.10, -0.05, -0.02, 0, 0.02, 0.05, 0.10)
dF_pts         <- F0 * escenarios
res_portafolio <- beta_port * V * escenarios            # ganancia/perdida de las acciones
res_futuros    <- -N * mult * dF_pts                    # corto: gana si el futuro baja
res_neto       <- res_portafolio + res_futuros
tabla7 <- data.frame(
  Mercado_pct = escenarios * 100, Variacion_puntos = round(dF_pts, 1),
  Variacion_ticks = round(dF_pts / tick, 0), Portafolio_USD = round(res_portafolio),
  Futuros_corto_USD = round(res_futuros), Neto_USD = round(res_neto)
)
print(tabla7)
##   Mercado_pct Variacion_puntos Variacion_ticks Portafolio_USD Futuros_corto_USD
## 1         -10          -2853.4          -11414       -3569137           3595284
## 2          -5          -1426.7           -5707       -1784569           1797642
## 3          -2           -570.7           -2283        -713827            719057
## 4           0              0.0               0              0                 0
## 5           2            570.7            2283         713827           -719057
## 6           5           1426.7            5707        1784569          -1797642
## 7          10           2853.4           11414        3569137          -3595284
##   Neto_USD
## 1    26147
## 2    13073
## 3     5229
## 4        0
## 5    -5229
## 6   -13073
## 7   -26147
g_escen <- function() {
  m <- cbind(Portafolio = res_portafolio, Futuros = res_futuros, Neto = res_neto) / 1e6
  par(mar = c(4, 4, 3, 1))
  matplot(escenarios * 100, m, type = "b", pch = 19, lty = 1, lwd = 2,
          col = c("steelblue", "tomato", "black"), xlab = "Variacion del indice (%)",
          ylab = "Ganancia / perdida (USD millones)",
          main = paste0("Cobertura con ", N, " contratos cortos"))
  abline(h = 0, col = "grey60")
  legend("topleft", legend = colnames(m), col = c("steelblue", "tomato", "black"),
         lty = 1, lwd = 2, pch = 19, bty = "n")
}
graficar("07_escenarios.png", g_escen)

Sin cobertura, una caida de 10% del mercado implica perder USD 3,569,138 Con 63 contratos cortos, el resultado neto es USD 26,146.

Los resultados evidencian que, ante una caída del mercado del 10 %, el portafolio experimentaría una pérdida de USD 3.569.138. Sin embargo, la posición corta en futuros generaría una ganancia de USD 3.595.284, obteniendo un resultado neto positivo de USD 26.146. De manera similar, ante caídas del 5 % y del 2 %, las ganancias de los futuros compensan prácticamente la totalidad de las pérdidas del portafolio. Por otro lado, cuando el mercado presenta movimientos positivos, la estrategia produce el efecto contrario. Ante un incremento del 10 %, el portafolio obtiene una ganancia de USD 3.569.138, pero la posición corta en futuros genera una pérdida de USD 3.595.284, dando como resultado una pérdida neta de USD 26.146. Al comparar los resultados con y sin cobertura, se obtiene una efectividad aproximada del 99,27 % para el escenario de caída del 10 %. Esto demuestra que la utilización de contratos de futuros permite reducir significativamente la exposición del portafolio frente a movimientos adversos del mercado.

CASO DEL INVERSIONISTA QUE YA TIENE ACCIONES

Es como contratar un seguro, Si lo único que le preocupa es una caída temporal, no necesita vender sus acciones (lo que le generaría costos y podría implicar impuestos). Le basta con vender futuros por un valor equivalente a su exposición. Así conserva las acciones, protege el valor total del portafolio y cuando quiera quitar la protección cierra los futuros.

PUNTO 8_ FLUJOS MENSUALES, MARK-TO-MARKET Y MARGIN CALL USANDO TICKS

# ==============================================================================
# Precios simulados con el retorno y la volatilidad mensuales historicos del Nasdaq-100
# ==============================================================================
n8 <- 3
set.seed(2026)
r8     <- rnorm(n8, mean = mu_idx, sd = sig_idx)
F_fin8 <- round(F0 * exp(cumsum(r8)) / tick) * tick
F_ini8 <- c(F0, F_fin8[-n8])
dF8    <- F_fin8 - F_ini8
pyg_largo8 <- N * mult * dF8
pyg_corto8 <- -N * mult * dF8

dep8 <- N * IM; umb8 <- N * MM
saldo_antes8 <- saldo_fin8 <- repo8 <- numeric(n8); llamado8 <- character(n8)
saldo8 <- dep8
for (t in 1:n8) {
  saldo_antes8[t] <- saldo8 + pyg_corto8[t]
  if (saldo_antes8[t] < umb8) {                         # llamado al margen: se repone hasta el margen INICIAL
    llamado8[t] <- "SI"; repo8[t] <- dep8 - saldo_antes8[t]; saldo8 <- dep8
  } else { llamado8[t] <- "NO"; saldo8 <- saldo_antes8[t] }
  saldo_fin8[t] <- saldo8
}
valor_port8 <- V * cumprod(1 + beta_port * (F_fin8 / F_ini8 - 1))
pyg_port8   <- diff(c(V, valor_port8))

tabla8 <- data.frame(
  Mes = 1:n8, Precio_inicial = F_ini8, Precio_final = F_fin8, Variacion_pts = dF8,
  PyG_largo_USD = round(pyg_largo8), PyG_corto_USD = round(pyg_corto8),
  Saldo_antes_USD = round(saldo_antes8), Llamado_margen = llamado8,
  Reposicion_USD = round(repo8), Saldo_final_USD = round(saldo_fin8)
)
cat("\n===== PUNTO 8: flujos del primer trimestre =====\n")
## 
## ===== PUNTO 8: flujos del primer trimestre =====
cat("Deposito inicial: USD", format(dep8, big.mark = ","), "| Umbral de mantenimiento: USD",
    format(umb8, big.mark = ","), "\n")
## Deposito inicial: USD 1,638,000 | Umbral de mantenimiento: USD 1,480,500
cat("Alza del futuro que dispara un llamado al margen:", (dep8 - umb8) / (N * mult), "puntos\n\n")
## Alza del futuro que dispara un llamado al margen: 125 puntos
print(tabla8)
##   Mes Precio_inicial Precio_final Variacion_pts PyG_largo_USD PyG_corto_USD
## 1   1        28534.0     29799.50       1265.50       1594530      -1594530
## 2   2        29799.5     28503.00      -1296.50      -1633590       1633590
## 3   3        28503.0     29150.25        647.25        815535       -815535
##   Saldo_antes_USD Llamado_margen Reposicion_USD Saldo_final_USD
## 1           43470             SI        1594530         1638000
## 2         3271590             NO              0         3271590
## 3         2456055             NO              0         2456055
cat("\nResultado del trimestre: acciones USD", format(round(sum(pyg_port8)), big.mark = ","),
    "| futuros USD", format(round(sum(pyg_corto8)), big.mark = ","),
    "| neto USD", format(round(sum(pyg_port8) + sum(pyg_corto8)), big.mark = ","), "\n")
## 
## Resultado del trimestre: acciones USD 769,419 | futuros USD -776,475 | neto USD -7,056
g_margen8 <- function() {
  par(mar = c(5, 4, 3, 1))
  ymax <- max(c(saldo_fin8, dep8)) / 1e6 * 1.25
  barplot(saldo_fin8 / 1e6, names.arg = paste("Mes", 1:n8),
          col = ifelse(llamado8 == "SI", "tomato", "steelblue"), ylim = c(0, ymax),
          ylab = "USD millones", main = "Cuenta de margen: saldo al cierre de cada mes",
          sub = "Rojo = mes con llamado al margen (saldo repuesto al margen inicial)")
  abline(h = umb8 / 1e6, lty = 2, col = "red"); abline(h = dep8 / 1e6, lty = 3, col = "darkgreen")
  legend("topleft", c("Margen de mantenimiento", "Margen inicial"), lty = c(2, 3),
         col = c("red", "darkgreen"), bty = "n")
}
graficar("08_cuenta_margen.png", g_margen8)

Deposito inicial ( 63 x 26000 ) = USD 1,638,000 Umbral de mantenimiento ( 63 x 23500 ) = USD 1,480,500 Alza del futuro que dispara un llamado al margen: 125 puntos

Aquí podemos analizar de cada mes el riesgo de liquidez, si el futuro aumenta 125 puntos desde el precio inicial, el saldo alcanza el margen de mantenimiento.

Mes 1: El futuro aumenta de 28.534 a 29.799,50 puntos, equivalente a una variación positiva de 1.265,50 puntos. El saldo de la cuenta después de registrar la pérdida es:1.638.000−1.594.530=43.470 Como USD 43.470 es inferior al margen de mantenimiento de USD 1.480.500, necesitamos un margin call. Para restablecer la cuenta al depósito inicial se requiere: 1.638.000−43.470=USD 1.594.530.

Mes 2: El precio del futuro disminuye de 29.799,50 a 28.503 puntos. Esta disminución beneficia a la posición corta y genera una ganancia de: 63×1.296,50×20=USD 1.633.590 El saldo de la cuenta aumenta hasta USD 3.271.590.

Mes 3:El precio del futuro aumenta de 28.503 a 29.150,25 puntos. La posición corta registra una pérdida de 63×647,25×20=USD 815.535 El saldo final queda en: 3.271.590−815.535=USD 2.456.055 Aunque se presenta una pérdida, no se activa un nuevo margin call porque el saldo continúa por encima del umbral de USD 1.480.500.

Al finalizar el trimestre, el portafolio de acciones registró una ganancia de USD 769.419, mientras que la posición corta de 63 contratos de futuros presentó una pérdida de USD 776.475. Como resultado de compensar ambas posiciones, se obtuvo una pérdida neta de USD 7.056, equivalente aproximadamente al 0,02 % del capital inicial de USD 35 millones.

PUNTO 9_ COBERTURA CORTA ABSOLUTA CON ROLL-OVER TRIMESTRAL (4 ANIOS = 16 TRIMESTRES)

c_carry <- log(F0 / S0) / (49 / 365)      # carry implicito (futuro dic-2026 vence 18/12/2026)
cat("\n===== PUNTO 9: roll-over =====\nCarry implicito anual:", round(c_carry * 100, 2), "%\n")
## 
## ===== PUNTO 9: roll-over =====
## Carry implicito anual: 3.9 %
set.seed(2026)
r_sim   <- rnorm(n_meses, mean = mu_idx, sd = sig_idx)
Sx      <- S0 * exp(cumsum(r_sim))               # indice simulado al cierre de cada mes
Sx_prev <- c(S0, Sx[-n_meses])
ret_ix  <- Sx / Sx_prev - 1
 
V_port <- V * cumprod(1 + beta_port * ret_ix)    # portafolio sin cobertura
V_prev <- c(V, V_port[-n_meses])
 
q_idx <- ceiling((1:n_meses) / 3)                # trimestre de cada mes
m_idx <- (1:n_meses) - 3 * (q_idx - 1)           # mes dentro del trimestre (1, 2, 3)
F_fin <- round(Sx * exp(c_carry * (3 - m_idx) / 12) / tick) * tick   # converge al indice en m = 3
F_ini <- numeric(n_meses)
for (t in 1:n_meses) {
  F_ini[t] <- if (m_idx[t] == 1) round(Sx_prev[t] * exp(c_carry * 0.25) / tick) * tick else F_fin[t - 1]
}
 
N_t <- pyg <- saldo_antes <- saldo_fin <- repo <- retiro <- costo <- numeric(n_meses)
llamado <- character(n_meses)
saldo <- N0 * IM
for (t in 1:n_meses) {
  if (m_idx[t] == 1) {                           # ROLL: cierre del contrato anterior y apertura del nuevo
    N_q <- if (reajustar_N) round(beta_port * V_prev[t] / (F_ini[t] * mult)) else N0
    dep <- N_q * IM; umb <- N_q * MM
    if (t > 1) {
      if (saldo < dep) { repo[t] <- dep - saldo; saldo <- dep }
      else if (retirar_exceso && saldo > dep) { retiro[t] <- saldo - dep; saldo <- dep }
    }
    costo[t] <- N_q * costo_roll
  }
  N_t[t] <- N_q
  pyg[t] <- -N_q * mult * (F_fin[t] - F_ini[t])  # posicion corta
  saldo_antes[t] <- saldo + pyg[t]
  if (saldo_antes[t] < umb) {                    # llamado al margen
    llamado[t] <- "SI"; repo[t] <- repo[t] + (dep - saldo_antes[t]); saldo <- dep
  } else { llamado[t] <- "NO"; saldo <- saldo_antes[t] }
  saldo_fin[t] <- saldo
}
 
W_cub  <- V_port + cumsum(pyg) - cumsum(costo)   # portafolio + resultado de futuros - costos
W_prev <- c(V, W_cub[-n_meses])
r_sin  <- V_port / V_prev - 1
r_cub  <- W_cub  / W_prev - 1
 
primero <- which(m_idx == 1); ultimo <- which(m_idx == 3)
tabla_trim <- data.frame(
  Trimestre         = 1:n_trim,
  Fecha_cierre      = (seq(as.Date("2026-12-01"), by = "month", length.out = n_meses) - 1)[ultimo],
  Contratos         = N_t[primero],
  F_apertura        = F_ini[primero],
  F_cierre          = F_fin[ultimo],
  PyG_realizada_USD = round(tapply(pyg, q_idx, sum), 0),
  Efecto_roll_USD   = round(N_t[primero] * mult * (F_ini[primero] - Sx_prev[primero]), 0),
  Llamados          = as.integer(tapply(llamado == "SI", q_idx, sum)),
  Reposicion_USD    = round(tapply(repo, q_idx, sum), 0),
  Costo_roll_USD    = round(costo[primero], 0),
  Ret_sin_cob_pct   = round((V_port[ultimo] / V_prev[primero] - 1) * 100, 2),
  Ret_cubierto_pct  = round((W_cub[ultimo]  / W_prev[primero] - 1) * 100, 2),
  Nuevo_contrato_F  = c(F_ini[primero][-1], NA)
)
print(tabla_trim, row.names = FALSE)
##  Trimestre Fecha_cierre Contratos F_apertura F_cierre PyG_realizada_USD
##          1   2027-01-31        63   28663.25 28998.00           -421785
##          2   2027-04-30        63   29282.25 25336.00           4972275
##          3   2027-07-31        63   25584.50 24203.50           1740060
##          4   2027-10-31        63   24441.00 23159.00           1615320
##          5   2028-01-31        63   23386.00 20540.25           3585645
##          6   2028-04-30        63   20741.75 24205.50          -4364325
##          7   2028-07-31        63   24442.75 24696.00           -319095
##          8   2028-10-31        63   24938.25 25689.25           -946260
##          9   2029-01-31        63   25941.25 32883.50          -8747235
##         10   2029-04-30        63   33206.00 39282.75          -7656705
##         11   2029-07-31        63   39668.00 39698.50            -38430
##         12   2029-10-31        63   40087.75 45512.00          -6834555
##         13   2030-01-31        63   45958.50 48314.00          -2967930
##         14   2030-04-30        63   48787.75 47277.00           1903545
##         15   2030-07-31        63   47740.50 44942.50           3525480
##         16   2030-10-31        63   45383.25 51659.00          -7907445
##  Efecto_roll_USD Llamados Reposicion_USD Costo_roll_USD Ret_sin_cob_pct
##           350784        1        1479240            315            2.20
##           358247        0              0            315          -12.88
##           313158        0              0            315           -4.56
##           299189        0              0            315           -4.40
##           286084        0              0            315          -11.53
##           253756        0              0            315           18.21
##           299002        0              0            315            2.06
##           305255        0              0            315            4.09
##           317465        1        1406160            315           28.60
##           406293        3        7656705            315           19.86
##           485498        1         160020            315            1.08
##           490572        3        6712965            315           14.95
##           562522        2        2967930            315            6.28
##           596996        0              0            315           -2.19
##           584146        0              0            315           -5.04
##           555333        1        3168585            315           15.25
##  Ret_cubierto_pct Nuevo_contrato_F
##              0.99         29282.25
##              1.04         25584.50
##              0.89         24441.00
##              0.85         23386.00
##              0.84         20741.75
##              0.59         24442.75
##              0.80         24938.25
##              0.79         25941.25
##              0.77         33206.00
##              1.09         39668.00
##              1.28         40087.75
##              1.35         45958.50
##              1.49         48787.75
##              1.47         47740.50
##              1.40         45383.25
##              1.49               NA
max_dd <- function(x) { x <- c(V, x); min(x / cummax(x) - 1) }
cagr   <- function(x) (x[length(x)] / V)^(1 / anios) - 1
resumen9 <- data.frame(
  Medida = c("Valor final (USD)", "Retorno anual compuesto (%)", "Volatilidad anual (%)", "Maxima caida (%)"),
  Sin_cobertura = c(round(V_port[n_meses]), round(cagr(V_port) * 100, 2),
                    round(sd(r_sin) * sqrt(12) * 100, 2), round(max_dd(V_port) * 100, 2)),
  Cubierto = c(round(W_cub[n_meses]), round(cagr(W_cub) * 100, 2),
               round(sd(r_cub) * sqrt(12) * 100, 2), round(max_dd(W_cub) * 100, 2))
)
cat("\nResumen a 4 anios:\n"); print(resumen9, row.names = FALSE)
## 
## Resumen a 4 anios:
##                       Medida Sin_cobertura    Cubierto
##            Valor final (USD)   64362591.00 41496111.00
##  Retorno anual compuesto (%)         16.45        4.35
##        Volatilidad anual (%)         19.32        0.35
##             Maxima caida (%)        -31.24        0.00
cat("\nPyG total de futuros: USD", format(round(sum(pyg)), big.mark = ","), "\n")
## 
## PyG total de futuros: USD -22,861,440
cat("Efecto roll acumulado (carry capturado por el corto): USD",
    format(round(sum(tabla_trim$Efecto_roll_USD)), big.mark = ","), "\n")
## Efecto roll acumulado (carry capturado por el corto): USD 6,464,300
cat("Costos de roll acumulados: USD", format(round(sum(costo)), big.mark = ","), "\n")
## Costos de roll acumulados: USD 5,040
cat("Llamados al margen:", sum(llamado == "SI"), "de", n_meses, "meses\n")
## Llamados al margen: 12 de 48 meses
cat("Reposiciones totales: USD", format(round(sum(repo)), big.mark = ","), "\n")
## Reposiciones totales: USD 23,551,605
# ---- DETALLE DE LA SIMULACION MES A MES (48 meses) QUE PRODUCE EL VALOR DE CIERRE ----
tabla_sim <- data.frame(
  Mes                     = 1:n_meses,
  Trimestre               = q_idx,
  Ret_log_simulado_pct    = round(r_sim * 100, 2),     # numero aleatorio: N(media, desviacion) del Nasdaq-100
  Indice_simulado         = round(Sx, 2),              # S(t) = S(t-1) x exp(retorno simulado)
  Retorno_indice_pct      = round(ret_ix * 100, 2),
  Futuro_inicial          = F_ini,
  Futuro_final            = F_fin,
  PyG_corto_USD           = round(pyg),
  Llamado_margen          = llamado,
  Reposicion_USD          = round(repo),
  Saldo_margen_USD        = round(saldo_fin),
  Portafolio_sin_cob_USD  = round(V_port),
  Portafolio_cubierto_USD = round(W_cub)
)
cat("\n===== SIMULACION MES A MES (48 meses) =====\n")
## 
## ===== SIMULACION MES A MES (48 meses) =====
cat("Parametros de la simulacion: retorno log mensual medio =", round(mu_idx * 100, 3),
    "% | desviacion mensual =", round(sig_idx * 100, 3), "% | semilla = 2026 | indice inicial =", S0, "\n\n")
## Parametros de la simulacion: retorno log mensual medio = 1.481 % | desviacion mensual = 5.491 % | semilla = 2026 | indice inicial = 28384.85
print(tabla_sim, row.names = FALSE)
##  Mes Trimestre Ret_log_simulado_pct Indice_simulado Retorno_indice_pct
##    1         1                 4.34        29643.72               4.44
##    2         1                -4.45        28354.06              -4.35
##    3         1                 2.25        28997.93               2.27
##    4         2                 1.02        29293.88               1.02
##    5         2                -2.18        28662.23              -2.16
##    6         2               -12.34        25335.96             -11.61
##    7         3                -2.56        24696.57              -2.52
##    8         3                -4.12        23699.54              -4.04
##    9         3                 2.10        24203.55               2.13
##   10         4                -1.12        23933.77              -1.11
##   11         4                -0.76        23752.38              -0.76
##   12         4                -2.53        23158.95              -2.50
##   13         5                 0.26        23220.37               0.27
##   14         5                 0.24        23276.35               0.24
##   15         5               -12.50        20540.36             -11.75
##   16         6                 8.88        22447.21               9.28
##   17         6                 4.87        23566.42               4.99
##   18         6                 2.68        24205.45               2.71
##   19         7                -2.94        23504.62              -2.90
##   20         7                 5.27        24776.13               5.41
##   21         7                -0.32        24695.98              -0.32
##   22         8                 0.58        24838.77               0.58
##   23         8                -6.16        23354.15              -5.98
##   24         8                 9.53        25689.29              10.00
##   25         9                 1.75        26141.64               1.76
##   26         9                11.96        29462.39              12.70
##   27         9                10.99        32883.55              11.61
##   28        10                 1.80        33480.84               1.82
##   29        10                 5.02        35206.05               5.15
##   30        10                10.96        39282.68              11.58
##   31        11                -1.42        38727.32              -1.41
##   32        11                 2.39        39665.84               2.42
##   33        11                 0.08        39698.41               0.08
##   34        12                 3.31        41033.67               3.36
##   35        12                 2.48        42065.12               2.51
##   36        12                 7.88        45512.05               8.19
##   37        13                 4.74        47721.18               4.85
##   38        13                -3.42        46118.49              -3.36
##   39        13                 4.65        48313.94               4.76
##   40        14                -3.05        46863.12              -3.00
##   41        14                -4.87        44633.83              -4.76
##   42        14                 5.75        47276.89               5.92
##   43        15                -5.13        44911.93              -5.00
##   44        15                 3.17        46356.15               3.22
##   45        15                -3.10        44942.51              -3.05
##   46        16                 9.27        49306.96               9.71
##   47        16                 5.39        52037.21               5.54
##   48        16                -0.73        51659.04              -0.73
##  Futuro_inicial Futuro_final PyG_corto_USD Llamado_margen Reposicion_USD
##        28663.25     29837.25      -1479240             SI        1479240
##        29837.25     28446.50       1752345             NO              0
##        28446.50     28998.00       -694890             NO              0
##        29282.25     29485.00       -255465             NO              0
##        29485.00     28755.75        918855             NO              0
##        28755.75     25336.00       4308885             NO              0
##        25584.50     24857.75        915705             NO              0
##        24857.75     23776.75       1362060             NO              0
##        23776.75     24203.50       -537705             NO              0
##        24441.00     24090.00        442260             NO              0
##        24090.00     23829.75        327915             NO              0
##        23829.75     23159.00        845145             NO              0
##        23386.00     23372.00         17640             NO              0
##        23372.00     23352.25         24885             NO              0
##        23352.25     20540.25       3543120             NO              0
##        20741.75     22593.75      -2333520             NO              0
##        22593.75     23643.25      -1322370             NO              0
##        23643.25     24205.50       -708435             NO              0
##        24442.75     23658.00        988785             NO              0
##        23658.00     24856.75      -1510425             NO              0
##        24856.75     24696.00        202545             NO              0
##        24938.25     25001.00        -79065             NO              0
##        25001.00     23430.25       1979145             NO              0
##        23430.25     25689.25      -2846340             NO              0
##        25941.25     26312.25       -467460             NO              0
##        26312.25     29558.50      -4090275             NO              0
##        29558.50     32883.50      -4189500             SI        1406160
##        33206.00     33699.50       -621810             SI         621810
##        33699.50     35320.75      -2042775             SI        2042775
##        35320.75     39282.75      -4992120             SI        4992120
##        39668.00     38980.00        866880             NO              0
##        38980.00     39795.00      -1026900             SI         160020
##        39795.00     39698.50        121590             NO              0
##        40087.75     41301.50      -1529325             SI        1407735
##        41301.50     42202.25      -1134945             SI        1134945
##        42202.25     45512.00      -4170285             SI        4170285
##        45958.50     48032.75      -2613555             SI        2613555
##        48032.75     46268.75       2222640             NO              0
##        46268.75     48314.00      -2577015             SI         354375
##        48787.75     47169.00       2039625             NO              0
##        47169.00     44779.25       3011085             NO              0
##        44779.25     47277.00      -3147165             NO              0
##        47740.50     45205.00       3194730             NO              0
##        45205.00     46507.25      -1640835             NO              0
##        46507.25     44942.50       1971585             NO              0
##        45383.25     49628.75      -5349330             NO              0
##        49628.75     52206.75      -3248280             SI        3168585
##        52206.75     51659.00        690165             NO              0
##  Saldo_margen_USD Portafolio_sin_cob_USD Portafolio_cubierto_USD
##           1638000               36582915                35103360
##           3390345               34959929                35232719
##           2695455               35769480                35347380
##           2439990               36141759                35463879
##           3358845               35347056                35588031
##           7667730               31163977                35713837
##           8583435               30361975                35827225
##           9945495               29112008                35939318
##           9407790               29743351                36032956
##           9850050               29405279                36136829
##          10177965               29178017                36237482
##          11023110               28434631                36339241
##          11040750               28511532                36433467
##          11065635               28581631                36528451
##          14608755               25155666                36645606
##          12275235               27537110                36693215
##          10952865               28937219                36770954
##          10244430               29737385                36862685
##          11233215               28859384                36973154
##           9722790               30451401                37054746
##           9925335               30350954                37156844
##           9846270               30529903                37256413
##          11825415               28669076                37374731
##           8979075               31592274                37451589
##           8511615               32159555                37551095
##           4421340               36325448                37626713
##           1638000               40626860                37738625
##           1638000               41379385                37869025
##           1638000               43553704                38000569
##           1638000               48696569                38151314
##           2504880               47994515                38315825
##           1638000               49180591                38475001
##           1759590               49221769                38637769
##           1638000               50910056                38796416
##           1638000               52215041                38966456
##           1638000               56578210                39159340
##           1638000               59378724                39345984
##           3860640               57345131                39535031
##           1638000               60128953                39741838
##           3677625               58287671                39939866
##           6688710               55460132                40123412
##           3541545               58809170                40325285
##           6736275               55809209                40519739
##           5095440               57639296                40708991
##           7067025               55846857                40888137
##           1717695               61377382                41069017
##           1638000               64843135                41286490
##           2328165               64362591                41496111
write.csv(tabla_sim, file.path(dir_graf, "simulacion_punto9.csv"), row.names = FALSE)   # para abrir en Excel
 
cat("\nComo se obtiene el valor de cierre (mes", n_meses, "):\n")
## 
## Como se obtiene el valor de cierre (mes 48 ):
cat("  Indice simulado inicial -> final:", round(S0, 2), "->", round(Sx[n_meses], 2),
    "(", round((Sx[n_meses] / S0 - 1) * 100, 1), "%)\n")
##   Indice simulado inicial -> final: 28384.85 -> 51659.04 ( 82 %)
cat("  Valor final SIN cobertura = capital x prod(1 + beta x retorno mensual del indice) = USD",
    format(round(V_port[n_meses]), big.mark = ","), "\n")
##   Valor final SIN cobertura = capital x prod(1 + beta x retorno mensual del indice) = USD 64,362,591
cat("  + Resultado acumulado de los futuros (corto):       USD", format(round(sum(pyg)), big.mark = ","), "\n")
##   + Resultado acumulado de los futuros (corto):       USD -22,861,440
cat("  - Costos de roll:                                   USD", format(round(sum(costo)), big.mark = ","), "\n")
##   - Costos de roll:                                   USD 5,040
cat("  = Valor final CUBIERTO:                             USD", format(round(W_cub[n_meses]), big.mark = ","), "\n")
##   = Valor final CUBIERTO:                             USD 41,496,111
g_sim_indice <- function() {
  par(mar = c(4, 4, 3, 1))
  plot(0:n_meses, c(S0, Sx), type = "l", lwd = 2, col = "steelblue", xlab = "Mes",
       ylab = "Nasdaq-100 simulado (puntos)", main = "Trayectoria simulada del Nasdaq-100 (48 meses)")
  abline(v = seq(3, n_meses, 3), col = "grey85", lty = 3)           # fechas de roll-over
  llam <- which(llamado == "SI")
  points(llam, Sx[llam], pch = 19, col = "red", cex = 1.2)
  legend("topleft", c("Indice simulado", "Mes con llamado al margen"), col = c("steelblue", "red"),
         lty = c(1, NA), pch = c(NA, 19), lwd = c(2, NA), bty = "n")
}
g_sim_ret <- function() {
  par(mar = c(4, 4, 3, 1))
  hist(r_sim * 100, breaks = 15, freq = FALSE, col = "lightblue", border = "white",
       xlab = "Retorno mensual simulado (%)", main = "Retornos mensuales simulados (48 meses)")
  curve(dnorm(x, mean = mu_idx * 100, sd = sig_idx * 100), add = TRUE, col = "red", lwd = 2)
  abline(v = mu_idx * 100, lty = 2)
}
graficar("09_simulacion_indice.png", g_sim_indice)

graficar("09_simulacion_retornos.png", g_sim_ret)

g_valor9 <- function() {
  meses <- 0:n_meses
  par(mar = c(4, 4, 3, 1))
  plot(meses, c(V, V_port) / 1e6, type = "n", ylim = range(c(V, V_port, W_cub)) / 1e6,
       xlab = "Mes", ylab = "USD millones",
       main = "Portafolio sin cobertura vs cubierto (roll-over trimestral)")
  abline(v = seq(0, n_meses, 3), col = "grey92")
  lines(meses, c(V, V_port) / 1e6, lwd = 2, col = "steelblue")
  lines(meses, c(V, W_cub)  / 1e6, lwd = 2, col = "tomato")
  legend("topleft", c("Sin cobertura", "Cubierto con futuros"), col = c("steelblue", "tomato"), lwd = 2, bty = "n")
}
g_pyg9 <- function() {
  par(mar = c(4, 4, 3, 1))
  barplot(tabla_trim$PyG_realizada_USD / 1e6, names.arg = tabla_trim$Trimestre,
          col = ifelse(tabla_trim$PyG_realizada_USD >= 0, "seagreen", "tomato"),
          xlab = "Trimestre", ylab = "USD millones",
          main = "Resultado realizado de los futuros por trimestre")
  abline(h = 0)
}
g_repo9 <- function() {
  par(mar = c(4, 4, 3, 1))
  barplot(tabla_trim$Reposicion_USD / 1e6, names.arg = tabla_trim$Trimestre, col = "orange",
          xlab = "Trimestre", ylab = "USD millones", main = "Reposiciones de margen por trimestre")
}
graficar("09_valor_cubierto_vs_sin.png", g_valor9)

graficar("09_pyg_trimestral.png", g_pyg9)

graficar("09_reposiciones.png", g_repo9)

Interpretación:

• Sin cobertura, el portafolio alcanza USD 64,36 millones, con una rentabilidad anual compuesta del 16,45 %.Con cobertura, el capital final es USD 41,50 millones, con una rentabilidad anual del 4,35 %.

• La cobertura reduce la volatilidad del 19,32 % al 0,35 %, lo que representa una reducción.

• La diferencia de capital final entre ambas estrategias es de USD 22.866.480. La cobertura corta con roll-over trimestral redujo la volatilidad anual del portafolio de 19,3 % a 0,35 % y eliminó la máxima caída (−31,2 %), a costa de bajar el retorno anual compuesto de 16,5 % a 4,35 %, cercano a la tasa libre de riesgo.

El roll-over aportó USD 6,5 M por convergencia entre futuro e índice y costó solo USD 5.040. La cobertura exigió reponer unos USD 23,6 M en 12 margin call, lo que evidencia el riesgo de liquidez de la estrategia

Se utiliza una semilla de 2026, un retorno logarítmico mensual medio de 1,481 % y una desviación mensual de 5,491 %. Por lo tanto, los resultados no representan una predicción segura del comportamiento futuro del Nasdaq.

PUNTO 10_ VALOR ESPERADO DE LA COBERTURA TRIMESTRAL CON LA TASA LIBRE DE RIESGO

rf_q   <- (1 + rf)^(1 / 4) - 1
Rp_q   <- ret_port / 4
EV_sin <- V * (1 + Rp_q)
sd_sin <- sd(r_port) * sqrt(3)

ES_T     <- S0 * exp(3 * mu_idx)                       # indice esperado al vencimiento
EPyG_fut <- N * mult * (F0 - ES_T)                     # corto: gana (F0 - precio final) por punto
EV_cub   <- EV_sin + EPyG_fut

mod10    <- lm(r_port ~ r_mkt)
R2       <- summary(mod10)$r.squared
sd_cub   <- sd(resid(mod10)) * sqrt(3)                 # riesgo residual trimestral
beta_emp <- coef(mod10)[2]
Rc_q     <- EV_cub / V - 1

comparacion10 <- data.frame(
  Medida = c("Valor esperado a 1 trimestre (USD)", "Retorno esperado trimestral (%)",
             "Desviacion trimestral (%)", "Desviacion trimestral (USD)",
             "Exceso sobre tasa libre de riesgo (%)", "Sharpe trimestral"),
  Sin_cobertura = c(round(EV_sin), round(Rp_q * 100, 2), round(sd_sin * 100, 2), round(sd_sin * V),
                    round((Rp_q - rf_q) * 100, 2), round((Rp_q - rf_q) / sd_sin, 3)),
  Cubierto = c(round(EV_cub), round(Rc_q * 100, 2), round(sd_cub * 100, 2), round(sd_cub * V),
               round((Rc_q - rf_q) * 100, 2), round((Rc_q - rf_q) / sd_cub, 3))
)
cat("\n===== PUNTO 10 =====\nTasa libre anual (^TNX):", round(rf * 100, 3), "% | trimestral efectiva:",
    round(rf_q * 100, 3), "%\n")
## 
## ===== PUNTO 10 =====
## Tasa libre anual (^TNX): 4.929 % | trimestral efectiva: 1.21 %
print(comparacion10, row.names = FALSE)
##                                 Medida Sin_cobertura     Cubierto
##     Valor esperado a 1 trimestre (USD)  37083408.000 35646683.000
##        Retorno esperado trimestral (%)         5.950        1.850
##              Desviacion trimestral (%)        11.900        6.890
##            Desviacion trimestral (USD)   4164126.000  2411736.000
##  Exceso sobre tasa libre de riesgo (%)         4.740        0.640
##                      Sharpe trimestral         0.399        0.093
cat("\nGanancia esperada de los futuros en el trimestre: USD", format(round(EPyG_fut), big.mark = ","), "\n")
## 
## Ganancia esperada de los futuros en el trimestre: USD -1,436,725
cat("Beta empirica:", round(beta_emp, 3), "| R2 contra el indice:", round(R2, 3), "\n")
## Beta empirica: 1.02 | R2 contra el indice: 0.665
cat("Reduccion de la desviacion con la cobertura:", round((1 - sd_cub / sd_sin) * 100, 1), "%\n")
## Reduccion de la desviacion con la cobertura: 42.1 %
Rm_q   <- exp(3 * mu_idx) - 1
alfa_q <- Rp_q - (rf_q + beta_port * (Rm_q - rf_q))
cat("Verificacion CAPM: retorno cubierto aprox. = tasa libre + alfa =", round((rf_q + alfa_q) * 100, 2),
    "% trimestral (alfa:", round(alfa_q * 100, 2), "%)\n")
## Verificacion CAPM: retorno cubierto aprox. = tasa libre + alfa = 2.55 % trimestral (alfa: 1.34 %)
g_p10 <- function() {
  m <- rbind("Sin cobertura" = c(Rp_q, sd_sin), "Cubierto" = c(Rc_q, sd_cub)) * 100
  colnames(m) <- c("Retorno esperado", "Desviacion (riesgo)")
  par(mar = c(4, 4, 3, 1))
  b <- barplot(m, beside = TRUE, col = c("steelblue", "tomato"), ylab = "% trimestral",
               main = "Sin cobertura vs cubierto (1 trimestre)", ylim = c(0, max(m) * 1.2),
               legend.text = TRUE, args.legend = list(x = "topright", bty = "n"))
  text(b, m, labels = sprintf("%.2f", m), pos = 3)
}
graficar("10_sin_vs_cubierto.png", g_p10)

Con una tasa libre de riesgo de 4,929 % anual (1,21 % trimestral, tomada del ^TNX al 30/10/2026), el valor esperado del portafolio a un trimestre es de USD 37,08 millones sin cobertura y USD 35,65 millones con ella. La cobertura redujo la desviación trimestral de 11,9 % a 6,9 % (−42 %), pero también el retorno esperado, de 5,95 % a 1,85 %, y el Sharpe, de 0,40 a 0,09. La reducción de riesgo es parcial porque el 66,5 % de la varianza del portafolio se explica por el índice (R² = 0,665); el resto es riesgo específico de las empresas, que los futuros sobre el índice no cubren. La cobertura reduce, tanto el riesgo como la rentabilidad esperada aquí se estaría protegiendo el capital frente a caída del mercado.

PUNTO 11_ RENDIMIENTO ESPERADO MENSUAL, VALOR DE CARTERA, VAR Y DIVIDENDOS

div_trim    <- div_trim[tickers]
yield_anual <- 4 * div_trim / cierre_ini
yield_port  <- sum(w * yield_anual)
acciones    <- floor(w * V / cierre_ini)
tabla_div <- data.frame(
  Accion = tickers, Dividendo_trim_USD = as.numeric(div_trim),
  Rend_dividendo_anual_pct = round(as.numeric(yield_anual) * 100, 3),
  Acciones = as.numeric(acciones), Dividendos_trim_USD = round(as.numeric(acciones * div_trim))
)
cat("\n===== PUNTO 11: dividendos =====\n"); print(tabla_div, row.names = FALSE)
## 
## ===== PUNTO 11: dividendos =====
##  Accion Dividendo_trim_USD Rend_dividendo_anual_pct Acciones
##    MSFT               0.98                    0.751    46942
##    TSLA               0.00                    0.000    13131
##    AMZN               0.00                    0.000    21843
##  Dividendos_trim_USD
##                46003
##                    0
##                    0
cat("Rendimiento por dividendo del portafolio:", round(yield_port * 100, 3), "% anual\n")
## Rendimiento por dividendo del portafolio: 0.526 % anual
cat("Dividendos esperados por trimestre: USD", format(round(sum(acciones * div_trim)), big.mark = ","), "\n")
## Dividendos esperados por trimestre: USD 46,003
cat("Retorno total esperado:", round(ret_port * 100, 2), "% = apreciacion",
    round((ret_port - yield_port) * 100, 2), "% + dividendos", round(yield_port * 100, 2), "%\n")
## Retorno total esperado: 23.81 % = apreciacion 23.28 % + dividendos 0.53 %
Rm_sin <- ret_port / 12                                 # enfoque 1: sin cobertura
Rm_idx <- exp(mu_idx) - 1
h      <- N * mult * F0 / V                             # razon de cobertura
Rm_cub <- Rm_sin + h * (c_carry / 12 - Rm_idx)          # enfoque 2: cubierto con futuros

sig_sin <- sd(r_port); sig_cub <- sd(resid(lm(r_port ~ r_mkt)))
var_sin <- -(Rm_sin + qnorm(1 - conf) * sig_sin)        # enfoque 3: escenarios de VaR
var_cub <- -(Rm_cub + qnorm(1 - conf) * sig_cub)

ve <- function(R, n) V * (1 + R)^n
tabla_ve <- data.frame(
  Enfoque = c("Sin cobertura", "Cubierto con futuros"),
  Rend_mensual_pct = round(c(Rm_sin, Rm_cub) * 100, 3),
  VE_1_mes = round(c(ve(Rm_sin, 1), ve(Rm_cub, 1))),
  VE_3_meses = round(c(ve(Rm_sin, 3), ve(Rm_cub, 3))),
  VE_12_meses = round(c(ve(Rm_sin, 12), ve(Rm_cub, 12)))
)
cat("\nValor esperado de la cartera (USD):\n"); print(tabla_ve, row.names = FALSE)
## 
## Valor esperado de la cartera (USD):
##               Enfoque Rend_mensual_pct VE_1_mes VE_3_meses VE_12_meses
##         Sin cobertura            1.984 35694469   37125020    44306013
##  Cubierto con futuros            0.786 35275076   35831732    38447408
cat("Referencia: tasa libre de riesgo mensual =", round(rf_m * 100, 3), "%\n")
## Referencia: tasa libre de riesgo mensual = 0.411 %
tabla_var11 <- data.frame(
  Enfoque = rep(c("Sin cobertura", "Cubierto"), each = 2), Confianza = rep(c("95%", "99%"), 2),
  VaR_pct = round(c(var_sin, var_cub) * 100, 2), VaR_USD = round(c(var_sin, var_cub) * V),
  Valor_escenario = round(V - c(var_sin, var_cub) * V)
)
cat("\nAjuste por escenarios de VaR mensual:\n"); print(tabla_var11, row.names = FALSE)
## 
## Ajuste por escenarios de VaR mensual:
##        Enfoque Confianza VaR_pct VaR_USD Valor_escenario
##  Sin cobertura       95%    9.31 3260020        31739980
##  Sin cobertura       99%   14.00 4898441        30101559
##       Cubierto       95%    5.76 2015245        32984755
##       Cubierto       99%    8.47 2964169        32035831
g_rend11 <- function() {
  b <- c("Sin cobertura" = Rm_sin, "Cubierto" = Rm_cub, "Tasa libre" = rf_m) * 100
  par(mar = c(4, 4, 3, 1))
  p <- barplot(b, col = c("steelblue", "tomato", "grey60"), ylab = "% mensual",
               main = "Rendimiento esperado mensual", ylim = c(0, max(b) * 1.2))
  text(p, b, labels = sprintf("%.2f%%", b), pos = 3)
}
g_var11 <- function() {
  m <- rbind("Sin cobertura" = var_sin, "Cubierto" = var_cub) * V / 1e6
  par(mar = c(4, 4, 3, 1))
  b <- barplot(m, beside = TRUE, names.arg = c("95%", "99%"), col = c("steelblue", "tomato"),
               ylab = "USD millones", main = "VaR mensual por enfoque", ylim = c(0, max(m) * 1.2),
               legend.text = TRUE, args.legend = list(x = "topleft", bty = "n"))
  text(b, m, labels = sprintf("%.2f", m), pos = 3)
}
graficar("11_rendimiento_mensual.png", g_rend11)

graficar("11_var_por_enfoque.png", g_var11)

En nuestro portafolio tenemos solo una acción que paga dividendos y es Microsoft en el resumen podemos ver que el dividendo trimestral por acción es de 0.98 multiplicado por 46.942 de acciones nos da un total de $46.003 USD trimestral.

El rendimiento anual (yeil es de 0.526%), lo que nos indica que el rendimiento total no es del pago de dividendos sino de la valorización de las acciones que sería de 23.28%. Para un total de rendimiento total de 23.81%. anual. se observa que el portafolio sin cobertura ofrece una mayor rentabilidad esperada, alcanzando un valor de USD 44.306.013 a doce meses, frente a USD 38.447.407 para el portafolio cubierto con futuros y aunque permite aprovechar mejor los movimientos positivos de las acciones, se expone el portafolio a mayores pérdidas y con cobertura se sacrifica parte de la rentabilidad esperada, pero a cambio de reducir el riesgo de mercado.

El Value at Risk (VaR) nos muestra que con un nivel de confianza del 95 %, el portafolio sin cobertura tiene una pérdida estimada de hasta el 9,31 % Y con cobertura, esa pérdida se reduce al 5,76 % y con un nivel de confianza del 99 %, el riesgo pasa del 14 % al 8,47 % al implementar la cobertura.

Eso quiere decir que la cobertura disminuye el VaR aproximadamente un 38,13 % al 95 % de confianza y un 39,50 % al 99 % y esto es importante en la protección del capital.

PUNTO 12_ SENSIBILIDAD DE LA COBERTURA A LA BETA (0.6 y 1.5)

betas12  <- c(0.6, beta_port, 1.5)
etiqueta <- c("beta = 0.6", paste0("beta = ", round(beta_port, 2), " (base)"), "beta = 1.5")
expo12   <- betas12 * V
N_opt12  <- expo12 / valor_contrato
N12      <- round(N_opt12)
val_fut12 <- N12 * valor_contrato

tabla12 <- data.frame(
  Caso = etiqueta, Beta = round(betas12, 2), Exposicion_sist_USD = round(expo12),
  N_optimo = round(N_opt12, 2), N_entero = N12, Cobertura_pct = round(val_fut12 / expo12 * 100, 2),
  Sens_1pct_indice_USD = round(expo12 * 0.01), Valor_tick_USD = N12 * tick * mult,
  Margen_inicial_USD = N12 * IM
)
cat("\n===== PUNTO 12: sensibilidad a la beta =====\n"); print(tabla12, row.names = FALSE)
## 
## ===== PUNTO 12: sensibilidad a la beta =====
##                Caso Beta Exposicion_sist_USD N_optimo N_entero Cobertura_pct
##          beta = 0.6 0.60            21000000    36.80       37        100.55
##  beta = 1.02 (base) 1.02            35691374    62.54       63        100.73
##          beta = 1.5 1.50            52500000    92.00       92        100.00
##  Sens_1pct_indice_USD Valor_tick_USD Margen_inicial_USD
##                210000            185             962000
##                356914            315            1638000
##                525000            460            2392000
esc12 <- c(-0.10, 0.10)
res12 <- do.call(rbind, lapply(seq_along(betas12), function(i) {
  data.frame(Caso = etiqueta[i], Mercado_pct = esc12 * 100,
             Portafolio_USD = round(expo12[i] * esc12), Futuros_corto_USD = round(-val_fut12[i] * esc12),
             Neto_USD = round(expo12[i] * esc12 - val_fut12[i] * esc12))
}))
cat("\nEscenarios de mercado:\n"); print(res12, row.names = FALSE)
## 
## Escenarios de mercado:
##                Caso Mercado_pct Portafolio_USD Futuros_corto_USD Neto_USD
##          beta = 0.6         -10       -2100000           2111516    11516
##          beta = 0.6          10        2100000          -2111516   -11516
##  beta = 1.02 (base)         -10       -3569137           3595284    26147
##  beta = 1.02 (base)          10        3569137          -3595284   -26147
##          beta = 1.5         -10       -5250000           5250256      256
##          beta = 1.5          10        5250000          -5250256     -256
cat("\nAlza del futuro que dispara un llamado al margen:", (IM - MM) / mult, "puntos\n")
## 
## Alza del futuro que dispara un llamado al margen: 125 puntos
alza <- 1265.5
cat("Reposicion si el futuro sube", alza, "puntos en un mes:\n")
## Reposicion si el futuro sube 1265.5 puntos en un mes:
print(data.frame(Caso = etiqueta, Reposicion_USD = N12 * mult * alza), row.names = FALSE)
##                Caso Reposicion_USD
##          beta = 0.6         936470
##  beta = 1.02 (base)        1594530
##          beta = 1.5        2328520
g_n12 <- function() {
  par(mar = c(4, 4, 3, 1))
  b <- barplot(N12, names.arg = paste0("beta ", round(betas12, 2)), col = c("lightblue", "steelblue", "navy"),
               ylab = "Contratos cortos", main = "Contratos necesarios segun la beta",
               ylim = c(0, max(N12) * 1.2))
  text(b, N12, labels = N12, pos = 3)
}
g_margen12 <- function() {
  par(mar = c(4, 4, 3, 1))
  m <- N12 * IM / 1e6
  b <- barplot(m, names.arg = paste0("beta ", round(betas12, 2)), col = c("lightblue", "steelblue", "navy"),
               ylab = "USD millones", main = "Margen inicial requerido", ylim = c(0, max(m) * 1.2))
  text(b, m, labels = sprintf("%.2f", m), pos = 3)
}
graficar("12_contratos_por_beta.png", g_n12)

graficar("12_margen_por_beta.png", g_margen12)

El análisis de sensibilidad realizado permite evidenciar la importancia del coeficiente Beta en la determinación de la exposición sistemática de un portafolio y en el cálculo del número óptimo de contratos de futuros necesarios para implementar una estrategia de cobertura. Los resultados muestran que, a medida que Beta aumenta de 0,60 a 1,50, la exposición sistemática pasa de USD 21.000.000 a USD 52.500.000, incrementando el número de contratos necesarios de 37 a 92. Esto demuestra que los portafolios con mayor sensibilidad al mercado requieren una mayor cobertura para compensar sus posibles pérdidas. En los escenarios de mercado con variaciones del -10 % y +10 %, se observa que la posición corta en futuros compensa prácticamente la totalidad de las ganancias o pérdidas del portafolio. La cobertura alcanza niveles cercanos al 100 %, en beta 0.6 sobre pasa un 0.55%, en beta 1.02 un 0.73% y en la beta 1.5 es perfecto al 100%. con pequeñas diferencias atribuibles al redondeo del número de contratos. Por otra parte, el análisis de los margin call demuestra que, aunque los contratos de futuros permiten reducir la exposición al riesgo sistemático, también generan necesidades de liquidez. En el escenario base, una variación adversa de 1.265,5 puntos en el precio del futuro representa una reposición de margen estimada de 1.594.530 USD.

CONCLUSIÓN

en conclusion el desarrollo de este proyecto permitió comprender la importancia de la gestión del riesgo financiero en la construcción y administración de portafolios de inversión, demostrando que no es suficiente seleccionar activos con buenas expectativas de rentabilidad, sino que también es necesario implementar estrategias que permitan proteger el capital frente a los movimientos desfavorables del mercado ademas de buscar diversificion del portafolio que garantice ganancias del portafolio.

A través del análisis fundamental y estadístico de Microsoft, Tesla y Amazon, se construyó un portafolio de inversión de USD 35 millones, con una distribución aproximada del 70 % en Microsoft, 15 % en Tesla y 15 % en Amazon. Esta composición obtuvo una rentabilidad esperada del 23,81 %, una volatilidad del 23,8 % y un índice de Sharpe de 0,7935, evidenciando una relación favorable, aunque moderada, entre rentabilidad y riesgo.

Sin embargo, los resultados del análisis de riesgo, especialmente el VaR y el coeficiente Beta de 1,02, demostraron que el portafolio mantiene una exposición importante a las fluctuaciones del mercado. Por esta razón, se implementó una estrategia de cobertura mediante una posición corta de 63 contratos de futuros sobre el índice Nasdaq, con el propósito de compensar las posibles pérdidas que podrían presentarse ante una caída del mercado.

Los resultados de las simulaciones evidenciaron que esta estrategia puede ser altamente efectiva para reducir el riesgo sistemático. No obstante, el análisis de largo plazo, considerando la renovación trimestral de los contratos durante cuatro años, permitió identificar que la protección tiene un costo significativo en términos de rentabilidad. Mientras el portafolio sin cobertura alcanzó un valor final de USD 64,36 millones, el portafolio cubierto terminó con aproximadamente USD 41,50 millones. A cambio, la volatilidad anual se redujo del 19,32 % al 0,35 %, mostrando una disminución considerable de la incertidumbre en los resultados.

Otro aprendizaje importante fue reconocer que los contratos de futuros generan compromisos financieros adicionales, como los depósitos de margen y los posibles margin calls. Por lo tanto, una cobertura correctamente diseñada no solamente debe considerar el número óptimo de contratos, sino también la disponibilidad de liquidez necesaria para mantener la posición durante períodos de alta volatilidad por eso es importante que al seleccionar las acciones se puedan identificar de inicio cual podria ser de alto riesgo y poderla descartar de entrada, pues esto ayudaria y favoreceria el desarrollo del portafolio a una finalidad optima esperada.

Finalmente, este ejercicio demuestra que las decisiones de inversión deben fundamentarse en herramientas cuantitativas, diversificada a análisis de escenarios y una adecuada administración del riesgo, buscando no solamente obtener mayores rendimientos, sino garantizar la sostenibilidad financiera del portafolio en el largo plazo.

REFERENCIA

Fuentes de datos y de la empresa

• 247 Wall St. (2026, 30 de octubre). Amazon could be building toward its next big stock market breakout. https://247wallst.com/investing/2026/10/30/amazon-could-be-building-toward-its-next-big-stock-market-breakout/

• AI Weekly. (2026). Amazon’s AWS growth hits 39% in Q3 as capex guide jolts stock. https://aiweekly.co/alerts/amazons-aws-growth-hits-39-in-q3-as-capex-guide-jolts-stock

• Amazon.com, Inc. (2026). Amazon.com announces third quarter results [Comunicado de prensa]. https://ir.aboutamazon.com/news-release/news-release-details/2026/Amazon-com-Announces-Third-Quarter-Results/

• Barchart. (2026, 7 de marzo). The $200 billion question: Is Amazon finally ready to pay a dividend? https://www.barchart.com/story/news/617144/the-200-billion-question-is-amazon-finally-ready-to-pay-a-dividend

• Beinsure. (2026). Tesla stock price forecast. https://beinsure.com/news/tesla-stock-price-forecast/

• Benzinga. (2026). [Título del artículo sobre precios objetivo de Microsoft]. https://www.benzinga.com/node/62612074

• Capital.com. (2026, 5 de agosto). Microsoft share price: Azure revenue tops $100bn. https://capital.com/en-gb/market-updates/microsoft-share-price-forecast-05-08-2026

• Getquin. (2026). [Título de la publicación sobre los resultados de Tesla del tercer trimestre de 2026]. https://app.getquin.com/en/post/ZdbOSuMYwK

• InvestingLive. (2026). Tesla Q3 earnings beat as margins and cash flow surprise, revenue narrowly misses. https://investinglive.com/stocks/tesla-q3-earnings-beat-as-margins-and-cash-flow-surprise-revenue-narrowly-misses/

• KuCoin. (2026). JPMorgan sets $365 price target for Amazon, suggesting 50% upside. https://www.kucoin.com/news/flash/jpmorgan-sets-365-price-target-for-amazon-suggesting-50-upside

• Let’s Data Science. (2026). Microsoft reports 19% revenue growth and 48% Azure growth in Q1. https://letsdatascience.com/news/microsoft-reports-19-revenue-growth-and-48-azure-growth-in-q-bd5ee9a7

• Microsoft Corp. (2026, septiembre). Microsoft announces quarterly dividend increase. FinanzNachrichten. https://www.finanznachrichten.de/nachrichten-2026-09/69591946-microsoft-corp-microsoft-announces-quarterly-dividend-increase-008.htm

• Yahoo Finance. (2026). Precios históricos de MSFT, TSLA, AMZN, ^NDX, NQ=F y ^TNX [Conjunto de datos]. https://finance.yahoo.com/

Contrato de futuros

• CME Group. (s. f.). E-mini Nasdaq-100 futures: Contract specifications and margins. https://www.cmegroup.com

• MetroTrade. (s. f.). E-mini Nasdaq-100 futures (NQ) contract specifications. https://help.metrotrade.com/kb/e-mini-nasdaq-100-futures-nq-contract-specifications

Metodología

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

• Jorion, P. (2007). Value at risk: The new benchmark for managing financial risk (3.ª ed.). McGraw-Hill.

• Markowitz, H. (1952). Portfolio selection. The Journal of Finance, 7(1), 77–91.

Software Para R y quantmod RStudio, Claude, chatGPT.