El objetivo del laboratorio es diseñar y evaluar estrategias de cobertura mediante opciones para proteger el 85% de un portafolio de USD 10 millones durante un horizonte de 2 años. Nuestro portafolio esta compuesto por las acciones de Cisco Systems (CSCO), Marvell Technology (MRVL) y Veeva Systems (VEEV). analizando cómo cambia su nivel de riesgo con la cobertura. El informe está organizado en tres bloques: en el Bloque I se realiza la selección de los activos y la construcción del portafolio óptimo; en el Bloque II se realiza la simulación mediante el MBG con GARCH y se calcula el VaR del portafolio sin cobertura; y en el Bloque III se seleccionan las opciones y se construyen las tres estrategias de cobertura, para posteriormente analizar su comportamiento y efecto sobre el riesgo del portafolio.
doc <- read.csv(file.path(carpeta, "documentacion_datos.csv"))
knitr::kable(doc, caption = "Documentación de los datos descargados")
| ticker | empresa | sector | mercado | primera_fecha | ultima_fecha | n_obs_crudas | faltantes | fuente | descarga |
|---|---|---|---|---|---|---|---|---|---|
| CSCO | Cisco Systems, Inc. | Tecnología (redes y equipos de telecomunicaciones) | NASDAQ | 2021-10-01 | 2026-09-25 | 1251 | 0 | Yahoo Finance (quantmod) | 2026-09-21 10:00 |
| VEEV | Veeva Systems Inc. | Salud (software para ciencias de la vida) | NYSE | 2021-10-01 | 2026-09-25 | 1251 | 0 | Yahoo Finance (quantmod) | 2026-09-21 10:00 |
| MRVL | Marvell Technology, Inc. | Tecnología (semiconductores) | NASDAQ | 2021-10-01 | 2026-09-25 | 1251 | 0 | Yahoo Finance (quantmod) | 2026-09-21 10:00 |
Las tres acciones se eligieron, en primer lugar, por liquidez de opciones: necesitábamos acciones donde fuera posible encontrar puts y calls con vencimientos entre 12 y 24 meses y con condiciones de mercado razonables (bid-ask ajustado, open interest suficiente). En segundo lugar, buscamos algo de diversificación entre ellas. CSCO y MRVL pertenecen al sector Tecnología, pero CSCO está más relacionada con redes e infraestructura, mientras que MRVL está enfocada en semiconductores. VEEV, por su parte, pertenece a un sector completamente distinto: software para ciencias de la vida. Es decir, aunque dos de las tres comparten el mismo sector amplio, no dependen del mismo negocio ni de los mismos factores de demanda, lo que ayuda a que el portafolio no esté totalmente concentrado en un solo tipo de riesgo.
Para el análisis del portafolio se trabajó con información desde el 1 de octubre de 2021. Adicionalmente, para la estimación de los modelos GARCH se utilizó información histórica desde el 20 de septiembre de 2016, con 2.517 observaciones para cada activo. De esta forma se contó con una historia más amplia para estimar la volatilidad utilizada en la simulación.
Aunque la marca de descarga se fijó en una fecha de referencia para mantener la reproducibilidad del análisis entre corridas, los datos de precios incluyen información de mercado hasta la última fecha disponible al momento de ejecutar el script (25 de septiembre de 2026).
liquidez <- read.csv("liquidez_opciones_candidatos.csv")
knitr::kable(liquidez, digits = 3, caption = "Liquidez por vencimiento (paso 1)")
| ticker | spot | div_yield | vencimiento | dias | puts_con_bid | calls_con_bid | spread_rel_put_med | spread_rel_call_med | oi_put_med | vol_put_sum | iv_put_med |
|---|---|---|---|---|---|---|---|---|---|---|---|
| MRVL | 261.935 | 0.001 | 2027-12-17 | 452 | 6 | 5 | 0.023 | 0.025 | 101.5 | 21 | 0.604 |
| MRVL | 261.935 | 0.001 | 2028-06-16 | 634 | 6 | 5 | 0.028 | 0.033 | 415.5 | 13 | 0.591 |
| MRVL | 261.935 | 0.001 | 2028-01-21 | 487 | 6 | 5 | 0.034 | 0.040 | 243.5 | 20 | 0.601 |
| MRVL | 261.935 | 0.001 | 2028-03-17 | 543 | 6 | 5 | 0.036 | 0.035 | 42.0 | 33 | 0.598 |
| CSCO | 106.700 | 0.016 | 2028-06-16 | 634 | 4 | 4 | 0.088 | 0.132 | 125.5 | 6 | 0.322 |
| CSCO | 106.700 | 0.016 | 2028-01-21 | 487 | 7 | 4 | 0.095 | 0.081 | 224.0 | 97 | 0.332 |
| CSCO | 106.700 | 0.016 | 2027-12-17 | 452 | 7 | 4 | 0.114 | 0.089 | 286.0 | 80 | 0.342 |
| VEEV | 280.680 | 0.000 | 2028-01-21 | 487 | 6 | 5 | 0.133 | 0.085 | 44.5 | 19 | 0.394 |
Para seleccionar el vencimiento se consideraron conjuntamente los spreads relativos, el interés abierto y el volumen negociado. El 21 de enero de 2028 fue seleccionado como vencimiento común porque se encontraba dentro del horizonte requerido para los tres activos y presentaba condiciones de liquidez aceptables. Aunque no fue el vencimiento con menor spread en todos los casos, su elección permite mantener un horizonte homogéneo para la construcción y comparación de las estrategias.
port_opt <- read.csv(file.path(carpeta, "portafolio_optimo.csv"))
knitr::kable(port_opt, digits = 4, caption = "Retorno, volatilidad y contribución al riesgo")
| ticker | peso | mu_anual | sigma_anual | contrib_vol | pct_del_riesgo |
|---|---|---|---|---|---|
| CSCO | 0.60 | 0.1613 | 0.2610 | 0.1274 | 0.4430 |
| VEEV | 0.15 | -0.0047 | 0.3931 | 0.0256 | 0.0889 |
| MRVL | 0.25 | 0.3014 | 0.6437 | 0.1346 | 0.4681 |
Las correlaciones entre las tres acciones muestran que existe diversificación en el portafolio. La correlación entre CSCO y VEEV es de 0,17, entre CSCO y MRVL es de 0,42 y entre VEEV y MRVL es de 0,24. Estos valores no son cercanos a 1, por lo que las acciones no se comportan exactamente igual.
También se puede ver que el peso de cada acción no es igual a su aporte al riesgo. CSCO representa el 60% del portafolio y aporta el 44,3% del riesgo, VEEV tiene el 15% y aporta el 8,9%, mientras que MRVL representa el 25% y aporta el 46,8% del riesgo.
Esto se debe principalmente a la volatilidad de cada acción y a la forma en que se relaciona con las demás. En el caso de VEEV, aunque tiene una volatilidad individual mayor que CSCO, sus correlaciones con las otras acciones son bajas, por lo que su aporte al riesgo total termina siendo menor.
Retornos log y precios ajustados:
Para calcular los retornos del portafolio se utilizaron precios ajustados por dividendos, mientras que para dimensionar la posición y valorar las opciones se usó el precio de cierre sin ajustar, ya que es el precio real al que se transan las acciones y las opciones en el mercado. Se trabajó con retornos logarítmicos en lugar de simples porque son aditivos en el tiempo, lo que los hace consistentes con el Movimiento Browniano Geométrico que se simula en el Bloque II.
comp <- read.csv(file.path(carpeta, "comparacion_portafolios.csv"))
knitr::kable(comp, digits = 4, caption = "Máximo Sharpe vs. mínima varianza")
| portafolio | CSCO | VEEV | MRVL | retorno_anual | volatilidad | sharpe |
|---|---|---|---|---|---|---|
| Máximo Sharpe | 0.6000 | 0.1500 | 0.25 | 0.1714 | 0.2877 | 0.4306 |
| Mínima varianza | 0.6125 | 0.2375 | 0.15 | 0.1429 | 0.2569 | 0.3710 |
Se escogió el portafolio de máximo Sharpe porque permite analizar conjuntamente el retorno esperado y el riesgo. El portafolio de mínima varianza presenta una volatilidad anual menor, de 25,69%, frente al 28,77% del portafolio de máximo Sharpe. Sin embargo, también presenta un retorno esperado menor, de 14,29% frente a 17,14%.
El índice de Sharpe relaciona el rendimiento adicional obtenido con el nivel de riesgo asumido. En este caso, el portafolio de máximo Sharpe presenta un indicador de 0,4306, frente a 0,3710 del portafolio de mínima varianza.
Por esta razón, se seleccionó el portafolio de máximo Sharpe como base para el ejercicio de cobertura, buscando un equilibrio entre retorno esperado y riesgo.
posicion <- read.csv(file.path(carpeta, "posicion_y_cobertura.csv"))
knitr::kable(posicion, digits = 2, caption = "Acciones, contratos y cobertura del 85%")
| ticker | peso | spot | inversion_usd | acciones | acciones_a_cubrir_85 | contratos_aprox | criterio |
|---|---|---|---|---|---|---|---|
| CSCO | 0.60 | 106.70 | 6000000 | 56232 | 47797 | 478 | sharpe |
| VEEV | 0.15 | 280.68 | 1500000 | 5344 | 4542 | 45 | sharpe |
| MRVL | 0.25 | 261.94 | 2500000 | 9544 | 8112 | 81 | sharpe |
garch <- read.csv(file.path(carpeta, "garch_parametros.csv"))
knitr::kable(garch, digits = 4, caption = "Parámetros GARCH(1,1) por activo")
| ticker | n_obs | omega | alpha1 | beta1 | persistencia | vol_anual_incondicional | vol_anual_ultima | vol_anual_pronost_final |
|---|---|---|---|---|---|---|---|---|
| CSCO | 2517 | 0e+00 | 0.2103 | 0.7117 | 0.9220 | 0.2989 | 0.3236 | 0.2989 |
| VEEV | 2517 | 1e-04 | 0.0504 | 0.8283 | 0.8786 | 0.3885 | 0.3709 | 0.3885 |
| MRVL | 2517 | 0e+00 | 0.1542 | 0.8255 | 0.9797 | 0.7309 | 0.5512 | 0.7309 |
La persistencia del modelo GARCH muestra cuánto tiempo tienden a mantenerse los efectos de un choque fuerte en la volatilidad. Cuando está cerca de 1, como en MRVL (0,98), quiere decir que ese choque casi no se olvida: si hay una noticia que mueve mucho el precio, ese efecto sigue afectando las estimaciones de los días siguientes durante bastante tiempo. CSCO y VEEV tienen persistencias más moderadas (0,92 y 0,88), así que también tienen memoria, pero sus choques se van disipando un poco más rápido que en MRVL.
Se usó GARCH en vez de una volatilidad histórica fija porque el riesgo de una acción no es siempre el mismo: hay épocas más tranquilas y otras más agitadas. El GARCH va actualizando la estimación de volatilidad combinando lo que pasó recientemente con la volatilidad de períodos anteriores, mientras que una volatilidad fija asumiría el mismo nivel de riesgo todo el tiempo, sin importar lo que esté pasando en el mercado. Por eso resulta más adecuado para las simulaciones: permite que el riesgo del portafolio vaya cambiando a lo largo de los dos años, en vez de suponer que siempre es igual.
Se usó como deriva la tasa libre de riesgo menos el dividendo (r − q) porque es un supuesto que se apoya en información que sí se puede observar hoy en el mercado, y no en suponer que lo que pasó antes con cada acción se va a repetir. Por ejemplo, MRVL tuvo una deriva histórica de casi 30% anual, pero asumir que va a seguir creciendo así de rápido los próximos dos años sería arriesgado, porque rendimientos pasados no garantizan nada hacia adelante. En cambio, la tasa libre de riesgo sale de las tasas de los títulos del Tesoro y el dividendo es el rendimiento por dividendos del activo, o sea que son datos que uno puede consultar en el momento mismo de hacer la valoración. Por eso, para simular el MBG se prefirió usar r − q: así no se está proyectando a futuro un rendimiento histórico que a lo mejor no se vuelve a repetir.
var_sin <- read.csv(file.path(carpeta, "var_sin_cobertura_rf.csv"))
knitr::kable(var_sin, digits = 2, caption = "VaR y ES sin cobertura, por horizonte")
| horizonte | dias | VaR_95 | VaR_99 | ES_95 | VaR_95_pct_V0 | VaR_99_pct_V0 |
|---|---|---|---|---|---|---|
| 1er trimestre | 63 | 2181011 | 2905192 | 2634103 | 21.81 | 29.05 |
| Vencimiento opciones | 337 | 4525827 | 5542903 | 5157512 | 45.26 | 55.43 |
| 2 años | 504 | 5193395 | 6404082 | 5878950 | 51.93 | 64.04 |
El VaR al 95% al vencimiento de las opciones, de 45,26%, quiere decir que, para un portafolio de USD 10 millones y en los 337 días analizados, la pérdida correspondiente al percentil 5% es de aproximadamente USD 4,53 millones. En otras palabras, en el 5% de los escenarios la pérdida puede ser superior a ese valor. Al mirar las simulaciones a 2 años, se ve que la mediana del portafolio se puede quedar estancada o incluso bajar, mientras que la media sube. Esto pasa porque la distribución tiene una cola larga hacia la derecha: hay algunos escenarios con ganancias muy altas que jalan la media hacia arriba, aunque esos casos sean pocos y la mayoría de las simulaciones se queden en valores más bajos.
Por último, este nivel de riesgo sin cobertura muestra por qué es importante analizar una cobertura del 85% del portafolio, ya que se trata de una pérdida potencial de más del 45% del capital en el escenario de cola del 5%. Aun así, el VaR por sí solo no significa que esa pérdida vaya a ocurrir necesariamente; es una medida para dimensionar el riesgo y después poder compararlo con lo que cambia al incluir las estrategias de cobertura.
Matriz de dependencia en la simulación:
Para simular las tres acciones de forma correlacionada, se aplicó una descomposición de Cholesky sobre la matriz de correlación de los residuos estandarizados del modelo GARCH, de manera que los choques aleatorios usados en el Movimiento Browniano Geométrico mantuvieran la misma estructura de dependencia observada entre los tres activos.
candidatos <- read.csv(file.path(carpeta, "candidatos_top.csv"))
knitr::kable(candidatos[, c("ticker","tipo","strike","moneyness","tipo_moneyness",
"bid","ask","oi","volumen","iv","puntaje")],
digits = 3, caption = "Candidatos de strikes por liquidez (top 3 por tipo)")
| ticker | tipo | strike | moneyness | tipo_moneyness | bid | ask | oi | volumen | iv | puntaje |
|---|---|---|---|---|---|---|---|---|---|---|
| CSCO | call | 115.0 | 1.078 | OTM | 15.65 | 16.80 | 1360 | 58 | 0.410 | 6 |
| CSCO | call | 120.0 | 1.125 | OTM | 13.70 | 16.00 | 7254 | 150 | 0.428 | 6 |
| CSCO | call | 110.0 | 1.031 | OTM | 17.60 | 19.15 | 1456 | 4 | 0.421 | 9 |
| CSCO | put | 100.0 | 0.937 | OTM | 11.55 | 12.15 | 3125 | 2 | 0.324 | 7 |
| CSCO | put | 97.5 | 0.914 | OTM | 10.00 | 11.00 | 255 | 76 | 0.326 | 8 |
| CSCO | put | 105.0 | 0.984 | ATM | 14.00 | 14.55 | 174 | 2 | 0.319 | 10 |
| VEEV | call | 290.0 | 1.033 | OTM | 58.50 | 62.50 | 19 | 2 | 0.504 | 5 |
| VEEV | call | 300.0 | 1.069 | OTM | 54.50 | 58.50 | 252 | 1 | 0.500 | 5 |
| VEEV | call | 320.0 | 1.140 | OTM | 47.00 | 51.50 | 54 | 1 | 0.511 | 8 |
| VEEV | put | 260.0 | 0.926 | OTM | 34.00 | 38.50 | 35 | 10 | 0.392 | 6 |
| VEEV | put | 250.0 | 0.891 | OTM | 29.50 | 34.00 | 117 | 2 | 0.396 | 7 |
| VEEV | put | 230.0 | 0.819 | OTM | 21.50 | 26.00 | 179 | 2 | 0.407 | 8 |
| MRVL | call | 300.0 | 1.145 | OTM | 72.70 | 76.00 | 5840 | 49 | 0.737 | 7 |
| MRVL | call | 270.0 | 1.031 | OTM | 81.50 | 84.10 | 391 | 4 | 0.732 | 8 |
| MRVL | call | 290.0 | 1.107 | OTM | 75.60 | 78.25 | 227 | 12 | 0.735 | 8 |
| MRVL | put | 260.0 | 0.993 | ATM | 68.50 | 69.90 | 1676 | 1 | 0.598 | 7 |
| MRVL | put | 220.0 | 0.840 | OTM | 45.70 | 47.05 | 138 | 3 | 0.603 | 8 |
| MRVL | put | 230.0 | 0.878 | OTM | 50.70 | 52.45 | 349 | 10 | 0.600 | 8 |
elegidos <- read.csv(file.path(carpeta, "strikes_elegidos.csv"))
knitr::kable(elegidos, caption = "Strikes finales elegidos")
| ticker | put_strike | call_strike | criterio |
|---|---|---|---|
| CSCO | 97.5 | 115 | elegido por el equipo |
| VEEV | 260.0 | 300 | elegido por el equipo |
| MRVL | 250.0 | 260 | elegido por el equipo |
CSCO: la put tiene un moneyness de 0,9138, por lo que el strike está aproximadamente 8,6% por debajo del precio spot. Esto significa que la opción comienza a tener valor intrínseco cuando la acción cae por debajo de ese nivel.
VEEV: la put tiene un moneyness de 0,9263, con el strike aproximadamente 7,4% por debajo del precio spot.
MRVL: la put tiene un moneyness de 0,9544, por lo que el strike está cerca de 4,6% por debajo del precio spot. De las tres acciones, esta es la put cuyo strike está más cerca del precio actual.
La selección de los strikes no se hizo únicamente buscando el mayor interés abierto. También se tuvo en cuenta la distancia del strike frente al precio spot, el nivel de protección deseado y las condiciones de negociación observadas en las opciones disponibles. De esta manera, se escogieron strikes que permitieran construir las estrategias planteadas y mantener una liquidez razonable.
Es importante aclarar que dos de los strikes elegidos, la put de 250 y la call de 260 de MRVL, no aparecen entre los tres primeros candidatos de la tabla anterior. La put de 250 sí pasó el filtro de liquidez, con un open interest de 1.132 y un spread relativo de 3,6%, pero no quedó entre las tres opciones con mejor resultado. En el caso de la call de 260, esta no apareció porque el precio de MRVL era de USD 261,94 y el strike estaba por debajo del precio de la acción, por lo que la opción era ITM y no cumplía con el filtro de calls OTM. Sin embargo, la opción tenía cotización de mercado y el equipo decidió utilizarla para el collar.
paridad <- read.csv(file.path(carpeta, "paridad_put_call.csv"))
iv_garch <- read.csv(file.path(carpeta, "iv_vs_garch.csv"))
knitr::kable(iv_garch, digits = 3, caption = "IV implícita (mercado) vs. GARCH vs. histórica")
| ticker | iv_mediana_puts | iv_mediana_calls | garch_vol_ultima | garch_vol_incondicional | vol_historica |
|---|---|---|---|---|---|
| CSCO | 0.332 | 0.416 | 0.324 | 0.299 | 0.261 |
| VEEV | 0.400 | 0.508 | 0.371 | 0.389 | 0.393 |
| MRVL | 0.601 | 0.733 | 0.551 | 0.731 | 0.644 |
Al comparar la paridad put-call con el precio spot, se observa que las desviaciones son pequeñas, con medianas entre 0,24% y 0,47% del spot y valores máximos inferiores al 0,92%. Esto indica que, en general, la relación de paridad se cumple razonablemente, aunque no de manera exacta debido a que se están analizando opciones americanas. Por otro lado, al comparar la volatilidad implícita con la volatilidad estimada mediante GARCH, se observa que las IV de las puts son cercanas al GARCH en CSCO y VEEV, mientras que en MRVL la diferencia es mayor. En las calls, la IV es superior al GARCH en las tres acciones, especialmente en VEEV y MRVL. Esto muestra que existe una diferencia importante entre las volatilidades implícitas de puts y calls, especialmente en VEEV y MRVL, y ayuda a explicar por qué en la estrategia collar la venta de calls puede generar un crédito que compense parte del costo de las puts.
tasas <- read.csv(file.path(carpeta, “tasas_libres_riesgo.csv”)) knitr::kable( tasas, digits = 4, caption = “Tasa libre de riesgo interpolada al vencimiento de las opciones” )
Como el vencimiento de las opciones es de aproximadamente 1,34 años, este no coincide exactamente con las tasas del Treasury de 1 y 2 años disponibles. Por esta razón, se utilizó una tasa libre de riesgo interpolada entre ambas —de 4,44% (1 año) y 4,76% (2 años), resultando en una tasa interpolada de 4,55%— con el fin de obtener una tasa más acorde con el plazo específico de las opciones, en lugar de usar directamente una que corresponda a un vencimiento distinto.
val <- read.csv(file.path(carpeta, "valoracion_opciones.csv"))
knitr::kable(val[, c("ticker","tipo","strike","mid","iv_yahoo","iv_propia_mid",
"precio_europeo","precio_americano","prima_ejercicio_anticipado",
"delta_americano")], digits = 4,
caption = "Valoración binomial CRR: europea vs. americana")
| ticker | tipo | strike | mid | iv_yahoo | iv_propia_mid | precio_europeo | precio_americano | prima_ejercicio_anticipado | delta_americano |
|---|---|---|---|---|---|---|---|---|---|
| CSCO | put | 97.5 | 10.500 | 0.3258 | 0.3493 | 10.1844 | 10.500 | 0.3156 | -0.3083 |
| CSCO | call | 115.0 | 16.225 | 0.4105 | 0.3714 | 16.2246 | 16.225 | 0.0004 | 0.5404 |
| VEEV | put | 260.0 | 36.250 | 0.3916 | 0.4238 | 34.9420 | 36.250 | 1.3080 | -0.3170 |
| VEEV | call | 300.0 | 56.500 | 0.5000 | 0.4472 | 56.5000 | 56.500 | 0.0000 | 0.5967 |
| MRVL | put | 250.0 | 63.325 | 0.6005 | 0.6615 | 61.7114 | 63.325 | 1.6136 | -0.3138 |
| MRVL | call | 260.0 | 86.850 | 0.7386 | 0.6878 | 86.8500 | 86.850 | 0.0000 | 0.6836 |
Es importante aclarar que dos de los strikes elegidos, la put de 250 y la call de 260 de MRVL, no aparecen entre los tres primeros candidatos de la tabla anterior. La put de 250 sí pasó el filtro de liquidez, con un open interest de 1.132 y un spread relativo de 3,6%, pero no quedó entre las tres opciones con mejor resultado.
En el caso de la call de 260, esta no apareció porque el precio de MRVL era de USD 261,94 y el strike estaba por debajo del precio de la acción, por lo que la opción era ITM y no cumplía con el filtro de calls OTM. Sin embargo, la opción tenía cotización de mercado y el equipo decidió utilizarla para el collar.
Al comparar la volatilidad implícita calculada por nosotros con la de Yahoo, encontramos diferencias tanto en las puts como en las calls. Por eso decidimos calcular nuestra propia IV usando el árbol binomial CRR y el precio medio de mercado, para que la valoración fuera consistente con el modelo utilizado. En cuanto al ejercicio anticipado, observamos que en las calls la diferencia es casi cero, mientras que en las puts es mayor: 0,3156 en CSCO, 1,308 en VEEV y 1,6136 en MRVL. Esto se debe a que los dividendos de las acciones son muy bajos o nulos, por lo que ejercer una call antes del vencimiento casi no resulta atractivo, ya que se pierde el valor del tiempo que todavía le queda a la opción. En cambio, en una put puede ser conveniente ejercer antes cuando el precio de la acción cae bastante, porque se recibe antes el dinero correspondiente al strike. Por eso el ejercicio anticipado tiene mayor valor en las puts que en las calls.
| ticker | A_protective_put | B_collar_put | B_collar_call |
|---|---|---|---|
| CSCO | 97.5 | 97.5 | 115 |
| VEEV | 260.0 | 260.0 | 300 |
| MRVL | 250.0 | 250.0 | 260 |
Protective Put: consiste en mantener la acción y comprar una opción put que da el derecho a venderla a un precio determinado. De esta forma, si el precio de la acción baja mucho, la put ayuda a limitar la pérdida.
Collar: consiste en mantener la acción, comprar una put y vender una call. La put protege al portafolio ante una caída del precio, mientras que la venta de la call genera un ingreso por la prima, pero limita parte de la ganancia si el precio de la acción sube demasiado.
Se escogió el bear put spread como tercera estrategia porque el VaR sin cobertura, de 45,26% al vencimiento, mostró un nivel de riesgo importante, por lo que se decidió incluir el bear put spread como tercera estrategias.A diferencia del covered call, que solo genera un ingreso por la prima y da un colchón limitado si el activo cae, el bear put spread sí permite compensar parte de las pérdidas gracias a la put comprada, dejando un rango de protección hasta el strike de la put vendida. Por eso esta estrategia encaja mejor con el objetivo de reducir el riesgo de pérdidas grandes, aunque hay que tener claro que su protección también tiene un límite y un costo asociado.
costos <- read.csv(file.path(carpeta, "costos_estrategias.csv"))
knitr::kable(costos, digits = 0, caption = "Costo neto por estrategia y acción (USD; negativo = crédito)")
| ticker | protective_put | collar | bear_put_spread |
|---|---|---|---|
| CSCO | 501900 | -273655 | 117110 |
| VEEV | 163125 | -91125 | 56250 |
| MRVL | 512932 | -190552 | 95175 |
| TOTAL | 1177958 | -555332 | 268535 |
El costo de las estrategias cambia bastante según cómo están armadas. La protective put fue la más cara, con un total de USD 1.177.957,50, porque solo compra puts y hay que pagar toda la prima. El bear put spread costó USD 268.535, porque vender una put con strike más bajo ayuda a financiar parte de la put comprada. El collar, en cambio, dio un resultado de -USD 555.332,50, es decir, un crédito neto: lo que se recibió por vender las calls fue mayor que lo que costó comprar las puts.
Esta diferencia se puede relacionar con las volatilidades implícitas observadas en las opciones. En las tres acciones, las calls presentaron una IV mayor que las puts, por lo que la prima recibida por vender las calls ayuda a cubrir el costo de las puts. En general, las estrategias que venden opciones reducen el desembolso inicial frente a la protective put, aunque también limitan parte de la protección o de la ganancia potencial.
El costo de la cobertura no se distribuyó directamente según los pesos del portafolio ni según la contribución al riesgo. La participación final de cada activo en el costo corresponde al valor de las primas de las opciones utilizadas en cada posición.
Para la protective put, CSCO representa el 42,61% del costo total, VEEV el 13,85% y MRVL el 43,54%. Esta distribución está relacionada con el número de contratos y con el precio de las opciones de cada activo.
Como referencia, la contribución al riesgo del portafolio es de 44,30% para CSCO, 8,89% para VEEV y 46,81% para MRVL. Por tanto, la distribución efectiva del costo es cercana a la distribución por riesgo en CSCO y MRVL, mientras que VEEV presenta una participación mayor en el costo debido al precio de las opciones utilizadas.
var_con <- read.csv(file.path(carpeta, "var_con_cobertura.csv"))
knitr::kable(var_con, digits = 2, caption = "VaR y ES por estrategia y horizonte")
| horizonte | dias | estrategia | VaR_95 | VaR_99 | ES_95 | VaR_95_pct | VaR_99_pct |
|---|---|---|---|---|---|---|---|
| 1er trimestre | 63 | Sin cobertura | 2181010.8 | 2905192.1 | 2634102.9 | 21.81 | 29.05 |
| 1er trimestre | 63 | Protective put | -814269.3 | -411171.8 | -568506.1 | -9.23 | -4.66 |
| 1er trimestre | 63 | Collar | 1594719.3 | 1778636.5 | 1706640.9 | 15.11 | 16.85 |
| 1er trimestre | 63 | Bear put spread | 1550096.9 | 2235124.8 | 1975783.9 | 15.93 | 22.97 |
| Vencimiento opciones | 337 | Sin cobertura | 4525826.9 | 5542903.4 | 5157511.6 | 45.26 | 55.43 |
| Vencimiento opciones | 337 | Protective put | 121378.7 | 288716.7 | 225860.5 | 1.38 | 3.27 |
| Vencimiento opciones | 337 | Collar | 1855383.8 | 2022006.7 | 1959322.5 | 17.58 | 19.16 |
| Vencimiento opciones | 337 | Bear put spread | 3609097.8 | 4652222.3 | 4253799.5 | 37.09 | 47.81 |
Al comparar el VaR de las tres estrategias contra el escenario sin cobertura, la protective put es la que más reduce el riesgo. A 63 días, el VaR pasa de 21,81% sin cobertura a -9,23% con la protective put. Al vencimiento, pasa de 45,26% a 1,38%. El collar queda en 15,11% a 63 días y 17,58% al vencimiento, mientras que el bear put spread presenta 15,93% y 37,09%, respectivamente. En el caso de la protective put, el VaR negativo significa que en ese percentil el resultado de la estrategia todavía sería positivo.
Este resultado tiene sentido porque la protective put da la protección más amplia, pero a cambio hay que asumir el costo completo de la prima. En cambio, el collar y el bear put spread reducen el costo al vender otra opción, y por eso también tienen límites en la protección que ofrecen.
Aunque el collar usa las mismas puts compradas que la protective put, termina con un VaR más alto porque además incluye la venta de calls. En los escenarios extremos del portafolio no necesariamente caen las tres acciones al mismo tiempo: puede que una caiga mientras otra sube. En ese caso, la call vendida sobre la acción que sube puede generar pérdidas y quitar parte del efecto protector de las puts. Por eso la protective put logra una mayor reducción del VaR, mientras que el collar sacrifica parte de esa protección a cambio del ingreso recibido por las calls.
El bear put spread muestra una reducción moderada del VaR al 95%, pero tiene una protección más limitada en escenarios extremos. Esto pasa porque la put comprada protege ante las caídas, pero la put vendida en un strike más bajo limita hasta dónde llega esa protección. En caídas moderadas el spread todavía funciona bien, pero cuando la caída es mayor y el precio pasa el strike de la put vendida, la protección adicional se acaba.
En el primer trimestre, la protective put presenta un VaR de -9,23%. En este caso, el signo negativo indica que el percentil utilizado todavía corresponde a un resultado positivo de la estrategia, por lo que la pérdida de cola no llega a materializarse en ese horizonte bajo la convención utilizada en la simulación.
mtm <- read.csv(file.path(carpeta, "revaloracion_trimestral_mtm.csv"))
knitr::kable(mtm, digits = 2, caption = "Valor promedio de cada estrategia por trimestre (USD)")
| trimestre | dias | dentro_ventana_cobertura | media_pp | mtm_pct_pp | media_collar | mtm_pct_collar | media_spread | mtm_pct_spread |
|---|---|---|---|---|---|---|---|---|
| T1 | 63 | TRUE | 11209530 | 27.06 | 9508106 | -9.92 | 10323655 | 6.09 |
| T2 | 126 | TRUE | 11298611 | 28.07 | 9610605 | -8.95 | 10426903 | 7.15 |
| T3 | 189 | TRUE | 11382495 | 29.03 | 9713872 | -7.97 | 10521296 | 8.12 |
| T4 | 252 | TRUE | 11475626 | 30.08 | 9818961 | -6.98 | 10623745 | 9.17 |
| T5 | 315 | TRUE | 11612928 | 31.64 | 9937740 | -5.85 | 10774084 | 10.72 |
| T6 | 378 | FALSE | 10595556 | 20.11 | 10595556 | 0.38 | 10595556 | 8.88 |
| T7 | 441 | FALSE | 10704950 | 21.35 | 10704950 | 1.42 | 10704950 | 10.01 |
| T8 | 504 | FALSE | 10826608 | 22.72 | 10826608 | 2.57 | 10826608 | 11.26 |
eficiencia <- read.csv(file.path(carpeta, "eficiencia_estrategias.csv"))
knitr::kable(eficiencia, digits = 3, caption = "Costo como % del portafolio y eficiencia de cada estrategia")
| estrategia | costo_usd | costo_pct_V0 | reduccion_VaR95_usd | eficiencia_usd_reducido_por_usd_prima |
|---|---|---|---|---|
| Protective put | 1177957.5 | 11.780 | 4404448.2 | 3.739 |
| Collar | -555332.5 | -5.553 | 2670443.0 | NA |
| Bear put spread | 268535.0 | 2.685 | 916729.1 | 3.414 |
En T5 la cobertura todavía está activa, pero las opciones vencen en el día 337 y todavía quedan tres trimestres de exposición (T6, T7 y T8). Por eso, en ese punto sería necesario renovar la cobertura antes de llegar a T6, buscando nuevas opciones que cubran el tiempo que falta. No sería conveniente dejar el portafolio descubierto durante esos tres trimestres, porque todavía existe riesgo. La idea sería renovar la cobertura antes de que venzan las opciones actuales para evitar quedar sin protección.
A partir de T6 las opciones ya han vencido, por lo que las tres estrategias dejan de tener posiciones en opciones y el valor mostrado corresponde únicamente al portafolio de acciones. Por esta razón, desde T6 los valores de las tres estrategias coinciden. Para mantener una cobertura durante los dos años completos, sería necesario renovar las opciones antes de su vencimiento y realizar una nueva valoración de la cobertura.
En cuanto a la eficiencia, la protective put reduce más el VaR en términos absolutos (USD 4.404.448), pero también tiene un costo mayor (USD 1.177.958, equivalente al 11,78% del portafolio). El bear put spread logra una eficiencia parecida por cada dólar gastado (3,41 frente a 3,74 de la protective put), pero con un costo mucho menor (USD 268.535, equivalente al 2,69% del portafolio). Esto muestra que el bear put spread tiene una mejor relación entre el costo y la reducción del riesgo, aunque la protective put consiga una mayor reducción del VaR en términos absolutos.
El collar es diferente porque tiene un costo negativo y por eso no se puede calcular el mismo indicador de eficiencia. En este caso, se obtiene un crédito neto de USD 555.333, es decir, se reduce el riesgo y al mismo tiempo se recibe dinero en lugar de hacer un desembolso.
A partir de los resultados obtenidos, el equipo seleccionó el collar como estrategia de cobertura, tomando como criterio principal la relación entre el costo de la cobertura y la reducción del riesgo. La protective put presentó la mayor reducción del VaR, pero también implicó el mayor desembolso, con un costo de USD 1.177.957,50. El collar, por su parte, generó un crédito neto de USD 555.332,50 y redujo el VaR al 95% de 21,81% a 15,11% en el primer trimestre y de 45,26% a 17,58% al vencimiento de las opciones.
El bear put spread tuvo un costo de USD 268.535 y también permitió reducir el VaR frente al escenario sin cobertura, aunque su nivel de protección fue más limitado al vencimiento.
Con base en este criterio, el equipo escogió el collar porque permite disminuir parte del riesgo del portafolio sin realizar un desembolso inicial neto. Sin embargo, esta estrategia implica una limitación importante: la venta de las calls establece un nivel máximo para la ganancia de las acciones cubiertas. Por esto, el resultado del collar representa un equilibrio entre costo de cobertura, reducción del riesgo y participación en las ganancias del portafolio.
Ryan, J. A., & Ulrich, J. M. (2024). quantmod: Quantitative financial modelling framework [Paquete de R]. https://cran.r-project.org/package=quantmod
Yahoo Finance. (2026). Cotizaciones históricas y cadenas de opciones de CSCO, VEEV y MRVL [Datos]. https://finance.yahoo.com
Board of Governors of the Federal Reserve System (US). (2026). 1-Year Treasury Constant Maturity Rate [DGS1] y 2-Year Treasury Constant Maturity Rate [DGS2] [Datos]. FRED, Federal Reserve Bank of St. Louis. https://fred.stlouisfed.org/