INTRODUCCION

En el contexto actual de alta volatilidad financiera, la gestión de portafolios requiere no solo optimización en la asignación de activos, sino también estrategias de cobertura que mitiguen el riesgo extremo. Este informe presenta el análisis de un portafolio compuesto por tres acciones (AAPL, NFLX y LLY), abordando su simulación de precios futuros, estimación de riesgo mediante Value at Risk (VaR), y la implementación de derivados financieros como instrumentos de protección. A través de modelos estocásticos y valuación de opciones europeas y americanas, se busca evidenciar cómo una cobertura bien estructurada puede preservar el capital invertido frente a escenarios adversos, manteniendo la eficiencia financiera del portafolio.

OBJETIVO

Evaluar la efectividad de una estrategia de cobertura con opciones europeas y americanas sobre un portafolio de tres activos, utilizando simulaciones estocásticas, análisis de riesgo y modelos de valuación, con el fin de proteger el 85% de la inversión mediante apalancamiento con la tasa del bono del tesoro.

RESUMEN

Este informe presenta el análisis de cobertura de un portafolio de inversión compuesto por tres activos NFLX, AAPL, LLY. Se construye un portafolio óptimo mediante media-varianza, se simulan precios futuros con Movimiento Geométrico Browniano (MGB), y se valoran opciones europeas y americanas para cubrir el 85% de la inversión. Se aplican criterios de desempeño como índice de Sharpe, volatilidad y Value at Risk (VaR), y se justifica la estrategia de cobertura con apalancamiento.

tickers <- c("NFLX", "AAPL", "LLY")
start_date <- as.Date("2023-10-01")
end_date <- as.Date("2025-11-05")

getSymbols(tickers, src = "yahoo", from = start_date, to = end_date)
## [1] "NFLX" "AAPL" "LLY"
prices <- merge(Ad(NFLX), Ad(AAPL), Ad(LLY))
colnames(prices) <- c("Netflix", "Apple", "Eli_Lilly")
prices_df <- data.frame(Date = index(prices), coredata(prices))
prices_melt <- melt(prices_df, id.vars = "Date")

ggplot(prices_melt, aes(x = Date, y = value, color = variable)) +
  geom_line(size = 1) +
  labs(title = "Histórico de precios (NFLX, AAPL, LLY)",
       x = "Fecha", y = "Precio ajustado (USD)",
       color = "Acción") +
  theme_minimal()

De la grafica de precios podemos deducir

Eli Lilly (azul) cotiza en niveles mucho más altos (700–1,200 USD), lo que refleja su alta valoración en el mercado farmacéutico; Netflix (rojo) muestra un crecimiento fuerte desde 400 USD hasta superar los 1,000 USD, indicando una tendencia alcista significativa; Apple (verde) se mantiene en un rango más bajo (150–250 USD), típico de una empresa con gran capitalización y menor volatilidad relativa.

prices <- merge(Ad(NFLX), Ad(AAPL), Ad(LLY))
colnames(prices) <- c("Netflix", "Apple", "Eli_Lilly")
returns <- na.omit(Return.calculate(prices))

mean_returns <- colMeans(returns)
cov_matrix <- cov(returns)

Dmat <- 2 * cov_matrix
dvec <- rep(0, length(mean_returns))
Amat <- cbind(rep(1, length(mean_returns)), diag(length(mean_returns)))
bvec <- c(1, rep(0, length(mean_returns)))  # suma de pesos = 1, pesos >= 0
solution <- solve.QP(Dmat, dvec, Amat, bvec, meq = 1)

weights <- solution$solution
names(weights) <- colnames(prices)
weights
##   Netflix     Apple Eli_Lilly 
## 0.2700488 0.4567437 0.2732075
total_investment <- 10000000
allocation <- weights * total_investment
allocation
##   Netflix     Apple Eli_Lilly 
##   2700488   4567437   2732075
# Función para calcular riesgo y retorno dado un vector de pesos
portfolio_stats <- function(weights, mean_returns, cov_matrix) {
  ret <- sum(weights * mean_returns)
  risk <- sqrt(t(weights) %*% cov_matrix %*% weights)
  return(c(risk, ret))
}

# Generar combinaciones de pesos para la frontera eficiente
n_points <- 100
weights_list <- matrix(NA, nrow = n_points, ncol = length(mean_returns))
returns_list <- numeric(n_points)
risk_list <- numeric(n_points)

for (i in 1:n_points) {
  # Restricción: suma de pesos = 1, pesos >= 0
  target_return <- min(mean_returns) + (max(mean_returns) - min(mean_returns)) * (i / n_points)
  Dmat <- 2 * cov_matrix
  dvec <- rep(0, length(mean_returns))
  Amat <- cbind(rep(1, length(mean_returns)), mean_returns, diag(length(mean_returns)))
  bvec <- c(1, target_return, rep(0, length(mean_returns)))
  result <- solve.QP(Dmat, dvec, Amat, bvec, meq = 2)
  
  weights_list[i, ] <- result$solution
  stats <- portfolio_stats(result$solution, mean_returns, cov_matrix)
  risk_list[i] <- stats[1]
  returns_list[i] <- stats[2]
}

Se crea el portafolio de media Varianza optimizado y se concluye lo siguiente:

Apple (AAPL): 45.67% → Es la acción con menor riesgo relativo y/o mejor relación riesgo-retorno en la muestra, por eso el modelo asigna casi la mitad del portafolio.

Netflix (NFLX): 27.00% Tiene más volatilidad que Apple, pero aporta diversificación.

Eli Lilly (LLY): 27.30% → Sector farmacéutico, menos correlacionado con tecnología y entretenimiento, lo que reduce el riesgo global.

Porlo tanto El portafolio busca minimizar la varianza, por eso asigna más peso a la acción con menor riesgo y menos correlación (Apple), y distribuye el resto entre Netflix y Eli Lilly.


# Data frame para graficar
frontier_df <- data.frame(Risk = risk_list, Return = returns_list)

# Portafolio actual (mínima varianza)
current_stats <- portfolio_stats(weights, mean_returns, cov_matrix)

# Gráfico
ggplot(frontier_df, aes(x = Risk, y = Return)) +
  geom_line(color = "blue", linewidth = 1.2) +
  geom_point(aes(x = current_stats[1], y = current_stats[2]), color = "red", size = 3) +
  labs(title = "Frontera Eficiente y Portafolio Actual",
       x = "Riesgo (Desviación Estándar)",
       y = "Retorno Esperado") +
  theme_minimal()

De la frontera eficiente podemos concluir

La curva azul representa todos los portafolios eficientes posibles combinando los tres activos (NFLX, AAPL, LLY), El eje X es el riesgo (desviación estándar), y el eje Y es el retorno esperado.La curva tiene forma convexa, lo que indica que a medida que se buscas más retorno, se debe aceptar más riesgo.

# Parámetros de simulación GBM
set.seed(123)
n_sim <- 500  # número de trayectorias
n_days <- 252 * 2  # dos años
dt <- 1/252

# Últimos precios y volatilidades
S0 <- as.numeric(last(prices))
mu <- colMeans(returns)
sigma <- apply(returns, 2, sd)

# Función de simulación MGB
sim_prices <- function(S0, mu, sigma, n_days, n_sim) {
  matrix(S0 * exp(cumsum((mu - 0.5 * sigma^2) * dt + 
         sigma * sqrt(dt) * matrix(rnorm(n_days * n_sim), nrow = n_days))), 
         nrow = n_days, ncol = n_sim)
}

# Simular precios para cada acción
sim_list <- lapply(1:3, function(i) sim_prices(S0[i], mu[i], sigma[i], n_days, n_sim))
names(sim_list) <- c("NFLX", "AAPL", "LLY")


# Visualizar trayectorias simuladas
plot_sim <- function(sim_matrix, name) {
  matplot(sim_matrix[, 1:20], type = "l", lty = 1, col = rainbow(20),
          main = paste("Simulación de precios futuros -", name),
          xlab = "Días", ylab = "Precio simulado")
}


par(mfrow = c(1, 3))
plot_sim(sim_list$NFLX, "NFLX")
plot_sim(sim_list$AAPL, "AAPL")
plot_sim(sim_list$LLY, "LLY")

De la grafica del MGB

La simulación confirma que el riesgo del portafolio depende de la volatilidad individual y la correlación, Apple aporta estabilidad, mientras que Netflix y Eli Lilly añaden más incertidumbre, a medida que el horizonte aumenta, la dispersión se amplía, lo que implica mayor riesgo a largo plazo.

# Calcular valor del portafolio en cada simulación
# Usamos los pesos del portafolio (weights) y las simulaciones de cada acción
portfolio_values <- matrix(NA, nrow = n_days, ncol = n_sim)

for (i in 1:n_sim) {
  for (t in 1:n_days) {
    portfolio_values[t, i] <- sum(c(sim_list$NFLX[t, i],
                                    sim_list$AAPL[t, i],
                                    sim_list$LLY[t, i]) * weights)
  }
}

# Verificar
dim(portfolio_values)  # Debe ser 504 x 500 (2 años x simulaciones)
## [1] 504 500
# Análisis: valor final del portafolio
final_values <- portfolio_values[n_days, ]
summary(final_values)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   654.9  1153.4  1916.4  2614.8  3731.8  6894.9
# VaR al 1% y 5%
VaR_1 <- quantile(final_values, probs = 0.01)
VaR_5 <- quantile(final_values, probs = 0.05)

cat("VaR al 1%:", VaR_1, "\n")
## VaR al 1%: 669.9733
cat("VaR al 5%:", VaR_5, "\n")
## VaR al 5%: 696.2229
# Histograma con líneas de VaR
hist(final_values, breaks = 50, col = "lightblue",
     main = "Distribución del valor final del portafolio",
     xlab = "Valor del portafolio (USD)")
abline(v = VaR_1, col = "red", lwd = 2)
abline(v = VaR_5, col = "orange", lwd = 2)
legend("topright", legend = c("VaR 1%", "VaR 5%"),
       col = c("red", "orange"), lwd = 2)

INTERPRETACION

Esto indica que en las simulaciones de precios futuros del portafolio:

El valor mínimo observado fue 654.9 USD.

El valor promedio fue 2614.8 USD.

El valor máximo fue 6894.9 USD.Esto refleja una alta dispersión, lo que sugiere volatilidad significativa en el portafolio

Con los resultados del VaR podemos concluir

VaR al 1%: Hay un 1% de probabilidad de que el valor del portafolio caiga por debajo de 669.97 USD en el horizonte de tiempo simulado. Es decir, en el peor 1% de los escenarios, podrías perder hasta ese valor o más.

VaR al 5%: Hay un 5% de probabilidad de que el portafolio caiga por debajo de 696.22 USD. Es un umbral menos extremo, pero aún representa un escenario adverso.

Por lo tanto el análisis de riesgo mediante Value at Risk (VaR) muestra que, en los escenarios más adversos simulados, el portafolio podría caer por debajo de los 670 USD (VaR al 1%) o 696 USD (VaR al 5%). Aunque estas probabilidades son bajas, evidencian la necesidad de implementar estrategias de cobertura con derivados que protejan el capital invertido ante eventos extremos del mercado.”

SELECCION DE OPCIONES

Para cada acción, seleccionamos opciones con vencimiento trimestral hasta 2 años.

Tipo de opciones: Put: para proteger contra caídas (cobertura directa). Call vendidas: para generar ingresos si el precio no sube demasiado (estrategia de ingresos). Strike price: puede ser el precio actual o el promedio simulado. Modelo de valuación: Europeas: Black-Scholes. Americanas: Árbol binomial.

# Función para opción europea tipo call
BS_Call <- function(S, K, r, sigma, T){
  d1 <- (log(S/K) + (r + 0.5*sigma^2)*T) / (sigma * sqrt(T))
  d2 <- d1 - sigma * sqrt(T)
  C <- S * pnorm(d1) - K * exp(-r * T) * pnorm(d2)
  return(C)
}

# Función para opción europea tipo put
BS_Put <- function(S, K, r, sigma, T){
  d1 <- (log(S/K) + (r + 0.5*sigma^2)*T) / (sigma * sqrt(T))
  d2 <- d1 - sigma * sqrt(T)
  P <- K * exp(-r * T) * pnorm(-d2) - S * pnorm(-d1)
  return(P)
}

# Tasa del bono a 10 años
r <- 0.045

# Tiempo hasta vencimiento (trimestre)
T <- 0.25

# AAPL
S_AAPL <- 170      # Precio actual
K_AAPL <- 170      # Strike
sigma_AAPL <- 0.25 # Volatilidad

# NFLX
S_NFLX <- 400
K_NFLX <- 400
sigma_NFLX <- 0.30

# LLY
S_LLY <- 600
K_LLY <- 600
sigma_LLY <- 0.22

# AAPL
call_AAPL <- BS_Call(S_AAPL, K_AAPL, r, sigma_AAPL, T)
put_AAPL  <- BS_Put(S_AAPL, K_AAPL, r, sigma_AAPL, T)

# NFLX
call_NFLX <- BS_Call(S_NFLX, K_NFLX, r, sigma_NFLX, T)
put_NFLX  <- BS_Put(S_NFLX, K_NFLX, r, sigma_NFLX, T)

# LLY
call_LLY <- BS_Call(S_LLY, K_LLY, r, sigma_LLY, T)
put_LLY  <- BS_Put(S_LLY, K_LLY, r, sigma_LLY, T)

# Mostrar resultados
cat("AAPL - Call:", call_AAPL, " Put:", put_AAPL, "\n")
## AAPL - Call: 9.409563  Put: 7.50778
cat("NFLX - Call:", call_NFLX, " Put:", put_NFLX, "\n")
## NFLX - Call: 26.08447  Put: 21.60969
cat("LLY  - Call:", call_LLY,  " Put:", put_LLY,  "\n")
## LLY  - Call: 29.66241  Put: 22.95024

INTERPRETACION

La valuación de opciones europeas mediante el modelo de Black-Scholes permite estimar el costo teórico de cobertura por activo. Las primas obtenidas reflejan la volatilidad implícita de cada acción, siendo más elevadas en NFLX y LLY. La opción put sobre AAPL, por ejemplo, tiene una prima de 7.51 USD, lo que implica un costo total de cobertura de aproximadamente 171,600 USD para cubrir el monto asignado. Esta información es clave para dimensionar el gasto en derivados y evaluar la eficiencia de la estrategia de protección del portafolio.

# Función para opción americana tipo PUT con árbol binomial
binomial_tree_american_put <- function(S, K, r, sigma, T, steps) {
  dt <- T / steps
  u <- exp(sigma * sqrt(dt))
  d <- 1 / u
  p <- (exp(r * dt) - d) / (u - d)
  
  # Árbol de precios
  prices <- matrix(0, nrow = steps + 1, ncol = steps + 1)
  for (i in 0:steps) {
    for (j in 0:i) {
      prices[j + 1, i + 1] <- S * u^j * d^(i - j)
    }
  }
  
  # Árbol de valores de opción
  option <- matrix(0, nrow = steps + 1, ncol = steps + 1)
  for (j in 0:steps) {
    option[j + 1, steps + 1] <- max(K - prices[j + 1, steps + 1], 0)
  }
  
  # Retroceso en el árbol
  for (i in (steps - 1):0) {
    for (j in 0:i) {
      hold <- exp(-r * dt) * (p * option[j + 2, i + 2] + (1 - p) * option[j + 1, i + 2])
      exercise <- max(K - prices[j + 1, i + 1], 0)
      option[j + 1, i + 1] <- max(hold, exercise)
    }
  }
  
  return(option[1, 1])
}

# Parámetros de prueba
S <- 170        # Precio actual
K <- 170        # Strike
r <- 0.045      # Tasa libre de riesgo
sigma <- 0.25   # Volatilidad
T <- 0.25       # Tiempo en años
steps <- 100    # Pasos del árbol

# Ejecutar función
binomial_tree_american_put(S, K, r, sigma, T, steps)
## [1] 7.650303
# Parámetros generales
r <- 0.045
T <- 0.25
steps <- 100

# AAPL
put_AAPL <- binomial_tree_american_put(S = 170, K = 170, r = r, sigma = 0.25, T = T, steps = steps)

# NFLX
put_NFLX <- binomial_tree_american_put(S = 400, K = 400, r = r, sigma = 0.30, T = T, steps = steps)

# LLY
put_LLY <- binomial_tree_american_put(S = 600, K = 600, r = r, sigma = 0.22, T = T, steps = steps)

# Mostrar resultados
cat("AAPL - Put americana:", put_AAPL, "\n")
## AAPL - Put americana: 7.650303
cat("NFLX - Put americana:", put_NFLX, "\n")
## NFLX - Put americana: 21.92848
cat("LLY  - Put americana:", put_LLY, "\n")
## LLY  - Put americana: 23.47025

INTERPRETACIÓN

La cobertura del portafolio se realizó mediante opciones americanas tipo put, valoradas con un modelo binomial. Estas opciones permiten ejercer anticipadamente ante caídas de mercado, ofreciendo mayor flexibilidad que las europeas. El costo total de cobertura se calculó multiplicando la prima por el número de acciones cubiertas, resultando en un gasto aproximado de 391,459 USD para proteger el 85% del portafolio. Esta estrategia mitiga el riesgo extremo evidenciado en el análisis de VaR.

CONCLUSION

El análisis realizado permitió valorar el riesgo de un portafolio compuesto por tres activos (AAPL, NFLX y LLY) mediante simulaciones estocásticas y métricas de Value at Risk (VaR), evidenciando escenarios de pérdida extrema que justifican la implementación de una estrategia de cobertura. La valuación de opciones europeas y americanas, tanto call como put, se realizó utilizando modelos robustos (Black-Scholes y árbol binomial), y se seleccionaron opciones americanas tipo put como instrumento principal de protección por su flexibilidad de ejercicio anticipado.

La cobertura se estructuró sobre el 85% de la inversión total, distribuida proporcionalmente según los pesos del portafolio optimizado. El costo total de cobertura fue estimado en 391,459 USD, financiado mediante apalancamiento con la tasa del bono del tesoro (4.5%), lo cual permite mantener la exposición al mercado sin comprometer la liquidez inmediata.

Esta estrategia se alinea con los pagos trimestrales del negocio subyacente y del derivado, permitiendo ajustes periódicos según la evolución del mercado.

Desde una perspectiva de asesoría financiera, se recomienda mantener una cobertura dinámica, revisando trimestralmente la volatilidad de los activos y el comportamiento del portafolio. La evidencia técnica respalda que el uso de derivados no solo mitiga el riesgo extremo, sino que también optimiza la eficiencia del portafolio frente a escenarios adversos. En consecuencia, la estrategia propuesta representa una solución válida, coherente y financieramente sólida para inversionistas que buscan preservar capital sin renunciar a oportunidades de crecimiento.

REFERENCIAS

Black, F., & Scholes, M. (1973). The pricing of options and corporate liabilities. Journal of Political Economy, 81(3), 637–654. https://doi.org/10.1086/260062

Hull, J. C. (2017). Options, Futures, and Other Derivatives (9th ed.). Pearson Education.

R Core Team. (2023). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/

U.S. Department of the Treasury. (2025). Daily Treasury Yield Curve Rates. https://home.treasury.gov/resource-center/data-chart-center/interest-rates