Parte 1. Aplicación de cobertura con futuros de índice bursátil

1.1 Portafolio Óptimo de Inversión

1.1.1 Análisis Fundamental

1.1.2 American Express · S&P 500 · Financials · NYSE: AXP

Historia, modelo de negocio y posición competitiva

American Express, originalmente fundada como empresa de mensajería y transporte de valores en 1850, es, hoy en día, una de las redes de pago más rentables del planeta (American Express Newsroom, 2025). Su modelo de negocio, construido sobre un sistema propio e integrado, le otorga un nivel de control operativo que pocas compañías del sector pueden replicar. Mientras Visa o Mastercard operan como redes abiertas (donde son los bancos los que emiten las tarjetas bajo su propio nombre y asumen el riesgo crediticio mientras la red se limita a procesar los pagos), AmEx es simultáneamente quien: extiende el crédito y distribuye las tarjetas, procesa las transacciones, gestiona la relación con los clientes y además negocia con los comercios, lo que se conoce como una red de circuito cerrado (Forbes, 2014; Investopedia, 2024).

El éxito de American Express radica en este sistema pues hace que sea posible capturar un mayor margen por cada dólar transado y, al mismo tiempo, tener acceso directo a los hábitos de gasto de sus clientes (sin depender de bancos intermediarios en la mayoría de casos), esta cercanía le permite estructurar ofertas exclusivas que han sido la clave para retener a un segmento de clientes con un alto poder adquisitivo (Forbes, 2014). Por ejemplo, en 2025, el gasto anual promedio de un cliente de AmEx fue 2.9 veces superior al de los usuarios de otras redes, con un valor promedio por transacción un 60% más alto (American Express, 2025).

La superioridad del modelo de American Express se hace evidente al comparar los números: en 2023, la empresa generó ingresos anuales de 60 mil millones de dólares con apenas 140 millones de tarjetas en circulación, superando los 25 y 32 mil millones que percibieron Mastercard y Visa respectivamente, a pesar de que estas últimas contaban con más de mil millones de tarjetas en operación cada una (The Motley Fool, 2024; American Express Company, 2024). A esto se suma que sus clientes son, en general, muy solventes, la tasa de morosidad (cuentas con más de 30 días de retraso) de American Express en 2024, apenas alcanzó el 1.3%, una cifra significativamente menor al promedio del 3.17% registrado en la industria bancaria estadounidense (American Express Company, 2025; Board of Governors of the Federal Reserve System, 2025).

Desempeño financiero reciente

Hoy en día, sus ingresos provienen de tres fuentes principales: las comisiones cobradas directamente a los comercios, que representan aproximadamente el 51.78% del total, las cuotas anuales de membresía de sus productos de tarjeta (13.84%) y el cobro de intereses (24.04%) (American Express Company, 2026).

Los estados financieros recientes de American Express muestran que la compañía ha consolidado un crecimiento sostenido y predecible a lo largo de la última década. Entre 2019 y 2025, los ingresos netos ajustados crecieron de 43.6 a 72 mil millones de dólares (Bloomberg, 2026). La tasa de crecimiento, que llegó a ser de dos dígitos en el período post pandemia, se ha moderado hacia el 9% en los últimos dos períodos, no obstante, el beneficio neto ajustado continúa su expansión de forma sostenida, pasando de $9.99 mil millones en 2024 a $10.70 mil millones en 2025, con un margen que se ha mantenido estable en torno al 13% (pese a la desaceleración en el crecimiento de los ingresos, la compañía ha logrado operar con una eficiencia que le permite mantener su rentabilidad) (Bloomberg, 2026).

Al mismo tiempo, la expansión se ha traducido en indicadores sólidos: el ROE se ha mantenido consistentemente por encima del 30%, cerrando 2025 en 33.58% tras alcanzar un pico del 34.28% el año anterior (Bloomberg, 2026). En esa misma línea, el BPA ajustado pasó de $14.01 en 2024 a $15.38 en 2025, consolidando una tendencia que los estimados de Bloomberg proyectan continúe hasta los $20.12 para 2027 (Bloomberg, 2026).

Tabla 1. Información financiera destacada — AXP US Equity (Fuente: Bloomberg FA, 2026)
Indicador FY2019 FY2020 FY2021 FY2022 FY2023 FY2024 FY2025 FY2026 Est. FY2027 Est.
Ingreso neto aj. (MM USD) 43,556 36,087 42,380 52,862 60,515 65,949 72,229 79,078 86,083
Crecimiento YoY (%) 8.0 -17.1 17.4 24.7 14.5 9.0 9.5 9.5 8.9
Beneficio neto aj. (MM USD) 6,805 3,036 7,933 7,400 8,252 9,995 10,701 11,959 13,321
Margen (%) 15.6 8.4 18.7 14.0 13.6 15.2 14.8 15.1 15.5
Ingreso operacional aj. (MM USD) 8,650 4,296 10,689 9,585 10,513 12,895 13,795 15,282 17,026
Margen (%) 19.9 11.9 25.2 18.1 17.4 19.6 19.1 19.3 19.8
BPA aj. (USD) 8.20 3.77 10.02 9.85 11.21 14.01 15.38 17.60 20.12
Crecimiento YoY (%) 11.8 -54.0 165.8 -1.7 13.8 25.0 9.8 14.4 14.3
Tabla 2. Rentabilidad y márgenes — AXP US Equity (Fuente: Bloomberg FA, 2026)
Indicador 2019 2020 2021 2022 2023 2024 2025
ROE — Retorno sobre capital común (%) 29.24 13.18 35.13 31.56 31.28 34.28 33.58
ROA — Retorno en activos (%) 3.49 1.61 4.24 3.60 3.42 3.80 3.79
Retorno de capital (%) 7.90 4.04 12.31 11.41 11.48 12.78 12.55
Margen EBITDA (%) 27.82 20.79 31.30 25.12 28.22 30.76 29.59
Margen operacional (%) 19.35 11.90 25.22 18.13 17.37 19.55 19.10
Margen beneficio neto (%) 14.37 8.21 18.46 13.51 12.43 13.65 13.46
Ratio pago de dividendos (%) 20.48 45.85 17.13 21.19 21.45 20.00 21.36
Tasa crecimiento sostenible (%) 23.25 7.14 29.11 24.88 24.57 27.42 26.40

Expectativa de precio hacia el 30/03/2026

Con la acción cotizando en $301.90 al 24 de marzo de 2026, el consenso del mercado apunta a un potencial de valorización del 26.5%, con un precio objetivo de $381.85 según los 33 analistas cubiertos por Bloomberg (Bloomberg, 2026). La distribución de recomendaciones refleja una postura cautelosa pero optimista: el 54.5% recomienda mantener y el 39.4% recomienda comprar, con solo dos firmas en posición de venta (Bloomberg, 2026).

A comienzos de 2026, tras caer un 23% desde sus máximos históricos, la acción llegó a un punto de entrada atractivo (Patel, 2026). El mercado pasó de pagar casi $20 por cada dólar de utilidad generado el año anterior, a solo $17 por cada dólar que la empresa espera ganar en 2026 (Bloomberg, 2026). Sin embargo, la coyuntura económica actual ha generado dudas, la brecha entre el precio objetivo más conservador de BTIG ($285) y el más optimista de Deutsche Bank ($462) muestra que no hay un consenso claro sobre si el cliente de American Express seguirá gastando al mismo ritmo (Bloomberg, 2026; Volkman, 2026 ). Aunque la lógica indica que la acción tiene más espacio para subir que para seguir cayendo, esa confianza es hoy más frágil que hace unos meses.


1.1.3 Chipotle Mexican Grill · S&P 500 · Consumer Discretionary · NYSE: CMG

Historia, modelo de negocio y posición competitiva

Chipotle Mexican Grill fue fundada en 1993 en Colorado, EE.UU. con una propuesta diferente e innovadora para la época: vender comida mexicana, de alta calidad, con precios accesibles y en tiempos de servicio acordes a los de la comida rápida. Chipotle inició con un solo local financiado por un préstamo familiar y posteriormente se convirtió en una de las cadenas de restaurantes con mayor crecimiento de EE.UU. gracias a su iniciativa de lujo accesible y a la inversión de McDonald’s entre 1998 y 2006, la cual le permitió expandir sus puntos de venta de forma acelerada (Whitten, 2017). En 2006, Chipotle hace su salida a la Bolsa de Nueva York y desde entonces se convierte en una de las acciones más importantes y exitosas de la década (2006-2016), con una de las mayores revalorizaciones en el sector del consumo discrecional (Whitten, 2017).

Chipotle tiene un modelo de negocio compuesto por tres pilares. El primero es su misión: “Food With Integrity”, enfocada en ofrecer ingredientes frescos, trazabilidad en su cadena de suministro y un compromiso creciente en prácticas sostenibles y proteínas de origen responsable, esto les permite competir con los segmentos premium del mercado de comida rápida (Sorvino, 2025). El segundo, es su modelo de restaurantes propios, no ofrece franquicias, lo que le permite operar prácticamente la totalidad de sus más de 3,700 restaurantes directamente, teniendo control total sobre la calidad, la experiencia del cliente y los márgenes operativos (Sorvino, 2025). Finalmente, el tercer y último pilar son sus canales de atención, su carril de servicio rápido drive-thru “Chipotlane” y su plataforma digital que cuenta con un programa de lealtad con más de 40 millones de miembros activos, lo que ha llevado a que las ventas digitales lleguen a representar cerca del 35% de los ingresos totales sin requerir personal adicional, mejorando directamente la rentabilidad por restaurante. (Chipotle Mexican Grill, 2025).

En conjunto, Chipotle tiene una posición competitiva en el segmento fast casual prácticamente invulnerable en la actualidad pues sus principales competidores no logran replicar a CMG en su reconocimiento de marca, poder de fijación de precios y eficiencia operativa construida durante 3 décadas (Cabrera, 2025). De esta manera, su principal riesgo no proviene de competidores directos, sino de cambios macroeconómicos o fallas operativas que puedan llegar a afectar el gasto del consumidor o el desempeño de la empresa.

Desempeño financiero reciente

Chipotle cuenta con indicаdores de rentаbilidad que muestrаn una trayectoria de mejorаmiento continuo entre 2016 y 2025. El Retorno Sobre el Capital Común (ROE) creció de 1.30% en 2016 a 47.36% en 2025, еxpansión que es rеsultаdo de una mejorа en sus márgеnеs, un aumento en su eficiencia operаtiva y el mantеnimiеnto de sus ganancias en lugar de distribuirlas como dividendos, lo que lo consolida como uno de los ROE más altos del sеctor de rеstaurаntеs (Bloomberg, 2026). De igual forma, el Rеtorno Sobre Activos (ROA) crеció de 0.97% en 2016 a 16.88% en 2025, demostrando que Chipotle hace un uso cada vez más еficiеntе de sus activos (rеstaurantеs, еquipos, еfectivo e invеntarios) para gеnеrar mayores beneficios. Adicionalmente, el hecho de que el Retorno de Capital Invertido (ROIC) haya cerrado en 19.41%, por еncima del WACC de 10.52%, gеnеra un Sprеad EVA positivo de 8.88%, lo que rеafirma que Chipotlе no solo es rеntаble en el ámbito contаblе sino que crеa valor por еncima del costo de oportunidad del capital invеrtido (Chipotle Mexican Grill, 2026).

Rеspеcto al margen bruto, se observa una mejora del 12.47% hasta el 25.38% en 2025, lo que indica que la empresa ha logrado retener una mayor proporción de sus ventаs después de cubrir los costos directos, rеflеjаndo una mеjor rеntаbilidad del negocio principal (Bloomberg, 2026). Al mismo tiempo, el margen operacional mejoró del 0.89% al 16.23% en 2025, lo que permite inferir que Chipotle no solo mejoró la rentаbilidad directa de sus productos sino también su rentаbilidad general posterior a gastos operativos como administración y arrendamiento, en conjunto, la compañía se volvió considerablemente más eficiente y rentable a lo largo del período analizado (Bloomberg, 2026).

En cuanto a la еstructura de capital, se еvidеncia una compañía financiеramente sana donde la capitalización de mеrcado asciendе a $40,262 millones, representando el 90.5% de la estructura total, con dеuda a largo plazo de apenas $4,773 millones (8.9%) y dеuda a corto plazo de $302 millones (0.6%). Adicionalmеnte, Chipotle no distribuye dividendos, destinando su gеnеración de caja hacia la rеinvеrsión еn nuevas apеrturas y la rеcompra de accionеs.

Tabla 3. Información financiera destacada — CMG US Equity (Fuente: Bloomberg FA, 2026)
Indicador FY2019 FY2020 FY2021 FY2022 FY2023 FY2024 FY2025 FY2026 Est. FY2027 Est.
Capitalización de mercado (MM USD) 23,234.0 38,829.3 49,090.9 38,332.2 62,722.2 81,932.7 48,261.3 42,621.8
Valor de empresa (MM USD) 25,207.1 41,034.7 51,534.9 41,164.5 65,478.3 85,050.4 52,288.0 46,648.5
Ingresos aj. (MM USD) 5,586.4 5,984.6 7,547.1 8,634.7 9,871.6 11,313.9 11,925.6 12,953.2 14,381.9
Crecimiento YoY (%) 14.8 7.1 26.1 14.4 14.3 14.6 5.4 8.6 11.0
Beneficio bruto aj. (MM USD) 1,142.5 1,041.1 1,707.0 2,062.1 2,586.1 3,017.7 3,026.2 3,092.5 3,491.9
Margen (%) 20.5 17.4 22.6 23.9 26.2 26.7 25.4 23.9 24.3
EBITDA aj. (MM USD) 1,036.1 932.9 1,465.2 1,878.0 2,354.9 2,784.3 2,862.1 2,319.3 2,689.8
Margen (%) 18.5 15.6 19.4 21.7 23.9 24.6 24.0 17.9 18.7
Beneficio neto aj. (MM USD) 417.2 314.2 681.2 959.2 1,283.1 1,563.9 1,559.6 1,488.3 1,744.0
Margen (%) 7.5 5.2 9.0 11.1 13.0 13.8 13.1 11.5 12.1
BPA aj. (USD) 0.30 0.22 0.48 0.68 0.93 1.13 1.16 1.14 1.37
Crecimiento YoY (%) 71.07 -25.03 116.09 43.08 35.45 22.21 2.31 -1.28 19.69
Efectivo de operaciones (MM USD) 721.6 663.8 1,282.1 1,323.2 1,783.5 2,105.1 2,113.9
Gastos de capital (MM USD) -333.9 -373.4 -442.5 -479.2 -560.7 -593.6 -666.3 -737.5 -789.8
Flujo de caja libre (MM USD) 387.7 290.5 839.6 844.0 1,222.7 1,511.5 1,447.6 1,330.7 1,571.8
Tabla 4. Rentabilidad y márgenes — CMG US Equity (Fuente: Bloomberg FA, 2026)
Indicador 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025
ROE — Retorno sobre capital común (%) 1.30 12.74 12.58 22.41 19.21 30.25 38.54 45.26 45.67 47.36
ROA — Retorno en activos (%) 0.97 8.66 8.19 9.50 6.42 10.34 13.24 16.41 17.79 16.88
Retorno de capital (%) 1.30 12.71 12.56 11.71 7.32 11.88 15.09 18.60 20.04 19.07
Retorno de capital invertido (%) 1.14 12.40 12.02 11.24 7.13 11.46 14.53 17.63 18.94 18.18
Margen bruto (%) 12.76 16.89 18.73 20.45 17.40 22.62 23.88 26.20 26.67 25.38
Margen EBITDA (%) 4.63 9.70 9.46 17.22 14.35 18.80 21.30 23.39 24.17 23.80
Margen operacional (%) 0.89 6.05 5.31 7.95 4.85 10.67 13.44 15.78 16.94 16.23
Margen beneficio neto (%) 0.59 3.94 3.63 6.27 5.94 8.65 10.41 12.45 13.56 12.88
Tasa impositiva efectiva (%) 40.79 36.08 34.23 23.59 NA 19.66 23.90 24.18 23.68 23.58
Ratio pago de dividendos (%) 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Tasa de crecimiento sostenible (%) 1.30 12.74 12.58 22.41 19.21 30.25 38.54 45.26 45.67 47.36

Expectativa de precio hacia el 30/03/2026

Con la acción cotizando en $32.82 al 24 de marzo de 2026, el consenso del mercado apunta a un precio objetivo a 12 meses de $44.97, lo que representa un potencial de retorno del 37%. La distribución de recomendaciones es marcadamente optimista: el 71.8% de los analistas recomienda comprar (28 de 39), el 25.6% recomienda mantener (10 analistas) y únicamente el 2.6% recomienda vender (1 analista, Hedgeye Risk Management con posición corta).

Los precios objetivo individuales oscilan entre $28.00 (Zacks, el más conservador) y $52.00 (BMO Capital Markets, el más optimista), con firmas de alto perfil como Goldman Sachs ($46), Deutsche Bank ($48), Morgan Stanley ($49) y Bernstein ($50) situadas en el rango alcista. Es importante contextualizar que la acción acumula una caída del -33.8% en los últimos 12 meses, lo que explica en gran medida el amplio diferencial entre el precio actual y los objetivos de consenso (Chipotle Mexican Grill, 2026).

Desde el punto de vista de la inversión a largo plazo, el hecho de que la acción haya caído posiciona a CMG como una oportunidad interesante para los inversionistas. Recientemente, Argus subió su calificación a “Comprar”, justificando que los reportes que la compañía ha publicado son conservadores y que el potencial real de crecimiento para el segundo trimestre de 2026 es mayor al que el mercado está anticipando. Esto según los resultados que obtuvo la empresa en el primer trimestre del año, donde los ingresos crecieron un 7% gracias a mejoras operativas que apuntan a una recuperación de márgenes durante lo que queda del año y a lo largo de 2027 (Moadel, 2026).

1.1.4 Hilton Worldwide Holdings · S&P 500 · Consumer Discretionary · NYSE: HLT

Historia, modelo de negocio y posición competitiva

Hilton Worldwide Holdings Inc. es hoy una de las compañías hoteleras más grandes del mundo, gran parte de ese crecimiento se explica por la decisión de que en lugar de ser dueña de los hoteles, administra, oferece franquicias y licencia su marca a terceros. Estе modеlo, conocido como assеt-light, le pеrmitе expandirse sin nеcеsitar grandes invеrsiones en activos físicos, lo que se traducе en mayor flexibilidad y menor exposición al capital. Sus ingresos llеgan principalmente a través de tarifas de franquicia, contratos de administración y su programa de fidеlización Hilton Honors, que ha sido fundamental para consolidar rеlaciones duradеras tanto con viajeros frеcuеntes como con propiеtarios de hotеlеs (Hilton, 2026a; Hilton Worldwide Holdings Inc., 2026b).

Lo que también distinguе a Hilton es su capacidad de compеtir en prácticamеntе todos los segmentos del mercado hotelero, dеsde el lujo y estilo de vida hasta viajes corporativos y еstadías prolongadas, lo que le permite no dеpеndеr de un solo tipo de cliente ni de un solo ciclo económico (Hilton, 2026a).

Desempeño financiero reciente

Hilton ha mostrado un buen desempeño recientemente con un crecimiento operativo estable y una buena capacidad para generar caja. Según Bloomberg, para el FY 2025 la compañía registraba ingresos ajustados cercanos a USD 12.039 millones, con un crecimiento anual del 7.74% (Bloomberg, 2026). Adеmás, rеportó un EBITDA ajustado aproximado de USD 3.056 millones (un margеn EBITDA del 25.38%) con un benеficio nеto posterior cercano a los 1.522 millones y un flujo de caja libre de aproximadamente USD 2.028 millones, confirmando quе la compañía opera con rеntabilidad y tiene margen para crеcer (Bloomberg, 2026).

Las еstimacionеs de Bloombеrg para el FY 2026 apuntan a ingrеsos por USD 13,071 millonеs y un EBITDA ajustado de USD 4,034 millones, lo que rеprеsеnta еxpеctativas de mеjora en rеntabilidad y crеcimiеnto frеntе a 2025. Dicho еsto, al sеr una acción del sеctor del consumo discrеcional, HLT sigue siendo sеnsible al ciclo еconómico, las tasas de intеrés y la confianza del consumidor (Hilton Worldwide Holdings Inc., 2026a; Bloomberg, 2026).

Dеsdе el punto de vista fundamеntal, la acción también prеsеnta buеnos indicadorеs de eficiencia operativa y financiera. Según los rеportes de Bloombеrg, la compañía tiеne un WACC cеrcano al 10.1% y un ROIC aproximado del 24.35%, por lo que su sprеad EVA еs positivo (del 14.21%), indicando quе la compañía genera valor por еncima del costo de capital (Bloomberg, 2026).. Además, al analizar su еstructura de capital se encuentra que Hilton еs principalmente rеspaldada por capitalización bursátil, quе es cеrcana a los USD 66.192 millones, frente una deuda total de USD 13.214 millones (Bloomberg, 2026)..

Tabla 5. Información financiera destacada — HLT US Equity (Fuente: Bloomberg FA, 2026)
Indicador FY2019 FY2020 FY2021 FY2022 FY2023 FY2024 FY2025 FY2026 Est. FY2027 Est.
Capitalización de mercado (MM USD) 30,942.2 30,884.8 43,535.4 33,846.8 46,157.7 59,764.9 66,191.9 68,393.1
Valor de empresa (MM USD) 39,577.2 39,298.8 51,886.4 42,332.8 55,490.7 70,504.9 78,529.9 80,731.1
Ingresos aj. (MM USD) 9,452.0 4,307.0 5,788.0 8,773.0 10,235.0 11,174.0 12,039.0 13,070.8 14,168.7
Crecimiento YoY (%) 6.1 -54.4 34.4 51.6 16.7 9.2 7.7 8.6 8.4
Beneficio bruto aj. (MM USD) 8,198.0 3,687.0 5,109.0 7,774.0 9,094.0 10,048.0 10,945.0 7,888.9 8,581.3
Margen (%) 86.7 85.6 88.3 88.6 88.9 89.9 90.9 60.4 60.6
EBITDA aj. (MM USD) 2,334.0 766.0 1,455.0 2,419.0 2,606.0 3,254.0 3,056.0 4,034.3 4,389.6
Margen (%) 24.7 17.8 25.1 27.6 25.5 29.1 25.4 30.9 31.0
Beneficio neto aj. (MM USD) 1,028.7 -143.2 517.1 1,293.5 1,341.4 1,733.1 1,521.7 2,052.0 2,280.1
Margen (%) 10.9 -3.3 8.9 14.7 13.1 15.5 12.6 15.7 16.1
BPA aj. (USD) 3.55 -0.52 1.84 4.67 5.09 6.93 6.39 9.05 10.40
Crecimiento YoY (%) 27.66 153.59 9.03 36.19 -7.80 41.51 14.93
Efectivo de operaciones (MM USD) 1,384.0 708.0 109.0 1,681.0 1,946.0 2,013.0 2,129.0
Gastos de capital (MM USD) -81.0 -46.0 -35.0 -39.0 -151.0 -96.0 -101.0 -109.0 -114.7
Flujo de caja libre (MM USD) 1,303.0 662.0 74.0 1,642.0 1,795.0 1,917.0 2,028.0 2,434.0 2,644.0
Tabla 6. Rentabilidad y márgenes — HLT US Equity (Fuente: Bloomberg FA, 2026)
Indicador 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025
ROE — Retorno sobre capital común (%) 5.69 28.58 68.24 NA NA NA NA NA NA NA
ROA — Retorno en activos (%) 1.30 5.36 5.41 6.09 -4.51 2.55 8.11 7.38 9.62 8.75
Retorno de capital (%) 2.38 12.69 12.81 14.29 -4.05 7.28 17.75 17.92 25.24 23.46
Retorno de capital invertido (%) -0.20 11.35 11.35 13.03 -3.25 7.10 15.99 17.36 24.73 23.15
Margen bruto (%) 80.55 84.39 85.04 86.73 85.60 88.27 88.61 88.85 89.92 90.91
Margen EBITDA (%) 23.43 18.05 19.73 22.71 0.98 22.86 27.00 24.33 23.49 24.72
Margen operacional (%) 13.20 13.92 16.08 17.53 -9.71 17.45 23.87 21.74 21.21 22.37
Margen beneficio neto (%) 5.14 13.33 8.58 9.32 -16.60 7.08 14.31 11.15 13.74 12.10
Tasa impositiva efectiva (%) 103.15 NA 28.66 28.78 NA 27.32 27.51 31.97 13.68 29.49
Ratio de pago de dividendos (%) NA 18.08 23.72 19.55 NA 0.00 9.86 13.76 9.69 9.72
Tasa de crecimiento sostenible (%) NA 23.41 52.06 NA NA NA NA NA NA 9.72

Expectativa de precio hacia el 30/03/2026

Teniendo en cuenta que la acción de la compañía se cotiza alrededor de los USD 298.73 al 24/03/2026, la expectativa hacia el 30/03/2026 puede clasificarse como moderadamente alcista. Esta expectativa respecto a la acción se base en la información consultada en Bloomberg, donde el precio objetivo a 12 meses era de USD 336.00 según el consenso de mercado, frente al precio al que tranza hoy, esto implica un potencial de valorización aproximado del 12.48%. Asimismo, el 55.6% de los analistas recomienda comprar, el 40.7% mantener y solo el 3.7% a favor de vender, lo que confirma hay optimismo respecto al comportamiento de la acción (Bloomberg, 2026).

1.1.5 Estimadores Anuales

# ── Paso 1: Cargar librerías ──────────────────────────────────────────────
library(readxl)
library(dplyr)
library(knitr)
library(kableExtra)

# ── Paso 2: Cargar el archivo ─────────────────────────────────────────────
datos <- read_excel(
  "/Users/santiagocampillo/Documents/SEMESTRE VII/Ins. Financieros Derivados/Acciones Portafolio.xlsx"
)

# ── Paso 3: Ordenar por fecha ─────────────────────────────────────────────
precios <- datos %>%
  arrange(Date)

# ── Paso 4: Calcular retornos logarítmicos diarios ───────────────────────
retornos <- precios %>%
  mutate(
    r_AXP   = log(AXP   / lag(AXP))   * 100,
    r_CMG   = log(CMG   / lag(CMG))   * 100,
    r_HLT   = log(HLT   / lag(HLT))   * 100,
    r_SP500 = log(SP500 / lag(SP500)) * 100
  ) %>%
  na.omit()

# ── Paso 5: Anualizar con año comercial de 252 días ───────────────────────
dias <- 252

estadisticas <- data.frame(
  Accion = c("American Express (AXP)", "Chipotle Mexican Grill (CMG)", 
             "Hilton Worldwide (HLT)", "S&P 500"),
  
  Retorno_Anual = c(
    mean(retornos$r_AXP)  * dias,
    mean(retornos$r_CMG)  * dias,
    mean(retornos$r_HLT)  * dias,
    mean(retornos$r_SP500) * dias
  ),
  
  Varianza_Anual = c(
    var(retornos$r_AXP)  * dias,
    var(retornos$r_CMG)  * dias,
    var(retornos$r_HLT)  * dias,
    var(retornos$r_SP500) * dias
  ),
  
  Desv_Estandar_Anual = c(
    sd(retornos$r_AXP)  * sqrt(dias),
    sd(retornos$r_CMG)  * sqrt(dias),
    sd(retornos$r_HLT)  * sqrt(dias),
    sd(retornos$r_SP500) * sqrt(dias)
  )
)

# ── Paso 7: Mostrar tabla ─────────────────────────────────────
estadisticas_fmt <- estadisticas %>%
  mutate(
    Retorno_Anual       = paste0(round(Retorno_Anual, 2), "%"),
    Varianza_Anual = paste0(round(Varianza_Anual / 100, 2), "%"),
    Desv_Estandar_Anual = paste0(round(Desv_Estandar_Anual, 2), "%")
  )

kable(
  estadisticas_fmt,
  col.names = c("Acción", "Retorno Anual", "Varianza Anual", "Desviación Estándar Anual"),
  caption   = "Tabla 7. Retornos y estadísticas anuales del portafolio (252 días comerciales)"
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = TRUE,
    font_size  = 10
  )
Tabla 7. Retornos y estadísticas anuales del portafolio (252 días comerciales)
Acción Retorno Anual Varianza Anual Desviación Estándar Anual
American Express (AXP) 16.13% 9.9% 31.47%
Chipotle Mexican Grill (CMG) 12.52% 12.57% 35.45%
Hilton Worldwide (HLT) 18.92% 8.26% 28.73%
S&P 500 11.73% 3.26% 18.06%

En comparación con el S&P500, que sirve como el referente de mercado, las tres acciones individuales ofrecen rendimientos superiores al 11,73%, aunque con una volatilidad significativamente mayor. Esto es coherente, ya que el índice elimina el riesgo no sistemático al diversificar entre cientos de empresas mientras que las posiciones individuales lo asumen en su totalidad.

Los resultados obtenidos permiten observar distintos perfiles de riesgo-retorno entre las 3 acciones, siendo Hilton la más atractiva del conjunto en términos de eficiencia individual, pues ofrece el mayor retorno anual del portafolio (18,92%) con la menor desviación estándar (28,73%). American Express sigue de cerca con un 16.13% de retorno, aunque con una desviación estándar ligeramente mayor (31.47%). Por último, Chipotle muestra el desempeño menos favorable del conjunto en términos de eficiencia al presentar la mayor volatilidad (35,45%) para un rendimiento (12,52%) que apenas supera al del mercado (está asumiendo el riesgo más alto para obtener el retorno relativo más bajo del grupo).

1.1.6 Matriz de varianzas y covarianzas y Matriz de Correlaciones

# ── Matriz de varianzas-covarianzas ───────────────────────────────────────
cov_matrix <- cov(retornos[, c("r_AXP", "r_CMG", "r_HLT")]) * dias

# ── Matriz de correlaciones ───────────────────────────────────────────────
cor_matrix <- cor(retornos[, c("r_AXP", "r_CMG", "r_HLT")])

# ── Nombres legibles ──────────────────────────────────────────────────────
nombres <- c("AXP", "CMG", "HLT")
rownames(cov_matrix) <- colnames(cov_matrix) <- nombres
rownames(cor_matrix) <- colnames(cor_matrix) <- nombres

# ── Tabla covarianzas ─────────────────────────────────────────────────────
kable(
  round(cov_matrix / 100, 2),
  caption = "Tabla 8. Matriz de varianzas-covarianzas anual (%)",
  align = "c"
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = TRUE,
    font_size = 10
  )
Tabla 8. Matriz de varianzas-covarianzas anual (%)
AXP CMG HLT
AXP 9.90 3.93 5.73
CMG 3.93 12.57 3.90
HLT 5.73 3.90 8.26
# ── Tabla correlaciones ───────────────────────────────────────────────────
kable(
  round(cor_matrix, 4),
  caption = "Tabla 9. Matriz de correlaciones",
  align = "c"
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = TRUE,
    font_size = 10
  )
Tabla 9. Matriz de correlaciones
AXP CMG HLT
AXP 1.0000 0.3521 0.6333
CMG 0.3521 1.0000 0.3824
HLT 0.6333 0.3824 1.0000

La matriz de varianzas y covarianzas permite observar tanto el riesgo individual de cada activo como el grado en que se mueven conjuntamente.

La diagonal principal refleja los niveles de riesgo individual de cada acción, en línea con el análisis anterior, Chipotle es el activo con la mayor varianza anual (12.57%), seguida de American Express (9.90%) y Hilton (8.26%).

Fuera de la diagonal, las covarianzas son positivas en todos los casos, lo que indica que las tres acciones tienden a moverse en la misma dirección ante choques en el mercado. La covarianza más alta se registra entre AXP y HLT con un valor de 5.73%, lo que permite concluir que existe una relación estrecha entre los rendimientos de ambas empresas explicada por su dependencia compartida al gasto del consumidor premium.

En cuanto a las correlaciones, la asociación más alta aparece entre AXP y HLT (0.63), un resultado esperado considerando la proximidad observada entre sus covarianzas. Chipotle en cambio, presenta las correlaciones más bajas con las otras dos acciones (0.35 con AXP y 0.38 con HLT), lo que resulta favorable para el portafolio porque indica que sus precios responden a factores distintos (su desempeño está más atado al consumo cotidiano que al gasto discrecional), permitiendo mitigar el riesgo total al no estar perfectamente sincronizada con el sector financiero u hotelero.

Aunque las tres correlaciones son todas positivas, ninguna se acerca a 1, por lo que el portafolio logra eliminar parte del riesgo diversificable.

1.1.7 Retorno Esperado, Desviación Estándar y Razón de Sharpe del Portafolio Óptimo

Para construir el portafolio óptimo se maximizó la razón de Sharpe, exigiendo que los pesos fueran no negativos, no superaran la unidad y sumaran exactamente uno. Como tasa libre de riesgo se tomó el rendimiento del bono del Tesoro estadounidense a 10 años reportado por la Reserva Federal para el 24 de marzo de 2026 (4.39% en base N360DV, convertido a base 252 días) (Board of Governors of the Federal Reserve System, 2026).

La elección de este instrumento como aproximación al costo de no asumir riesgo responde a dos razones principales: la primera, su comportamiento históricamente estable y predecible, sus rendimientos durante décadas han sido asintóticos al 5%, y la segunda, el hecho de estar respaldado por la Reserva Federal, organismo que controla la emisión de dólares y por lo tanto hace que la probabilidad de incumplimiento sea prácticamente nula.

# ── Tasa libre de riesgo ──────────────────────────────────────────────────
# Fuente: Federal Reserve H.15, 24/03/2026 - Base 360 días convertida a 252
rf_anual <- (1 + 0.0439 / 360)^252 - 1

# ── Pesos óptimos por optimización (maximizar Sharpe) ─────────────────────
library(quadprog)

# Matriz de covarianzas anualizada
cov_dec <- cov(retornos[, c("r_AXP", "r_CMG", "r_HLT")]) * dias / 10000

# Vector de retornos esperados anuales (en decimales)
retornos_esperados <- c(
  mean(retornos$r_AXP) * dias / 100,
  mean(retornos$r_CMG) * dias / 100,
  mean(retornos$r_HLT) * dias / 100
)

# ── Optimización: maximizar Sharpe con restricciones ─────────────────────
library(nloptr)

sharpe_neg <- function(w) {
  ret_p <- sum(w * retornos_esperados)
  var_p  <- as.numeric(t(w) %*% cov_dec %*% w)
  sd_p   <- sqrt(var_p)
  return(-((ret_p - rf_anual) / sd_p))  
}

# Restricciones: pesos >= 0, <= 1, suma = 1
opts <- list(algorithm = "NLOPT_LN_COBYLA", xtol_rel = 1e-8, maxeval = 10000)

resultado <- nloptr(
  x0     = c(1/3, 1/3, 1/3),       # punto de partida: pesos iguales
  eval_f = sharpe_neg,
  lb     = c(0, 0, 0),             # pesos >= 0
  ub     = c(1, 1, 1),             # pesos <= 1
  eval_g_eq = function(w) sum(w) - 1,  # suma = 1
  opts   = opts
)

pesos_optimos <- resultado$solution
names(pesos_optimos) <- c("AXP", "CMG", "HLT")

# ── Métricas del portafolio óptimo ────────────────────────────────────────
ret_portafolio <- sum(pesos_optimos * retornos_esperados)
var_portafolio <- as.numeric(t(pesos_optimos) %*% cov_dec %*% pesos_optimos)
sd_portafolio  <- sqrt(var_portafolio)
sharpe         <- (ret_portafolio - rf_anual) / sd_portafolio


# ── Tabla de métricas del portafolio ──────────────────────────────────────
metricas <- data.frame(
  Metrica = c("Retorno esperado anual", "Desviación estándar anual", "Razón de Sharpe"),
  Valor   = c(
    paste0(round(ret_portafolio * 100, 2), "%"),
    paste0(round(sd_portafolio  * 100, 2), "%"),
    round(sharpe, 4)
  )
)

kable(metricas,
      col.names = c("Métrica", "Valor"),
      caption   = "Tabla 10. Métricas del portafolio óptimo") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 10. Métricas del portafolio óptimo
Métrica Valor
Retorno esperado anual 18.05%
Desviación estándar anual 26.75%
Razón de Sharpe 0.5582

El portafolio tuvo un retorno anual del 18.05%, superior al del S&P 500 y al de algunas de las acciones individuales que lo componen. Llevado a un horizonte de 4 años con reinversión total de los retornos y condiciones de mercado similares a las del período analizado, este rendimiento implicaría que la inversión inicial de $20 millones crezca hasta aproximadamente $38.8 millones.

La desviación estándar, que indica qué tanto podían alejarse los resultados reales del rendimiento promedio obtenido en un año típico del período analizado fue del 26.75%. Aunque alta, sigue siendo inferior a la volatilidad individual de las tres acciones, lo que evidencia el efecto positivo de la diversificación; al combinarse activos con correlaciones no perfectas el riesgo del portafolio se reduce sin necesidad de sacrificar rentabilidad.

Finalmente, se obtuvo una razón de Sharpe de aproximadamente 0.56, es decir que, por cada unidad de riesgo asumida por encima de la tasa libre de riesgo, el portafolio compensó con poco más de media unidad de retorno adicional. Un nivel considerado aceptable dentro de los estándares de las finanzas donde valores entre 0.5 y 1 se asocian con portafolios eficientes y valores superiores a 1 son excepcionales y difíciles de sostener con activos de renta variable.

En conjunto, los tres indicadores muestran que la optimización permitió construir una combinación eficiente de activos, alcanzando un retorno competitivo mientras se controla parcialmente la volatilidad a través de la diversificación.

# ── Tabla de pesos óptimos ────────────────────────────────────────────────
pesos_tabla <- data.frame(
  Accion  = c("American Express (AXP)", "Chipotle Mexican Grill (CMG)", "Hilton Worldwide (HLT)"),
  Peso    = paste0(round(pesos_optimos * 100, 2), "%"),
  Capital = paste0("$", formatC(pesos_optimos * 20000000, format = "f", 
                                digits = 0, big.mark = ","))
)

kable(pesos_tabla,
      col.names = c("Acción", "Peso óptimo", "Capital asignado (USD)"),
      caption   = "Tabla 11. Pesos óptimos del portafolio") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 11. Pesos óptimos del portafolio
Acción Peso óptimo Capital asignado (USD)
American Express (AXP) 15.14% $3,027,389
Chipotle Mexican Grill (CMG) 6.96% $1,392,074
Hilton Worldwide (HLT) 77.9% $15,580,536

Al maximizarse la razón de Sharpe, Hilton recibe la mayor participación del portafolio con un 77.9%, porque, de las tres acciones, es la que mejor compensa el riesgo asumido (mayor retorno, menor volatilidad). American Express capta el 15.14%, su alta correlación con Hilton (0.63) limita una mayor asignación, pues aumentarla implicaría duplicar la exposición a los mismos riesgos del segmento premium sin ganar diversificación real. Por último, Chipotle, la más volátil de las tres, recibe apenas el 6.96% dado que su nivel de volatilidad es alto en relación con el retorno que ofrece, lo que desde la lógica de maximizar la razón de Sharpe reduce su atractivo; su inclusión, sin embargo, sigue siendo importante por el efecto diversificador que aporta al no moverse en total sincronía con los otros dos sectores. Sobre los $20 millones disponibles, esto se traduce en aproximadamente $15.6 millones destinados a HLT, $3 millones a AXP y $1.4 millones a CMG.

Vale la pena señalar que, aunque esta asignación es matemáticamente eficiente, una concentración del 77.9% en una sola acción implica que el desempeño del portafolio queda principalmente determinado por los riesgos específicos de ese sector. Es decir que, para el horizonte de 4 años, $15,6 millones de dólares quedan expuestos al desempeño de la industria hotelera, lo cual es importante de considerar más allá de los resultados del optimizador.


1.2 Óptimo de contratos del futuro del índice

1.2.1 VaR al 1% y 5% del portafolio

# ── VaR al 1% y 5% ──────────────

# Valor total del portafolio
valor_portafolio <- 20000000

# Pesos óptimos
pesos <- resultado$solution

# Retorno esperado diario del portafolio
ret_diario <- sum(pesos * c(mean(retornos$r_AXP),
                             mean(retornos$r_CMG),
                             mean(retornos$r_HLT))) / 100

# Desviación estándar diaria del portafolio
cov_dec_diaria <- cov(retornos[, c("r_AXP", "r_CMG", "r_HLT")]) / 10000
sd_diaria <- sqrt(as.numeric(t(pesos) %*% cov_dec_diaria %*% pesos))

# Valores críticos (distribución normal)
z_1  <- qnorm(0.01)   # -2.3263
z_5  <- qnorm(0.05)   # -1.6449

# VaR en términos monetarios (pérdida máxima esperada)
VaR_1 <- abs(ret_diario + z_1 * sd_diaria) * valor_portafolio
VaR_5 <- abs(ret_diario + z_5 * sd_diaria) * valor_portafolio

# ── Tabla de resultados ───────────────────────────────────────────────────
var_tabla <- data.frame(
  Nivel         = c("VaR al 1%", "VaR al 5%"),
  Z             = c(round(z_1, 4), round(z_5, 4)),
  VaR_Pct       = c(paste0(round(abs(ret_diario + z_1 * sd_diaria) * 100, 4), "%"),
                    paste0(round(abs(ret_diario + z_5 * sd_diaria) * 100, 4), "%")),
  VaR_USD       = c(paste0("$", formatC(VaR_1, format = "f", digits = 2, big.mark = ",")),
                    paste0("$", formatC(VaR_5, format = "f", digits = 2, big.mark = ",")))
)

kable(var_tabla,
      col.names = c("Nivel de confianza", "Z crítico", 
                    "VaR diario (%)", "VaR diario (USD)"),
      caption   = "Tabla 12. VaR diario del portafolio") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 12. VaR diario del portafolio
Nivel de confianza Z crítico VaR diario (%) VaR diario (USD)
VaR al 1% -2.3263 3.848% $769,597.13
VaR al 5% -1.6449 2.6997% $539,949.79

El VaR estima la pérdida máxima esperada del portafolio en un día bajo condiciones normales de mercado. Al 99% de confianza, esa pérdida no debería superar los $769,597, lo que significa que solo en el 1% de los días se esperaría una caída por encima de ese monto. Al 95% de confianza, el umbral se reduce a $539,950. En términos prácticos, estos valores representan el capital mínimo que debe cubrirse y servirán como referencia para el cálculo de la cobertura con futuros del índice.

1.2.2 Betas individuales y beta del portafolio (CAPM)

# ── Betas individuales por CAPM ───────────────────────────────────────────

rf_diaria <- ((1 + 0.0439 / 360)^252 - 1) / 252

# Regresión lineal: r_accion ~ r_SP500 (exceso de retorno)
capm_AXP <- lm((r_AXP - rf_diaria*100) ~ I(r_SP500 - rf_diaria*100), data = retornos)
capm_CMG <- lm((r_CMG - rf_diaria*100) ~ I(r_SP500 - rf_diaria*100), data = retornos)
capm_HLT <- lm((r_HLT - rf_diaria*100) ~ I(r_SP500 - rf_diaria*100), data = retornos)

# ── Extraer alpha y beta ──────────────────────────────────────────────────
betas  <- c(coef(capm_AXP)[2], coef(capm_CMG)[2], coef(capm_HLT)[2])
r2     <- c(summary(capm_AXP)$r.squared,
            summary(capm_CMG)$r.squared,
            summary(capm_HLT)$r.squared)

names(betas) <- c("AXP", "CMG", "HLT")

# ── Beta del portafolio ───────────────────────────────────────────────────
beta_portafolio <- sum(pesos * betas)

# ── Tabla de resultados ───────────────────────────────────────────────────
capm_tabla <- data.frame(
  Accion  = c("American Express (AXP)", "Chipotle Mexican Grill (CMG)", 
              "Hilton Worldwide (HLT)", "Portafolio"),
  Beta    = round(c(betas, beta_portafolio), 4),
  R2      = round(c(r2, NA), 4)
)

kable(capm_tabla,
      col.names = c("Acción", "Beta (β)", "R²"),
      caption   = "Tabla 13. Betas estimadas por CAPM y beta del portafolio",
      na        = "—") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 13. Betas estimadas por CAPM y beta del portafolio
Acción Beta (β)
AXP American Express (AXP) 1.2655 0.5274
CMG Chipotle Mexican Grill (CMG) 0.9243 0.2217
HLT Hilton Worldwide (HLT) 0.9864 0.3844
Portafolio 1.0243 NA

Las betas estimadas mediante el modelo CAPM revelan que los tres activos tienen una sensibilidad bastante similar a la del mercado. American Express es la más sensible con una beta de aproximadamente 1.27, lo que implica que, ante cada movimiento del 1% en el índice de referencia, se espera una reacción del 1.27% (en la misma dirección). Este comportamiеnto, respаldado por un R2 de 0.5274, sugiere que más de la mitad de su variabilidad es explicаda por el riesgo sistemático. En comparación, Chipotle presenta un pеrfil más defensivo con una beta de 0.92, por lo que sus movimientos tienden a ser algo más moderаdos que los del índice, su R2 relativаmente bajo (0.2217), implica que una gran parte de su desеmpеño obedece a factores específicos de la empresa que son diversificаbles. De manera similar, Hilton se sitúa en un punto intermedio con una beta de 0.99 y un R2 de 0.38 moviéndose prácticamente en línea con el mercado.

Finalmente, la beta del portafolio de 1.02 resulta de ponderar las betas individuales por los pesos óptimos obtenidos en la sección anterior. Estе valor, prácticаmente igual a uno, indica que el portafolio en su conjunto se comporta de forma muy similаr al S&P 500 en términos de riesgo sistemático, aunque con un leve sеsgo alcista, se espera entonces que, ante una variación del 1% en el mercado, el portafolio experimente un cambio en promedio del 1.02%.

Esta beta, se tomará como referencia para determinаr el número óptimo de contratos necesarios para la cobertura ya que refleja la exposición que debe ser mitigаda para proteger el capital de las fluctuaciones del mercado.

1.2.3 Número óptimo de contratos

# ── Número óptimo de contratos ────────────────────────────────────────────

# Datos
beta_p        <- beta_portafolio   # extraído del CAPM
beta_objetivo <- 0                 # cobertura total
capital       <- 20000000          # valor del portafolio
precio_spot   <- 6556.37           # S&P 500 spot al 24/03/2026
multiplicador <- 50                # E-mini S&P 500 (CME Group)

# Paso 1: Valor nominal del contrato
Vf <- precio_spot * multiplicador

# Paso 2: Número óptimo de contratos
N_star <- (beta_p - beta_objetivo) * capital / Vf
N_star_redondeado <- round(N_star, 0)

# Paso 3: Razón de cobertura (hedge ratio)

hedge_ratio <- (N_star_redondeado * Vf) / capital


# ── Tabla de resultados ───────────────────────────────────────────────────
contratos_tabla <- data.frame(
  Concepto = c(
    "Beta del portafolio (βp)",
    "Beta objetivo (β*)",
    "Capital del portafolio (P)",
    "Precio spot S&P 500 (24/03/2026)",
    "Multiplicador E-mini S&P 500",
    "Valor nominal del contrato (Vf)",
    "Número óptimo de contratos (N*)",
    "Número óptimo redondeado"
  ),
  Valor = c(
    round(beta_p, 4),
    beta_objetivo,
    paste0("$", formatC(capital, format = "f", digits = 0, big.mark = ",")),
    paste0(precio_spot, " puntos"),
    paste0("$", multiplicador, " por punto"),
    paste0("$", formatC(Vf, format = "f", digits = 2, big.mark = ",")),
    round(N_star, 4),
    N_star_redondeado
  )
)

kable(contratos_tabla,
      col.names = c("Concepto", "Valor"),
      caption   = "Tabla 14. Cálculo del número óptimo de contratos de futuros E-mini S&P 500") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 14. Cálculo del número óptimo de contratos de futuros E-mini S&P 500
Concepto Valor
Beta del portafolio (βp) 1.0243
Beta objetivo (β*) 0
Capital del portafolio (P) $20,000,000
Precio spot S&P 500 (24/03/2026) 6556.37 puntos
Multiplicador E-mini S&P 500 $50 por punto
Valor nominal del contrato (Vf) $327,818.50
Número óptimo de contratos (N*) 62.4925
Número óptimo redondeado 62

Conociendo la exposición del portafolio, se tomó una posición corta en contratos de futuros sobre el S&P 500, de manera que, cualquier caída en el valor de las acciones quede compensada por una ganancia equivalente en los derivados.

El valor nominal de cada contrato ($327,818.50 ) resulta de multiplicar el precio spot del índice al 24 de marzo de 2026 (6,556.37 puntos) por el multiplicador de los contratos E-mini S&P 500 ($50 por punto) (CME Group, 2026). Al fijar una beta objetivo de cero, la razón de cobertura óptima se alineó con la beta del portafolio (1.0243), lo que significa que por cada dólar expuesto al mercado se cubren 1.0243 dólares en futuros (una cobertura total del riesgo sistemático).

Tras aplicar la fórmula que relaciona la beta del portafolio con el capital total y el valor nominal del contrato se determinó que la protección óptima requiere la venta en corto de 62 contratos E-mini S&P 500. Esta posición representa un valor de aproximadamente 20.3 millones de dólares, lo que implica una sobrecobertura del 1.62% respecto al capital inicial de 20 millones.

1.2.4 Margin Call Trimestral y Análisis de Roll-over

library(scales)
library(tidyr)
library(patchwork)
library(ggplot2)

# ── parámetros ────────────────────────────────────────────────────────────
N             <- 62
multiplicador <- 50
precio_ini    <- 6556.37
VGI0_u        <- 24431
VGM_u_corto   <- 22668
VGM_u_largo   <- 24119
VGI0          <- VGI0_u      * N
VGM_corto     <- VGM_u_corto * N
VGM_largo     <- VGM_u_largo * N
n_dias        <- 252 * 4
dias_trim     <- 63

# ── simulación de precios ─────────────────────────────────────────────────
set.seed(123)
retornos_sim   <- sample(retornos$r_SP500 / 100, size = n_dias, replace = TRUE)
precios_sim    <- numeric(n_dias + 1)
precios_sim[1] <- precio_ini
for (i in 2:(n_dias + 1)) {
  precios_sim[i] <- precios_sim[i-1] * exp(retornos_sim[i-1])
}

# ── función de liquidación diaria ─────────────────────────────────────────
liquidar <- function(precios, posicion = "corto") {
  VGM_uso  <- ifelse(posicion == "corto", VGM_corto, VGM_largo)
  balance  <- VGI0
  resultado <- data.frame(dia=integer(), trimestre=integer(), precio=numeric(),
                           pnl_dia=numeric(), balance=numeric(), mc=numeric())
  for (t in 1:n_dias) {
    delta   <- precios[t+1] - precios[t]
    pnl_dia <- ifelse(posicion == "corto",
                      -delta * N * multiplicador,
                       delta * N * multiplicador)
    balance <- balance + pnl_dia
    mc <- 0
    if (balance < VGM_uso) { mc <- VGI0 - balance; balance <- VGI0 }
    resultado <- rbind(resultado, data.frame(
      dia = t, trimestre = ceiling(t / dias_trim),
      precio = precios[t+1], pnl_dia = pnl_dia, balance = balance, mc = mc
    ))
  }
  return(resultado)
}

# ── ejecutar simulaciones ─────────────────────────────────────────────────
sim_corto <- liquidar(precios_sim, "corto")
sim_largo <- liquidar(precios_sim, "largo")

# ── resumen trimestral ────────────────────────────────────────────────────
resumen <- function(sim, posicion) {
  sim %>%
    group_by(trimestre) %>%
    summarise(Precio_inicio = first(precio), Precio_fin = last(precio),
              PnL_trimestre = sum(pnl_dia), N_MarginCalls = sum(mc > 0),
              MC_total = sum(mc), Balance_final = last(balance), .groups = "drop") %>%
    mutate(Posicion = posicion, PnL_acumulado = cumsum(PnL_trimestre))
}

trim_corto <- resumen(sim_corto, "Corto")
trim_largo <- resumen(sim_largo, "Largo")

# ── clasificación por tipo de mercado ────────────────────────────────────
escenario_trim <- trim_corto %>%
  mutate(
    Retorno_trim = (Precio_fin / Precio_inicio) - 1,
    Tipo_mercado = case_when(
      Retorno_trim >  0.05 ~ "Alcista",
      Retorno_trim < -0.05 ~ "Bajista",
      TRUE                 ~ "Lateral"
    )
  )

tipo_por_trimestre <- escenario_trim %>% select(trimestre, Tipo_mercado)

# ── gráfica simulación con colores por tipo de mercado (va primero) ───────
data.frame(Dia = 0:n_dias, Precio = precios_sim) %>%
  mutate(trimestre = ifelse(ceiling(Dia / dias_trim) == 0, 1,
                            ceiling(Dia / dias_trim))) %>%
  left_join(tipo_por_trimestre, by = "trimestre") %>%
  mutate(Tipo_mercado = ifelse(is.na(Tipo_mercado), "Lateral", Tipo_mercado)) %>%
  ggplot(aes(x = Dia, y = Precio, color = Tipo_mercado, group = 1)) +
  geom_line(linewidth = 1) +
  geom_hline(yintercept = precio_ini, linetype = "dashed",
             color = "gray40", linewidth = 0.8) +
  scale_color_manual(values = c("Alcista" = "#117a65",
                                "Bajista" = "#c0392b",
                                "Lateral" = "#f39c12")) +
  scale_y_continuous(labels = comma) +
  scale_x_continuous(breaks = seq(0, n_dias, by = dias_trim * 4),
                     labels = paste0("Año ", 0:4)) +
  labs(title    = "Trayectoria simulada del S&P 500 — simulación mixta (4 años)",
       subtitle = "Verde: mercado alcista | Rojo: mercado bajista | Amarillo: mercado lateral",
       x = "Horizonte", y = "Precio S&P 500", color = "Tipo de mercado",
       caption = "Fuente: elaboración propia con datos Bloomberg GP (2016–2026)") +
  theme_minimal(base_family = "serif") +
  theme(plot.title = element_text(size = 12, face = "bold"),
        plot.subtitle = element_text(size = 10, color = "gray40"),
        legend.position = "bottom")

# ── función para tablas trimestrales ──────────────────────────────────────
tabla_trim <- function(df, caption_text) {
  kable(
    df %>%
      mutate(
        PnL_trimestre = paste0("$", formatC(PnL_trimestre, format="f",
                                            digits=0, big.mark=",")),
        PnL_acumulado = paste0("$", formatC(PnL_acumulado, format="f",
                                            digits=0, big.mark=",")),
        MC_total      = paste0("$", formatC(MC_total,      format="f",
                                            digits=0, big.mark=",")),
        Balance_final = paste0("$", formatC(Balance_final, format="f",
                                            digits=0, big.mark=",")),
        Precio_inicio = round(Precio_inicio, 2),
        Precio_fin    = round(Precio_fin,    2)
      ) %>% select(-Posicion),
    col.names = c("Trimestre", "Precio inicio", "Precio fin", "P&L trimestre",
                  "N° Margin Calls", "MC total (USD)", "Balance final",
                  "P&L acumulado"),
    caption = caption_text
  ) %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                  full_width = TRUE, font_size = 10)
}

tabla_trim(trim_corto, "Tabla 15. Escenario corto — liquidación trimestral con roll-over")
Tabla 15. Escenario corto — liquidación trimestral con roll-over
Trimestre Precio inicio Precio fin P&L trimestre N° Margin Calls MC total (USD) Balance final P&L acumulado
1 6598.83 6646.00 $-277,846 4 $735,966 $1,972,841 $-277,846
2 6693.73 6630.10 $49,280 7 $3,139,720 $5,161,841 $-228,566
3 6589.60 6178.52 $1,399,913 0 $0 $6,561,754 $1,171,347
4 6136.24 6281.11 $-318,041 0 $0 $6,243,713 $853,305
5 6301.98 7012.12 $-2,266,135 0 $0 $3,977,577 $-1,412,830
6 7073.95 7118.68 $-330,343 0 $0 $3,647,235 $-1,743,173
7 7191.35 8142.55 $-3,173,979 4 $965,567 $1,438,823 $-4,917,152
8 8145.38 8914.17 $-2,392,027 9 $3,161,967 $2,208,763 $-7,309,179
9 8984.06 9527.51 $-1,901,353 9 $2,141,581 $2,448,990 $-9,210,532
10 9543.77 9227.60 $929,723 0 $0 $3,378,713 $-8,280,810
11 9150.42 8514.58 $2,210,372 0 $0 $5,589,085 $-6,070,438
12 8637.51 8568.34 $-166,673 0 $0 $5,422,412 $-6,237,110
13 8512.38 8868.53 $-930,594 0 $0 $4,491,818 $-7,167,705
14 8853.21 9485.57 $-1,912,824 1 $692,073 $3,271,067 $-9,080,529
15 9528.36 9126.53 $1,113,033 0 $0 $4,384,100 $-7,967,495
16 8961.20 9235.79 $-338,722 0 $0 $4,045,378 $-8,306,217
tabla_trim(trim_largo, "Tabla 16. Escenario largo — liquidación trimestral con roll-over")
Tabla 16. Escenario largo — liquidación trimestral con roll-over
Trimestre Precio inicio Precio fin P&L trimestre N° Margin Calls MC total (USD) Balance final P&L acumulado
1 6598.83 6646.00 $277,846 5 $831,589 $2,624,158 $277,846
2 6693.73 6630.10 $-49,280 0 $0 $2,574,878 $228,566
3 6589.60 6178.52 $-1,399,913 5 $533,309 $1,708,273 $-1,171,347
4 6136.24 6281.11 $318,041 8 $1,414,793 $3,441,108 $-853,305
5 6301.98 7012.12 $2,266,135 0 $0 $5,707,243 $1,412,830
6 7073.95 7118.68 $330,343 0 $0 $6,037,585 $1,743,173
7 7191.35 8142.55 $3,173,979 0 $0 $9,211,565 $4,917,152
8 8145.38 8914.17 $2,392,027 0 $0 $11,603,592 $7,309,179
9 8984.06 9527.51 $1,901,353 0 $0 $13,504,945 $9,210,532
10 9543.77 9227.60 $-929,723 0 $0 $12,575,222 $8,280,810
11 9150.42 8514.58 $-2,210,372 0 $0 $10,364,850 $6,070,438
12 8637.51 8568.34 $166,673 0 $0 $10,531,523 $6,237,110
13 8512.38 8868.53 $930,594 0 $0 $11,462,117 $7,167,705
14 8853.21 9485.57 $1,912,824 0 $0 $13,374,941 $9,080,529
15 9528.36 9126.53 $-1,113,033 0 $0 $12,261,908 $7,967,495
16 8961.20 9235.79 $338,722 0 $0 $12,600,630 $8,306,217
# ── gráfica P&L acumulado ─────────────────────────────────────────────────
bind_rows(trim_corto, trim_largo) %>%
  ggplot(aes(x = trimestre, y = PnL_acumulado / 1e6, color = Posicion)) +
  geom_line(linewidth = 1.2) + geom_point(size = 2.5) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") +
  scale_color_manual(values = c("Corto" = "#1a5276", "Largo" = "#c0392b")) +
  scale_x_continuous(breaks = 1:16) +
  labs(title    = "P&L acumulado — escenario corto vs. largo (16 trimestres)",
       subtitle = "Simulación con bootstrap de retornos históricos del S&P 500",
       x = "Trimestre", y = "P&L acumulado (millones USD)", color = "Posición",
       caption = "Fuente: elaboración propia con datos Bloomberg GP (2016–2026)") +
  theme_minimal(base_family = "serif") +
  theme(plot.title = element_text(size = 12, face = "bold"),
        plot.subtitle = element_text(size = 10, color = "gray40"),
        legend.position = "bottom")

# ── función resumen total ─────────────────────────────────────────────────
tabla_resumen <- function(sim, caption_text) {
  pnl_tot  <- sum(sim$pnl_dia)
  bal_fin  <- last(sim$balance)
  mc_tot   <- sum(sim$mc)
  cap_comp <- VGI0 + mc_tot
  gar_fin  <- bal_fin - mc_tot
  rent     <- (pnl_tot / cap_comp) * 100
  kable(
    data.frame(
      Concepto = c("Garantía inicial (T1)", "P&L total liquidaciones",
                   "Balance final", "(−) Margin Calls totales",
                   "Capital total comprometido", "Garantía final",
                   "Rentabilidad sobre capital comprometido"),
      Valor = c(
        paste0("$", formatC(VGI0,     format="f", digits=0, big.mark=",")),
        paste0("$", formatC(pnl_tot,  format="f", digits=0, big.mark=",")),
        paste0("$", formatC(bal_fin,  format="f", digits=0, big.mark=",")),
        paste0("$", formatC(mc_tot,   format="f", digits=0, big.mark=",")),
        paste0("$", formatC(cap_comp, format="f", digits=0, big.mark=",")),
        paste0("$", formatC(gar_fin,  format="f", digits=0, big.mark=",")),
        paste0(round(rent, 2), "%")
      )
    ),
    col.names = c("Concepto", "Valor"), caption = caption_text
  ) %>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                  full_width = TRUE, font_size = 10)
}

tabla_resumen(sim_corto, "Tabla 17. Resumen posición corta (4 años)")
Tabla 17. Resumen posición corta (4 años)
Concepto Valor
Garantía inicial (T1) $1,514,722
P&L total liquidaciones $-8,306,217
Balance final $4,045,378
(−) Margin Calls totales $10,836,873
Capital total comprometido $12,351,595
Garantía final $-6,791,495
Rentabilidad sobre capital comprometido -67.25%
tabla_resumen(sim_largo, "Tabla 18. Resumen posición larga (4 años)")
Tabla 18. Resumen posición larga (4 años)
Concepto Valor
Garantía inicial (T1) $1,514,722
P&L total liquidaciones $8,306,217
Balance final $12,600,630
(−) Margin Calls totales $2,779,691
Capital total comprometido $4,294,413
Garantía final $9,820,939
Rentabilidad sobre capital comprometido 193.42%
# ── tabla escenarios presupuestales ──────────────────────────────────────
kable(
  escenario_trim %>%
    group_by(Tipo_mercado) %>%
    summarise(N_trim    = n(), PnL_corto = sum(PnL_trimestre),
              MC_corto  = sum(MC_total), FCT_corto = PnL_corto - MC_corto,
              .groups   = "drop") %>%
    left_join(
      trim_largo %>%
        mutate(Tipo_mercado = case_when(
          (Precio_fin/Precio_inicio - 1) >  0.05 ~ "Alcista",
          (Precio_fin/Precio_inicio - 1) < -0.05 ~ "Bajista",
          TRUE ~ "Lateral")) %>%
        group_by(Tipo_mercado) %>%
        summarise(PnL_largo = sum(PnL_trimestre), MC_largo = sum(MC_total),
                  FCT_largo = PnL_largo - MC_largo, .groups = "drop"),
      by = "Tipo_mercado"
    ) %>%
    mutate(across(c(PnL_corto, MC_corto, FCT_corto, PnL_largo, MC_largo, FCT_largo),
                  ~ paste0("$", formatC(.x, format="f", digits=0, big.mark=",")))),
  col.names = c("Tipo de mercado", "N° trimestres", "P&L corto", "MC corto",
                "FCT corto", "P&L largo", "MC largo", "FCT largo"),
  caption = "Tabla 19. Escenarios presupuestales — flujo de caja total por tipo de mercado"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 19. Escenarios presupuestales — flujo de caja total por tipo de mercado
Tipo de mercado N° trimestres P&L corto MC corto FCT corto P&L largo MC largo FCT largo
Alcista 5 $-11,646,318 $6,961,188 $-18,607,506 $11,646,318 $0 $11,646,318
Bajista 2 $3,610,285 $0 $3,610,285 $-3,610,285 $533,309 $-4,143,594
Lateral 9 $-270,184 $3,875,685 $-4,145,869 $270,184 $2,246,382 $-1,976,199

Para estimar el margin call trimestral se proyectaron 16 trimestres de liquidación diaria tomando como referencia la serie de precios del S&P 500 desde 2016 hasta 2026. El margen inicial por contrato ($24,431) y los márgenes de mantenimiento se tomaron directamente del CME Group para el contrato E-mini S&P 500 al primer vencimiento disponible (septiembre de 2026) (CME Group, 2026). Para la posición corta el margen de mantenimiento utilizado fue de $22,668 por contrato, y para la posición larga de $24,119. Con 62 contratos, la garantía inicial total fue de $1.5 millones, lo que equivale al 7.5% del capital expuesto.

Los resultados del escenario corto muestran una pérdida acumulada de $8.3 millones en liquidaciones, con margin calls que exigieron inyecciones extra de capital por $10.8 millones, para un capital total comprometido de $12.3 millones y una rentabilidad de -67.25% sobre ese mismo capital. Esto ocurre porque la trayectoria simulada del S&P 500 fue más alcista que bajista, lo que va directamente en contra de una posición en corto. En los 5 trimestres clasificados como alcistas, la posición corta perdió $11.6 millones además de necesitar $6.9 millones en margin calls, resultando en un flujo de caja total negativo de $18.6 millones solo en esos períodos.

Por el contrario, el escenario largo generó una ganancia de $8.3 millones con una rentabilidad del 193.42% sobre el capital comprometido, impulsada principalmente por los trimestres alcistas donde acumuló $11.6 millones en ganancias sin generar un solo margin call. A pesar de ser la posición ganadora, también enfrentó $2.7 millones en margin calls durante trimestres puntuales de caída, el 3 y el 4 son el ejemplo más claro, donde el precio cayó de $6,693 a $6,136, sin embargo, la magnitud de esos llamados fue considerablemente menor que los de la posición corta, lo que refleja que en un mercado con tendencia alcista la posición larga exige mucha menos liquidez adicional para sostenerse.

Al descomponer los resultados por tipo de mercado se observa que en los 2 trimestres bajistas la posición corta generó $3.6 millones en ganancias sin necesitar un solo margin call, mientras que la posición larga perdió $3.6 millones y tuvo que inyectar $533,309 adicionales. En los 9 trimestres laterales, ambas posiciones mostraron pérdidas y ganancias moderadas aunque la posición corta tuvo que agregar una cantidad considerable de capital por margin calls, confirmando que es en los extremos del mercado donde la elección de posición determina por completo el desempeño de la estrategia de cobertura.

Mantener todo en largo maximiza las ganancias en mercados alcistas pero expone al inversionista a pérdidas significativas ante cualquier escenario bajista, mientras que mantener todo en corto genera pérdidas importantes cuando el mercado sube y obliga a comprometer capital muy superior al que inicialmente se depositó. Ambos extremos son estrategias de alto riesgo para un horizonte de 4 años. Por ello, la recomendación apunta a utilizar una cobertura dinámica que pueda ajustarse a las fluctuaciones del mercado, garantizando un control más estricto sobre el balance para evitar llamadas al margen y prevenir inyecciones de capital adicionales.

1.2.5 Valor esperado de la cobertura trimestral

# ── parámetros punto 5 ────────────────────────────────────────────────────
rf_anual <- 0.04021
rf_trim  <- rf_anual / 4
q_anual  <- 0.0133
q_trim   <- q_anual / 4
V0       <- 20000000
bp       <- beta_portafolio

# ── valor esperado por trimestre — corto ──────────────────────────────────
trim_5 <- trim_corto %>%
  mutate(
    rm          = (Precio_fin / Precio_inicio) - 1,
    E_rp        = rf_trim + bp * ((rm + q_trim) - rf_trim),
    V_acciones  = V0 * cumprod(1 + E_rp),
    PnL_corto   = PnL_trimestre,
    V_cub_corto = V_acciones + PnL_corto,
    Ef_corto    = ((V_cub_corto - V0) / V0) * 100
  )

# ── valor esperado por trimestre — largo ──────────────────────────────────
trim_5_largo <- trim_largo %>%
  mutate(
    rm          = (Precio_fin / Precio_inicio) - 1,
    E_rp        = rf_trim + bp * ((rm + q_trim) - rf_trim),
    V_acciones  = V0 * cumprod(1 + E_rp),
    PnL_largo   = PnL_trimestre,
    V_cub_largo = V_acciones + PnL_largo,
    Ef_largo    = ((V_cub_largo - V0) / V0) * 100
  )

# ── reducción de varianza ─────────────────────────────────────────────────
ret_sin_cob   <- diff(trim_5$V_acciones)    / head(trim_5$V_acciones,    -1)
ret_con_corto <- diff(trim_5$V_cub_corto)   / head(trim_5$V_cub_corto,   -1)
ret_con_largo <- diff(trim_5_largo$V_cub_largo) / head(trim_5_largo$V_cub_largo, -1)

var_sin       <- var(ret_sin_cob)
sd_sin        <- sd(ret_sin_cob)   * 100
sd_corto      <- sd(ret_con_corto) * 100
sd_largo      <- sd(ret_con_largo) * 100
red_corto     <- (1 - var(ret_con_corto) / var_sin) * 100
red_largo     <- (1 - var(ret_con_largo) / var_sin) * 100
rent_sin      <- (last(trim_5$V_acciones)       - V0) / V0 * 100
rent_corto    <- (last(trim_5$V_cub_corto)      - V0) / V0 * 100
rent_largo    <- (last(trim_5_largo$V_cub_largo) - V0) / V0 * 100

# ── tabla A: valor esperado de la cobertura ───────────────────────────────
kable(
  data.frame(
    Trimestre       = trim_5$trimestre,
    V_acciones      = paste0("$", formatC(trim_5$V_acciones,
                                          format="f", digits=0, big.mark=",")),
    PnL_corto       = paste0("$", formatC(trim_5$PnL_corto,
                                          format="f", digits=0, big.mark=",")),
    V_cub_corto     = paste0("$", formatC(trim_5$V_cub_corto,
                                          format="f", digits=0, big.mark=",")),
    Ef_corto        = paste0(round(trim_5$Ef_corto, 2), "%"),
    PnL_largo       = paste0("$", formatC(trim_5_largo$PnL_largo,
                                          format="f", digits=0, big.mark=",")),
    V_cub_largo     = paste0("$", formatC(trim_5_largo$V_cub_largo,
                                          format="f", digits=0, big.mark=",")),
    Ef_largo        = paste0(round(trim_5_largo$Ef_largo, 2), "%")
  ),
  col.names = c("Trimestre",
                "Valor acciones (sin cobertura)",
                "P&L futuros (corto)", "Portafolio cubierto (corto)", "Efectividad corto",
                "P&L futuros (largo)", "Portafolio cubierto (largo)", "Efectividad largo"),
  caption   = "Tabla A. Valor esperado de la cobertura trimestral — corto vs. largo"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla A. Valor esperado de la cobertura trimestral — corto vs. largo
Trimestre Valor acciones (sin cobertura) P&L futuros (corto) Portafolio cubierto (corto) Efectividad corto P&L futuros (largo) Portafolio cubierto (largo) Efectividad largo
1 $20,209,675 $-277,846 $19,931,829 -0.34% $277,846 $20,487,522 2.44%
2 $20,076,775 $49,280 $20,126,055 0.63% $-49,280 $20,027,495 0.14%
3 $18,857,336 $1,399,913 $20,257,249 1.29% $-1,399,913 $17,457,423 -12.71%
4 $19,372,971 $-318,041 $19,054,930 -4.73% $318,041 $19,691,013 -1.54%
5 $21,670,329 $-2,266,135 $19,404,193 -2.98% $2,266,135 $23,936,464 19.68%
6 $21,879,192 $-330,343 $21,548,850 7.74% $330,343 $22,209,535 11.05%
7 $24,912,663 $-3,173,979 $21,738,684 8.69% $3,173,979 $28,086,642 40.43%
8 $27,399,925 $-2,392,027 $25,007,898 25.04% $2,392,027 $29,791,952 48.96%
9 $29,184,267 $-1,901,353 $27,282,913 36.41% $1,901,353 $31,085,620 55.43%
10 $28,286,208 $929,723 $29,215,931 46.08% $-929,723 $27,356,486 36.78%
11 $26,362,292 $2,210,372 $28,572,664 42.86% $-2,210,372 $24,151,920 20.76%
12 $26,229,390 $-166,673 $26,062,718 30.31% $166,673 $26,396,063 31.98%
13 $27,436,415 $-930,594 $26,505,820 32.53% $930,594 $28,367,009 41.84%
14 $29,530,507 $-1,912,824 $27,617,683 38.09% $1,912,824 $31,443,331 57.22%
15 $28,348,235 $1,113,033 $29,461,268 47.31% $-1,113,033 $27,235,202 36.18%
16 $29,327,651 $-338,722 $28,988,929 44.94% $338,722 $29,666,373 48.33%
# ── tabla B: rentabilidad vs. estabilidad ────────────────────────────────
kable(
  data.frame(
    Escenario    = c("Sin cobertura",
                     "Con cobertura (corto)",
                     "Con cobertura (largo)"),
    Rentabilidad = c(
      paste0(round(rent_sin,   2), "%"),
      paste0(round(rent_corto, 2), "%"),
      paste0(round(rent_largo, 2), "%")
    ),
    Desv_Std = c(
      paste0(round(sd_sin,   4), "%"),
      paste0(round(sd_corto, 4), "%"),
      paste0(round(sd_largo, 4), "%")
    ),
    Reduccion = c(
      "—",
      paste0(round(red_corto, 2), "%"),
      paste0(round(red_largo, 2), "%")
    )
  ),
  col.names = c("Escenario", "Rentabilidad total",
                "Desv. estándar retornos (%)",
                "Reducción de varianza"),
  caption   = "Tabla 20. Rentabilidad vs. estabilidad — efectividad de la cobertura"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 20. Rentabilidad vs. estabilidad — efectividad de la cobertura
Escenario Rentabilidad total Desv. estándar retornos (%) Reducción de varianza
Sin cobertura 46.64% 6.4074%
Con cobertura (corto) 44.94% 6.3327% 2.32%
Con cobertura (largo) 48.33% 12.677% -291.45%
# ── gráfica comparativa ───────────────────────────────────────────────────
bind_rows(
  trim_5       %>% mutate(Escenario = "Sin cobertura",         Valor = V_acciones),
  trim_5       %>% mutate(Escenario = "Con cobertura (corto)", Valor = V_cub_corto),
  trim_5_largo %>% mutate(Escenario = "Con cobertura (largo)", Valor = V_cub_largo)
) %>%
  ggplot(aes(x = trimestre, y = Valor / 1e6, color = Escenario)) +
  geom_line(linewidth = 1.2) +
  geom_point(size = 2.5) +
  geom_hline(yintercept = V0 / 1e6, linetype = "dashed", color = "gray50") +
  scale_color_manual(values = c(
    "Sin cobertura"         = "#c0392b",
    "Con cobertura (corto)" = "#1a5276",
    "Con cobertura (largo)" = "#117a65"
  )) +
  scale_x_continuous(breaks = 1:16) +
  labs(
    title    = "Valor del portafolio — sin cobertura vs. cubierto (16 trimestres)",
    subtitle = "rf = 4.021% (^FVX) | β = 1.0243 | Dividend yield = 1.33%",
    x        = "Trimestre",
    y        = "Valor del portafolio (millones USD)",
    color    = "Escenario"
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title      = element_text(size = 12, face = "bold"),
    plot.subtitle   = element_text(size = 10, color = "gray40"),
    legend.position = "bottom"
  )

Para estimar el valor esperado de la cobertura trimestral se utilizó la tasa del bono del Tesoro estadounidense a 5 años (^FVX) equivalente al 4.021% anual (1.005% trimestral).

Los resultados muestran que el portafolio sin cobertura creció de $20 millones hasta $28.9 / 29.6 millones a lo largo de los 16 trimestres, una valorización aproximada del 46.64%, impulsada por la tendencia alcista del índice durante la simulación.

El portafolio cubierto con posición corta cerró en $28.98 millones con una rentabilidad del 44.94%, una diferencia de casi dos puntos porcentuales sobre el portafolio sin cobertura, que representa el costo de mantener esa posición abierta durante un mercado favorable. El portafolio con posición larga, por su parte, cerró en $29.67 millones con una rentabilidad del 48.33%, superando ligeramente al portafolio sin cobertura.

La Tabla 20 permite corroborar la eficiencia de la estrategia corta pues la desviación estándar de los retornos trimestrales pasa del 6.41% sin cobertura al 6.33% con cobertura, además se da una reducción de la varianza del 2.32%, confirmando que el portafolio cubierto fue más estable que el expuesto y que la posición corta cumplió con su objetivo de minimizar la varianza y actuar como amortiguador ante movimientos adversos del mercado. La posición larga, en cambio, duplicó la desviación estándar, haciendo que pasara del 6.41 al 12.68%, con un aumento en la varianza del 291.45%, lo que demuestra que esta estrategia actúa como un mecanismo de especulación y apalancamiento que amplifica tanto las ganancias como las pérdidas y convierte al portafolio cubierto en un instrumento considerablemente más volátil que el original.

La conclusión es que bajo los resultados de esta simulación, cubrir el portafolio con futuros en posición corta implica sacrificar parte del retorno a cambio de mayor estabilidad, mientras que hacerlo en largo amplifica la exposición al mercado sin reducir el riesgo. En un mercado alcista como el simulado donde el S&P 500 subió cerca del 40% en cuatro años, el costo de la posición corta puede parecer alto pero sigue siendo razonable, más aún considerando que a pesar de los llamados al margen el valor total del portafolio cubierto se mantuvo siempre bastante cerca y en su mayoría por encima del capital inicial de $20 millones.

También, es importante destacar que, las estrategias de cobertura no están diseñadas para ganar dinero con el derivado sino para reducir el impacto de caídas, que en este caso, no se materializaron con la magnitud suficiente para que la cobertura mostrara todo su potencial, lo que sí queda claro es que en entornos de mayor incertidumbre o correcciones sostenidas, los resultados de una posición corta serían notablemente distintos y la reducción de varianza mucho más pronunciada, haciendo de la cobertura un instrumento considerablemente más útil.

1.2.6 Sensibilidad ante cambios en beta (0.8 y 1.5)

# ── análisis de sensibilidad — betas 0.8, portafolio y 1.5 ───────────────
betas_sens    <- c(0.8, 1.5)
precio_spot   <- 6556.37
multiplicador <- 50
Vf            <- precio_spot * multiplicador
rf_trim_sens  <- 0.04378 / 4
q_trim_sens   <- 0.0133  / 4

resultados_sens <- lapply(betas_sens, function(beta_s) {
  
  N_s    <- round(beta_s * V0 / Vf, 0)
  VGI0_s <- VGI0_u     * N_s
  VGM_s  <- VGM_u_corto * N_s   # usando margen corto para la sensibilidad
  
  balance_s <- VGI0_s
  pnl_vec   <- numeric(n_dias)
  mc_vec    <- numeric(n_dias)
  bal_vec   <- numeric(n_dias)
  
  for (t in 1:n_dias) {
    delta     <- precios_sim[t+1] - precios_sim[t]
    pnl_dia   <- -delta * N_s * multiplicador
    balance_s <- balance_s + pnl_dia
    mc_dia    <- 0
    if (balance_s < VGM_s) {
      mc_dia    <- VGI0_s - balance_s
      balance_s <- VGI0_s
    }
    pnl_vec[t] <- pnl_dia
    mc_vec[t]  <- mc_dia
    bal_vec[t] <- balance_s
  }
  
  trim_s <- data.frame(
    dia       = 1:n_dias,
    trimestre = ceiling(1:n_dias / dias_trim),
    pnl_dia   = pnl_vec,
    mc        = mc_vec,
    balance   = bal_vec
  ) %>%
    group_by(trimestre) %>%
    summarise(
      Precio_inicio = precios_sim[first(dia)],
      Precio_fin    = precios_sim[last(dia) + 1],
      PnL_trimestre = sum(pnl_dia),
      MC_total      = sum(mc),
      Balance_final = last(balance),
      .groups       = "drop"
    ) %>%
    mutate(
      rm         = (Precio_fin / Precio_inicio) - 1,
      E_rp       = rf_trim_sens + beta_s * ((rm + q_trim_sens) - rf_trim_sens),
      V_acciones = V0 * cumprod(1 + E_rp),
      V_cubierto = V_acciones + PnL_trimestre
    )
  
  ret_sin <- diff(trim_s$V_acciones) / head(trim_s$V_acciones, -1)
  ret_con <- diff(trim_s$V_cubierto) / head(trim_s$V_cubierto, -1)
  
  list(
    beta         = beta_s,
    N            = N_s,
    pnl_total    = sum(pnl_vec),
    mc_total     = sum(mc_vec),
    capital_comp = VGI0_s + sum(mc_vec),
    rent_sin     = (last(trim_s$V_acciones) - V0) / V0 * 100,
    rent_con     = (last(trim_s$V_cubierto) - V0) / V0 * 100,
    red_var      = (1 - var(ret_con) / var(ret_sin)) * 100
  )
})

# ── fila del portafolio (del punto 5) ────────────────────────────────────
fila_portafolio <- data.frame(
  Beta               = paste0(round(beta_portafolio, 4), " (portafolio)"),
  N_contratos        = N_star_redondeado,
  PnL_futuros        = paste0("$", formatC(sum(sim_corto$pnl_dia), format="f",
                                           digits=0, big.mark=",")),
  MC_total           = paste0("$", formatC(sum(sim_corto$mc), format="f",
                                           digits=0, big.mark=",")),
  Capital_comp       = paste0("$", formatC(VGI0 + sum(sim_corto$mc), format="f",
                                           digits=0, big.mark=",")),
  Rent_sin_cob       = paste0(round(rent_sin,  2), "%"),
  Rent_con_cob       = paste0(round(rent_corto, 2), "%"),
  Reduccion_varianza = paste0(round(red_corto,  2), "%")
)

# ── filas 0.8 y 1.5 ──────────────────────────────────────────────────────
filas_sens <- bind_rows(lapply(resultados_sens, function(r) {
  data.frame(
    Beta               = as.character(r$beta),
    N_contratos        = r$N,
    PnL_futuros        = paste0("$", formatC(r$pnl_total,    format="f",
                                             digits=0, big.mark=",")),
    MC_total           = paste0("$", formatC(r$mc_total,     format="f",
                                             digits=0, big.mark=",")),
    Capital_comp       = paste0("$", formatC(r$capital_comp, format="f",
                                             digits=0, big.mark=",")),
    Rent_sin_cob       = paste0(round(r$rent_sin, 2), "%"),
    Rent_con_cob       = paste0(round(r$rent_con, 2), "%"),
    Reduccion_varianza = paste0(round(r$red_var,  2), "%")
  )
}))

# ── tabla final: 0.8 / portafolio / 1.5 ──────────────────────────────────
kable(
  bind_rows(filas_sens[1, ], fila_portafolio, filas_sens[2, ]),
  col.names = c("Beta", "N° contratos", "P&L futuros",
                "Margin calls totales", "Capital comprometido",
                "Rent. sin cobertura", "Rent. con cobertura",
                "Reducción de varianza"),
  caption   = "Tabla 21. Análisis de sensibilidad — betas 0.8, 1.0243 y 1.5"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 21. Análisis de sensibilidad — betas 0.8, 1.0243 y 1.5
Beta N° contratos P&L futuros Margin calls totales Capital comprometido Rent. sin cobertura Rent. con cobertura Reducción de varianza
0.8 49 $-6,564,591 $8,564,625 $9,761,744 42.66% 41.32% 1.56%
1.0243 (portafolio) 62 $-8,306,217 $10,836,873 $12,351,595 46.64% 44.94% 2.32%
1.5 92 $-12,325,354 $16,080,521 $18,328,173 62.19% 59.68% 3.21%

El análisis de los distintos escenarios de sensibilidad demuestra que existe una relación directamente proporcional entre el riesgo sistemático (Beta) y la magnitud de la cobertura. Al ajustar la beta de un nivel defensivo de 0.8 a uno agresivo de 1.5, el número de contratos necesarios para neutralizar el riesgo sube de 49 a 92, lo que representa un incremento del 87.7% en la posición de derivados. Esta variación significa que el portafolio con mayor beta es considerablemente más sensible a los movimientos del S&P 500, exigiendo por lo tanto una cobertura mucho mayor para contrarrestar la volatilidad del mercado.

En cuanto a la efectividad, los tres escenarios lograron reducir la varianza del portafolio, siendo el caso en el que β=1.5 en el que mayor estabilidad se alcanzó (3.21%), aunque también el más costoso en términos de rentabilidad sacrificada. Con una beta de 0.8 la rentabilidad pasa del 42.66% sin cobertura al 41.32% con cobertura y además se obtiene una reducción de la varianza del 1.56% mientras que si el portafolio tuviese una beta igual a 1.5 la rentabilidad pasa del 62.19% al 59.68%. En los tres casos (incluyendo el escenario base) la posición corta en futuros logra disminuir el riesgo, aunque siempre a cambio de parte de la rentabilidad obtenida.

El comportamiento de los margin calls y el capital comprometido también es similar. Con la beta del 0.8 los margin calls acumulados fueron de $8.6 millones y el capital comprometido de $9.8 millones, los valores más bajos del grupo. En el escenario base los margin calls ascendieron a los $10.8 millones con un capital comprometido de $12.4 millones, y con la beta del 1.5 esas cifras escalaron a $16.1 millones y $18.3 millones respectivamente. Esta progresión confirma que una beta más alta no solo requiere más contratos sino también mayor disponibilidad de liquidez para sostener la posición cuando el mercado se mueve en contra, y que subestimar la beta del portafolio al momento de diseñar la cobertura puede traducirse en una exposición al riesgo mayor a la esperada.

Lo que estos resultados dejan claro es que el punto central del análisis de sensibilidad no es solo el cambio en el número de contratos sino también el cambio simultáneo en la exposición cubierta, los margin calls, el capital comprometido y la reducción de varianza. La beta del portafolio (1.0243) se ubica como el punto de equilibrio entre una cobertura defensiva, menos costosa pero menos efectiva, y una cobertura agresiva, más cara pero con mayor capacidad de reducir el riesgo relativo del portafolio.


Parte 2. Desarrollo de un forward de divisas

2.1 Proceso del crédito

2.1.1 Análisis fundamental de la TRM

Dólar en 2026

Al inicio de 2026, el mercаdo cambiаrio colombiаno expеrimentó un arranque sólido y de relativa estabilidad, con una Tasa Representаtiva del Mercаdo que fluctuó iniciаlmente entre los $3.590 (su mínimo desde 2021) y un promedio de $3.660 a $3.696 pesos por dólar (Corficolombiana, 2026). En febrero, el peso colombiano registró una depreciаción mensual del 1,7%, con el dólar fluctuаndo entre los $3.590 y $3.830, y cerrando el mes en $3.752 (Infobae, 2026). Hacia finales de marzo, la TRM se ha estabilizó cerca de los $3.700, аunque las sesiones estuvieron marcаdas por la incertidumbre, con mínimos de $3.677 y máximos de $3.725 (Superintendencia Financiera de Colombia, 2026).

Durante abril, la tendencia se revirtió y el peso colombiano tuvo una apreciación mensual del 1.1%, con la TRM fluctuando entre COP 3,543 y COP 3,706 y cerrando el mes en COP 3,634, cuarenta pesos por debajo del cierre de marzo (Bancolombia, 2026). Este comportamiento estuvo impulsado por el retroceso global del dólar, el pago del impuesto de renta de Grandes Contribuyentes y la recompra de bonos globales por parte del sector público por cerca de USD 1,900 millones (Bancolombia, 2026).

2025 fue un año completamente diferente, la TRM pasó de $4.409 en enero a $3.757 al ciеrre de diciembrе, una revaluación del peso de casi un 15% en doce meses (Superintendencia Financiera de Colombia, 2026). A pesаr de que el dólar se mantiene bajo en términos históricos, su comportamiento en lo que va del 2026 dista mucho de la caída predecible que se experimentó en 2025, la volatilidad e incertidumbre actuаl sumаda a los choques externos sugieren que el peso colombiano enfrenta ahora un escenario mucho más frágil y propenso a correcciones al alza (Corficolombiana, 2026).

Factores Internos

Déficit fiscal

El mayor determinante de la TRM en este momento no es el contexto global ni el petróleo, es el desorden fiscal colombiano (Corficolombiana, 2026). Para 2026 se prevé un déficit del 6,5% y una deuda pública que escalaría hasta el 64,8% del PIB, resultado de un recaudo tributario que crece por debajo del gasto y de rigideces presupuestales que el Gobierno no ha logrado corregir (Bancolombia, 2025). El Comité Autónomo de la Regla Fiscal advirtió que, sin medidas efectivas para subir los ingresos o recortar el gasto, la deuda neta podría acercarse al 62% del PIB aún en 2028 (Infobae, 2026). Fitch reaccionó rebajando la calificación del país y los mercados, exigen hoy una prima de riesgo (CDS) que se sitúa 130 puntos básicos por encima del promedio regional, lo que significa que el país paga su deuda más cara que sus pares latinoamericanos debido a la desconfianza en sus cuentas públicas (Valora Analitik, 2025; Banco de la República, 2026).

El Fondo Monetario Internacional advierte que, las economías emergentes con altos niveles de deuda son significativamente más vulnerables a fugas de capital y a la depreciación del tipo de cambio (FMI, 2024). Cuando los inversionistas perciben que la deuda pública es insostenible, venden activos denominados en pesos, compran dólares y sacan su capital del país, reduciendo la oferta de divisas en el mercado local y empujando el dólar hacia arriba (FMI, 2024).

Política Monetaria

El diferencial de tasas de interés es otro de los determinantes del tipo de cambio, los países que lo reducen suelen experimentar las mayores depreciaciones frente al dólar en el corto plazo (Murcia y Rojas, 2013). Por las presiones inflacionarias del aumento del salario mínimo del 23,7% decretado para 2026, el Banco de la República incrementó su tasa de intervención en 100 puntos básicos hasta el 11,25% en marzo, con proyecciones de Bancolombia que la sitúan en 12,75% al cierre del año y una inflación que no volvería al rango de tolerancia (3-4%) hasta la primera mitad de 2029 (Banco de la República, 2026; Bancolombia, 2026). Al mismo tiempo, la Fed cerró 2025 con una inflación del 2,7% y proyecta recortes que llevarían su tasa hacia el 3% a lo largo de 2026 (Bureau of Labor Statistics, 2026; Federal Reserve Bank of St. Louis, 2026).

En conjunto, la políticas del Banco de la República y la Reserva federal hacen que se mantenga un diferencial de tasas que atrae flujos hacia activos colombianos de mayor rendimiento (como los TES), pero al tiempo, encarece el crédito interno, frena la inversión y genera un entorno que, junto con el desbalance de las finanzas públicas, destruye la confianza en los activos locales (Bancolombia, 2026).

Elecciones Presidenciales

El 2026 es año electoral en Colombia, con primera vuelta presidencial el 31 de mayo y segunda vuelta el 21 de junio el mercado ya empieza a reflejar la incertidumbre sobre el rumbo económico del próximo gobierno. En febrero, la curva de TES cayó 132 puntos básicos en promedio y los títulos cerraron negociándose a tasas del 13,8%, señal de que los inversionistas exigían más rendimiento para seguir financiando al Estado colombiano (Infobae, 2026). Tras los resultados de las elecciones legislativas y las consultas del 8 de marzo, la prima de riesgo medida a través del CDS cayó 23 puntos básicos hasta ubicarse en 214 (su nivel más bajo desde finales de febrero) (Portafolio, 2026). Ese comportamiento previo a las elecciones legislativas, con presión sobre los TES y alivio posterior al resultado, es exactamente el patrón que se puede esperar de cara a las elecciones presidenciales (Portafolio, 2026). Históricamente, los ciclos electorales colombianos van acompañados de mayor volatilidad cambiaria, y este no tiene razones para ser la excepción, a medida que se acerque el 31 de mayo, la prima de riesgo probablemente volverá a subir y la TRM lo va a reflejar (Portafolio, 2026).

Factores Externos

Petróleo y remesas

Colombia financia buena parte de sus exportaciones y sus ingresos fiscales con petróleo, de modo que su precio incide directamente en la oferta local de dólares. Para 2025, la producción colombiana ya venía golpeada, con una caída anual del 3,7% (a Octubre se estaban produciendo 736.300 barriles diarios, el segundo nivel más bajo desde mediados de 2021, al mismo tiempo, las exportaciones de petróleo y sus derivados cayeron en 22,1% frente al mismo mes de 2024.), la tendencia continuó en 2026, en febrero de 2026 se produjeron 734.919 barriles diarios, 2,8% menos que un año antes. (Bloomberg, 2026; El Colombiano, 2026). Además, en 2025 las remesas superaron al petróleo y al café como principal fuente de dólares en Colombia (Bancolombia, 2025).

En lo corrido de marzo, el conflicto en Medio Oriente empujó la cotización del Brent 49,1% al alza (Superintendencia Financiera de Colombia, 2026). Este repunte podría aliviar temporalmente la presión sobre la cuenta corriente colombiana (cada dólar adicional por barril exportado se traduce en mayor ingreso de divisas al país), aunque la decisión del Gobierno Nacional de amortiguar el incremento de los precios mediante subsidios proyecta un deterioro fiscal adicional, situando ahora el déficit esperado para 2026 en un 7% del PIB según Oxford Economics (Delgado, 2026).

En 2025, Las remesas sumaron aproximadamente USD 13.000 millones (cerca del 4% del PIB) y se han consolidado como el mayor financiador del déficit de cuenta corriente (Bancolombia, 2025). Para 2026 se espera que el flujo se mantenga elevado, aunque con un ritmo de crecimiento más moderado dado que las economías donde reside la mayor parte de los migrantes colombianos (principalmente Estados Unidos y España) muestran señales de desaceleración (Bancolombia, 2026). Si ese dinamismo se frena en un contexto de producción petrolera en caída y un déficit fiscal creciente, la presión sobre el tipo de cambio se podría intensificar (Bancolombia, 2026).

Proyección de la TRM

Finalmente, las proyecciones para 2026 sitúan al dólar en un promedio de $3.751, con un cierre de año estimado cerca de los $3.800. Instituciones como Corficolombiana y Grupo Cibest prevén que la divisa oscile en un rango entre $3.700 y $3.850 (Bancolombia, 2026; Corficolombiana, 2026). Sin embargo, Corficolombiana advierte que, un desenlace electoral favorable a la inversión podría bajar el tipo de cambio a niveles inferiores a $3.600, mientras que un choque de desconfianza política tiene el potencial de disparar la moneda por encima de los $4.500, un movimiento superior al 20% desde los niveles actuales (Corficolombiana, 2026).

Lo que este análisis fundamental deja claro es que el riesgo cambiario para 2026 es significativo y en gran proporción incierto, mientras el escenario favorable apenas movería el tipo de cambio, un escenario adverso podría terminar encareciendo los pagos del crédito en más de un 20%. Por eso, estructurаr una cobertura con forwards de divisаs es necesаrio para proteger el flujo de pagos del crédito.

2.1.2 Simulación del crédito en dólares

Para el financiamiento de la maquinaria en Estados Unidos se opta por una tasa del 8% anual (JPMorgan Chase, s. f.). Esta cifra toma como referencia las condiciones actuales del mercado crediticio reportadas por JPMorgan Chase, donde la prime rate se sitúa en un 6.75% y la tasa SOFR a 30 días en un 3.65% (que representan los rangos razonables para los créditos empresariales y corporativos en EE.UU.) (JPMorgan Chase, s. f.).

Dеbido a quе las еntidadеs financiеras aplican un sprеad sobrе estas tasas base en función del pеrfil del cliеntе, las garantías y el plazo de la opеración (que en este caso es de 10 años), se considеra que el 8% representa un valor rеalista para la proyección del costo financiero y la amortización del crédito (J.P. Morgan Private Bank, s. f.).

Esta tasa pеrmite una еstimación adecuada de las obligaciones mеnsuales en dólares antеs de evaluar el impacto de la volatilidad cambiaria en el flujo de caja en pesos.

# ── carga y limpieza de datos TRM ─────────────────────────────────────────
trm_raw <- read_excel(
  "/Users/santiagocampillo/Documents/SEMESTRE VII/Ins. Financieros Derivados/USDCOP.xlsx"
)

colnames(trm_raw) <- c("Fecha", "TRM")
trm_raw$Fecha     <- as.Date(trm_raw$Fecha)
trm_raw$TRM       <- as.numeric(trm_raw$TRM)
trm_raw           <- trm_raw[complete.cases(trm_raw), ]
trm_raw           <- trm_raw[order(trm_raw$Fecha), ]

# ── parámetros del crédito ────────────────────────────────────────────────
TRM_base         <- 3636
inversion_COP    <- 350000000
inversion_USD    <- inversion_COP / TRM_base

pago_inicial_pct <- 0.10
pago_inicial_USD <- inversion_USD * pago_inicial_pct
credito_USD      <- inversion_USD - pago_inicial_USD

tasa_anual_USD   <- 0.08
n_anios          <- 10
n_meses          <- n_anios * 12
tasa_mensual_USD <- (1 + tasa_anual_USD)^(1/12) - 1

# ── cuota fija mensual (sistema francés) ──────────────────────────────────
cuota_USD <- credito_USD *
  (tasa_mensual_USD * (1 + tasa_mensual_USD)^n_meses) /
  ((1 + tasa_mensual_USD)^n_meses - 1)

# ── valor cubierto por forward  ─────────
valor_forward_USD <- inversion_USD * 0.75

# ── tabla de amortización en USD ──────────────────────────────────────────
tabla_USD <- data.frame(
  Mes           = 1:n_meses,
  Saldo_inicial = NA_real_,
  Interes       = NA_real_,
  Amortizacion  = NA_real_,
  Cuota         = cuota_USD,
  Saldo_final   = NA_real_
)

saldo <- credito_USD
for (i in 1:n_meses) {
  interes                    <- saldo * tasa_mensual_USD
  amortizacion               <- cuota_USD - interes
  tabla_USD$Saldo_inicial[i] <- saldo
  tabla_USD$Interes[i]       <- interes
  tabla_USD$Amortizacion[i]  <- amortizacion
  tabla_USD$Saldo_final[i]   <- saldo - amortizacion
  saldo                      <- saldo - amortizacion
}

# ── tabla: primeros y últimos 6 meses  ───────────
tabla_visual <- tabla_USD %>%
  mutate(across(where(is.numeric), ~ round(.x, 2)))

tabla_resumen <- bind_rows(
  head(tabla_visual, 6) %>% mutate(Periodo = "Inicio"),
  tail(tabla_visual, 6) %>% mutate(Periodo = "Cierre")
) %>%
  rename(
    "Mes"           = Mes,
    "Saldo inicial" = Saldo_inicial,
    "Interés"       = Interes,
    "Amortización"  = Amortizacion,
    "Cuota"         = Cuota,
    "Saldo final"   = Saldo_final,
    "Período"       = Periodo
  ) %>%
  select("Período", everything())

kable(
  tabla_resumen,
  caption      = "Tabla 22. Amortización del crédito en USD — inicio y cierre (Sistema Francés)",
  format.args  = list(big.mark = ",")
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10) %>%
  pack_rows("Primeros 6 meses", 1, 6) %>%
  pack_rows("Últimos 6 meses",  7, 12)
Tabla 22. Amortización del crédito en USD — inicio y cierre (Sistema Francés)
Período Mes Saldo inicial Interés Amortización Cuota Saldo final
Primeros 6 meses
Inicio 1 86,633.66 557.40 480.97 1,038.37 86,152.70
Inicio 2 86,152.70 554.31 484.06 1,038.37 85,668.64
Inicio 3 85,668.64 551.19 487.18 1,038.37 85,181.46
Inicio 4 85,181.46 548.06 490.31 1,038.37 84,691.15
Inicio 5 84,691.15 544.91 493.46 1,038.37 84,197.69
Inicio 6 84,197.69 541.73 496.64 1,038.37 83,701.05
Últimos 6 meses
Cierre 115 6,092.29 39.20 999.17 1,038.37 5,093.12
Cierre 116 5,093.12 32.77 1,005.60 1,038.37 4,087.52
Cierre 117 4,087.52 26.30 1,012.07 1,038.37 3,075.45
Cierre 118 3,075.45 19.79 1,018.58 1,038.37 2,056.87
Cierre 119 2,056.87 13.23 1,025.14 1,038.37 1,031.73
Cierre 120 1,031.73 6.64 1,031.73 1,038.37 0.00
# ── gráfica evolución del crédito ─────────────────────────────────────────
library(scales)

ggplot(tabla_USD, aes(x = Mes)) +
  geom_line(aes(y = Saldo_final,   color = "Saldo pendiente"),
            linewidth = 1.2) +
  geom_line(aes(y = Interes * 100, color = "Interés (×100)"),
            linewidth = 0.8, linetype = "dashed") +
  scale_y_continuous(labels = comma) +
  scale_color_manual(values = c(
    "Saldo pendiente" = "#1a5276",
    "Interés (×100)"  = "#c0392b"
  )) +
  labs(
    title    = "Evolución del crédito en USD — Sistema Francés (10 años)",
    subtitle = paste0("Crédito: $", formatC(credito_USD, format="f",
                                            digits=0, big.mark=","),
                      " USD | Tasa: 8% EA | Cuota fija: $",
                      formatC(cuota_USD, format="f", digits=2, big.mark=","),
                      " USD"),
    x        = "Mes",
    y        = "USD",
    color    = ""
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title      = element_text(size = 12, face = "bold"),
    plot.subtitle   = element_text(size = 10, color = "gray40"),
    legend.position = "bottom"
  )

La еstructura del financiamiеnto para la maquinaria amarilla se dеfinió bajo el sistema de amortización francés, con un plazo de 10 años (120 meses), una tasa de intеrés del 8% еfеctivo anual y una cuota inicial del 10% sobre el valor de la inversión. Cuando se aplica este pago inicial a los 350 millones de pеsos originalеs, el capital neto a financiar asciende a $86,633.66 dólarеs, gеnеrando una cuota fija de $1,038.37 dólares a lo largo de los 120 mеsеs.

Aunquе la cuota es constantе, su composición cambia conforme avanza el cronograma de pagos. En el primer mes, la carga de intereses es de $557.40 dólares mientras que la amortización alcanza los $480.97 dólares. A medida que el saldo pendiente disminuye la relación se invierte y en el mes 120 los intereses son de apenas $6.64 dólares mientras que la amortización alcanza los $1,031.73 dólares, haciendo que el saldo quede en 0.

Este comportamiеnto se reflеja en la gráfica de evolución del crédito, dondе el saldo pеndiеnte cae de forma convexa hasta cero al cierre del período, mientras que los intereses descienden de manera casi lineal. Ambas dinámicas son características del modelo francés y confirman su estructura de financiación estable en términos de flujo de caja mensual y la cancelación total de la deuda al vencimiento.

2.1.3 Recreación del crédito en pesos

# ── parámetros BMG para TRM ───────────────────────────────────────────────
set.seed(42)
S0    <- 3636
mu    <- mean(diff(log(trm_raw$TRM)))        # drift histórico mensual
sigma <- sd(diff(log(trm_raw$TRM)))          # volatilidad histórica mensual
dt    <- 1

# ── simulación TRM por movimiento browniano geométrico ───────────────────
Z       <- rnorm(n_meses)
TRM_sim <- numeric(n_meses)
TRM_sim[1] <- S0 * exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * Z[1])
for (t in 2:n_meses) {
  TRM_sim[t] <- TRM_sim[t-1] * exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * Z[t])
}

# ── transformación del crédito a pesos ───────────────────────────────────
tabla_COP <- tabla_USD %>%
  mutate(
    TRM_simulada  = TRM_sim,
    Cuota_COP     = Cuota * TRM_simulada,
    Saldo_COP     = Saldo_final * TRM_simulada,
    Variacion_pct = ((Cuota_COP - first(Cuota_COP)) / first(Cuota_COP)) * 100
  )

# ── costo total y comparativo ─────────────────────────────────────────────
costo_total_COP   <- sum(tabla_COP$Cuota_COP)
costo_inicial_COP <- inversion_COP
diferencia_COP    <- costo_total_COP - costo_inicial_COP
diferencia_pct    <- (diferencia_COP / costo_inicial_COP) * 100

# ── tabla resumen: primeros y últimos 6 meses ─────────────────────────────
tabla_COP_visual <- tabla_COP %>%
  select(Mes, Cuota, TRM_simulada, Cuota_COP, Variacion_pct) %>%
  mutate(
    Cuota        = round(Cuota, 2),
    TRM_simulada = round(TRM_simulada, 2),
    Cuota_COP    = round(Cuota_COP, 0),
    Variacion_pct = paste0(round(Variacion_pct, 2), "%")
  )

tabla_COP_resumen <- bind_rows(
  head(tabla_COP_visual, 6) %>% mutate(Periodo = "Inicio"),
  tail(tabla_COP_visual, 6) %>% mutate(Periodo = "Cierre")
) %>%
  rename(
    "Período"      = Periodo,
    "Cuota (USD)"  = Cuota,
    "TRM simulada" = TRM_simulada,
    "Cuota (COP)"  = Cuota_COP,
    "Variación %"  = Variacion_pct
  ) %>%
  select("Período", everything())

kable(
  tabla_COP_resumen,
  caption     = "Tabla 24. Crédito recreado en pesos colombianos — inicio y cierre",
  format.args = list(big.mark = ",")
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10) %>%
  pack_rows("Primeros 6 meses", 1, 6) %>%
  pack_rows("Últimos 6 meses",  7, 12)
Tabla 24. Crédito recreado en pesos colombianos — inicio y cierre
Período Mes Cuota (USD) TRM simulada Cuota (COP) Variación %
Primeros 6 meses
Inicio 1 1,038.37 3,849.29 3,996,983 0%
Inicio 2 1,038.37 3,771.44 3,916,149 -2.02%
Inicio 3 1,038.37 3,834.90 3,982,042 -0.37%
Inicio 4 1,038.37 3,941.73 4,092,973 2.4%
Inicio 5 1,038.37 4,014.66 4,168,696 4.3%
Inicio 6 1,038.37 4,006.29 4,160,009 4.08%
Últimos 6 meses
Cierre 115 1,038.37 5,250.18 5,451,633 36.39%
Cierre 116 1,038.37 5,181.67 5,380,489 34.61%
Cierre 117 1,038.37 5,087.46 5,282,663 32.17%
Cierre 118 1,038.37 5,680.42 5,898,379 47.57%
Cierre 119 1,038.37 5,390.80 5,597,645 40.05%
Cierre 120 1,038.37 5,432.20 5,640,632 41.12%
# ── tabla de costo total vs inversión inicial ─────────────────────────────
kable(
  data.frame(
    Concepto = c(
      "Inversión inicial en maquinaria (COP)",
      "Costo total del crédito en COP (cuotas simuladas)",
      "Costo adicional por devaluación",
      "Incremento porcentual sobre inversión inicial"
    ),
    Valor = c(
      paste0("$", formatC(costo_inicial_COP, format="f", digits=0, big.mark=",")),
      paste0("$", formatC(costo_total_COP,   format="f", digits=0, big.mark=",")),
      paste0("$", formatC(diferencia_COP,    format="f", digits=0, big.mark=",")),
      paste0(round(diferencia_pct, 2), "%")
    )
  ),
  col.names = c("Concepto", "Valor"),
  caption   = "Tabla 25. Costo total del crédito en COP vs. inversión inicial"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 25. Costo total del crédito en COP vs. inversión inicial
Concepto Valor
Inversión inicial en maquinaria (COP) $350,000,000
Costo total del crédito en COP (cuotas simuladas) $579,837,786
Costo adicional por devaluación $229,837,786
Incremento porcentual sobre inversión inicial 65.67%
# ── gráfica cuota USD vs cuota COP ────────────────────────────────────────
escala <- mean(tabla_COP$Cuota_COP) / cuota_USD

ggplot(tabla_COP, aes(x = Mes)) +
  geom_line(aes(y = Cuota_COP, color = "Cuota en COP"),
            linewidth = 1, alpha = 0.8) +
  geom_line(aes(y = Cuota * escala, color = "Cuota en USD"),
            linewidth = 1.2, linetype = "dashed") +
  scale_y_continuous(
    name   = "COP",
    labels = comma,
    sec.axis = sec_axis(
      trans  = ~ . / escala,
      name   = "USD",
      labels = comma
    )
  ) +
  scale_color_manual(values = c(
    "Cuota en COP" = "#1a5276",
    "Cuota en USD" = "#c0392b"
  )) +
  labs(
    title    = "Cuota mensual del crédito — USD vs. COP simulado",
    subtitle = paste0("TRM inicial: $", formatC(S0, format="f", digits=0, big.mark=","),
                      " | Drift mensual: ", round(mu * 100, 3),
                      "% | Volatilidad mensual: ", round(sigma * 100, 2), "%"),
    x       = "Mes",
    color   = ""
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title       = element_text(size = 12, face = "bold"),
    plot.subtitle    = element_text(size = 10, color = "gray40"),
    legend.position  = "bottom",
    axis.title.y.right = element_text(color = "black"),
    axis.text.y.right  = element_text(color = "black")
  )

La recreación del crédito en pesos revela que el riesgo está en la exposición cambiaria. Al observar la Tabla 24, se evidencia que la TRM simulada inició en 3,849.29 COP/USD y cerró en el mes 120 en 5,432.20 COP/USD, lo que representa una devaluación significativa del peso. Este aumento, obliga a la empresa a generar una cantidad cada vez mayor de pesos para adquirir los mismos $1,038.37 USD de la cuota fija, una situación que puede presionar el flujo de caja pues los recursos deben ser destinados a cubrir el sobrecosto de la cuota por los cambios en la cotización de la divisa.

Al mismo tiempo, el modelo de amortización francés pierde su propiedad de cuota constante al transformarse en pesos. Mientras la cuota en dólares se mantiene igual durante los 120 meses, el peso colombiano oscila entre un mínimo de 3505.31 y un máximo de 5912,81.

Finalmente, el costo total del crédito en pesos ascendió a $579,837,786, lo que representa un costo adicional por devaluación de $229,837,786. Este incremento del 65.67% sobre la inversión inicial de la maquinaria justifica la decisión de contratar un forward de divisas para el 75% de la deuda a partir del sexto año (mes 61).

2.1.4 Retornos y simulación BMG de la TRM

# ── parámetros de simulación ──────────────────────────────────────────────
set.seed(123)
n_sim       <- 1000
n_meses_sim <- 120

# ── retornos logarítmicos mensuales históricos ────────────────────────────
trm_raw$Mes <- format(trm_raw$Fecha, "%Y-%m")

trm_mensual <- trm_raw %>%
  group_by(Mes) %>%
  summarise(TRM_cierre = last(TRM), .groups = "drop") %>%
  arrange(Mes) %>%
  mutate(Retorno = c(NA, diff(log(TRM_cierre))))

retornos      <- na.omit(trm_mensual$Retorno)
media_mensual <- mean(retornos)
sd_mensual    <- sd(retornos)

# ── tabla de retornos — primeros y últimos 10 meses ───────────────────────
tabla_retornos <- data.frame(
  Mes               = trm_mensual$Mes[-1],
  `TRM cierre`      = round(trm_mensual$TRM_cierre[-1], 2),
  `Retorno mensual` = paste0(round(retornos * 100, 4), "%"),
  check.names       = FALSE
)

tabla_retornos_resumen <- bind_rows(
  head(tabla_retornos, 10) %>% mutate(Período = "Inicio"),
  tail(tabla_retornos, 10) %>% mutate(Período = "Cierre")
) %>%
  select(Período, everything())

kable(
  tabla_retornos_resumen,
  caption     = "Tabla 26. Retornos logarítmicos mensuales históricos — TRM (primeros y últimos 10 meses)",
  format.args = list(big.mark = ","),
  align       = c("l", "l", "r", "r")
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10) %>%
  pack_rows("Primeros 10 meses", 1, 10) %>%
  pack_rows("Últimos 10 meses", 11, 20)
Tabla 26. Retornos logarítmicos mensuales históricos — TRM (primeros y últimos 10 meses)
Período Mes TRM cierre Retorno mensual
Primeros 10 meses
Inicio 2015-02 2,499.80 2.4168%
Inicio 2015-03 2,599.90 3.9262%
Inicio 2015-04 2,382.60 -8.7281%
Inicio 2015-05 2,531.42 6.0588%
Inicio 2015-06 2,606.59 2.9262%
Inicio 2015-07 2,880.45 9.9904%
Inicio 2015-08 3,052.50 5.8014%
Inicio 2015-09 3,087.42 1.1375%
Inicio 2015-10 2,896.70 -6.3764%
Inicio 2015-11 3,146.25 8.2639%
Últimos 10 meses
Cierre 2025-07 4,185.58 2.0778%
Cierre 2025-08 4,017.05 -4.1097%
Cierre 2025-09 3,920.46 -2.4339%
Cierre 2025-10 3,854.68 -1.6921%
Cierre 2025-11 3,755.34 -2.6109%
Cierre 2025-12 3,777.62 0.5915%
Cierre 2026-01 3,696.89 -2.1602%
Cierre 2026-02 3,751.64 1.4701%
Cierre 2026-03 3,673.65 -2.1007%
Cierre 2026-04 3,638.50 -0.9614%
# ── tabla de estadísticas descriptivas ───────────────────────────────────
kable(
  data.frame(
    Estadístico = c("Media mensual", "Desviación estándar mensual",
                    "Media anualizada", "Volatilidad anualizada"),
    Valor = c(
      paste0(round(media_mensual * 100,       4), "%"),
      paste0(round(sd_mensual    * 100,       4), "%"),
      paste0(round(media_mensual * 12  * 100, 4), "%"),
      paste0(round(sd_mensual * sqrt(12)* 100,4), "%")
    )
  ),
  col.names = c("Estadístico", "Valor"),
  caption   = "Tabla 27. Estadísticas descriptivas — retornos mensuales TRM"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 27. Estadísticas descriptivas — retornos mensuales TRM
Estadístico Valor
Media mensual 0.2959%
Desviación estándar mensual 4.0005%
Media anualizada 3.5514%
Volatilidad anualizada 13.858%
# ── histograma de retornos históricos ────────────────────────────────────
ggplot(data.frame(Retorno = retornos), aes(x = Retorno)) +
  geom_histogram(aes(y = after_stat(density)), bins = 50,
                 fill = "#1a5276", color = "white", alpha = 0.8) +
  stat_function(fun  = dnorm,
                args = list(mean = media_mensual, sd = sd_mensual),
                color = "#c0392b", linewidth = 1.2) +
  labs(
    title    = "Distribución de retornos mensuales — TRM histórica",
    subtitle = "Histograma con curva normal ajustada",
    x        = "Retorno logarítmico mensual",
    y        = "Densidad",
    caption  = "Fuente: BanRep / Bloomberg"
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title    = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 10, color = "gray40")
  )

# ── simulación BMG distribución normal ───────────────────────────────────
TRM_actual <- tail(trm_mensual$TRM_cierre, 1)
sim_normal <- matrix(NA, nrow = n_meses_sim, ncol = n_sim)

for (j in 1:n_sim) {
  shocks          <- rnorm(n_meses_sim, mean = media_mensual, sd = sd_mensual)
  sim_normal[, j] <- TRM_actual * cumprod(exp(shocks))
}

# ── simulación BMG distribución t-student ────────────────────────────────
gl           <- 5
sim_tstudent <- matrix(NA, nrow = n_meses_sim, ncol = n_sim)

for (j in 1:n_sim) {
  shocks_t          <- rt(n_meses_sim, df = gl) *
                       sd_mensual * sqrt((gl - 2) / gl) + media_mensual
  sim_tstudent[, j] <- TRM_actual * cumprod(exp(shocks_t))
}

# ── estadísticas al mes 120 ───────────────────────────────────────────────
final_normal   <- sim_normal[n_meses_sim, ]
final_tstudent <- sim_tstudent[n_meses_sim, ]

kable(
  data.frame(
    Estadístico = c("Media TRM simulada (mes 120)",
                    "Mediana TRM simulada (mes 120)",
                    "Percentil 5%  (escenario favorable)",
                    "Percentil 95% (escenario adverso)",
                    "Percentil 99%"),
    Normal = c(
      paste0("$", formatC(mean(final_normal),           format="f", digits=0, big.mark=",")),
      paste0("$", formatC(median(final_normal),         format="f", digits=0, big.mark=",")),
      paste0("$", formatC(quantile(final_normal, 0.05), format="f", digits=0, big.mark=",")),
      paste0("$", formatC(quantile(final_normal, 0.95), format="f", digits=0, big.mark=",")),
      paste0("$", formatC(quantile(final_normal, 0.99), format="f", digits=0, big.mark=","))
    ),
    T_Student = c(
      paste0("$", formatC(mean(final_tstudent),           format="f", digits=0, big.mark=",")),
      paste0("$", formatC(median(final_tstudent),         format="f", digits=0, big.mark=",")),
      paste0("$", formatC(quantile(final_tstudent, 0.05), format="f", digits=0, big.mark=",")),
      paste0("$", formatC(quantile(final_tstudent, 0.95), format="f", digits=0, big.mark=",")),
      paste0("$", formatC(quantile(final_tstudent, 0.99), format="f", digits=0, big.mark=","))
    )
  ),
  col.names = c("Estadístico", "Distribución normal", "Distribución t-Student"),
  caption   = "Tabla 28. Estadísticas de la TRM simulada al mes 120"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 28. Estadísticas de la TRM simulada al mes 120
Estadístico Distribución normal Distribución t-Student
Media TRM simulada (mes 120) $5,726 $5,674
Mediana TRM simulada (mes 120) $5,264 $5,250
Percentil 5% (escenario favorable) $2,573 $2,615
Percentil 95% (escenario adverso) $10,165 $10,236
Percentil 99% $13,778 $13,420
# ── datos para gráficas ───────────────────────────────────────────────────
hacer_df_sim <- function(sim_matrix, nombre) {
  data.frame(
    Mes          = 1:n_meses_sim,
    TRM_media    = rowMeans(sim_matrix),
    TRM_p5       = apply(sim_matrix, 1, quantile, 0.05),
    TRM_p95      = apply(sim_matrix, 1, quantile, 0.95),
    Distribucion = nombre
  )
}

df_normal   <- hacer_df_sim(sim_normal,   "Distribución Normal")
df_tstudent <- hacer_df_sim(sim_tstudent, "Distribución T-Student")

# ── función gráfica ───────────────────────────────────────────────────────
grafica_sim <- function(df, color, titulo) {
  ggplot(df, aes(x = Mes)) +
    geom_ribbon(aes(ymin = TRM_p5, ymax = TRM_p95),
                fill = color, alpha = 0.15) +
    geom_line(aes(y = TRM_media), color = color, linewidth = 1.2) +
    geom_hline(yintercept = TRM_actual, linetype = "dashed",
               color = "gray50", linewidth = 0.8) +
    scale_y_continuous(labels = comma) +
    scale_x_continuous(breaks = seq(0, 120, by = 24),
                       labels = paste0("Año ", seq(0, 10, by = 2))) +
    labs(
      title    = titulo,
      subtitle = paste0("Banda: P5% – P95% | TRM inicial: $",
                        formatC(TRM_actual, format="f", digits=0, big.mark=",")),
      x        = "Horizonte",
      y        = "TRM (COP/USD)",
    ) +
    theme_minimal(base_family = "serif") +
    theme(
      plot.title    = element_text(size = 11, face = "bold"),
      plot.subtitle = element_text(size = 9,  color = "gray40")
    )
}

# ── panel lado a lado ─────────────────────────────────────────────────────
library(patchwork)

p1 <- grafica_sim(df_normal,   "#1a5276", "Simulación BMG — Distribución Normal")
p2 <- grafica_sim(df_tstudent, "#c0392b", "Simulación BMG — Distribución T-Student")

p1 + p2 +
  plot_annotation(
    title   = "Trayectorias simuladas de la TRM (120 meses)",
    theme   = theme(
      plot.title = element_text(size = 13, face = "bold",
                                family = "serif")
    )
  )

# ── densidad comparativa normal vs t-student (mes 120) ───────────────────
df_dist <- data.frame(
  TRM          = c(final_normal, final_tstudent),
  Distribucion = c(rep("Normal", n_sim), rep("T-Student (gl=5)", n_sim))
)

ggplot(df_dist, aes(x = TRM, fill = Distribucion, color = Distribucion)) +
  geom_density(alpha = 0.4, linewidth = 1) +
  geom_vline(xintercept = TRM_actual, linetype = "dashed",
             color = "gray30", linewidth = 0.8) +
  scale_x_continuous(labels = comma) +
  scale_fill_manual(values  = c("Normal"           = "#1a5276",
                                "T-Student (gl=5)" = "#c0392b")) +
  scale_color_manual(values = c("Normal"           = "#1a5276",
                                "T-Student (gl=5)" = "#c0392b")) +
  labs(
    title    = "Distribución de la TRM proyectada al mes 120",
    subtitle = "Comparativo Normal vs. T-Student | 1,000 simulaciones",
    x        = "TRM proyectada (COP/USD)",
    y        = "Densidad",
    fill     = "",
    color    = ""
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title      = element_text(size = 12, face = "bold"),
    plot.subtitle   = element_text(size = 10, color = "gray40"),
    legend.position = "bottom"
  )

2.2 Proceso del forward

2.2.1 Forward SET-FX mayor a 6 meses

# ── datos observados SET-FX (29/04/2026) ─────────────────────────────────
setfx <- data.frame(
  Mercado     = c("Spot USD/COP", "Forward 0-1 mes", "Forward 1-3 meses",
                  "Forward 3-6 meses", "Forward >6 meses"),
  Apertura    = c(3615.00, 3600.00, NA,      3726.64, NA),
  Cierre      = c(3633.00, 3633.29, 3686.87, 3726.64, 3915.91),
  Promedio    = c(3626.01, 1193.92, 3401.29, 3726.64, 23.10),
  Precio_max  = c(3634.49, 3657.00, 3686.87, 3726.64, 3915.91),
  Fecha       = rep("2026-04-29", 5),
  stringsAsFactors = FALSE
)

kable(
  setfx,
  col.names   = c("Mercado", "Apertura", "Cierre", "Promedio",
                  "Precio máx.", "Fecha"),
  caption     = "Tabla 29. Resumen SET-FX USD/COP por plazo (29/04/2026)",
  format.args = list(big.mark = ","),
  align       = c("l", "r", "r", "r", "r", "c")
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 29. Resumen SET-FX USD/COP por plazo (29/04/2026)
Mercado Apertura Cierre Promedio Precio máx. Fecha
Spot USD/COP 3,615.00 3,633.00 3,626.01 3,634.49 2026-04-29
Forward 0-1 mes 3,600.00 3,633.29 1,193.92 3,657.00 2026-04-29
Forward 1-3 meses NA 3,686.87 3,401.29 3,686.87 2026-04-29
Forward 3-6 meses 3,726.64 3,726.64 3,726.64 3,726.64 2026-04-29
Forward >6 meses NA 3,915.91 23.10 3,915.91 2026-04-29
# ── tasas de referencia ───────────────────────────────────────────────────
S0          <- 3633       # TRM spot SET-FX cierre 29/04/2026
r_COP       <- 0.095      # tasa comercial Colombia (IBR/TCC)
r_USD       <- 0.050      # tasa comercial EE.UU. (Fed Funds)
anio_inicio <- 2026

# ── forwards teóricos — años 6 a 9 del crédito ───────────────────────────
# F = S0 × ((1 + r_COP) / (1 + r_USD))^t
forwards <- data.frame(
  Forward     = paste0("Forward ", 1:4),
  Anio        = (anio_inicio + 5):(anio_inicio + 8),
  Anio_credito = 6:9,
  t_anios     = 5:8
) %>%
  mutate(
    TRM_forward        = S0 * ((1 + r_COP) / (1 + r_USD))^t_anios,
    Valor_cubierto_USD = valor_forward_USD,
    Valor_cubierto_COP = valor_forward_USD * TRM_forward
  )

kable(
  forwards %>%
    mutate(
      TRM_forward        = formatC(round(TRM_forward, 2),
                                   format="f", digits=2, big.mark=","),
      Valor_cubierto_USD = paste0("$", formatC(Valor_cubierto_USD,
                                               format="f", digits=2, big.mark=",")),
      Valor_cubierto_COP = paste0("$", formatC(round(Valor_cubierto_COP),
                                               format="f", digits=0, big.mark=","))
    ),
  col.names = c("Forward", "Año", "Año crédito", "t (años)",
                "TRM forward", "Valor cubierto (USD)", "Valor cubierto (COP)"),
  caption   = "Tabla 30. Forwards teóricos USD/COP — años 6 a 9 del crédito"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 30. Forwards teóricos USD/COP — años 6 a 9 del crédito
Forward Año Año crédito t (años) TRM forward Valor cubierto (USD) Valor cubierto (COP)
Forward 1 2031 6 5 4,481.15 $72,194.72 $323,515,380
Forward 2 2032 7 6 4,673.20 $72,194.72 $337,380,325
Forward 3 2033 8 7 4,873.48 $72,194.72 $351,839,481
Forward 4 2034 9 8 5,082.34 $72,194.72 $366,918,316
# ── curva forward ─────────────────────────────────────────────────────────
t_seq     <- seq(0, 10, by = 0.25)
curva_fwd <- data.frame(
  t       = t_seq,
  Forward = S0 * ((1 + r_COP) / (1 + r_USD))^t_seq
)

ggplot(curva_fwd, aes(x = t, y = Forward)) +
  geom_line(color = "#1a5276", linewidth = 1.2) +
  geom_point(data = forwards,
             aes(x = t_anios, y = TRM_forward),
             color = "#c0392b", size = 3.5) +
  geom_text(data = forwards,
            aes(x = t_anios, y = TRM_forward,
                label = paste0(Forward, "\n", round(TRM_forward, 0))),
            vjust = -0.9, size = 3, color = "#c0392b",
            family = "serif") +
  geom_hline(yintercept = 3915.91, linetype = "dashed",
             color = "#117a65", linewidth = 0.9) +
  annotate("text", x = 0.8, y = 3960,
           label  = "SET-FX >6m: 3,915.91",
           color  = "#117a65", size = 3.2, family = "serif") +
  geom_point(aes(x = 0, y = S0), color = "#1a5276", size = 3) +
  annotate("text", x = 0.4, y = S0 - 90,
           label  = paste0("Spot: ", formatC(S0, format="f",
                                             digits=0, big.mark=",")),
           color  = "#1a5276", size = 3.2, family = "serif") +
  scale_y_continuous(labels = comma) +
  scale_x_continuous(breaks = 0:10) +
  labs(
    title    = "Curva forward USD/COP — paridad de tasas de interés",
    subtitle = "Puntos rojos: forwards contratados (años 6–9) | Verde: referencia SET-FX >6 meses",
    x        = "Años desde 2026",
    y        = "TRM forward (COP/USD)",
    caption  = "Fuente: SET-FX (29/04/2026) | Elaboración propia"
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title    = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 10, color = "gray40")
  )

La información del SET-FX para el 29 de abril de 2026 indica que el mercado espera que el peso colombiano continue devaluándose. Mientras que el precio spot se situa en $3,633 COP/USD, los forwards ya incorporan una prima que escala hasta los $3,915.91 para los vencimientos superiores a seis meses.

Al mismo tiempo, los forwards teóricos proyectados para los años 6 a 9 del crédito indican que esa tendencia se intensifica con el tiempo. La TRM pactada escala de $4,481.15 en 2031 hasta $5,082.34 en 2034, lo que eleva el costo del 75% de la inversión cubierta de $323,515,380 a $366,918,316 COP entre el primer y el último forward. Ante este escenario, contratar un forward permite fijar hoy el tipo de cambio para los pagos futuros, protegiendo al deudor de una devaluación que, como muestra la Tabla 30, el mercado ya tiene prevista.

2.2.2 Eventos de cobertura y no cobertura

# ── carga de datos spot USDCOP ────────────────────────────────────────────
spot_raw <- read_excel(
  "/Users/santiagocampillo/Documents/SEMESTRE VII/Ins. Financieros Derivados/USDCOP.xlsx",
  col_names = c("Fecha_num", "Spot"),
  skip = 2
)

spot_raw$Fecha <- as.Date(spot_raw$Fecha_num, origin = "1899-12-30")
spot_raw       <- spot_raw[, c("Fecha", "Spot")]
spot_raw       <- spot_raw[complete.cases(spot_raw), ]
spot_raw       <- spot_raw[order(spot_raw$Fecha), ]

# ── retornos logarítmicos y estadísticas ──────────────────────────────────
retornos_spot <- diff(log(spot_raw$Spot))
mu_spot       <- mean(retornos_spot, na.rm = TRUE)
sd_spot       <- sd(retornos_spot,   na.rm = TRUE)
S_actual      <- tail(spot_raw$Spot, 1)

# ── tabla de estadísticas spot ────────────────────────────────────────────
kable(
  data.frame(
    Estadístico = c("Observaciones", "Spot actual (último dato)",
                    "Retorno medio mensual", "Volatilidad mensual",
                    "Volatilidad anualizada"),
    Valor = c(
      paste0(length(retornos_spot), " retornos mensuales"),
      paste0("$", formatC(S_actual,              format="f", digits=2, big.mark=",")),
      paste0(round(mu_spot * 100,          4), "%"),
      paste0(round(sd_spot * 100,          4), "%"),
      paste0(round(sd_spot * sqrt(12)*100, 4), "%")
    )
  ),
  col.names = c("Estadístico", "Valor"),
  caption   = "Tabla 31. Estadísticas del precio spot USDCOP"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 31. Estadísticas del precio spot USDCOP
Estadístico Valor
Observaciones 134 retornos mensuales
Spot actual (último dato) $3,638.50
Retorno medio mensual 0.2801%
Volatilidad mensual 4.0112%
Volatilidad anualizada 13.8953%
# ── gráfica histórica spot ────────────────────────────────────────────────
ggplot(spot_raw, aes(x = Fecha, y = Spot)) +
  geom_line(color = "#1a5276", linewidth = 0.7) +
  geom_hline(yintercept = S0, linetype = "dashed",
             color = "#c0392b", linewidth = 0.8) +
  annotate("text", x = as.Date("2016-01-01"), y = S0 + 80,
           label  = paste0("Spot SET-FX: ",
                           formatC(S0, format="f", digits=0, big.mark=",")),
           color  = "#c0392b", size = 3.2, family = "serif") +
  scale_y_continuous(labels = comma) +
  labs(
    title    = "Precio spot USDCOP — Bloomberg (2015–2026)",
    subtitle = "Datos mensuales",
    x        = "Fecha",
    y        = "COP/USD",
    caption  = "Fuente: Elaboración propiar a partir de datos de Bloomberg"
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title    = element_text(size = 12, face = "bold"),
    plot.subtitle = element_text(size = 10, color = "gray40")
  )

# ── simulación BMG por horizonte forward (años 6–9) ───────────────────────
set.seed(42)
n_sim       <- 1000
horizontes  <- c(60, 72, 84, 96)   # meses desde hoy hasta cada forward

med   <- numeric(4)
p5    <- numeric(4)
p95   <- numeric(4)
prot  <- numeric(4)
nprot <- numeric(4)
resultados_sim <- list()

for (k in 1:4) {
  h       <- horizontes[k]
  sim_mat <- matrix(NA, nrow = h, ncol = n_sim)
  
  for (j in 1:n_sim) {
    shocks       <- rnorm(h, mean = mu_spot, sd = sd_spot)
    sim_mat[, j] <- S_actual * cumprod(exp(shocks))
  }
  
  ST_k               <- sim_mat[h, ]
  resultados_sim[[k]] <- ST_k
  
  med[k]   <- mean(ST_k)
  p5[k]    <- quantile(ST_k, 0.05)
  p95[k]   <- quantile(ST_k, 0.95)
  prot[k]  <- sum(ST_k > forwards$TRM_forward[k]) / n_sim * 100
  nprot[k] <- 100 - prot[k]
}

# ── tabla resumen de cobertura ────────────────────────────────────────────
resumen_cob <- data.frame(
  Forward          = forwards$Forward,
  Año              = forwards$Anio,
  TRM_forward      = round(forwards$TRM_forward, 2),
  Spot_medio       = round(med,   2),
  Spot_P5          = round(p5,    2),
  Spot_P95         = round(p95,   2),
  Pct_protegido    = round(prot,  1),
  Pct_no_protegido = round(nprot, 1)
)

kable(
  resumen_cob %>%
    mutate(
      TRM_forward  = formatC(TRM_forward, format="f", digits=2, big.mark=","),
      Spot_medio   = formatC(Spot_medio,  format="f", digits=2, big.mark=","),
      Spot_P5      = formatC(Spot_P5,     format="f", digits=2, big.mark=","),
      Spot_P95     = formatC(Spot_P95,    format="f", digits=2, big.mark=","),
      Pct_protegido    = paste0(Pct_protegido,    "%"),
      Pct_no_protegido = paste0(Pct_no_protegido, "%")
    ),
  col.names = c("Forward", "Año", "TRM forward", "Spot medio sim.",
                "Spot P5%", "Spot P95%", "% protegido", "% no protegido"),
  caption   = "Tabla 32. Análisis de cobertura — 1,000 simulaciones BMG por horizonte"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 32. Análisis de cobertura — 1,000 simulaciones BMG por horizonte
Forward Año TRM forward Spot medio sim. Spot P5% Spot P95% % protegido % no protegido
Forward 1 2031 4,481.15 4,493.51 2,554.24 7,092.58 44.1% 55.9%
Forward 2 2032 4,673.20 4,674.41 2,483.82 7,608.19 42.3% 57.7%
Forward 3 2033 4,873.48 4,914.29 2,434.96 8,194.21 44.5% 55.5%
Forward 4 2034 5,082.34 5,119.39 2,394.36 8,920.66 43.7% 56.3%
# ── gráfica eventos de cobertura por forward ──────────────────────────────
data.frame(
  Forward    = rep(resumen_cob$Forward, 2),
  Tipo       = c(rep("Protegido", 4), rep("No protegido", 4)),
  Porcentaje = c(resumen_cob$Pct_protegido, resumen_cob$Pct_no_protegido)
) %>%
  ggplot(aes(x = Forward, y = Porcentaje, fill = Tipo)) +
  geom_col(position = "stack", alpha = 0.85, width = 0.6) +
  geom_text(aes(label = paste0(Porcentaje, "%")),
            position  = position_stack(vjust = 0.5),
            color     = "white", fontface = "bold",
            size      = 4, family = "serif") +
  scale_fill_manual(values = c("Protegido"    = "#117a65",
                               "No protegido" = "#c0392b")) +
  labs(
    title    = "Eventos de cobertura por forward",
    x        = "",
    y        = "% de simulaciones",
    fill     = ""
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title      = element_text(size = 12, face = "bold"),
    plot.subtitle   = element_text(size = 10, color = "gray40"),
    legend.position = "bottom"
  )

Con una volatilidad mensual del 4.01%, la desviación estándar supera en más de 14 veces al retorno medio del 0.28%, lo que evidencia que, cualquier proyecto financiado en dólares queda expuesto a fluctuaciones del tipo de cambio capaces de transformar una deuda manejable en una carga mucho más costosa si la TRM se mueve de forma adversa.

Las 1,000 simulaciones del Movimiento Browniano Geométrico muestran que el forward protege la inversión entre el 42.3% y el 44.5% de los escenarios simulados. Esto ocurre porque, en una posición larga en forward (que es la que corresponde a un deudor en dólares) la compensación positiva solo se materializa cuando la TRM supera el precio pactado. En el resto de los escenarios, la empresa enfrenta un costo de oportunidad al estar obligada a comprar dólares al precio del forward cuando el mercado spot los ofrece más baratos.

Por lo tanto que la protección se sitúe por debajo del 50% como se observa en la gráfica de cobertura por forward es una consecuencia de que el precio del contrato ya incorpora una prima sobre el precio spot. Al fijarse un tipo de cambio superior al actual, el umbral que la TRM debe superar para generar una ganancia se hace más alto, y es por esto que en la mayoría de los escenarios simulados la devaluación del peso resultó ligeramente inferior a la tasa pactada en los contratos.

2.2.3 Flujo total: crédito vs. forward

# ── tabla anual del crédito en USD ────────────────────────────────────────
saldo       <- credito_USD
tabla_anual <- data.frame(
  Anio       = 1:10,
  Calendario = anio_inicio:(anio_inicio + 9),
  Cuotas_USD = NA_real_,
  Interes_USD = NA_real_,
  Amort_USD  = NA_real_,
  Saldo_USD  = NA_real_
)

for (i in 1:10) {
  int_anual <- 0
  amort_anual <- 0
  for (m in ((i-1)*12+1):(i*12)) {
    interes      <- saldo * tasa_mensual_USD
    amortizacion <- cuota_USD - interes
    int_anual    <- int_anual   + interes
    amort_anual  <- amort_anual + amortizacion
    saldo        <- saldo - amortizacion
  }
  tabla_anual$Cuotas_USD[i]  <- cuota_USD * 12
  tabla_anual$Interes_USD[i] <- int_anual
  tabla_anual$Amort_USD[i]   <- amort_anual
  tabla_anual$Saldo_USD[i]   <- max(saldo, 0)
}

# ── TRM simulada (media t-student) como escenario sin cobertura ───────────
# se usa el promedio de cada horizonte para los años 6-9
# para años 1-5 y año 10 se usa la TRM del punto 3 (sim_tstudent mes 60)
trm_sim_anual <- sapply(1:10, function(i) {
  mes_fin <- i * 12
  if (mes_fin <= n_meses_sim) {
    mean(sim_tstudent[mes_fin, ])
  } else {
    mean(sim_tstudent[n_meses_sim, ])
  }
})

# ── asignación de TRM por año ─────────────────────────────────────────────
# años 6-9: 75% cubierto con forward + 25% expuesto a TRM simulada
# años 1-5 y 10: 100% expuesto a TRM simulada
anios_forward <- c(6, 7, 8, 9)
pct_cobertura <- 0.75

tabla_anual$TRM_forward  <- NA_real_
tabla_anual$TRM_simulada <- trm_sim_anual
tabla_anual$Cobertura    <- "Sin cobertura"

for (k in 1:4) {
  idx <- which(tabla_anual$Anio == anios_forward[k])
  tabla_anual$TRM_forward[idx] <- forwards$TRM_forward[k]
  tabla_anual$Cobertura[idx]   <- paste0("Forward ", k)
}

# ── flujos en COP ─────────────────────────────────────────────────────────
tabla_anual <- tabla_anual %>%
  mutate(
    # sin cobertura: 100% a TRM simulada
    Cuota_COP_sin_fwd = Cuotas_USD * TRM_simulada,

    # con cobertura: 75% forward + 25% simulada (solo años 6-9)
    Cuota_COP_forward = case_when(
      !is.na(TRM_forward) ~
        Cuotas_USD * (pct_cobertura * TRM_forward +
                      (1 - pct_cobertura) * TRM_simulada),
      TRUE ~ Cuotas_USD * TRM_simulada
    ),

    Diferencia_COP = Cuota_COP_sin_fwd - Cuota_COP_forward,
    Dif_acumulada  = cumsum(Diferencia_COP)
  )

# ── totales ───────────────────────────────────────────────────────────────
total_sin <- sum(tabla_anual$Cuota_COP_sin_fwd)
total_con <- sum(tabla_anual$Cuota_COP_forward)
total_dif <- total_sin - total_con

# ── tabla resumen flujo total ─────────────────────────────────────────────
kable(
  tabla_anual %>%
    mutate(
      TRM_simulada     = formatC(round(TRM_simulada, 2),      format="f", digits=2, big.mark=","),
      TRM_forward      = ifelse(is.na(TRM_forward), "—",
                                formatC(round(TRM_forward, 2), format="f", digits=2, big.mark=",")),
      Cuotas_USD       = formatC(round(Cuotas_USD, 2),        format="f", digits=2, big.mark=","),
      Cuota_COP_forward= paste0("$", formatC(round(Cuota_COP_forward), format="f", digits=0, big.mark=",")),
      Cuota_COP_sin_fwd= paste0("$", formatC(round(Cuota_COP_sin_fwd), format="f", digits=0, big.mark=",")),
      Diferencia_COP   = paste0("$", formatC(round(Diferencia_COP),    format="f", digits=0, big.mark=",")),
      Dif_acumulada    = paste0("$", formatC(round(Dif_acumulada),      format="f", digits=0, big.mark=","))
    ) %>%
    select(Anio, Calendario, Cobertura, TRM_simulada, TRM_forward,
           Cuotas_USD, Cuota_COP_forward, Cuota_COP_sin_fwd,
           Diferencia_COP, Dif_acumulada),
  col.names = c("Año", "Calendario", "Cobertura", "TRM simulada",
                "TRM forward", "Cuota (USD)", "Cuota COP (con fwd)",
                "Cuota COP (sin fwd)", "Diferencia COP", "Dif. acumulada"),
  caption   = "Tabla 33. Flujo anual del crédito — con y sin cobertura forward (COP)"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 33. Flujo anual del crédito — con y sin cobertura forward (COP)
Año Calendario Cobertura TRM simulada TRM forward Cuota (USD) Cuota COP (con fwd) Cuota COP (sin fwd) Diferencia COP Dif. acumulada
1 2026 Sin cobertura 3,801.76 12,460.44 $47,371,533 $47,371,533 $0 $0
2 2027 Sin cobertura 3,974.28 12,460.44 $49,521,240 $49,521,240 $0 $0
3 2028 Sin cobertura 4,124.48 12,460.44 $51,392,758 $51,392,758 $0 $0
4 2029 Sin cobertura 4,313.23 12,460.44 $53,744,773 $53,744,773 $0 $0
5 2030 Sin cobertura 4,482.13 12,460.44 $55,849,325 $55,849,325 $0 $0
6 2031 Forward 1 4,724.06 4,481.15 12,460.44 $56,593,784 $58,863,882 $2,270,098 $2,270,098
7 2032 Forward 2 4,920.98 4,673.20 12,460.44 $59,001,973 $61,317,584 $2,315,611 $4,585,708
8 2033 Forward 3 5,176.54 4,873.48 12,460.44 $61,669,757 $64,501,993 $2,832,236 $7,417,944
9 2034 Forward 4 5,411.42 5,082.34 12,460.44 $64,353,314 $67,428,634 $3,075,320 $10,493,264
10 2035 Sin cobertura 5,673.59 12,460.44 $70,695,376 $70,695,376 $0 $10,493,264
# ── tabla de totales ──────────────────────────────────────────────────────
kable(
  data.frame(
    Concepto = c("Total sin forward (COP)",
                 "Total con forward (COP)",
                 "Ahorro por cobertura (COP)",
                 "Conclusión"),
    Valor = c(
      paste0("$", formatC(round(total_sin), format="f", digits=0, big.mark=",")),
      paste0("$", formatC(round(total_con), format="f", digits=0, big.mark=",")),
      paste0("$", formatC(round(total_dif), format="f", digits=0, big.mark=",")),
      ifelse(total_dif > 0,
             "El forward beneficia al inversionista",
             "El forward incrementó el costo del crédito")
    )
  ),
  col.names = c("Concepto", "Valor"),
  caption   = "Tabla 34. Resumen comparativo — impacto de la cobertura forward"
) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                full_width = TRUE, font_size = 10)
Tabla 34. Resumen comparativo — impacto de la cobertura forward
Concepto Valor
Total sin forward (COP) $580,687,097
Total con forward (COP) $570,193,834
Ahorro por cobertura (COP) $10,493,264
Conclusión El forward beneficia al inversionista
# ── gráfica cuotas con vs sin forward ────────────────────────────────────
data.frame(
  Anio  = rep(tabla_anual$Anio, 2),
  Tipo  = c(rep("Con forward (75% cubierto)", 10),
            rep("Sin forward (TRM simulada)", 10)),
  Cuota = c(tabla_anual$Cuota_COP_forward,
            tabla_anual$Cuota_COP_sin_fwd)
) %>%
  ggplot(aes(x = factor(Anio), y = Cuota, fill = Tipo)) +
  geom_col(position = "dodge", alpha = 0.85, width = 0.7) +
  geom_vline(xintercept = 5.5, linetype = "dashed",
             color = "gray30", linewidth = 0.8) +
  annotate("text", x = 5.7, y = max(tabla_anual$Cuota_COP_sin_fwd) * 0.97,
           label  = "Inicia\nforward",
           size   = 3, hjust = 0, family = "serif", color = "gray30") +
  scale_fill_manual(values = c(
    "Con forward (75% cubierto)" = "#1a5276",
    "Sin forward (TRM simulada)" = "#c0392b"
  )) +
  scale_y_continuous(labels = comma) +
  labs(
    title    = "Cuotas anuales del crédito — con y sin cobertura forward",
    subtitle = "Valores en COP | Cobertura del 75% activa años 6–9 (2031–2034)",
    x        = "Año del crédito",
    y        = "COP",
    fill     = ""
  ) +
  theme_minimal(base_family = "serif") +
  theme(
    plot.title      = element_text(size = 12, face = "bold"),
    plot.subtitle   = element_text(size = 10, color = "gray40"),
    legend.position = "bottom"
  )

Al comparar el flujo total del crédito con y sin cobertura, los resultados respaldan la decisión de contratar los forwards. Sin cobertura, el costo total de la maquinaria asciende a $580,687,097 COP como consecuencia de la devaluación acumulada a lo largo de los diez años del crédito. Al incorporar los cuatro contratos forward para cubrir el 75% de la deuda en los años 6 a 9, ese costo se reduce a $570,193,834 COP, es decir que, hay un ahorro de $10,493,264 COP.

También, en la visualización de la gráfica se hace evidente la eficiencia de la estrategia de cobertura. Las barras azules (que representan el flujo con forward) se mantuvieron consistentemente por debajo de las barras rojas en los años 6 a 9 (el tramo donde la TRM simulada supera los precios pactados en los contratos). En el año 9, por ejemplo, mientras el mercado simuló un dólar a $5,411.42, la empresa pagó gran parte de su cuota a $5,082.34, una diferencia de más de $3 millones de pesos solo durante ese período.

Finalmente, el análisis de los resultados permite concluir que la inversión en la maquinaria amarilla está justificada y resulta beneficiosa. Aunque se podría argumentar que el ahorro de 10.4 millones parece pequeño frente a la inversión total, el beneficio real de la cobertura está en haber eliminado el riesgo camnbiario, pues de lo contrario, el costo del crédito se hubiese disparado muy por encima de lo presupuestado.

El forward transformó una deuda variable y dificil de predecir en un compromiso certero y con un techo, que es precisamente la función para la que fue diseñado este instrumento.


Referencias

Adrian, T., Gaspar, V., & Gourinchas, P. O. (28 de marzo de 2024). The fiscal and financial risks of a high-debt, slow-growth world. IMF Blog. Recuperado de https://www.imf.org/en/blogs/articles/2024/03/28/the-fiscal-and-financial-risks-of-a-high-debt-slow-growth-world

American Express. (2025). 2025 OptBlue Objection Handling: Acceptance and Spend Statistics [Basado en datos de The Nilson Report, Issue 1,279]. Recuperado de https://www.americanexpress.com/en-us/business/optblue/agent/agent-resources/2025-OptBlue-Objection-Handling-One-Pager.pdf

American Express Company. (2024). 2023 Annual Report on Form 10-K. Securities and Exchange Commission. Recuperado de https://ir.americanexpress.com/investor-relations/default.aspx

American Express Company. (2025). Quarterly Earnings Supplement: Fourth Quarter 2024. Recuperado de https://ir.americanexpress.com

American Express Company. (2026). 2025 Annual Report. Securities and Exchange Commission. Recuperado de https://ir.americanexpress.com/investor-relations/default.aspx

American Express Newsroom. (2025). 175 years of American Express: A look back at our milestone anniversary. Recuperado de https://www.americanexpress.com/en-us/newsroom/articles/colleagues-and-culture/175-years-of-american-express–a-look-back-at-our-milestone-anni.html

Bancolombia. (Septiembre de 2025). Guía 2026: Perspectiva Económica. Dirección de Investigaciones Económicas, Sectoriales y de Mercado.

Bancolombia. (17 de marzo de 2026). Actualización de proyecciones económicas para Colombia: La economía colombiana del 2026: Pico de rendimiento, riesgo de ruptura. Dirección de Investigaciones Económicas, Sectoriales y de Mercado.

Bancolombia. Dirección de Investigaciones Económicas, Sectoriales y de Mercados. (4 de mayo de 2026). Informe mensual del mercado cambiario — abril 2026. Recuperado de https://www.bancolombia.com/wcm/connect/

Banco de la República. (5 de febrero de 2026). Informe de Política Monetaria: Enero de 2026. Presentado por el equipo técnico a la Junta Directiva. Recuperado de https://www.banrep.gov.co/

Bloomberg L.P. (2026). Financial Analysis (FA), Analyst Recommendations (ANR) y Earnings Estimates (EE): American Express Co. (AXP US Equity). Consultado el 24 de marzo de 2026, en Bloomberg Terminal.

Bloomberg L.P. (2026). Financial Analysis (FA), Analyst Recommendations (ANR) y Earnings Estimates (EE): Chipotle Mexican Grill Inc. (CMG US Equity). Consultado el 24 de marzo de 2026, en Bloomberg Terminal.

Bloomberg L.P. (2026). Financial Analysis (FA), Analyst Recommendations (ANR) y Earnings Estimates (EE): Hilton Worldwide Holdings Inc. (HLT US Equity). Consultado en marzo de 2026, en Bloomberg Terminal.

Bloomberg Línea. (2026). Colombia se enfrentará en 2026 a un petróleo más barato con sobreoferta y exceso de inventarios. Recuperado de https://www.bloomberglinea.com/latinoamerica/colombia/colombia-se-enfrentara-en-2026-a-un-petroleo-mas-barato-con-sobreoferta-y-exceso-de-inventarios/

Board of Governors of the Federal Reserve System. (2025). Delinquency Rate on Credit Card Loans, All Commercial Banks (DRCCLACBS). FRED, Federal Reserve Bank of St. Louis. Recuperado de https://fred.stlouisfed.org/series/DRCCLACBS

Board of Governors of the Federal Reserve System. (2026). Selected Interest Rates (Daily) — H.15. Recuperado de https://www.federalreserve.gov/releases/h15/

Bureau of Labor Statistics. (2026). Consumer Price Index: 2025 in review. The Economics Daily. U.S. Department of Labor. Recuperado de https://www.bls.gov/opub/ted/2026/consumer-price-index-2025-in-review.htm

Cabrera, J. (26 de junio de 2025). ¿Por qué Chipotle supera a sus competidores? XTB. Recuperado de https://www.xtb.com/es/analisis-de-mercado/por-que-chipotle-supera-a-sus-competidores

Chipotle Mexican Grill. (2025). Annual Report 2024. Recuperado de https://ir.chipotle.com/annual-reports

Chipotle Mexican Grill. (29 de abril de 2026). Chipotle announces first quarter 2026 results. Recuperado de https://ir.chipotle.com/2026-04-29-CHIPOTLE-ANNOUNCES-FIRST-QUARTER-2026-RESULTS

CME Group. (2026). E-mini S&P 500 Futures Contract Specifications. Recuperado de https://www.cmegroup.com/markets/equities/sp/e-mini-sandp500.html

CME Group. (2026). E-mini S&P 500 Futures Margin Requirements. Recuperado de https://www.cmegroup.com/markets/equities/sp/e-mini-sandp500.margins.html

Corficolombiana. (16 de febrero de 2026). Informe Semanal: Tasa de cambio en 2026: dólar débil, riesgos fuertes. Investigaciones Económicas.

Delgado, P. (27 de marzo de 2026). Oxford Economics advierte sobre el choque petrolero en Colombia: empujaría el déficit al 7% del PIB. Valora Analitik. Recuperado de https://www.valoraanalitik.com/oxford-economics-advierte-sobre-el-choque-petrolero-en-colombia-empujaria-el-deficit-al-7-del-pib/

El Colombiano. (2026). Producción de petróleo en Colombia cae 2,8% pese a discurso oficial de estabilidad. Recuperado de https://www.elcolombiano.com/negocios/produccion-petroleo-colombia-marzo-2026-supera-reservas-probadas-OD35051395

Escobar Fernández, J. (3 de marzo de 2026). Precio del dólar en Colombia: volvió a subir y se puso caro, así cerró ante el nerviosismo por las elecciones de 2026. Infobae. Recuperado de https://www.infobae.com/noticias/2026/03/03/colombia-cotizacion-de-cierre-del-dolar-hoy-3-de-marzo-de-usd-a-cop/

Federal Reserve Bank of St. Louis. (marzo de 2026). FOMC Summary of Economic Projections: March 2026. FRED Blog. Recuperado de https://fredblog.stlouisfed.org/2026/03/fomc-summary-of-economic-projections-march-2026/

Fitch Ratings. (2025). Fitch Ratings advierte sobre riesgos fiscales en la calificación de Colombia. Valora Analitik. Recuperado de https://www.valoraanalitik.com/fitch-ratings-degrado-calificacion-colombia/

Forbes. (2014, marzo 13). How American Express gains a competitive advantage from its closed-loop network. Recuperado de https://www.forbes.com/sites/greatspeculations/2014/03/13/how-american-express-gains-a-competitive-advantage-from-its-closed-loop-network/

Hilton. (2026a). Fact Sheets. Recuperado de https://stories.hilton.com/fact-sheets

Hilton Worldwide Holdings Inc. (11 de febrero de 2026a). Hilton reports fourth quarter and full year results. Recuperado de https://stories.hilton.com/releases/hilton-reports-2025-fourth-quarter-and-full-year-results

Hilton Worldwide Holdings Inc. (2026b). 2025 Annual Report / Form 10-K. Recuperado de https://stories.hilton.com/2025-10K

Infobae. (2 de marzo de 2026). Deuda pública de Colombia entraría en una senda insostenible si no se corrige déficit fiscal: advirtió CARF. Recuperado de https://www.infobae.com/colombia/2026/03/02/deuda-publica-de-colombia-entraria-en-una-senda-insostenible-si-no-se-corrige-deficit-fiscal-advirtio-carf-es-cada-vez-mas-preocupante/

Investopedia. (2024). How American Express makes its money: Fees, interest, and merchant revenue. Recuperado de https://www.investopedia.com/articles/markets/012715/how-american-express-makes-its-money.asp

JPMorgan Chase. (2026). Historical prime rate. Recuperado de https://www.jpmorganchase.com/legal/historical-prime-rate

J.P. Morgan Private Bank. (2026). Préstamos especializados. Recuperado de https://privatebank.jpmorgan.com/latam/es/services/lending/specialty-lending

Moadel, D. (5 de mayo de 2026). Argus upgrades Chipotle to buy: Wall Street bets the cautious guidance will be crushed. Yahoo Finance. Recuperado de https://finance.yahoo.com/markets/stocks/articles/argus-upgrades-chipotle-buy-wall-153311872.html

Murcia, A., & Rojas, D. (2013). Determinantes de la tasa de cambio en Colombia: un enfoque de microestructura de mercados. Borradores de Economía No. 789. Banco de la República. Recuperado de https://www.banrep.gov.co/es/borrador-789

Patel, N. (2026, enero 20). Is 2026 the year to buy American Express stock? The Motley Fool, publicado en Yahoo Finance. Recuperado de https://finance.yahoo.com/news/2026-buy-american-express-stock-111500022.html

Portafolio. (2026). Gobierno fortalecería su caja en dólares con compras en el mercado cambiario. Recuperado de https://www.portafolio.co/economia/finanzas/gobierno-petro-estaria-aprovechando-el-momento-para-fortalecer-su-caja-en-dolares-con-compras-en-mercado-cambiario-490058

Sorvino, C. (18 de noviembre de 2025). From fax machines to AI: How Chipotle’s CTO revolutionized its digital business. Forbes. Recuperado de https://www.forbes.com/sites/chloesorvino/2025/11/18/from-fax-machines-to-ai-how-chipotles-cto-revolutionized-its-digital-business/

Superintendencia Financiera de Colombia. (Marzo de 2026). Boletín Macroeconómico No. 32. Grupo de Investigaciones Económicas y Macroeconómicas.

The Motley Fool. (2024). Credit and debit card market share by network and issuer [Basado en datos de The Nilson Report, Issue 1264]. Recuperado de https://www.fool.com/money/research/credit-debit-card-market-share-network-issuer/

Volkman, E. (2026). Is American Express a buy, sell, or hold in 2026? Yahoo Finance. Recuperado de https://finance.yahoo.com/news/american-express-buy-sell-hold-194700016.html

Whitten, S. (29 de noviembre de 2017). Steve Ells wanted to open a fine-dining restaurant, instead he built a burrito empire. CNBC. Recuperado de https://www.cnbc.com/2017/11/29/how-steve-ells-built-chipotle-mexican-grill-into-a-burrito-empire.html