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.
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)
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%
#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
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.
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.
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%.
#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.
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).
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.
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.
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.