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).
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.
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.
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"
## [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 =====
## 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)# ==============================================================================
# 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
##
## 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
##
## 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
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 %
## Desviacion estandar del portafolio: 23.8 %
## Sharpe Ratio: 0.7935
## (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)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
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.
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
## 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.
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 =====
## Valor de un contrato (USD): 570,680
## Exposicion sistematica beta x V (USD): 35,691,374
## N* (sin redondear): 62.54
## Contratos Valor_futuros Cobertura_pct Diferencia_USD
## 1 62 35382160 99.13 -309214
## 2 63 35952840 100.73 261466
## 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.
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.
# ==============================================================================
# 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
## Alza del futuro que dispara un llamado al margen: 125 puntos
## 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.
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
##
## 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
## Costos de roll acumulados: USD 5,040
## Llamados al margen: 12 de 48 meses
## 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
## 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
## - Costos de roll: USD 5,040
## = 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)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)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.
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 %
## 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
## Beta empirica: 1.02 | R2 contra el indice: 0.665
## 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.
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
## 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
## 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)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.
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
##
## Alza del futuro que dispara un llamado al margen: 125 puntos
## Reposicion si el futuro sube 1265.5 puntos en un mes:
## 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)
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.
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.
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.