1. Seleccion de acciones y carga de datos

Se descargan los precios de tres acciones: WMT,AAPL y MSFT. Durante el periodo analizado desde el 01/06/2022 hasta el 31/03/2025. Se observo que AAPL y MSFT han caido, mientras que WMT se mantuvo relativamente estable, esto puede ser debido a su naturaleza que suele tener menor volatilidad en mercados bajistas.

tick <- c('WMT', 'AAPL', 'MSFT') #Cayendo desde hace 6 meses, excepto WMT.

price_data <- tq_get(tick,
                     from = '2022-06-01',
                     to = '2025-03-31',
                     get = 'stock.prices')

WMT: Tendencia alcista, comportamiento más estable respecto a las otras acciones. AAPL: Tendencia bajista en los últimos 6 meses, aunque con recuperación moderada en las últimas semanas. MSFT: También presenta una tendencia a la baja desde hace seis meses.

2. Calculo de Rentabilidades y Estadisticas

Se calculan los retornos logaritmicos diarios para cada accion y se obtienen medidas descriptivas para cada accion.

log_ret_tidy <- price_data %>%
  group_by(symbol) %>%
  tq_transmute(select = adjusted,
               mutate_fun = periodReturn,
               period = 'daily',
               col_rename = 'ret',
               type = 'log')

#Rentabilidad esperada de cada accion
mu <- log_ret_tidy %>% 
  group_by(symbol) %>% 
  summarise(expected_return = mean(ret,na.rm = TRUE))

#Matriz de retornos y covarianzas
ret_mat <- log_ret_tidy %>%
  pivot_wider(names_from = symbol,values_from = ret) %>%
  select(-date) %>%
  na.omit()

cov_matriz <- cov(ret_mat)

3. Optimización de Portafolio (Media-Varianza)

Se construye la matriz de retornos y covarianzas para optimizar el portafolio, obteniendo la asignacion de pesos que minimiza la varianza total, sujeto a que la suma de los pesos sea de 1 y sin posiciones cortas

#Optimizacion media-varianza
n <- ncol(ret_mat)
Dmat <- 2 * cov_matriz
dvec <- rep(0,n)
Amat <- cbind(rep(1,n),diag(n)) #Los pesos deben sumar 1
bvec <- c(1,rep(0,n)) #La suma de los pesos es 1 y la suma no podra ser negativo

opt <- solve.QP(Dmat,dvec,Amat,bvec,meq = 1)
w_opt <- opt$solution #Aca obtendremos los pesos optimos

#Asignamos los pesos al portafolio
portafolio <- tibble(
  symbol = colnames(ret_mat),
  weight = w_opt
)

print(portafolio)
## # A tibble: 3 × 2
##   symbol weight
##   <chr>   <dbl>
## 1 WMT     0.611
## 2 AAPL    0.203
## 3 MSFT    0.186

Los pesos obtenidos son mas eficientes que una asignacion equitativa, ya que se basan en la volatilidad individual y las correlaciones entre activos. Dado que la rentabilidad esperada es el promedio ponderado, se puede determinar si el portafolio ofrece un rendimiento adecuado en funcion de la asignacion de riesgo. Las ponderaciones aproximadas en el portafolio optimo son: WMT: 61.1% AAPL: 20.3% MSFT:18.6%

4. Simulación de Precios por Movimiento Geométrico Browniano (MGB)

#Simulacion del portafolio por MGB
set.seed(123)

#Horizonte de simulacion
n_days <- 252 * 2
dt <- 1/252

#Volatilidad de cada activo
volatility <- log_ret_tidy %>% 
  group_by(symbol) %>% 
  summarise(vol = sd(ret, na.rm = TRUE))

#Funcion para simulacion de MGB
simulate_mgb <- function(S0, mu, sigma, dt, n_days) {
  W <- cumsum(rnorm(n_days, mean = 0, sd = sqrt(dt)))
  tibble(
    day = 1:n_days,
    price = S0 * exp((mu - 0.5 * sigma^2) * (1:n_days) * dt + sigma * W)
  )
}

#Precios iniciales de cada accion
initial_prices <- price_data %>% 
  group_by(symbol) %>%
  filter(date == max(date)) %>% 
  select(symbol, adjusted)

#Simulacion de precios para cada accion
simulated_prices <- map2_df(
  initial_prices$adjusted, 
  mu$expected_return, 
  function(S0, mu) {
    symbol <- initial_prices$symbol[initial_prices$adjusted == S0]
    sigma <- volatility$vol[volatility$symbol == symbol]
    
    df <- simulate_mgb(S0, mu, sigma, dt, n_days)
    df$symbol <- symbol
    return(df)
  }
)
ggplot(simulated_prices, aes(x = day, y = price, color = symbol)) + 
  geom_line() +
  facet_wrap(~symbol, scales = "free_y") + # Separa por activo
  labs(title = "Simulación de Precios con MGB", x = "Días", y = "Precio Simulado") +
  theme_minimal()

MSFT y AAPL presentan una mayor volatilidad, lo que implica mayores fluctuaciones de precios diarias. Estas acciones son más riesgosas, pero con mayor potencial de retorno. WMT, por otro lado, exhibe una volatilidad más baja, consolidándose como una acción más estable y menos sensible a cambios bruscos del mercado

5. Análisis de Riesgo (VaR y Sharpe)

Se calcula la rentabilidad ponderada del portafolio a partir de las simulaciones, el indice Sharpe y se determinan las probabilidades de ganancia o perdida junto con el VaR al 1% y al 5%

# Rentabilidad ponderada del portafolio
portafolio_returns <- simulated_prices %>%
  left_join(portafolio, by = "symbol") %>%
  mutate(weighted_price = price * weight) %>%
  group_by(day) %>%
  summarise(portfolio_price = sum(weighted_price)) %>%
  mutate(portfolio_return = (portfolio_price / lag(portfolio_price) - 1)) %>%
  na.omit()

#Rentabilidad esperada del portafolio
mu_portfolio <- mean(portafolio_returns$portfolio_return)
print(mu_portfolio)
## [1] 2.408294e-05
#Volatilidad del portafolio
cov_matrix <- cov(ret_mat)
volatility_portfolio <- sqrt(t(w_opt) %*% cov_matrix %*% w_opt)

print(cov_matriz)
##               WMT         AAPL         MSFT
## WMT  1.568497e-04 0.0000508290 5.171226e-05
## AAPL 5.082900e-05 0.0002643161 1.669377e-04
## MSFT 5.171226e-05 0.0001669377 2.699190e-04
print(volatility_portfolio)
##            [,1]
## [1,] 0.01075894
#T-Bonds a 3 meses para el 31 de Marzo de 2025
r_f <- 0.0421 

#Indice Sharpe del portafolio
sharpe_ratio <- (mu_portfolio - r_f) / volatility_portfolio

cat("Índice de Sharpe del portafolio:", sharpe_ratio, "\n") #Indice negativo, pero que con coberturas mitigaremos
## Índice de Sharpe del portafolio: -3.910786
cat("Volatilidad del portafolio:", volatility_portfolio, "\n")
## Volatilidad del portafolio: 0.01075894

La matriz de la covarianza de los retornos logaritmicos para las acciones WMT,AAPL y MSFT permite observar el grado de variacion conjunta entre estos activos. WMT presenta la menor varianza individual (0.0001568)lo que reafirma su perfil de activo de baja volatilidad y comportamiento defensivo. AAPL y MSFT tienen mayor varianza(0.0002643 y 0.0002699, respectivamente)lo que es consistente con su comportamiento mas volatil, aunque tambien mas rentable potencialmente. La covarianza entre AAPL y MSFT (0.0001669) es considerablemente mayor que la WMT con cualquiera de las dos(ambas ~0.000051), lo que indica que los retornos de AAPL y MSFT tienden a moverse en la misma direccion mas frecuentemente. Esto sugiere una alta correlacion entre AAPL y MSFT, lo que puede reducir el beneficio de diversificacion si ambas se mantienen juntas sin compensacion.

Indice Sharpe:

El valor negativo indica que, en promedio, el portafolio rinde por debajo de la tasa libre de riesgo, lo cual refuerza la necesidad de cubrir el riesgo con opciones. Esta situacion se compensa en el modelo mediante la estrategia de cobertura con opciones, diseñada para proteger el portafolio y limitar las perdidas en escenarios adversos. Este portafolio óptimo presenta una rentabilidad esperada del 2.40% con una volatilidad de 0.01%. Esta combinación equilibra activos defensivos y de crecimiento, permitiendo aprovechar el potencial de recuperación tecnológica con una base sólida de estabilidad.

VaR:

Se estimó el VaR diario para los percentiles 1% y 5%: • VaR al 1%: -0.211%. En un día muy adverso, el portafolio podría perder al menos un 0.211%. • VaR al 5%: -0.157%. En 1 de cada 20 días, se espera una pérdida de al menos 0.157%.

6. Resultados Trimestrales y Ganancias totales del Portafolio

#Grafica de simulacion del portafolio teniendo en cuenta la inversion de 1M USD
initial_investment <- 1000000

#Calcular la cantidad de acciones compradas para cada activo
initial_prices <- price_data %>% 
  group_by(symbol) %>%
  filter(date == max(date)) %>% 
  select(symbol, adjusted)

initial_shares <- tibble(
  symbol = initial_prices$symbol,
  shares = (initial_investment * w_opt) / initial_prices$adjusted
)

#Calcular el valor total del portafolio en cada día de la simulación
portfolio_values <- simulated_prices %>%
  left_join(initial_shares, by = "symbol") %>%
  mutate(portfolio_value = price * shares) %>%
  group_by(day) %>%
  summarise(total_value = sum(portfolio_value))

# Gráfica de evolución del portafolio
ggplot(portfolio_values, aes(x = day, y = total_value)) +
  geom_line(color = "blue") +
  labs(title = "Evolución del Portafolio Simulado",
       x = "Días",
       y = "Valor del Portafolio (USD)") +
  theme_minimal() 

#Analisis a cierre trimestral individual
#Precios esperados cada trimestre de cierre
simulated_prices_quarterly <- simulated_prices %>%
  filter(day %% 63 == 0) %>%
  group_by(symbol, day) %>%
  summarise(expected_price = mean(price))

ggplot(simulated_prices_quarterly, aes(x = day, y = expected_price)) + 
  geom_line(color = "blue") +
  facet_wrap(~ symbol, scales = "free_y") +  # Panel separado por activo
  scale_x_continuous(breaks = seq(0, max(simulated_prices_quarterly$day), by = 63),
                     labels = function(x) paste0("T", x / 63)) +
  labs(title = "Precios Esperados de Cierre por Trimestre",
       x = "Trimestres", y = "Precio Esperado") +
  theme_minimal()

# Estadísticas descriptivas para el comportamiento de los precios
market_stats <- simulated_prices %>%
  group_by(symbol) %>%
  summarise(
    mean_price = mean(price),
    median_price = median(price),
    sd_price = sd(price),
    min_price = min(price),
    max_price = max(price)
  )

print(market_stats)
## # A tibble: 3 × 6
##   symbol mean_price median_price sd_price min_price max_price
##   <chr>       <dbl>        <dbl>    <dbl>     <dbl>     <dbl>
## 1 AAPL        217.         217.     1.71      213.      220. 
## 2 MSFT        383.         383.     1.43      379.      386. 
## 3 WMT          85.5         85.4    0.352      84.8      86.5
#Grafica de tendencias
ggplot(simulated_prices, aes(x = day, y = price, color = symbol)) + 
  geom_line() +
  geom_smooth(method = "loess", se = FALSE, color = "black", linetype = "dashed") +
  labs(title = "Tendencia del Comportamiento de Precios Simulados", x = "Días", y = "Precio Simulado") +
  theme_minimal() +
  scale_y_continuous(breaks = seq(floor(min(simulated_prices$price)), ceiling(max(simulated_prices$price)), by = 20)) +
  facet_wrap(~symbol, scales = "free_y")

A cierre de cada trimestre: Se pueden extraer los precios simulados al final de cada trismestre y graficarlos para observar la evolucion en puntos especificos del tiempo. Ademas, se genera una grafica de la evolucion del precio simulado del portafolio, ponderado con los pesos optimos, para observar como se comporta en conjunto.

WMT: Máximo 86.54, Mínimo 84.82 AAPL: Máximo 220.35, Mínimo 212.75 MSFT: Máximo 386.38, Mínimo 378.89

Análisis de Reversión a la Media

WMT: Precio actual se acerca consistentemente a su media, mostrando estabilidad. AAPL y MSFT: Altas desviaciones desde sus medias históricas.

Distribución de los Retornos (Simulados)

Las tres acciones muestran distribución aproximadamente normal con ligeras asimetrías: WMT: Curtosis moderada, distribución concentrada. AAPL y MSFT: Leve sesgo negativo, lo cual refleja mayor probabilidad de retornos negativos extremos

Grafica de Evolucion del portafolio simulado

basado en las ponderaciones óptimas derivadas de la frontera eficiente, mostró una tendencia ascendente moderada durante el horizonte de inversión. • Punto mínimo: Aproximadamente al día 220, indicando una caída generalizada temporal. • Recuperación y crecimiento sostenido a partir del día 250, finalizando con una valorización acumulada significativa.

Grafica de precios esperados de cierre por trimestre:

AAPL • Oscilación significativa, con mínimo en el T3 y máximos en T7. • Volatilidad visible, aunque con recuperación clara hacia el final. MSFT • Comportamiento decreciente hasta el T6 con repunte fuerte en T8. • Puede indicar efecto de eventos positivos en el largo plazo. WMT • Estabilidad predominante con crecimiento leve pero consistente desde T4 hasta T8. • Refuerza la naturaleza defensiva del activo.

7. Valuación de Opciones y Estrategias de Cobertura

Se evaluan opciones europeas y americanas para diseñar una estrategia de cobertura que incluya la proteccion mediante una combinacion de put y call. Se consideran diferentes strikes ITM,ATM Y OTM en cada cierre trimestral.

valorar_opcion_bs <- function(S, K, r, sigma, T, div, type) {
  opt <- EuropeanOption(type = type, underlying = S, strike = K, dividendYield = div / S, riskFreeRate = r, maturity = T, volatility = sigma)
  return(opt$value)
}

# Funcion Modelo binomial - Americanas
valorar_opcion_binomial <- function(S, K, r, sigma, T, div, type, steps = 100) {
  bin_tree <- AmericanOption(type = type, underlying = S, strike = K, dividendYield = div / S, riskFreeRate = r, maturity = T, volatility = sigma, timeSteps = steps)
  return(bin_tree$value)
}

precios_actuales <- price_data %>% group_by(symbol) %>% summarise(last_price = last(adjusted))
S <- precios_actuales$last_price
sigma <- log_ret_tidy %>% 
  group_by(symbol) %>% 
  summarise(vol = sd(ret, na.rm = TRUE) * sqrt(252)) %>%
  pull(vol)
r <- 0.0421
T_vec <- seq(0.25,2,by = 0.25)

div_yields <- tick %>%
  map_df(~ tq_get(.x, get = "dividends", from = "2024-03-31", to = "2025-03-31") %>%
           summarise(symbol = .x, dividend_sum = sum(value))) %>%
  left_join(precios_actuales, by = "symbol") %>%
  mutate(div_yield = dividend_sum / last_price)

dividendos <- div_yields$div_yield
print(dividendos)
## [1] 0.010088080 0.004589261 0.008342133
#Crear tabla de opciones con liquidación trimestral
#Definir los strikes para cada activo y vencimiento
strike_multipliers <- c(0.95, 1, 1.05)  # ITM, ATM, OTM

opciones_resultados <- expand.grid(symbol = tick, T = T_vec, strike_type = c("ITM", "ATM", "OTM")) %>%
  left_join(precios_actuales, by = "symbol") %>%
  mutate(
    sigma = case_when(symbol == "WMT" ~ sigma[1],
                      symbol == "AAPL" ~ sigma[2],
                      symbol == "MSFT" ~ sigma[3]),
    dividendos = case_when(symbol == "WMT" ~ dividendos[1],
                           symbol == "AAPL" ~ dividendos[2],
                           symbol == "MSFT" ~ dividendos[3]),
    K = case_when(
      strike_type == "ITM" & last_price > 0 ~ last_price * 0.95,  # ITM para calls
      strike_type == "ITM" & last_price <= 0 ~ last_price * 1.05, # ITM para puts
      strike_type == "ATM" ~ last_price,
      strike_type == "OTM" & last_price > 0 ~ last_price * 1.05,  # OTM para calls
      strike_type == "OTM" & last_price <= 0 ~ last_price * 0.95  # OTM para puts
    )
  ) %>%
  # Filtrar valores incorrectos antes de calcular opciones
  filter(!is.na(sigma) & !is.na(dividendos) & !is.na(last_price) & !is.na(K)) %>%
  mutate(
    call_europeo = mapply(valorar_opcion_bs, last_price, K, r, sigma, T, dividendos, 'call'),
    put_europeo = mapply(valorar_opcion_bs, last_price, K, r, sigma, T, dividendos, 'put'),
    call_americano = mapply(valorar_opcion_binomial, last_price, K, r, sigma, T, dividendos, 'call'),
    put_americano = mapply(valorar_opcion_binomial, last_price, K, r, sigma, T, dividendos, 'put')
  )


print(opciones_resultados)
##    symbol    T strike_type last_price     sigma  dividendos        K
## 1     WMT 0.25         ITM      85.15 0.2580846 0.010088080  80.8925
## 2    AAPL 0.25         ITM     217.90 0.2608057 0.004589261 207.0050
## 3    MSFT 0.25         ITM     378.80 0.1988118 0.008342133 359.8600
## 4     WMT 0.50         ITM      85.15 0.2580846 0.010088080  80.8925
## 5    AAPL 0.50         ITM     217.90 0.2608057 0.004589261 207.0050
## 6    MSFT 0.50         ITM     378.80 0.1988118 0.008342133 359.8600
## 7     WMT 0.75         ITM      85.15 0.2580846 0.010088080  80.8925
## 8    AAPL 0.75         ITM     217.90 0.2608057 0.004589261 207.0050
## 9    MSFT 0.75         ITM     378.80 0.1988118 0.008342133 359.8600
## 10    WMT 1.00         ITM      85.15 0.2580846 0.010088080  80.8925
## 11   AAPL 1.00         ITM     217.90 0.2608057 0.004589261 207.0050
## 12   MSFT 1.00         ITM     378.80 0.1988118 0.008342133 359.8600
## 13    WMT 1.25         ITM      85.15 0.2580846 0.010088080  80.8925
## 14   AAPL 1.25         ITM     217.90 0.2608057 0.004589261 207.0050
## 15   MSFT 1.25         ITM     378.80 0.1988118 0.008342133 359.8600
## 16    WMT 1.50         ITM      85.15 0.2580846 0.010088080  80.8925
## 17   AAPL 1.50         ITM     217.90 0.2608057 0.004589261 207.0050
## 18   MSFT 1.50         ITM     378.80 0.1988118 0.008342133 359.8600
## 19    WMT 1.75         ITM      85.15 0.2580846 0.010088080  80.8925
## 20   AAPL 1.75         ITM     217.90 0.2608057 0.004589261 207.0050
## 21   MSFT 1.75         ITM     378.80 0.1988118 0.008342133 359.8600
## 22    WMT 2.00         ITM      85.15 0.2580846 0.010088080  80.8925
## 23   AAPL 2.00         ITM     217.90 0.2608057 0.004589261 207.0050
## 24   MSFT 2.00         ITM     378.80 0.1988118 0.008342133 359.8600
## 25    WMT 0.25         ATM      85.15 0.2580846 0.010088080  85.1500
## 26   AAPL 0.25         ATM     217.90 0.2608057 0.004589261 217.9000
## 27   MSFT 0.25         ATM     378.80 0.1988118 0.008342133 378.8000
## 28    WMT 0.50         ATM      85.15 0.2580846 0.010088080  85.1500
## 29   AAPL 0.50         ATM     217.90 0.2608057 0.004589261 217.9000
## 30   MSFT 0.50         ATM     378.80 0.1988118 0.008342133 378.8000
## 31    WMT 0.75         ATM      85.15 0.2580846 0.010088080  85.1500
## 32   AAPL 0.75         ATM     217.90 0.2608057 0.004589261 217.9000
## 33   MSFT 0.75         ATM     378.80 0.1988118 0.008342133 378.8000
## 34    WMT 1.00         ATM      85.15 0.2580846 0.010088080  85.1500
## 35   AAPL 1.00         ATM     217.90 0.2608057 0.004589261 217.9000
## 36   MSFT 1.00         ATM     378.80 0.1988118 0.008342133 378.8000
## 37    WMT 1.25         ATM      85.15 0.2580846 0.010088080  85.1500
## 38   AAPL 1.25         ATM     217.90 0.2608057 0.004589261 217.9000
## 39   MSFT 1.25         ATM     378.80 0.1988118 0.008342133 378.8000
## 40    WMT 1.50         ATM      85.15 0.2580846 0.010088080  85.1500
## 41   AAPL 1.50         ATM     217.90 0.2608057 0.004589261 217.9000
## 42   MSFT 1.50         ATM     378.80 0.1988118 0.008342133 378.8000
## 43    WMT 1.75         ATM      85.15 0.2580846 0.010088080  85.1500
## 44   AAPL 1.75         ATM     217.90 0.2608057 0.004589261 217.9000
## 45   MSFT 1.75         ATM     378.80 0.1988118 0.008342133 378.8000
## 46    WMT 2.00         ATM      85.15 0.2580846 0.010088080  85.1500
## 47   AAPL 2.00         ATM     217.90 0.2608057 0.004589261 217.9000
## 48   MSFT 2.00         ATM     378.80 0.1988118 0.008342133 378.8000
## 49    WMT 0.25         OTM      85.15 0.2580846 0.010088080  89.4075
## 50   AAPL 0.25         OTM     217.90 0.2608057 0.004589261 228.7950
## 51   MSFT 0.25         OTM     378.80 0.1988118 0.008342133 397.7400
## 52    WMT 0.50         OTM      85.15 0.2580846 0.010088080  89.4075
## 53   AAPL 0.50         OTM     217.90 0.2608057 0.004589261 228.7950
## 54   MSFT 0.50         OTM     378.80 0.1988118 0.008342133 397.7400
## 55    WMT 0.75         OTM      85.15 0.2580846 0.010088080  89.4075
## 56   AAPL 0.75         OTM     217.90 0.2608057 0.004589261 228.7950
## 57   MSFT 0.75         OTM     378.80 0.1988118 0.008342133 397.7400
## 58    WMT 1.00         OTM      85.15 0.2580846 0.010088080  89.4075
## 59   AAPL 1.00         OTM     217.90 0.2608057 0.004589261 228.7950
## 60   MSFT 1.00         OTM     378.80 0.1988118 0.008342133 397.7400
## 61    WMT 1.25         OTM      85.15 0.2580846 0.010088080  89.4075
## 62   AAPL 1.25         OTM     217.90 0.2608057 0.004589261 228.7950
## 63   MSFT 1.25         OTM     378.80 0.1988118 0.008342133 397.7400
## 64    WMT 1.50         OTM      85.15 0.2580846 0.010088080  89.4075
## 65   AAPL 1.50         OTM     217.90 0.2608057 0.004589261 228.7950
## 66   MSFT 1.50         OTM     378.80 0.1988118 0.008342133 397.7400
## 67    WMT 1.75         OTM      85.15 0.2580846 0.010088080  89.4075
## 68   AAPL 1.75         OTM     217.90 0.2608057 0.004589261 228.7950
## 69   MSFT 1.75         OTM     378.80 0.1988118 0.008342133 397.7400
## 70    WMT 2.00         OTM      85.15 0.2580846 0.010088080  89.4075
## 71   AAPL 2.00         OTM     217.90 0.2608057 0.004589261 228.7950
## 72   MSFT 2.00         OTM     378.80 0.1988118 0.008342133 397.7400
##    call_europeo put_europeo call_americano put_americano
## 1      7.277269    2.175362       7.277269      2.209124
## 2     18.728527    5.667372      18.728527      5.754346
## 3     28.644005    5.938427      28.644005      6.070928
## 4      9.404315    3.466869       9.404315      3.562344
## 5     24.221686    9.017068      24.221686      9.262772
## 6     36.349709    9.917999      36.349709     10.302254
## 7     11.148201    4.383989      11.148201      4.554848
## 8     28.721763   11.396135      28.721763     11.835733
## 9     42.838457   12.719649      42.838457     13.410097
## 10    12.679863    5.097568      12.679863      5.353053
## 11    32.672362   13.247943      32.672362     13.905255
## 12    48.631564   14.864282      48.631564     15.895170
## 13    14.070437    5.678651      14.070437      6.025638
## 14    36.257825   14.756601      36.257825     15.649382
## 15    53.956366   16.578832      53.956366     17.973973
## 16    15.357673    6.164897      15.357673      6.608753
## 17    39.575923   16.019648      39.575923     17.161782
## 18    58.935775   17.985809      58.935775     19.762575
## 19    16.564487    6.579133      16.564487      7.124169
## 20    42.685985   17.096189      42.685985     18.498843
## 21    63.645112   19.160137      63.645112     21.331526
## 22    17.706047    6.936440      17.706047      7.586177
## 23    45.627282   18.025267      45.627282     19.697581
## 24    68.134497   20.151548      68.134497     22.727445
## 25     4.816398    3.927416       4.816398      3.990279
## 26    12.445205   10.164982      12.445205     10.325877
## 27    17.002752   13.038875      17.002752     13.337465
## 28     7.050717    5.282087       7.050717      5.432967
## 29    18.212787   13.676225      18.212787     14.062663
## 30    25.183373   17.297142      25.183373     17.997144
## 31     8.851780    6.212737       8.851780      6.463875
## 32    22.859775   16.090511      22.859775     16.734061
## 33    31.894144   20.126647      31.894144     21.271715
## 34    10.424651    6.924336      10.424651      7.284030
## 35    26.916541   17.937963      26.916541     18.860080
## 36    37.833563   22.225458      37.833563     23.842373
## 37    11.849034    7.496490      11.849034      7.970895
## 38    30.589234   19.424485      30.589234     20.641122
## 39    43.272259   23.863779      43.272259     25.970560
## 40    13.165949    7.970125      13.165949      8.564017
## 41    33.983962   20.655942      33.983962     22.179501
## 42    48.349090   25.180044      48.349090     27.789278
## 43    14.399855    8.369606      14.399855      9.086784
## 44    37.163995   21.695365      37.163995     23.535735
## 45    53.146596   26.256381      53.146596     29.376949
## 46    15.566751    8.710840      15.566751      9.554371
## 47    40.170725   22.583909      40.170725     24.749094
## 48    57.718608   27.146204      57.718608     30.784389
## 49     2.998836    6.322779       2.998836      6.436331
## 50     7.791406   16.292114       7.791406     16.580958
## 51     9.039514   23.817339       9.039514     24.464050
## 52     5.149975    7.550161       5.149975      7.783332
## 53    13.350864   19.482359      13.350864     20.076854
## 54    16.613178   27.272427      16.613178     28.510843
## 55     6.921950    8.408078       6.921950      8.770339
## 56    17.926259   21.713359      17.926259     22.638124
## 57    23.051370   29.635185      23.051370     31.487906
## 58     8.483875    9.065540       8.483875      9.563563
## 59    21.957095   23.424359      21.957095     24.696767
## 60    28.836799   31.387871      28.836799     33.868854
## 61     9.906061    9.592759       9.906061     10.231548
## 62    25.625832   24.797558      25.625832     26.430678
## 63    34.181521   32.742095      34.181521     35.860163
## 64    11.225804   10.026932      11.225804     10.810364
## 65    29.029192   25.929426      29.029192     27.933413
## 66    39.200457   33.812334      39.200457     37.572885
## 67    12.465737   10.390593      12.465737     11.321727
## 68    32.225853   26.878390      32.225853     29.261277
## 69    43.964106   34.668649      43.964106     39.074644
## 70    13.640841   10.698626      13.640841     11.779893
## 71    35.254643   27.683028      35.254643     30.451228
## 72    48.519399   35.357540      48.519399     40.410235
library(scales)

# Simulación de portafolio sin cobertura (ya calculado)
portfolio_values <- portfolio_values %>%
  mutate(strategy = "Sin Cobertura")

# Valor de opciones europeas ATM y OTM
opciones_filtro <- opciones_resultados %>%
  filter(strike_type %in% c("ATM", "OTM")) %>%
  select(symbol, T, strike_type, put_europeo, call_europeo)

# Asignar cobertura basada en volatilidad
sigma_total <- sum(sigma)
asignacion_cobertura <- sigma / sigma_total * 850000

# Determinar cobertura por trimestre:
# T = 0.25: Put ATM
# T = 0.5: Put OTM
# T >= 0.75: Collar = Put OTM + Call OTM
opciones_cobertura <- opciones_filtro %>%
  mutate(funds_allocated = asignacion_cobertura[match(symbol, tick)] / 3) %>%
  filter((T == 0.5 & strike_type == "ATM") |
           (T == 0.75 & strike_type == "OTM") |
           (T >= 0.1 & strike_type == "OTM")) %>%
  mutate(
    tipo_cobertura = case_when(
      T == 0.5 ~ "Put ATM",
      T == 0.75 ~ "Put OTM",
      T >= 0.1 ~ "Collar (Put + Call)"
    ),
    costo_opcion = case_when(
      T == 0.5 ~ put_europeo,
      T == 0.75 ~ put_europeo,
      T >= 0.1 ~ put_europeo + call_europeo
    ),
    contracts = funds_allocated / costo_opcion
  )

# Gráfica de contratos comprados por activo y trimestre
ggplot(opciones_cobertura, aes(x = factor(T), y = contracts, fill = symbol)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Cantidad de Contratos de Opciones Comprados por Estrategia",
       x = "Trimestre",
       y = "Número de Contratos",
       fill = "Activo") +
  scale_y_continuous(labels = scales::comma) + # Formato de miles en el eje Y
  facet_wrap(~tipo_cobertura) +
  theme_minimal()

# Mostrar tabla ordenada de contratos por activo y trimestre
opciones_cobertura_tabla <- opciones_cobertura %>%
  select(symbol, T, tipo_cobertura, contracts, costo_opcion, funds_allocated) %>%
  arrange(T, symbol)

print(opciones_cobertura_tabla)
##    symbol    T      tipo_cobertura  contracts costo_opcion funds_allocated
## 1    AAPL 0.25 Collar (Put + Call)  4275.1418    24.083520       102960.46
## 2    MSFT 0.25 Collar (Put + Call)  2388.7443    32.856853        78486.62
## 3     WMT 0.25 Collar (Put + Call) 10930.1065     9.321615       101886.25
## 4    AAPL 0.50             Put ATM  7528.4270    13.676225       102960.46
## 5    AAPL 0.50             Put ATM  5284.8047    19.482359       102960.46
## 6    MSFT 0.50             Put ATM  4537.5486    17.297142        78486.62
## 7    MSFT 0.50             Put ATM  2877.8745    27.272427        78486.62
## 8     WMT 0.50             Put ATM 19289.0128     5.282087       101886.25
## 9     WMT 0.50             Put ATM 13494.5801     7.550161       101886.25
## 10   AAPL 0.75             Put OTM  4741.8026    21.713359       102960.46
## 11   MSFT 0.75             Put OTM  2648.4270    29.635185        78486.62
## 12    WMT 0.75             Put OTM 12117.6626     8.408078       101886.25
## 13   AAPL 1.00 Collar (Put + Call)  2268.7784    45.381454       102960.46
## 14   MSFT 1.00 Collar (Put + Call)  1303.2304    60.224670        78486.62
## 15    WMT 1.00 Collar (Put + Call)  5805.6776    17.549416       101886.25
## 16   AAPL 1.25 Collar (Put + Call)  2041.9187    50.423391       102960.46
## 17   MSFT 1.25 Collar (Put + Call)  1172.7792    66.923616        78486.62
## 18    WMT 1.25 Collar (Put + Call)  5225.2518    19.498821       101886.25
## 19   AAPL 1.50 Collar (Put + Call)  1873.4180    54.958618       102960.46
## 20   MSFT 1.50 Collar (Put + Call)  1074.9708    73.012791        78486.62
## 21    WMT 1.50 Collar (Put + Call)  4794.0297    21.252736       101886.25
## 22   AAPL 1.75 Collar (Put + Call)  1742.0148    59.104243       102960.46
## 23   MSFT 1.75 Collar (Put + Call)   998.1416    78.632755        78486.62
## 24    WMT 1.75 Collar (Put + Call)  4457.6817    22.856331       101886.25
## 25   AAPL 2.00 Collar (Put + Call)  1635.9116    62.937671       102960.46
## 26   MSFT 2.00 Collar (Put + Call)   935.7354    83.876939        78486.62
## 27    WMT 2.00 Collar (Put + Call)  4186.0510    24.339467       101886.25
#Portafolio simulado
portfolio_values <- portfolio_values %>%
  mutate(strategy = "Sin Cobertura")


# Valor de opciones europeas ATM y OTM
opciones_filtro <- opciones_resultados %>%
  filter(strike_type %in% c("ATM", "OTM")) %>%
  select(symbol, T, strike_type, put_europeo, call_europeo, K)

# Asignar cobertura basada en volatilidad
sigma_total <- sum(sigma)
asignacion_cobertura <- sigma / sigma_total * 850000


# Verificar si el costo total excede el presupuesto y ajustar si es necesario
costo_estimado <- sum(opciones_cobertura$costo_opcion * opciones_cobertura$contracts)

if (costo_estimado > 850000) {
  factor_ajuste <- 850000 / costo_estimado
  opciones_cobertura$contracts <- opciones_cobertura$contracts * factor_ajuste
}

# Tabla ordenada
opciones_cobertura_tabla <- opciones_cobertura %>%
  select(symbol, T, tipo_cobertura, costo_opcion, contracts) %>%
  arrange(symbol, T)

print(opciones_cobertura_tabla)
##    symbol    T      tipo_cobertura costo_opcion contracts
## 1    AAPL 0.25 Collar (Put + Call)    24.083520 1425.0473
## 2    AAPL 0.50             Put ATM    13.676225 2509.4757
## 3    AAPL 0.50             Put ATM    19.482359 1761.6016
## 4    AAPL 0.75             Put OTM    21.713359 1580.6009
## 5    AAPL 1.00 Collar (Put + Call)    45.381454  756.2595
## 6    AAPL 1.25 Collar (Put + Call)    50.423391  680.6396
## 7    AAPL 1.50 Collar (Put + Call)    54.958618  624.4727
## 8    AAPL 1.75 Collar (Put + Call)    59.104243  580.6716
## 9    AAPL 2.00 Collar (Put + Call)    62.937671  545.3039
## 10   MSFT 0.25 Collar (Put + Call)    32.856853  796.2481
## 11   MSFT 0.50             Put ATM    17.297142 1512.5162
## 12   MSFT 0.50             Put ATM    27.272427  959.2915
## 13   MSFT 0.75             Put OTM    29.635185  882.8090
## 14   MSFT 1.00 Collar (Put + Call)    60.224670  434.4101
## 15   MSFT 1.25 Collar (Put + Call)    66.923616  390.9264
## 16   MSFT 1.50 Collar (Put + Call)    73.012791  358.3236
## 17   MSFT 1.75 Collar (Put + Call)    78.632755  332.7139
## 18   MSFT 2.00 Collar (Put + Call)    83.876939  311.9118
## 19    WMT 0.25 Collar (Put + Call)     9.321615 3643.3688
## 20    WMT 0.50             Put ATM     5.282087 6429.6709
## 21    WMT 0.50             Put ATM     7.550161 4498.1934
## 22    WMT 0.75             Put OTM     8.408078 4039.2209
## 23    WMT 1.00 Collar (Put + Call)    17.549416 1935.2259
## 24    WMT 1.25 Collar (Put + Call)    19.498821 1741.7506
## 25    WMT 1.50 Collar (Put + Call)    21.252736 1598.0099
## 26    WMT 1.75 Collar (Put + Call)    22.856331 1485.8939
## 27    WMT 2.00 Collar (Put + Call)    24.339467 1395.3503

Basándose en la volatilidad de cada activo y en la asignación de capital, se calcula el número de contratos de opciones a comprar. Se explica la estrategia, en la que se combinan opciones put y call. Esta estrategia se adopta debido a la expectativa de que el precio baje durante el primer semestre y, posteriormente, se recupere. Esto permite limitar tanto las pérdidas como las ganancias, ofreciendo una cobertura balanceada. La prima pagada por las opciones se utiliza como un costo de seguro contra movimientos adversos en el precio del activo. Se analiza cómo esta prima afecta la rentabilidad neta y se justifica su pago como una medida de protección ante escenarios extremos.

El portafolio tiene estrategias de cobertura con opciones para las tres acciones;cada estrategia tiene un horizonte temporal (T en años), un tipo de cobertura, un costo asociado, y una cantidad de contratos (que podemos interpretar como magnitud de exposición o volumen de cobertura).

Consolidado por Tipo de Cobertura

Tipos utilizados: Put ATM: Protección directa en el dinero (costo moderado, cobertura efectiva). Put OTM: Protección barata pero menos efectiva (apuesta a eventos extremos). Collar (Put + Call): Reducción de costos al limitar ganancias y pérdidas.

El portafolio está fuertemente inclinado hacia estrategias de tipo Collar, lo cual es coherente con la conclusión de que se busca cobertura con menor costo neto.

Análisis por Acción

AAPL 1. Mayor proporción de puts ATM y OTM (más defensivo al corto plazo). 2. A medida que el tiempo (T) aumenta, predominan los collars, lo que indica un enfoque progresivo hacia coberturas más baratas y balanceadas.

MSFT 1. Estrategia similar a AAPL. 2. A corto plazo (T < 1): mezcla de puts ATM y OTM. 3. A largo plazo (T ≥ 1): uso de collars costosos

WMT 1. Altísima exposición a puts ATM a corto plazo 2. A largo plazo, transición hacia collars, pero con menores costos y contratos que en las tecnológicas, lo que reafirma el enfoque defensivo.

El portafolio demuestra un enfoque de cobertura gradual, aumentando el uso de collars a medida que crece el horizonte (T). Se priorizan estrategias defensivas a corto plazo para WMT, mientras que AAPL y MSFT usan estrategias mixtas con énfasis en cobertura flexible a largo plazo. La elección de opciones coincide con el análisis de riesgo-rentabilidad previo: se protege más donde hay más volatilidad y riesgo de caída.

8. Conclusiones Finales

Las acciones AAPL y MSFT han caído en el período analizado, mientras que WMT se mantiene estable.

La optimización por media-varianza asigna pesos eficientes que minimizan el riesgo total.

La simulación MGB muestra trayectorias plausibles para evaluar escenarios futuros.

La rentabilidad ponderada y el índice Sharpe negativo justifican la necesidad de estrategias de cobertura.

Se calcularon estadísticas descriptivas para cada activo, ayudando a comprender la distribución de retornos.

Se visualizaron precios simulados a cierre de cada trimestre y tendencias generales.

El uso de la prima se justifica como un costo de seguro que limita pérdidas en escenarios adversos.

Dentro de nuestro portafolio compuesto por WMT, AAPL y MSFT, empleamos una estrategia de Collar para cubrir el 85% de la inversión debido a su eficiencia en la protección del capital con bajo costo. Esta estrategia nos permite:

1. Limitar las pérdidas ante caídas bruscas en el precio de las acciones mediante la compra de opciones put.

2. Reducir el costo de la cobertura financiando parcialmente la prima del put con la venta de opciones call.

3. Estabilizar el desempeño del portafolio en escenarios de alta volatilidad, sin renunciar completamente a rendimientos positivos dentro de un rango.