# PARÁMETROS INICIALES
tickers <- c("WMT", "ROST", "DLTR")
indice <- "^GSPC" # S&P 500
capital_inicial <- 10000000
tasa_libre_riesgo <- 0.0402
fecha_inicio_datos <- "2015-07-31"
fecha_fin_datos <- "2025-07-31"
dias_comerciales <- 252
# DESCARGA DE DATOS HISTÓRICOS (10 AÑOS)
# Descargar precios ajustados
precios <- NULL
for (ticker in c(tickers, indice)) {
tryCatch({
datos <- getSymbols(ticker, from = fecha_inicio_datos,
to = fecha_fin_datos, auto.assign = FALSE)
precios <- cbind(precios, Ad(datos))
cat("✓", ticker, "descargado exitosamente\n")
}, error = function(e) {
cat("✗ Error descargando", ticker, "\n")
})
}
## ✓ WMT descargado exitosamente
## ✓ ROST descargado exitosamente
## ✓ DLTR descargado exitosamente
## ✓ ^GSPC descargado exitosamente
colnames(precios) <- c(tickers, "SP500")
# Calcular retornos logarítmicos
retornos <- na.omit(diff(log(precios)))
retornos_acciones <- retornos[, 1:3]
retornos_indice <- retornos[, 4]
cat("\nPeríodo de datos:", as.character(index(retornos)[1]), "a",
as.character(index(retornos)[nrow(retornos)]), "\n")
##
## Período de datos: 2015-08-03 a 2025-07-30
cat("Observaciones:", nrow(retornos), "días de negociación\n")
## Observaciones: 2513 días de negociación
ANÁLISIS FUNDAMENTAL
WMT: Perspectiva POSITIVA - Líder en retail con transformación digital exitosa Expectativa: Crecimiento sostenido impulsado por e-commerce y eficiencia
ROST:Perspectiva MODERADA - Modelo de negocio resistente, posible presión margen Expectativa: Estabilidad con crecimiento moderado, resistente a volatilidad
DLTR: Perspectiva CAUTELOSA - Competencia intensa, presión inflacionaria Expectativa: Volatilidad moderada, beneficio en entornos económicos difíciles
# PARTE 1: PORTAFOLIO ÓPTIMO DE INVERSIÓN
# 1.1 ANÁLISIS FUNDAMENTAL Y EXPECTATIVA DE PRECIOS
precio_actual <- as.numeric(tail(precios[, 1:3], 1))
precio_inicial <- as.numeric(head(precios[, 1:3], 1))
retorno_periodo <- (precio_actual - precio_inicial) / precio_inicial * 100
analisis_fundamental <- data.frame(
Ticker = tickers,
Sector = c("Consumer Staples", "Consumer Discretionary", "Consumer Discretionary"),
Empresa = c("Walmart Inc.", "Ross Stores Inc.", "Dollar Tree Inc."),
Precio_Actual_31Jul2025 = round(precio_actual, 2),
Retorno_10_años = paste0(round(retorno_periodo, 2), "%"),
Características = c(
"Líder retail, e-commerce fuerte, diversificación global",
"Descuentos off-price, resistente recesiones, márgenes sólidos",
"Dollar stores, mercado bajo ingreso, expansión agresiva"
)
)
# 1.2 RETORNOS ANUALES Y MATRIZ DE COVARIANZAS
# Anualizar estadísticas
retornos_anuales <- colMeans(retornos_acciones) * dias_comerciales
desv_std_anual <- apply(retornos_acciones, 2, sd) * sqrt(dias_comerciales)
# Matriz de varianzas y covarianzas anualizada
matriz_cov <- cov(retornos_acciones) * dias_comerciales
matriz_corr <- cor(retornos_acciones)
tabla_retornos <- data.frame(
Acción = tickers,
Retorno_Anual = paste0(round(retornos_anuales * 100, 2), "%"),
Desv_Std_Anual = paste0(round(desv_std_anual * 100, 2), "%"),
Coef_Variación = round(desv_std_anual / abs(retornos_anuales), 2)
)
print(kable(tabla_retornos))
##
##
## | |Acción |Retorno_Anual |Desv_Std_Anual | Coef_Variación|
## |:----|:------|:-------------|:--------------|--------------:|
## |WMT |WMT |16% |21.72% | 1.36|
## |ROST |ROST |10.58% |32.18% | 3.04|
## |DLTR |DLTR |3.81% |36.57% | 9.59|
cat("\n\nMATRIZ DE COVARIANZAS ANUALIZADA:\n")
##
##
## MATRIZ DE COVARIANZAS ANUALIZADA:
print(round(matriz_cov, 6))
## WMT ROST DLTR
## WMT 0.047192 0.019725 0.025079
## ROST 0.019725 0.103532 0.045209
## DLTR 0.025079 0.045209 0.133708
cat("\n\nMATRIZ DE CORRELACIONES:\n")
##
##
## MATRIZ DE CORRELACIONES:
print(round(matriz_corr, 3))
## WMT ROST DLTR
## WMT 1.000 0.282 0.316
## ROST 0.282 1.000 0.384
## DLTR 0.316 0.384 1.000
# 1.3 PORTAFOLIO DE MÍNIMA VARIANZA
# Portafolio de mínima varianza
n_activos <- length(tickers)
matriz_unos <- rep(1, n_activos)
matriz_cov_inv <- solve(matriz_cov)
# Pesos óptimos (mínima varianza)
pesos_optimos <- (matriz_cov_inv %*% matriz_unos) /
as.numeric(t(matriz_unos) %*% matriz_cov_inv %*% matriz_unos)
pesos_optimos <- as.vector(pesos_optimos)
names(pesos_optimos) <- tickers
# Estadísticas del portafolio
retorno_port <- sum(pesos_optimos * retornos_anuales)
varianza_port <- t(pesos_optimos) %*% matriz_cov %*% pesos_optimos
desv_std_port <- sqrt(varianza_port)
sharpe_ratio <- (retorno_port - tasa_libre_riesgo) / desv_std_port
cat("RETORNO ESPERADO DEL PORTAFOLIO:", round(retorno_port * 100, 2), "%\n")
## RETORNO ESPERADO DEL PORTAFOLIO: 13.74 %
cat("DESVIACIÓN ESTÁNDAR DEL PORTAFOLIO:", round(desv_std_port * 100, 2), "%\n")
## DESVIACIÓN ESTÁNDAR DEL PORTAFOLIO: 19.86 %
cat("SHARPE RATIO DEL PORTAFOLIO:", round(sharpe_ratio, 4), "\n\n")
## SHARPE RATIO DEL PORTAFOLIO: 0.4894
cat("Interpretación del Sharpe Ratio:\n")
## Interpretación del Sharpe Ratio:
if (sharpe_ratio > 1) {
cat("✓ Excelente - El portafolio ofrece muy buen retorno ajustado por riesgo\n")
} else if (sharpe_ratio > 0.5) {
cat("✓ Bueno - El portafolio ofrece retorno razonable por unidad de riesgo\n")
} else {
cat("⚠ Moderado - El retorno ajustado por riesgo es limitado\n")
}
## ⚠ Moderado - El retorno ajustado por riesgo es limitado
# 1.4 PESOS ÓPTIMOS Y ASIGNACIÓN DE CAPITAL
capital_por_accion <- pesos_optimos * capital_inicial
acciones_compradas <- capital_por_accion / precio_actual
asignacion <- data.frame(
Ticker = tickers,
Peso_Óptimo = paste0(round(pesos_optimos * 100, 2), "%"),
Capital_Asignado = dollar(capital_por_accion),
Precio_Acción = dollar(precio_actual),
Acciones = round(acciones_compradas, 0)
)
print(kable(asignacion, caption = "Asignación Óptima de Capital"))
##
##
## Table: Asignación Óptima de Capital
##
## | |Ticker |Peso_Óptimo |Capital_Asignado |Precio_Acción | Acciones|
## |:----|:------|:-----------|:----------------|:-------------|--------:|
## |WMT |WMT |69.94% |$6,994,295 |$97.36 | 71838|
## |ROST |ROST |20.67% |$2,066,781 |$138.11 | 14965|
## |DLTR |DLTR |9.39% |$938,924 |$114.15 | 8225|
# PARTE 2: ÓPTIMO DE CONTRATOS DE FUTUROS
# 2.1 CÁLCULO DEL VAR AL 1% Y 5%
# Retornos diarios del portafolio
retornos_port_diarios <- as.vector(retornos_acciones %*% pesos_optimos)
# VaR paramétrico
media_diaria <- mean(retornos_port_diarios)
desv_std_diaria <- sd(retornos_port_diarios)
z_1 <- qnorm(0.01)
z_5 <- qnorm(0.05)
var_1_porcentaje <- media_diaria + z_1 * desv_std_diaria
var_5_porcentaje <- media_diaria + z_5 * desv_std_diaria
var_1_dolares <- capital_inicial * var_1_porcentaje
var_5_dolares <- capital_inicial * var_5_porcentaje
# VaR histórico
var_hist_1 <- quantile(retornos_port_diarios, 0.01)
var_hist_5 <- quantile(retornos_port_diarios, 0.05)
var_hist_1_dolares <- capital_inicial * var_hist_1
var_hist_5_dolares <- capital_inicial * var_hist_5
cat("VaR PARAMÉTRICO (Distribución Normal):\n")
## VaR PARAMÉTRICO (Distribución Normal):
cat("─────────────────────────────────────\n")
## ─────────────────────────────────────
cat("VaR al 1% (diario):", dollar(var_1_dolares), "│",
round(var_1_porcentaje * 100, 2), "%\n")
## VaR al 1% (diario): -$285,576 │ -2.86 %
cat("VaR al 5% (diario):", dollar(var_5_dolares), "│",
round(var_5_porcentaje * 100, 2), "%\n\n")
## VaR al 5% (diario): -$200,320 │ -2 %
cat("VaR HISTÓRICO:\n")
## VaR HISTÓRICO:
cat("──────────────\n")
## ──────────────
cat("VaR al 1% (diario):", dollar(var_hist_1_dolares), "│",
round(var_hist_1 * 100, 2), "%\n")
## VaR al 1% (diario): -$319,109 │ -3.19 %
cat("VaR al 5% (diario):", dollar(var_hist_5_dolares), "│",
round(var_hist_5 * 100, 2), "%\n\n")
## VaR al 5% (diario): -$180,893 │ -1.81 %
cat("INTERPRETACIÓN DE ESCENARIOS:\n")
## INTERPRETACIÓN DE ESCENARIOS:
cat("─────────────────────────────\n")
## ─────────────────────────────
cat("• VaR 1%: Con 99% de confianza, la pérdida máxima diaria NO superará",
dollar(abs(var_1_dolares)), "\n")
## • VaR 1%: Con 99% de confianza, la pérdida máxima diaria NO superará $285,576
cat(" En 1 de cada 100 días, las pérdidas podrían exceder este monto.\n")
## En 1 de cada 100 días, las pérdidas podrían exceder este monto.
cat(" Este es el VALOR DE CUBRIMIENTO para escenarios extremos.\n\n")
## Este es el VALOR DE CUBRIMIENTO para escenarios extremos.
cat("• VaR 5%: Con 95% de confianza, la pérdida máxima diaria NO superará",
dollar(abs(var_5_dolares)), "\n")
## • VaR 5%: Con 95% de confianza, la pérdida máxima diaria NO superará $200,320
cat(" En 1 de cada 20 días, las pérdidas podrían exceder este monto.\n")
## En 1 de cada 20 días, las pérdidas podrían exceder este monto.
cat(" Este es el VALOR DE CUBRIMIENTO para escenarios normales adversos.\n\n")
## Este es el VALOR DE CUBRIMIENTO para escenarios normales adversos.
# 2.2 CÁLCULO DE BETAS (CAPM)
# Beta de cada acción
betas <- numeric(3)
r_squared <- numeric(3)
for (i in 1:3) {
modelo_capm <- lm(retornos_acciones[, i] ~ retornos_indice)
betas[i] <- coef(modelo_capm)[2]
r_squared[i] <- summary(modelo_capm)$r.squared
}
names(betas) <- tickers
# Beta del portafolio
beta_portafolio <- sum(pesos_optimos * betas)
cat("BETAS INDIVIDUALES (vs S&P 500):\n")
## BETAS INDIVIDUALES (vs S&P 500):
cat("────────────────────────────────\n")
## ────────────────────────────────
for (i in 1:3) {
cat(sprintf("%-6s β = %6.4f (R² = %.3f)", tickers[i], betas[i], r_squared[i]))
if (betas[i] > 1) {
cat(" → Más volátil que el mercado\n")
} else if (betas[i] < 1) {
cat(" → Menos volátil que el mercado\n")
} else {
cat(" → Igual volatilidad que el mercado\n")
}
}
## WMT β = 0.5181 (R² = 0.194) → Menos volátil que el mercado
## ROST β = 1.0267 (R² = 0.347) → Más volátil que el mercado
## DLTR β = 0.7351 (R² = 0.138) → Menos volátil que el mercado
cat("\n\nBETA DEL PORTAFOLIO: β =", round(beta_portafolio, 4), "\n")
##
##
## BETA DEL PORTAFOLIO: β = 0.6436
cat("Cálculo: β_p = ", paste0(round(pesos_optimos, 3), "×", round(betas, 3), collapse = " + "),
" = ", round(beta_portafolio, 4), "\n")
## Cálculo: β_p = 0.699×0.518 + 0.207×1.027 + 0.094×0.735 = 0.6436
if (beta_portafolio > 1) {
cat("\nInterpretación: El portafolio es MÁS VOLÁTIL que el S&P 500\n")
cat("Por cada 1% que se mueva el mercado, el portafolio se moverá aproximadamente",
round(beta_portafolio, 2), "%\n")
} else {
cat("\nInterpretación: El portafolio es MENOS VOLÁTIL que el S&P 500\n")
cat("Por cada 1% que se mueva el mercado, el portafolio se moverá aproximadamente",
round(beta_portafolio, 2), "%\n")
}
##
## Interpretación: El portafolio es MENOS VOLÁTIL que el S&P 500
## Por cada 1% que se mueva el mercado, el portafolio se moverá aproximadamente 0.64 %
# 2.3 NÚMERO ÓPTIMO DE CONTRATOS
# Parámetros del contrato futuro E-mini S&P 500
valor_sp500 <- as.numeric(tail(precios[, "SP500"], 1))
multiplicador <- 50 # E-mini S&P 500
valor_contrato <- valor_sp500 * multiplicador
garantia_inicial <- 13200 # Aproximado para E-mini
# Método 1: Basado en beta
contratos_beta <- (beta_portafolio * capital_inicial) / valor_contrato
# Método 2: Basado en VaR 1%
contratos_var <- abs(var_1_dolares) / valor_contrato
cat("PARÁMETROS DEL CONTRATO E-mini S&P 500:\n")
## PARÁMETROS DEL CONTRATO E-mini S&P 500:
cat("───────────────────────────────────────\n")
## ───────────────────────────────────────
cat("Nivel del S&P 500:", round(valor_sp500, 2), "\n")
## Nivel del S&P 500: 6362.9
cat("Multiplicador:", multiplicador, "\n")
## Multiplicador: 50
cat("Valor por contrato:", dollar(valor_contrato), "\n")
## Valor por contrato: $318,145
cat("Garantía inicial (aprox):", dollar(garantia_inicial), "\n\n")
## Garantía inicial (aprox): $13,200
cat("MÉTODO 1 - Basado en BETA:\n")
## MÉTODO 1 - Basado en BETA:
cat("──────────────────────────\n")
## ──────────────────────────
cat("Fórmula: N = (β × Valor_Portafolio) / Valor_Contrato\n")
## Fórmula: N = (β × Valor_Portafolio) / Valor_Contrato
cat("N = (", round(beta_portafolio, 4), "×", dollar(capital_inicial), ") /",
dollar(valor_contrato), "\n")
## N = ( 0.6436 × $10,000,000 ) / $318,145
cat("N =", round(contratos_beta, 2), "contratos\n")
## N = 20.23 contratos
cat("Redondeado:", ceiling(contratos_beta), "contratos\n\n")
## Redondeado: 21 contratos
cat("MÉTODO 2 - Basado en VaR al 1%:\n")
## MÉTODO 2 - Basado en VaR al 1%:
cat("───────────────────────────────\n")
## ───────────────────────────────
cat("Fórmula: N = |VaR| / Valor_Contrato\n")
## Fórmula: N = |VaR| / Valor_Contrato
cat("N =", dollar(abs(var_1_dolares)), "/", dollar(valor_contrato), "\n")
## N = $285,576 / $318,145
cat("N =", round(contratos_var, 2), "contratos\n")
## N = 0.9 contratos
cat("Redondeado:", ceiling(contratos_var), "contratos\n\n")
## Redondeado: 1 contratos
num_contratos <- ceiling(contratos_beta)
garantia_total <- num_contratos * garantia_inicial
cat("DECISIÓN FINAL: Se utilizarán", num_contratos, "contratos (método beta)\n")
## DECISIÓN FINAL: Se utilizarán 21 contratos (método beta)
cat("Garantía total requerida:", dollar(garantia_total), "\n")
## Garantía total requerida: $277,200
cat("Valor nominal cubierto:", dollar(num_contratos * valor_contrato), "\n")
## Valor nominal cubierto: $6,681,045
cat("Ratio de cobertura:", round((num_contratos * valor_contrato) / capital_inicial * 100, 1), "%\n")
## Ratio de cobertura: 66.8 %
# ============================================================================
# 2.4 MARGIN CALL Y ANÁLISIS DE RENTABILIDAD TRIMESTRAL
# Simular 4 trimestres
set.seed(123)
trimestres <- 4
dias_por_trimestre <- 63 # ~252/4
# Usar datos históricos reales del último año para simulación
if (length(retornos_port_diarios) >= dias_por_trimestre * trimestres) {
retornos_recientes <- tail(retornos_port_diarios, dias_por_trimestre * trimestres)
retornos_sp_recientes <- tail(as.vector(retornos_indice), dias_por_trimestre * trimestres)
} else {
# Si no hay suficientes datos, simular
retornos_recientes <- rnorm(dias_por_trimestre * trimestres,
mean = mean(retornos_port_diarios),
sd = sd(retornos_port_diarios))
retornos_sp_recientes <- rnorm(dias_por_trimestre * trimestres,
mean = mean(retornos_indice),
sd = sd(retornos_indice))
}
retornos_trimestrales <- numeric(trimestres)
mov_sp500_trimestral <- numeric(trimestres)
pnl_futuros_corto <- numeric(trimestres)
pnl_futuros_largo <- numeric(trimestres)
margin_calls <- numeric(trimestres)
for (t in 1:trimestres) {
inicio <- (t - 1) * dias_por_trimestre + 1
fin <- t * dias_por_trimestre
# Retorno del portafolio
retornos_trimestrales[t] <- sum(retornos_recientes[inicio:fin])
# Movimiento del S&P 500
mov_sp500_trimestral[t] <- sum(retornos_sp_recientes[inicio:fin])
# P&L de futuros CORTO (cobertura típica)
pnl_futuros_corto[t] <- -mov_sp500_trimestral[t] * num_contratos * valor_contrato
# P&L de futuros LARGO (especulación)
pnl_futuros_largo[t] <- mov_sp500_trimestral[t] * num_contratos * valor_contrato
# Margin call (si pérdida > 50% de garantía en posición corta)
retornos_diarios_trim <- retornos_sp_recientes[inicio:fin]
peor_dia <- max(retornos_diarios_trim) # Peor para posición corta
perdida_peor_dia <- peor_dia * num_contratos * valor_contrato
if (perdida_peor_dia > garantia_total * 0.5) {
margin_calls[t] <- perdida_peor_dia - garantia_total * 0.5
} else {
margin_calls[t] <- 0
}
}
cat("ANÁLISIS TRIMESTRAL DE FUTUROS (Posición CORTA - Cobertura):\n")
## ANÁLISIS TRIMESTRAL DE FUTUROS (Posición CORTA - Cobertura):
cat("════════════════════════════════════════════════════════════\n\n")
## ════════════════════════════════════════════════════════════
pnl_portafolio <- retornos_trimestrales * capital_inicial
pnl_total_corto <- pnl_portafolio + pnl_futuros_corto
tabla_trimestral <- data.frame(
Trim = paste0("Q", 1:trimestres),
Ret_Port = paste0(round(retornos_trimestrales * 100, 2), "%"),
PnL_Port = dollar(pnl_portafolio),
Mov_SP500 = paste0(round(mov_sp500_trimestral * 100, 2), "%"),
PnL_Futuros = dollar(pnl_futuros_corto),
Margin_Call = dollar(margin_calls),
PnL_Total = dollar(pnl_total_corto)
)
print(kable(tabla_trimestral))
##
##
## |Trim |Ret_Port |PnL_Port |Mov_SP500 |PnL_Futuros |Margin_Call |PnL_Total |
## |:----|:--------|:----------|:---------|:-----------|:-----------|:---------|
## |Q1 |8.79% |$879,158 |6.23% |-$416,045 |$13,602 |$463,112 |
## |Q2 |12.84% |$1,284,110 |4.34% |-$290,112 |$28,301 |$993,998 |
## |Q3 |-0.95% |-$95,227 |-8.72% |$582,803 |$468,673 |$487,576 |
## |Q4 |4.24% |$424,109 |13.47% |-$900,183 |$75,461 |-$476,074 |
cat("\n\nRESUMEN DE 4 TRIMESTRES:\n")
##
##
## RESUMEN DE 4 TRIMESTRES:
cat("════════════════════════\n")
## ════════════════════════
cat("Total P&L Portafolio sin cobertura:", dollar(sum(pnl_portafolio)),
sprintf("(%.2f%%)", sum(retornos_trimestrales) * 100), "\n")
## Total P&L Portafolio sin cobertura: $2,492,150 (24.92%)
cat("Total P&L Futuros (corto):", dollar(sum(pnl_futuros_corto)), "\n")
## Total P&L Futuros (corto): -$1,023,538
cat("Total P&L CON cobertura:", dollar(sum(pnl_total_corto)), "\n")
## Total P&L CON cobertura: $1,468,612
cat("Total Margin Calls:", dollar(sum(margin_calls)), "\n")
## Total Margin Calls: $586,036
cat("Costo roll-over estimado (0.15% trimestral):",
dollar(num_contratos * valor_contrato * 0.0015 * 4), "\n\n")
## Costo roll-over estimado (0.15% trimestral): $40,086.27
cat("EFECTIVIDAD DE LA COBERTURA:\n")
## EFECTIVIDAD DE LA COBERTURA:
cat("────────────────────────────\n")
## ────────────────────────────
reduccion_volatilidad <- sd(pnl_total_corto) / sd(pnl_portafolio)
cat("Reducción de volatilidad:", round((1 - reduccion_volatilidad) * 100, 1), "%\n")
## Reducción de volatilidad: -3.2 %
cat("Correlación Port-Futuros:", round(cor(pnl_portafolio, pnl_futuros_corto), 3), "\n\n")
## Correlación Port-Futuros: -0.489
cat("\n\nANÁLISIS COMPARATIVO: LARGO vs CORTO\n")
##
##
## ANÁLISIS COMPARATIVO: LARGO vs CORTO
cat("═════════════════════════════════════\n\n")
## ═════════════════════════════════════
pnl_total_largo <- pnl_portafolio + pnl_futuros_largo
tabla_comparativa <- data.frame(
Trimestre = paste0("Q", 1:trimestres),
Solo_Portafolio = dollar(pnl_portafolio),
Con_Cobertura_Corta = dollar(pnl_total_corto),
Con_Posicion_Larga = dollar(pnl_total_largo)
)
print(kable(tabla_comparativa))
##
##
## |Trimestre |Solo_Portafolio |Con_Cobertura_Corta |Con_Posicion_Larga |
## |:---------|:---------------|:-------------------|:------------------|
## |Q1 |$879,158 |$463,112 |$1,295,203 |
## |Q2 |$1,284,110 |$993,998 |$1,574,222 |
## |Q3 |-$95,227 |$487,576 |-$678,029 |
## |Q4 |$424,109 |-$476,074 |$1,324,292 |
cat("\n\nRESULTADOS FINALES:\n")
##
##
## RESULTADOS FINALES:
cat("───────────────────\n")
## ───────────────────
cat("1. Solo Portafolio:", dollar(sum(pnl_portafolio)), "\n")
## 1. Solo Portafolio: $2,492,150
cat("2. Portafolio + Cobertura (CORTO):", dollar(sum(pnl_total_corto)), "\n")
## 2. Portafolio + Cobertura (CORTO): $1,468,612
cat("3. Portafolio + Especulación (LARGO):", dollar(sum(pnl_total_largo)), "\n\n")
## 3. Portafolio + Especulación (LARGO): $3,515,688
cat("ANÁLISIS DE ESTRATEGIAS:\n")
## ANÁLISIS DE ESTRATEGIAS:
cat("════════════════════════\n\n")
## ════════════════════════
cat("ESTRATEGIA 1 - TODO EN CORTO (Full Hedge):\n")
## ESTRATEGIA 1 - TODO EN CORTO (Full Hedge):
cat("───────────────────────────────────────────\n")
## ───────────────────────────────────────────
cat("• Objetivo: Protección total contra caídas del mercado\n")
## • Objetivo: Protección total contra caídas del mercado
cat("• Resultado observado:", dollar(sum(pnl_futuros_corto)), "en futuros\n")
## • Resultado observado: -$1,023,538 en futuros
cat("• Ventaja: Minimiza pérdidas cuando el mercado cae\n")
## • Ventaja: Minimiza pérdidas cuando el mercado cae
cat("• Desventaja: Limita ganancias cuando el mercado sube\n")
## • Desventaja: Limita ganancias cuando el mercado sube
cat("• Beta efectivo: ~0 (neutral al mercado)\n")
## • Beta efectivo: ~0 (neutral al mercado)
if (sum(mov_sp500_trimestral) < 0) {
cat("• ✓ En este período PROTEGIÓ contra caídas del mercado\n")
} else {
cat("• ✗ En este período LIMITÓ las ganancias del mercado alcista\n")
}
## • ✗ En este período LIMITÓ las ganancias del mercado alcista
cat("\n")
cat("ESTRATEGIA 2 - TODO EN LARGO (Especulación):\n")
## ESTRATEGIA 2 - TODO EN LARGO (Especulación):
cat("─────────────────────────────────────────────\n")
## ─────────────────────────────────────────────
cat("• Objetivo: Amplificar ganancias del mercado alcista\n")
## • Objetivo: Amplificar ganancias del mercado alcista
cat("• Resultado observado:", dollar(sum(pnl_total_largo)), "total\n")
## • Resultado observado: $3,515,688 total
cat("• Ventaja: Duplica exposición si mercado sube\n")
## • Ventaja: Duplica exposición si mercado sube
cat("• Desventaja: Duplica pérdidas si mercado cae\n")
## • Desventaja: Duplica pérdidas si mercado cae
cat("• Beta efectivo: ~", round(beta_portafolio * 2, 2), "(doble exposición)\n")
## • Beta efectivo: ~ 1.29 (doble exposición)
cat("• ⚠ ALTO RIESGO - No recomendado como cobertura\n")
## • ⚠ ALTO RIESGO - No recomendado como cobertura
if (sum(mov_sp500_trimestral) > 0) {
cat("• ✓ En este período AMPLIFICÓ las ganancias\n")
} else {
cat("• ✗ En este período AMPLIFICÓ las pérdidas\n")
}
## • ✓ En este período AMPLIFICÓ las ganancias
cat("\n")
cat("ESTRATEGIA RECOMENDADA - ROLL-OVER TRIMESTRAL:\n")
## ESTRATEGIA RECOMENDADA - ROLL-OVER TRIMESTRAL:
cat("───────────────────────────────────────────────\n")
## ───────────────────────────────────────────────
cat("• Rebalancear posición cada trimestre según β actual\n")
## • Rebalancear posición cada trimestre según β actual
cat("• Costos estimados:\n")
## • Costos estimados:
cat(" - Comisión por contrato: ~$2.50\n")
## - Comisión por contrato: ~$2.50
cat(" - Spread bid-ask: ~0.25 puntos ($12.50 por contrato)\n")
## - Spread bid-ask: ~0.25 puntos ($12.50 por contrato)
cat(" - Costo total por roll-over:", dollar((2.50 + 12.50) * num_contratos), "\n")
## - Costo total por roll-over: $315
cat(" - Costo anual (4 roll-overs):", dollar((2.50 + 12.50) * num_contratos * 4), "\n")
## - Costo anual (4 roll-overs): $1,260
cat("• Ajustar número de contratos si β cambia >5%\n")
## • Ajustar número de contratos si β cambia >5%
cat("• Mantener cobertura dinámica, no estática\n\n")
## • Mantener cobertura dinámica, no estática
# 2.5 VALOR ESPERADO DE LA COBERTURA TRIMESTRAL
# Valor esperado del portafolio sin cobertura
retorno_trimestral_esperado <- retorno_port / 4
valor_esperado_sin_cobertura <- capital_inicial * (1 + retorno_trimestral_esperado)
# Valor esperado con cobertura perfecta
retorno_libre_riesgo_trimestral <- tasa_libre_riesgo / 4
valor_esperado_con_cobertura <- capital_inicial * (1 + retorno_libre_riesgo_trimestral)
# Costo de la cobertura
costo_cobertura <- valor_esperado_sin_cobertura - valor_esperado_con_cobertura
costo_cobertura_porcentaje <- (costo_cobertura / capital_inicial) * 100
# Valor esperado del portafolio cubierto (ajustado por beta)
retorno_alpha <- retorno_port - beta_portafolio * (colMeans(retornos_indice) * dias_comerciales)
retorno_esperado_cubierto_trimestral <- (retorno_alpha + tasa_libre_riesgo) / 4
valor_esperado_cubierto_real <- capital_inicial * (1 + retorno_esperado_cubierto_trimestral)
cat("VALOR ESPERADO TRIMESTRAL:\n")
## VALOR ESPERADO TRIMESTRAL:
cat("══════════════════════════\n\n")
## ══════════════════════════
cat("1. SIN COBERTURA:\n")
## 1. SIN COBERTURA:
cat(" Valor inicial:", dollar(capital_inicial), "\n")
## Valor inicial: $10,000,000
cat(" Retorno esperado trimestral:", round(retorno_trimestral_esperado * 100, 2), "%\n")
## Retorno esperado trimestral: 3.43 %
cat(" Valor esperado:", dollar(valor_esperado_sin_cobertura), "\n")
## Valor esperado: $10,343,481
cat(" Ganancia esperada:", dollar(valor_esperado_sin_cobertura - capital_inicial), "\n\n")
## Ganancia esperada: $343,481
cat("2. CON COBERTURA COMPLETA (β neutralizado):\n")
## 2. CON COBERTURA COMPLETA (β neutralizado):
cat(" Retorno esperado trimestral:", round(retorno_libre_riesgo_trimestral * 100, 2),
"% (tasa libre de riesgo)\n")
## Retorno esperado trimestral: 1 % (tasa libre de riesgo)
cat(" Valor esperado:", dollar(valor_esperado_con_cobertura), "\n")
## Valor esperado: $10,100,500
cat(" Ganancia esperada:", dollar(valor_esperado_con_cobertura - capital_inicial), "\n\n")
## Ganancia esperada: $100,500
cat("3. CON COBERTURA AJUSTADA (considerando alpha):\n")
## 3. CON COBERTURA AJUSTADA (considerando alpha):
cat(" Retorno esperado trimestral:", round(retorno_esperado_cubierto_trimestral * 100, 2), "%\n")
## Retorno esperado trimestral: 2.65 %
cat(" Valor esperado:", dollar(valor_esperado_cubierto_real), "\n")
## Valor esperado: $10,265,416
cat(" Ganancia esperada:", dollar(valor_esperado_cubierto_real - capital_inicial), "\n\n")
## Ganancia esperada: $265,416
cat("COSTO DE LA COBERTURA:\n")
## COSTO DE LA COBERTURA:
cat("──────────────────────\n")
## ──────────────────────
cat("Costo trimestral:", dollar(costo_cobertura),
sprintf("(%.2f%% del capital)", costo_cobertura_porcentaje), "\n")
## Costo trimestral: $242,981 (2.43% del capital)
cat("Costo anual estimado:", dollar(costo_cobertura * 4),
sprintf("(%.2f%%)", costo_cobertura_porcentaje * 4), "\n\n")
## Costo anual estimado: $971,925 (9.72%)
cat("ANÁLISIS DEL VALOR ESPERADO:\n")
## ANÁLISIS DEL VALOR ESPERADO:
cat("════════════════════════════\n")
## ════════════════════════════
cat("• La cobertura REDUCE el retorno esperado en",
round(costo_cobertura_porcentaje, 2), "% trimestral\n")
## • La cobertura REDUCE el retorno esperado en 2.43 % trimestral
cat("• A cambio, PROTEGE contra pérdidas extremas (VaR 1% =",
dollar(abs(var_1_dolares)), ")\n")
## • A cambio, PROTEGE contra pérdidas extremas (VaR 1% = $285,576 )
cat("• Tasa libre de riesgo actual (^TNX 3-5Y):",
paste0(round(tasa_libre_riesgo * 100, 2), "%"), "\n\n")
## • Tasa libre de riesgo actual (^TNX 3-5Y): 4.02%
cat("JUSTIFICACIÓN DE LA COBERTURA:\n")
## JUSTIFICACIÓN DE LA COBERTURA:
cat("───────────────────────────────\n")
## ───────────────────────────────
ratio_beneficio_costo <- abs(var_1_dolares) / (costo_cobertura * 4)
cat("• Ratio Beneficio/Costo anual:", round(ratio_beneficio_costo, 2), "\n")
## • Ratio Beneficio/Costo anual: 0.29
cat("• Por cada $1 gastado en cobertura, se protegen $",
round(ratio_beneficio_costo, 0), "de pérdidas potenciales\n")
## • Por cada $1 gastado en cobertura, se protegen $ 0 de pérdidas potenciales
if (ratio_beneficio_costo > 10) {
cat("• ✓ RECOMENDACIÓN: La cobertura es ALTAMENTE JUSTIFICADA\n")
} else if (ratio_beneficio_costo > 5) {
cat("• ✓ RECOMENDACIÓN: La cobertura es JUSTIFICADA\n")
} else {
cat("• ⚠ RECOMENDACIÓN: Evaluar alternativas de cobertura\n")
}
## • ⚠ RECOMENDACIÓN: Evaluar alternativas de cobertura
cat("\n• La cobertura es óptima cuando:\n")
##
## • La cobertura es óptima cuando:
cat(" 1. Se espera alta volatilidad en el mercado (σ actual:",
round(desv_std_diaria * sqrt(252) * 100, 1), "%)\n")
## 1. Se espera alta volatilidad en el mercado (σ actual: 19.9 %)
cat(" 2. El VaR potencial supera significativamente el costo\n")
## 2. El VaR potencial supera significativamente el costo
cat(" 3. El horizonte de inversión es largo (4 años en este caso)\n")
## 3. El horizonte de inversión es largo (4 años en este caso)
cat(" 4. Se busca protección contra cisnes negros\n\n")
## 4. Se busca protección contra cisnes negros
# 2.6 EXPLORACIÓN DE BETAS ALTERNATIVAS (0.8 y 1.5)
betas_alternativos <- c(0.8, 1.5)
resultados_sensibilidad <- list()
for (idx in 1:length(betas_alternativos)) {
beta_alt <- betas_alternativos[idx]
# Calcular contratos para beta alternativo
contratos_alt <- ceiling((beta_alt * capital_inicial) / valor_contrato)
garantia_alt <- contratos_alt * garantia_inicial
# Simular P&L con beta alternativo
pnl_futuros_alt <- -mov_sp500_trimestral * contratos_alt * valor_contrato
pnl_total_alt <- pnl_portafolio + pnl_futuros_alt
# Calcular estadísticas
retorno_total_alt <- sum(pnl_total_alt)
volatilidad_alt <- sd(pnl_total_alt)
sharpe_alt <- mean(pnl_total_alt) / sd(pnl_total_alt) * sqrt(4)
resultados_sensibilidad[[idx]] <- list(
beta = beta_alt,
contratos = contratos_alt,
garantia = garantia_alt,
pnl_futuros = pnl_futuros_alt,
pnl_total = pnl_total_alt,
retorno_total = retorno_total_alt,
volatilidad = volatilidad_alt,
sharpe = sharpe_alt
)
cat("\n", rep("═", 70), "\n")
cat("ESCENARIO: β =", beta_alt, "\n")
cat(rep("═", 70), "\n\n")
cat("CONFIGURACIÓN:\n")
cat("──────────────\n")
cat("Número de contratos:", contratos_alt, "\n")
cat(" • Diferencia vs β original (", round(beta_portafolio, 2), "):",
sprintf("%+d contratos", contratos_alt - num_contratos), "\n")
cat(" • Cambio porcentual:",
sprintf("%+.1f%%", (contratos_alt / num_contratos - 1) * 100), "\n")
cat("Garantía requerida:", dollar(garantia_alt), "\n")
cat(" • Diferencia:", sprintf("%s", dollar(garantia_alt - garantia_total)), "\n")
cat("Valor nominal cubierto:", dollar(contratos_alt * valor_contrato), "\n")
cat("Ratio de cobertura:",
round((contratos_alt * valor_contrato) / capital_inicial * 100, 1), "%\n\n")
cat("RESULTADOS TRIMESTRALES (4 trimestres):\n")
cat("═══════════════════════════════════════\n\n")
tabla_alt <- data.frame(
Trim = paste0("Q", 1:trimestres),
PnL_Port = dollar(pnl_portafolio),
PnL_Fut = dollar(pnl_futuros_alt),
PnL_Total = dollar(pnl_total_alt)
)
print(kable(tabla_alt))
cat("\n\nRESUMEN DE PERFORMANCE:\n")
cat("───────────────────────\n")
cat("P&L Total en futuros:", dollar(sum(pnl_futuros_alt)), "\n")
cat("P&L Total combinado:", dollar(retorno_total_alt), "\n")
cat("Volatilidad del portafolio cubierto:", dollar(volatilidad_alt), "\n")
cat("Sharpe Ratio anualizado:", round(sharpe_alt, 3), "\n\n")
cat("COMPARACIÓN CON β ORIGINAL:\n")
cat("───────────────────────────\n")
diferencia_pnl <- retorno_total_alt - sum(pnl_total_corto)
diferencia_vol <- volatilidad_alt - sd(pnl_total_corto)
cat("Diferencia en P&L:", dollar(diferencia_pnl))
if (diferencia_pnl > 0) {
cat(" (MEJOR)\n")
} else {
cat(" (PEOR)\n")
}
cat("Diferencia en volatilidad:", dollar(diferencia_vol))
if (diferencia_vol < 0) {
cat(" (Menos volátil - MEJOR)\n")
} else {
cat(" (Más volátil - PEOR)\n")
}
cat("\nEficiencia de cobertura:",
round((1 - volatilidad_alt / sd(pnl_portafolio)) * 100, 1), "%\n\n")
cat("INTERPRETACIÓN:\n")
cat("───────────────\n")
if (beta_alt < beta_portafolio) {
cat("✓ SUB-COBERTURA (β =", beta_alt, "< β_portafolio =",
round(beta_portafolio, 2), ")\n\n")
cat("Características:\n")
cat(" • Protección PARCIAL contra movimientos del mercado\n")
cat(" • Mayor exposición al riesgo de mercado\n")
cat(" • Menor costo de cobertura\n")
cat(" • Participa más en mercados alcistas\n")
cat(" • Sufre más en mercados bajistas\n\n")
cat("Cuándo usar:\n")
cat(" • Perspectiva moderadamente alcista del mercado\n")
cat(" • Busca balance entre protección y crecimiento\n")
cat(" • Presupuesto limitado para garantías\n")
cat(" • Mayor tolerancia al riesgo\n")
} else if (beta_alt > beta_portafolio) {
cat("✓ SOBRE-COBERTURA (β =", beta_alt, "> β_portafolio =",
round(beta_portafolio, 2), ")\n\n")
cat("Características:\n")
cat(" • Protección EXCESIVA - invierte exposición al mercado\n")
cat(" • Gana cuando el mercado cae (posición neta corta)\n")
cat(" • Pierde cuando el mercado sube\n")
cat(" • Mayor costo de cobertura (más contratos)\n")
cat(" • Estrategia de apuesta bajista\n\n")
cat("Cuándo usar:\n")
cat(" • Perspectiva BAJISTA del mercado\n")
cat(" • Especulación direccional a la baja\n")
cat(" • Expectativa de corrección significativa\n")
cat(" • NO recomendado como cobertura tradicional\n")
cat(" • ⚠ ALTO RIESGO - esto es ESPECULACIÓN, no cobertura\n")
}
cat("\n")
}
##
## ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
## ESCENARIO: β = 0.8
## ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
##
## CONFIGURACIÓN:
## ──────────────
## Número de contratos: 26
## • Diferencia vs β original ( 0.64 ): +5 contratos
## • Cambio porcentual: +23.8%
## Garantía requerida: $343,200
## • Diferencia: $66,000
## Valor nominal cubierto: $8,271,770
## Ratio de cobertura: 82.7 %
##
## RESULTADOS TRIMESTRALES (4 trimestres):
## ═══════════════════════════════════════
##
##
##
## |Trim |PnL_Port |PnL_Fut |PnL_Total |
## |:----|:----------|:-----------|:---------|
## |Q1 |$879,158 |-$515,104 |$364,054 |
## |Q2 |$1,284,110 |-$359,187 |$924,923 |
## |Q3 |-$95,227 |$721,565 |$626,338 |
## |Q4 |$424,109 |-$1,114,512 |-$690,403 |
##
##
## RESUMEN DE PERFORMANCE:
## ───────────────────────
## P&L Total en futuros: -$1,267,237
## P&L Total combinado: $1,224,913
## Volatilidad del portafolio cubierto: $702,821
## Sharpe Ratio anualizado: 0.871
##
## COMPARACIÓN CON β ORIGINAL:
## ───────────────────────────
## Diferencia en P&L: -$243,700 (PEOR)
## Diferencia en volatilidad: $89,720.76 (Más volátil - PEOR)
##
## Eficiencia de cobertura: -18.3 %
##
## INTERPRETACIÓN:
## ───────────────
## ✓ SOBRE-COBERTURA (β = 0.8 > β_portafolio = 0.64 )
##
## Características:
## • Protección EXCESIVA - invierte exposición al mercado
## • Gana cuando el mercado cae (posición neta corta)
## • Pierde cuando el mercado sube
## • Mayor costo de cobertura (más contratos)
## • Estrategia de apuesta bajista
##
## Cuándo usar:
## • Perspectiva BAJISTA del mercado
## • Especulación direccional a la baja
## • Expectativa de corrección significativa
## • NO recomendado como cobertura tradicional
## • ⚠ ALTO RIESGO - esto es ESPECULACIÓN, no cobertura
##
##
## ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
## ESCENARIO: β = 1.5
## ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
##
## CONFIGURACIÓN:
## ──────────────
## Número de contratos: 48
## • Diferencia vs β original ( 0.64 ): +27 contratos
## • Cambio porcentual: +128.6%
## Garantía requerida: $633,600
## • Diferencia: $356,400
## Valor nominal cubierto: $15,270,960
## Ratio de cobertura: 152.7 %
##
## RESULTADOS TRIMESTRALES (4 trimestres):
## ═══════════════════════════════════════
##
##
##
## |Trim |PnL_Port |PnL_Fut |PnL_Total |
## |:----|:----------|:-----------|:-----------|
## |Q1 |$879,158 |-$950,961 |-$71,803 |
## |Q2 |$1,284,110 |-$663,114 |$620,996 |
## |Q3 |-$95,227 |$1,332,120 |$1,236,894 |
## |Q4 |$424,109 |-$2,057,561 |-$1,633,452 |
##
##
## RESUMEN DE PERFORMANCE:
## ───────────────────────
## P&L Total en futuros: -$2,339,515
## P&L Total combinado: $152,635
## Volatilidad del portafolio cubierto: $1,235,993
## Sharpe Ratio anualizado: 0.062
##
## COMPARACIÓN CON β ORIGINAL:
## ───────────────────────────
## Diferencia en P&L: -$1,315,977 (PEOR)
## Diferencia en volatilidad: $622,893 (Más volátil - PEOR)
##
## Eficiencia de cobertura: -108.1 %
##
## INTERPRETACIÓN:
## ───────────────
## ✓ SOBRE-COBERTURA (β = 1.5 > β_portafolio = 0.64 )
##
## Características:
## • Protección EXCESIVA - invierte exposición al mercado
## • Gana cuando el mercado cae (posición neta corta)
## • Pierde cuando el mercado sube
## • Mayor costo de cobertura (más contratos)
## • Estrategia de apuesta bajista
##
## Cuándo usar:
## • Perspectiva BAJISTA del mercado
## • Especulación direccional a la baja
## • Expectativa de corrección significativa
## • NO recomendado como cobertura tradicional
## • ⚠ ALTO RIESGO - esto es ESPECULACIÓN, no cobertura
# Tabla comparativa final
cat("\n\n", rep("═", 70), "\n")
##
##
## ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
cat("TABLA COMPARATIVA DE TODOS LOS ESCENARIOS DE BETA\n")
## TABLA COMPARATIVA DE TODOS LOS ESCENARIOS DE BETA
cat(rep("═", 70), "\n\n")
## ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═ ═
comparacion_final <- data.frame(
Beta = c(beta_portafolio, betas_alternativos),
Contratos = c(num_contratos,
resultados_sensibilidad[[1]]$contratos,
resultados_sensibilidad[[2]]$contratos),
Garantia = c(garantia_total,
resultados_sensibilidad[[1]]$garantia,
resultados_sensibilidad[[2]]$garantia),
PnL_Total = c(sum(pnl_total_corto),
resultados_sensibilidad[[1]]$retorno_total,
resultados_sensibilidad[[2]]$retorno_total),
Volatilidad = c(sd(pnl_total_corto),
resultados_sensibilidad[[1]]$volatilidad,
resultados_sensibilidad[[2]]$volatilidad),
Sharpe = c(mean(pnl_total_corto) / sd(pnl_total_corto) * sqrt(4),
resultados_sensibilidad[[1]]$sharpe,
resultados_sensibilidad[[2]]$sharpe)
)
comparacion_final$Beta <- round(comparacion_final$Beta, 2)
comparacion_final$Garantia <- dollar(comparacion_final$Garantia)
comparacion_final$PnL_Total <- dollar(comparacion_final$PnL_Total)
comparacion_final$Volatilidad <- dollar(comparacion_final$Volatilidad)
comparacion_final$Sharpe <- round(comparacion_final$Sharpe, 3)
print(kable(comparacion_final, caption = "Comparación de Escenarios de Beta"))
##
##
## Table: Comparación de Escenarios de Beta
##
## | Beta| Contratos|Garantia |PnL_Total |Volatilidad | Sharpe|
## |----:|---------:|:--------|:----------|:-----------|------:|
## | 0.64| 21|$277,200 |$1,468,612 |$613,100 | 1.198|
## | 0.80| 26|$343,200 |$1,224,913 |$702,821 | 0.871|
## | 1.50| 48|$633,600 |$152,635 |$1,235,993 | 0.062|
cat("\n\nCONCLUSIONES FINALES:\n")
##
##
## CONCLUSIONES FINALES:
cat("═════════════════════\n\n")
## ═════════════════════
cat("1. IMPACTO EN NÚMERO DE CONTRATOS:\n")
## 1. IMPACTO EN NÚMERO DE CONTRATOS:
cat(" • β = 0.8: ", resultados_sensibilidad[[1]]$contratos, "contratos (",
sprintf("%+.1f%%", (resultados_sensibilidad[[1]]$contratos/num_contratos - 1) * 100),
"vs β original)\n")
## • β = 0.8: 26 contratos ( +23.8% vs β original)
cat(" • β = 1.5: ", resultados_sensibilidad[[2]]$contratos, "contratos (",
sprintf("%+.1f%%", (resultados_sensibilidad[[2]]$contratos/num_contratos - 1) * 100),
"vs β original)\n\n")
## • β = 1.5: 48 contratos ( +128.6% vs β original)
cat("2. IMPACTO EN RESULTADOS:\n")
## 2. IMPACTO EN RESULTADOS:
mejor_sharpe <- which.max(c(mean(pnl_total_corto) / sd(pnl_total_corto),
resultados_sensibilidad[[1]]$sharpe,
resultados_sensibilidad[[2]]$sharpe))
betas_todos <- c(beta_portafolio, 0.8, 1.5)
cat(" • Mejor Sharpe Ratio: β =", betas_todos[mejor_sharpe], "\n")
## • Mejor Sharpe Ratio: β = 0.8
cat(" • Menor volatilidad: β =",
betas_todos[which.min(c(sd(pnl_total_corto),
resultados_sensibilidad[[1]]$volatilidad,
resultados_sensibilidad[[2]]$volatilidad))], "\n")
## • Menor volatilidad: β = 0.6435922
cat(" • Mayor P&L (este período): β =",
betas_todos[which.max(c(sum(pnl_total_corto),
resultados_sensibilidad[[1]]$retorno_total,
resultados_sensibilidad[[2]]$retorno_total))], "\n\n")
## • Mayor P&L (este período): β = 0.6435922
cat("3. SENSIBILIDAD DEL MODELO:\n")
## 3. SENSIBILIDAD DEL MODELO:
cat(" • Un cambio de β de", round(beta_portafolio, 2), "a 0.8 (-",
round((1 - 0.8/beta_portafolio) * 100, 0), "%)\n")
## • Un cambio de β de 0.64 a 0.8 (- -24 %)
cat(" requiere",
abs(num_contratos - resultados_sensibilidad[[1]]$contratos),
"contratos MENOS\n")
## requiere 5 contratos MENOS
cat(" • Un cambio de β de", round(beta_portafolio, 2), "a 1.5 (+",
round((1.5/beta_portafolio - 1) * 100, 0), "%)\n")
## • Un cambio de β de 0.64 a 1.5 (+ 133 %)
cat(" requiere",
abs(resultados_sensibilidad[[2]]$contratos - num_contratos),
"contratos MÁS\n\n")
## requiere 27 contratos MÁS
cat("4. RECOMENDACIÓN ESTRATÉGICA:\n")
## 4. RECOMENDACIÓN ESTRATÉGICA:
cat(" • Para COBERTURA conservadora: β = 0.8 (sub-cobertura)\n")
## • Para COBERTURA conservadora: β = 0.8 (sub-cobertura)
cat(" • Para COBERTURA óptima: β =", round(beta_portafolio, 2),
"(beta del portafolio)\n")
## • Para COBERTURA óptima: β = 0.64 (beta del portafolio)
cat(" • Para ESPECULACIÓN bajista: β = 1.5 (sobre-cobertura)\n\n")
## • Para ESPECULACIÓN bajista: β = 1.5 (sobre-cobertura)
cat(" ⚠ IMPORTANTE: El β óptimo depende de:\n")
## ⚠ IMPORTANTE: El β óptimo depende de:
cat(" - Perspectiva del mercado (alcista/bajista)\n")
## - Perspectiva del mercado (alcista/bajista)
cat(" - Tolerancia al riesgo del inversionista\n")
## - Tolerancia al riesgo del inversionista
cat(" - Horizonte de inversión\n")
## - Horizonte de inversión
cat(" - Costos de transacción y garantías disponibles\n\n")
## - Costos de transacción y garantías disponibles
# RESUMEN EJECUTIVO FINAL
cat("PORTAFOLIO ÓPTIMO:\n")
## PORTAFOLIO ÓPTIMO:
cat("══════════════════\n")
## ══════════════════
cat("Capital inicial:", dollar(capital_inicial), "\n")
## Capital inicial: $10,000,000
cat("Composición:\n")
## Composición:
for (i in 1:length(tickers)) {
cat(" •", tickers[i], ":", sprintf("%5.1f%%", pesos_optimos[i] * 100),
"│", dollar(capital_por_accion[i]), "\n")
}
## • WMT : 69.9% │ $6,994,295
## • ROST : 20.7% │ $2,066,781
## • DLTR : 9.4% │ $938,924
cat("\nRetorno esperado anual:", round(retorno_port * 100, 2), "%\n")
##
## Retorno esperado anual: 13.74 %
cat("Volatilidad anual:", round(desv_std_port * 100, 2), "%\n")
## Volatilidad anual: 19.86 %
cat("Sharpe Ratio:", round(sharpe_ratio, 3), "\n")
## Sharpe Ratio: 0.489
cat("Beta del portafolio:", round(beta_portafolio, 4), "\n\n")
## Beta del portafolio: 0.6436
cat("ESTRATEGIA DE COBERTURA:\n")
## ESTRATEGIA DE COBERTURA:
cat("════════════════════════\n")
## ════════════════════════
cat("Instrumento: E-mini S&P 500 Futures\n")
## Instrumento: E-mini S&P 500 Futures
cat("Número de contratos:", num_contratos, "\n")
## Número de contratos: 21
cat("Valor por contrato:", dollar(valor_contrato), "\n")
## Valor por contrato: $318,145
cat("Garantía total:", dollar(garantia_total), "\n")
## Garantía total: $277,200
cat("Valor nominal cubierto:", dollar(num_contratos * valor_contrato), "\n\n")
## Valor nominal cubierto: $6,681,045
cat("MÉTRICAS DE RIESGO:\n")
## MÉTRICAS DE RIESGO:
cat("═══════════════════\n")
## ═══════════════════
cat("VaR diario (1%):", dollar(var_1_dolares), "\n")
## VaR diario (1%): -$285,576
cat("VaR diario (5%):", dollar(var_5_dolares), "\n")
## VaR diario (5%): -$200,320
cat("Reducción de volatilidad con cobertura:",
round((1 - sd(pnl_total_corto) / sd(pnl_portafolio)) * 100, 1), "%\n\n")
## Reducción de volatilidad con cobertura: -3.2 %
cat("PROYECCIÓN 4 AÑOS:\n")
## PROYECCIÓN 4 AÑOS:
cat("══════════════════\n")
## ══════════════════
cat("Valor esperado sin cobertura:", dollar(capital_inicial * (1 + retorno_port * 4)), "\n")
## Valor esperado sin cobertura: $15,495,701
cat("Costo estimado de cobertura anual:",
dollar(costo_cobertura * 4 + (2.50 + 12.50) * num_contratos * 4), "\n")
## Costo estimado de cobertura anual: $973,185
cat("Roll-overs requeridos: 16 (trimestrales)\n\n")
## Roll-overs requeridos: 16 (trimestrales)
cat("═══════════════════════════════════════════════════════════════════\n")
## ═══════════════════════════════════════════════════════════════════
cat(" Análisis completado exitosamente\n")
## Análisis completado exitosamente
cat(" Fecha:", format(Sys.Date(), "%d de %B de %Y"), "\n")
## Fecha: 27 de octubre de 2025
cat("═══════════════════════════════════════════════════════════════════\n")
## ═══════════════════════════════════════════════════════════════════