Trabajo Final — Instrumentos Derivados Financieros
Universidad EAFIT | Semestre 2026-1
Parte 1: Cobertura con Futuros de Índice
Bursátil
Parte 2: Forward de Divisas USD/COP
Nota metodológica: Este informe presenta el análisis cuantitativo del trabajo final del curso de Instrumentos Derivados Financieros. Se emplean retornos logarítmicos, año comercial de 252 días, optimización media-varianza de Markowitz (1952), cobertura sistemática con futuros E-mini S&P 500 y cobertura cambiaria mediante forwards de divisas bajo paridad cubierta de tasas (CIP). Marco teórico de referencia: Hull (2018).
Para este portafolio se buscaron tres criterios concretos: sectores con demanda estable que no depende del ciclo económico de corto plazo, empresas capaces de trasladar la inflación a sus precios, y correlaciones lo suficientemente moderadas entre sí para que la diversificación tenga sentido real. El sector tecnológico donde dominan Apple, Microsoft y Nvidia fue descartado de manera deliberada: sus valoraciones en 2026 incorporan expectativas de crecimiento muy exigentes, lo que deja poco margen ante cualquier decepción. En cambio, utilities reguladas, ferroviarias y REITs logísticos ofrecen flujos más predecibles, apropiados para un horizonte de cuatro años con capital institucional.
NextEra es el mayor generador de energía renovable del mundo por capacidad instalada. Tiene dos frentes: Florida Power & Light (FPL), una distribuidora regulada con cerca de seis millones de clientes, y NextEra Energy Resources, su brazo de proyectos en cuarenta estados.
| Métrica | Valor Q1-2026 |
|---|---|
| P/E Forward | 20x (sector utilities: 17x promedio) |
| Dividendo por acción | $2.18/año; crecimiento histórico 10%/año |
| Deuda neta / EBITDA | 5.5x (normal para sector regulado y capital intensivo) |
| Pipeline renovable | +20 GW solar y eólica 2026–2028 |
| Precio objetivo consenso | $75–$82 en 12 meses |
Al cierre de marzo de 2026, NEE cotizaba entre $68 y $72. El consenso apunta a un rango de $75–$82 en doce meses, impulsado por los créditos fiscales ITC/PTC de la Inflation Reduction Act y la expectativa de que tasas más bajas de la Fed reduzcan el costo de un negocio muy apalancado. El riesgo principal es regulatorio: un cambio en las tarifas aprobadas por la FPSC en Florida afecta directamente los márgenes de FPL. De los tres activos, NEE ofrece el mayor retorno esperado pero también la mayor volatilidad.
Union Pacific opera la mayor red ferroviaria del oeste de Estados Unidos, aproximadamente 32,000 millas de vía. En muchas de sus rutas no existe un sustituto ferroviario competitivo, lo que le otorga un poder de fijación de precios sostenido.
| Métrica | Valor Q1-2026 |
|---|---|
| P/E Forward | 20x |
| Operating Ratio | 61% (menor es mejor; refleja eficiencia operativa) |
| EV/EBITDA | 14x |
| Recompra de acciones | $3–4 bn/año |
| Precio objetivo consenso | $240–$260 en 12 meses |
Al cierre de marzo de 2026, UNP cotizaba entre $230 y $238. El nearshoring en México empresas que trasladan producción desde Asia para servir el mercado norteamericano genera volúmenes crecientes de carga en las rutas de Union Pacific. La combinación de poder de precio, recompras agresivas y modelo de negocio estable hace de UNP el activo más defensivo del portafolio, con el mejor ratio retorno/riesgo individual de los tres.
Prologis es el mayor REIT industrial del mundo: más de 1,200 millones de pies cuadrados de almacenes en 19 países, concentrados en mercados donde la nueva oferta está estructuralmente limitada (puertos, aeropuertos, zonas urbanas densas).
| Métrica | Valor Q1-2026 |
|---|---|
| P/FFO (Funds From Operations) | ~22x |
| Tasa de ocupación | 97% |
| Crecimiento contractual alquileres | 4–6%/año |
| Precio objetivo consenso | $115–$130 en 12 meses |
Al cierre de marzo de 2026, PLD cotizaba entre $108 y $115. El principal catalizador es la eventual baja de tasas de la Fed: los REITs son activos de largo plazo cuyos flujos se descuentan con tasas de interés, de modo que tasas más bajas implican mayor valoración directamente. El e-commerce requiere entre tres y cinco veces más espacio de almacenamiento que el comercio físico, lo que sostiene la demanda estructural con independencia del entorno de tasas.
Fuentes: Bloomberg Terminal Q1 2026; Morningstar Direct; SEC 10-K 2025; informes de analistas Jefferies y Wells Fargo (marzo 2026).
## [<matplotlib.lines.Line2D object at 0x000002729A8FA050>]
## [<matplotlib.lines.Line2D object at 0x000002729A962A90>]
## [<matplotlib.lines.Line2D object at 0x000002729A924610>]
## Text(0.5, 1.0, 'Precios Normalizados (Base 100 = Mar 2016)')
## Text(0, 0.5, 'Índice (Base 100)')
## <matplotlib.legend.Legend object at 0x000002729A319290>
## <Axes: xlabel='Ticker', ylabel='Ticker'>
## Text(0.5, 1.0, 'Correlación de Retornos Logarítmicos Diarios')
Figura 1. Precios normalizados (izquierda) y matriz de correlaciones de retornos diarios (derecha). Datos: Yahoo Finance (2016–2026). Elaboración propia.
Las correlaciones entre las tres acciones se ubican en un rango moderado entre 0.30 y 0.55 aproximadamente, lo que es suficiente para obtener beneficios reales de diversificación. No son activos independientes entre sí: todos reaccionan en alguna medida a shocks macroeconómicos. PLD fue el más afectado en 2022, cuando la Fed subió tasas agresivamente: el alza del costo del capital golpea directamente a un REIT, que financia gran parte de su operación con deuda. NEE acumula el mayor retorno relativo en el período, impulsado por el boom renovable posterior a la Inflation Reduction Act. UNP muestra la trayectoria más estable de las tres, que es coherente con su naturaleza de negocio esencial con poca exposición al ciclo.
La siguiente tabla resume los estadísticos anualizados de cada acción y la matriz de varianzas-covarianzas del portafolio:
## Retorno anual (μ) Volatilidad anual (σ) Ratio μ/σ
## Ticker
## NEE 13.8871% 25.3197% 0.5485
## UNP 13.2674% 25.2136% 0.5262
## PLD 13.6112% 27.0227% 0.5037
UNP presenta el mejor ratio retorno/riesgo de los tres, lo que anticipa que recibirá una asignación importante en el portafolio óptimo. Las covarianzas positivas entre todos los pares reflejan que los tres activos se mueven en la misma dirección ante shocks del mercado, algo esperable dado que los tres cotizan en el mismo mercado y responden a las mismas condiciones macroeconómicas generales. Eso limita los beneficios de diversificación, pero no los elimina. La diferencia en la magnitud de esas covarianzas es precisamente lo que aprovecha la optimización de Markowitz.
El portafolio óptimo maximiza el Sharpe Ratio, que mide el retorno excedente obtenido por cada unidad de riesgo asumida:
\[\max_{w} \; SR = \frac{\mathbf{w}^T\boldsymbol{\mu} - r_f}{\sqrt{\mathbf{w}^T\boldsymbol{\Sigma}\mathbf{w}}} \qquad \text{s.a.} \; \sum_i w_i = 1, \quad w_i \geq 0 \;\forall i\]
Tasa libre de riesgo: 4.4400001% (^TNX CBOE, cierre 28-mar-2026). Algoritmo: SLSQP. Sin ventas en corto (\(w_i \geq 0\)). Markowitz (1952); Sharpe (1964).
## Acción Peso óptimo Capital (USD)
## NEE 43.51% $ 8,701,604
## UNP 38.52% $ 7,703,692
## PLD 17.97% $ 3,594,704
## Indicador Valor
## Retorno anual esperado 13.5988%
## Volatilidad anual 20.1692%
## Sharpe Ratio (óptimo) 0.4541
## Sharpe Ratio (pesos iguales) 0.4477
## Mejora +0.0064 (1.4%)
## <matplotlib.colorbar.Colorbar object at 0x000002729AB9C310>
## <matplotlib.collections.PathCollection object at 0x000002729AC088D0>
## <matplotlib.collections.PathCollection object at 0x000002729AB0DCD0>
## Text(0.5, 1.0, 'Frontera Eficiente — Simulación Monte Carlo (12,000 portafolios)')
## Text(0.5, 0, 'Volatilidad anual')
## Text(0, 0.5, 'Retorno anual esperado')
## <matplotlib.legend.Legend object at 0x000002729ABBB310>
## Text(0.5, 1.0, 'Distribución del Capital — USD 20M')
Figura 2. Frontera eficiente (12,000 portafolios aleatorios) y distribución óptima del capital. La estrella roja marca el portafolio de máximo Sharpe Ratio. Elaboración propia. Markowitz (1952); Sharpe (1964).
La frontera eficiente ilustra algo concreto: dado un nivel de riesgo fijo, siempre existe una combinación de activos que maximiza el retorno esperado. El portafolio óptimo —la estrella roja se ubica donde la Capital Market Line es tangente a la frontera, y eso corresponde exactamente al máximo Sharpe Ratio. La mejora frente a los pesos iguales no es trivial: más retorno por unidad de riesgo significa que la asignación matemática tiene sentido práctico, no solo teórico.
Lo que llama la atención en la distribución final es que UNP concentra la mayor asignación del capital, lo cual es completamente consistente con lo que mostraron los estadísticos individuales: mejor ratio retorno/riesgo y menor covarianza relativa con los otros dos. NEE recibe una asignación importante por su retorno esperado, y PLD aporta diversificación sectorial real, aunque su peso menor refleja su mayor volatilidad y correlación positiva con los otros dos activos.
VaR histórico: \(\text{VaR}_\alpha = \text{percentil}_{1-\alpha}(\text{pérdidas históricas}) \times V_P\)
VaR paramétrico: \(\text{VaR}_\alpha = (z_{1-\alpha}\,\sigma_d - \mu_d) \times V_P \quad\) donde \(\;\sigma_d = \sigma_{anual}/\sqrt{252}\)
Interpretación: el VaR al 99% es el monto que el portafolio no debería perder en más de 1 de cada 100 días hábiles. Hull (2018, cap. 22).
## Nivel de confianza VaR Histórico (USD) VaR Paramétrico (USD) % del Capital Brecha Hist. − Param.
## 99% — VaR 1% $ 663,039 $ 580,350 3.315% $+82,689
## 95% — VaR 5% $ 381,675 $ 407,177 1.908% $-25,502
## (array([7.12432013e-09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 7.12432013e-09, 7.12432013e-09,
## 0.00000000e+00, 0.00000000e+00, 7.12432013e-09, 7.12432013e-09,
## 7.12432013e-09, 0.00000000e+00, 7.12432013e-09, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 1.42486403e-08, 0.00000000e+00,
## 1.42486403e-08, 0.00000000e+00, 4.27459208e-08, 2.84972805e-08,
## 3.56216007e-08, 7.12432013e-08, 1.49610723e-07, 1.92356644e-07,
## 2.56475525e-07, 3.63340327e-07, 6.05567211e-07, 9.54658898e-07,
## 1.19688578e-06, 1.80245299e-06, 2.25128516e-06, 2.42226885e-06,
## 2.12304740e-06, 1.46048563e-06, 1.09002098e-06, 7.48053614e-07,
## 4.77329449e-07, 4.41707848e-07, 3.27718726e-07, 2.13729604e-07,
## 1.42486403e-07, 1.06864802e-07, 8.54918416e-08, 3.56216007e-08,
## 4.27459208e-08, 1.42486403e-08, 3.56216007e-08, 7.12432013e-09,
## 1.42486403e-08, 7.12432013e-09, 7.12432013e-09, 7.12432013e-09,
## 7.12432013e-09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 1.42486403e-08, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 7.12432013e-09,
## 0.00000000e+00, 0.00000000e+00, 7.12432013e-09, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 7.12432013e-09]), array([-2444127.41900989, -2388205.39880531, -2332283.37860073,
## -2276361.35839616, -2220439.33819158, -2164517.317987 ,
## -2108595.29778242, -2052673.27757785, -1996751.25737327,
## -1940829.23716869, -1884907.21696411, -1828985.19675954,
## -1773063.17655496, -1717141.15635038, -1661219.1361458 ,
## -1605297.11594123, -1549375.09573665, -1493453.07553207,
## -1437531.05532749, -1381609.03512291, -1325687.01491834,
## -1269764.99471376, -1213842.97450918, -1157920.9543046 ,
## -1101998.93410003, -1046076.91389545, -990154.89369087,
## -934232.87348629, -878310.85328172, -822388.83307714,
## -766466.81287256, -710544.79266798, -654622.77246341,
## -598700.75225883, -542778.73205425, -486856.71184967,
## -430934.6916451 , -375012.67144052, -319090.65123594,
## -263168.63103136, -207246.61082679, -151324.59062221,
## -95402.57041763, -39480.55021305, 16441.46999152,
## 72363.4901961 , 128285.51040068, 184207.53060526,
## 240129.55080984, 296051.57101441, 351973.59121899,
## 407895.61142357, 463817.63162815, 519739.65183272,
## 575661.6720373 , 631583.69224188, 687505.71244646,
## 743427.73265103, 799349.75285561, 855271.77306019,
## 911193.79326477, 967115.81346934, 1023037.83367392,
## 1078959.8538785 , 1134881.87408308, 1190803.89428765,
## 1246725.91449223, 1302647.93469681, 1358569.95490139,
## 1414491.97510596, 1470413.99531054, 1526336.01551512,
## 1582258.0357197 , 1638180.05592427, 1694102.07612885,
## 1750024.09633343, 1805946.11653801, 1861868.13674258,
## 1917790.15694716, 1973712.17715174, 2029634.19735632,
## 2085556.21756089, 2141478.23776547, 2197400.25797005,
## 2253322.27817463, 2309244.29837921, 2365166.31858378,
## 2421088.33878836, 2477010.35899294, 2532932.37919752,
## 2588854.39940209]), <BarContainer object of 90 artists>)
## [<matplotlib.lines.Line2D object at 0x000002729AE1FE10>]
## <matplotlib.lines.Line2D object at 0x000002729AB31750>
## <matplotlib.lines.Line2D object at 0x000002729A859F50>
## <matplotlib.collections.FillBetweenPolyCollection object at 0x000002729AA473D0>
## (0.0, 2.543382287994821e-06)
## Text(0.5, 1.0, 'Distribución Empírica de Pérdidas Diarias — Portafolio Óptimo')
## Text(0.5, 0, 'Pérdida diaria (USD)')
## Text(0, 0.5, 'Densidad de probabilidad')
## <matplotlib.legend.Legend object at 0x000002729ACBC2D0>
Figura 3. Distribución empírica de pérdidas diarias del portafolio. Las líneas verticales marcan los umbrales VaR 95% y 99%. La zona roja representa el 1% de días con pérdidas más extremas. Elaboración propia. Hull (2018, cap. 22).
El VaR al 99% responde a una pregunta concreta para quien toma decisiones de inversión: ¿cuánto podría perder el portafolio en un día muy malo? No es el peor día posible —eso sería el Expected Shortfall, sino el umbral que solo se supera en una de cada cien jornadas hábiles. Para un fondo de USD 20 millones, ese monto tiene implicaciones directas sobre cuánto capital debe mantenerse como reserva de liquidez.
Lo más relevante es la brecha entre el VaR histórico y el paramétrico: el histórico es más alto porque los datos reales tienen colas más pesadas que una distribución normal. Los mercados de 2020 y 2022 generaron caídas que la normal subestimaría de manera significativa. Eso es la leptocurtosis en la práctica, y es precisamente la razón por la que en la Parte 2 se usa la distribución t-Student para la TRM en lugar de asumir normalidad. La cobertura con futuros busca compensar pérdidas de la magnitud del VaR cuando el mercado cae.
Modelo de mercado (Jensen, 1968): \[R_i - r_f = \alpha_i + \beta_i(R_m - r_f) + \varepsilon_i \qquad \beta_P = \sum_i w_i \beta_i\]
Estimación por OLS con retornos en exceso sobre la tasa libre de riesgo. Índice de referencia: S&P 500 (^GSPC).
## <matplotlib.collections.PathCollection object at 0x000002729AED2850>
## [<matplotlib.lines.Line2D object at 0x000002729AD4BE90>]
## <matplotlib.lines.Line2D object at 0x000002729A9F2190>
## <matplotlib.lines.Line2D object at 0x000002729AD4DE50>
## Text(0.5, 1.0, 'CAPM: NEE vs S&P 500')
## Text(0.5, 0, 'Exceso retorno mercado')
## Text(0, 0.5, 'Exceso retorno NEE')
## <matplotlib.legend.Legend object at 0x000002729AEE0C50>
## <matplotlib.collections.PathCollection object at 0x000002729AD89A50>
## [<matplotlib.lines.Line2D object at 0x000002729AD06D50>]
## <matplotlib.lines.Line2D object at 0x000002729AC66250>
## <matplotlib.lines.Line2D object at 0x000002729ADA0850>
## Text(0.5, 1.0, 'CAPM: UNP vs S&P 500')
## Text(0.5, 0, 'Exceso retorno mercado')
## Text(0, 0.5, 'Exceso retorno UNP')
## <matplotlib.legend.Legend object at 0x000002729AD49A50>
## <matplotlib.collections.PathCollection object at 0x000002729ADA89D0>
## [<matplotlib.lines.Line2D object at 0x000002729AD44990>]
## <matplotlib.lines.Line2D object at 0x000002729ADAA990>
## <matplotlib.lines.Line2D object at 0x000002729AE936D0>
## Text(0.5, 1.0, 'CAPM: PLD vs S&P 500')
## Text(0.5, 0, 'Exceso retorno mercado')
## Text(0, 0.5, 'Exceso retorno PLD')
## <matplotlib.legend.Legend object at 0x000002729AD74DD0>
Figura 4. Regresión CAPM de cada acción contra el exceso de retorno del S&P 500 (2016–2026). La línea roja es la línea característica de cada activo. Elaboración propia. Sharpe (1964); Jensen (1968).
## Acción Beta CAPM IC95 inf IC95 sup R² p-valor Signif
## NEE 0.641917 0.593193 0.690641 0.210179 1.098867e-130 Sí
## UNP 0.900292 0.858603 0.941981 0.416912 4.194323e-296 Sí
## PLD 0.960655 0.915835 1.005475 0.413262 1.054687e-292 Sí
## Prima de riesgo S&P 500 (Rm − Rf) : 6.8934%
## Beta ponderada del portafolio : 0.798727
## Retorno esperado CAPM portafolio : 9.9459%
## Perfil de riesgo : Defensivo
Que la beta del portafolio sea menor a 1.0 tiene una lectura directa: cuando el S&P 500 cae un 1%, este portafolio debería caer menos. No significa que sea inmune significa que amplifica menos los movimientos del mercado. Tiene sentido dado lo que son NEE, UNP y PLD: negocios con flujos de caja relativamente estables, no cíclicos de corto plazo.
Lo que importa para la cobertura con futuros es que las betas sean estadísticamente significativas; de lo contrario, se estarían calibrando contratos con parámetros poco confiables. Todas cumplen ese criterio (p-valor < 0.05). Los R² individuales indican cuánta variación de cada acción explica el mercado en su conjunto: donde son más bajos, existe riesgo idiosincrático que los futuros del índice simplemente no cubren. Ese riesgo residual es una limitación real de la estrategia que hay que tener presente.
Hull (2018, Cap. 3): \[N^* = \frac{(\beta_{objetivo} - \beta_P) \times V_P}{F_0 \times A}\]
\(A = 50\) USD/punto (E-mini S&P 500). \(N^* < 0\) indica posición corta (venta de contratos). Objetivo: \(\beta_{objetivo} = 0\) (cobertura total del riesgo sistemático).
## Parámetro Valor
## Precio futuro ES=F (F₀) 6,412.25
## Multiplicador del contrato (USD/punto) USD 50 / punto
## Valor nocional por contrato $320,612
## Valor del portafolio $20,000,000
## Beta actual del portafolio 0.798727
## Beta objetivo (cobertura total) 0.0
## N* teórico (contratos) -49.8251
## N* redondeado -50 contratos
## Posición en futuros CORTA — venta de contratos ES=F
## Error por redondeo 0.3511%
## === MÁRGENES CME GROUP — E-mini S&P 500 (ES) Q1 2026 ===
## Margen inicial por contrato : $ 26,580
## Margen de mantenimiento/ctto : $ 24,164
## Contratos en posición (abs) : 50
## Margen inicial TOTAL : $ 1,329,000
## Margen mantenimiento TOTAL : $ 1,208,200
## Capital inmovilizado / portaf. : 6.645%
La posición corta en futuros ES es el instrumento de cobertura. La lógica operativa es directa: cuando el mercado cae, los contratos vendidos se recompran a menor precio generando una ganancia que compensa, al menos parcialmente, las pérdidas del portafolio de acciones. La cantidad de contratos se calibra para que la beta efectiva del portafolio combinado converja a cero, eliminando la exposición al riesgo sistemático.
El redondeo a número entero introduce un desajuste menor, pero es inevitable con contratos estandarizados. Lo que sí vale la pena señalar es que esta cobertura elimina el riesgo de mercado el movimiento del índice— pero no el riesgo específico de cada empresa. Si NEE enfrenta un problema regulatorio en Florida, si Union Pacific tiene una falla operativa relevante, o si Prologis sufre por tasas persistentemente altas, el futuro del S&P 500 no va a compensar eso. Ese riesgo idiosincrático queda fuera de la cobertura por diseño.
El capital inmovilizado en márgenes representa una consideración de liquidez no menor: ese porcentaje del portafolio debe estar disponible en efectivo en todo momento, lo que tiene un costo de oportunidad real.
## [<matplotlib.lines.Line2D object at 0x000002729AF7DD50>, <matplotlib.lines.Line2D object at 0x000002729AF9F4D0>, <matplotlib.lines.Line2D object at 0x000002729AF47CD0>, <matplotlib.lines.Line2D object at 0x000002729AF81D50>, <matplotlib.lines.Line2D object at 0x000002729AEBDAD0>, <matplotlib.lines.Line2D object at 0x000002729AF96710>, <matplotlib.lines.Line2D object at 0x000002729AEB4B50>, <matplotlib.lines.Line2D object at 0x000002729AF145D0>, <matplotlib.lines.Line2D object at 0x000002729ADF73D0>, <matplotlib.lines.Line2D object at 0x000002729AF5D690>, <matplotlib.lines.Line2D object at 0x000002729AC3C3D0>, <matplotlib.lines.Line2D object at 0x000002729AFA7FD0>, <matplotlib.lines.Line2D object at 0x000002729AF97BD0>, <matplotlib.lines.Line2D object at 0x000002729A8B8B10>, <matplotlib.lines.Line2D object at 0x000002729AF98810>, <matplotlib.lines.Line2D object at 0x000002729AF98C50>, <matplotlib.lines.Line2D object at 0x000002729ADC94D0>, <matplotlib.lines.Line2D object at 0x000002729AF82C50>, <matplotlib.lines.Line2D object at 0x000002729AF990D0>, <matplotlib.lines.Line2D object at 0x000002729AF01490>, <matplotlib.lines.Line2D object at 0x000002729AF72510>, <matplotlib.lines.Line2D object at 0x000002729AF94E50>, <matplotlib.lines.Line2D object at 0x000002729AF99D10>, <matplotlib.lines.Line2D object at 0x000002729AF9FC50>, <matplotlib.lines.Line2D object at 0x000002729AFA8050>, <matplotlib.lines.Line2D object at 0x000002729AC98C50>, <matplotlib.lines.Line2D object at 0x000002729AFABCD0>, <matplotlib.lines.Line2D object at 0x000002729AF9AD10>, <matplotlib.lines.Line2D object at 0x000002729AF9BF50>, <matplotlib.lines.Line2D object at 0x000002729AF5F210>, <matplotlib.lines.Line2D object at 0x000002729A946C90>, <matplotlib.lines.Line2D object at 0x000002729AFB4950>, <matplotlib.lines.Line2D object at 0x000002729AFB5150>, <matplotlib.lines.Line2D object at 0x000002729AFB5590>, <matplotlib.lines.Line2D object at 0x000002729ADAAA10>, <matplotlib.lines.Line2D object at 0x000002729AFB5890>, <matplotlib.lines.Line2D object at 0x000002729AF16310>, <matplotlib.lines.Line2D object at 0x000002729AFB5F50>, <matplotlib.lines.Line2D object at 0x000002729AFB6790>, <matplotlib.lines.Line2D object at 0x000002729AFB6BD0>, <matplotlib.lines.Line2D object at 0x000002729AF973D0>, <matplotlib.lines.Line2D object at 0x000002729AFB7010>, <matplotlib.lines.Line2D object at 0x000002729AFB7850>, <matplotlib.lines.Line2D object at 0x000002729AFB7C90>, <matplotlib.lines.Line2D object at 0x000002729AFB7F90>, <matplotlib.lines.Line2D object at 0x000002729AFB4910>, <matplotlib.lines.Line2D object at 0x000002729AFB4D10>, <matplotlib.lines.Line2D object at 0x000002729AFB5110>, <matplotlib.lines.Line2D object at 0x000002729AFC4510>, <matplotlib.lines.Line2D object at 0x000002729AFC5590>, <matplotlib.lines.Line2D object at 0x000002729AF9DD90>, <matplotlib.lines.Line2D object at 0x000002729AF25590>, <matplotlib.lines.Line2D object at 0x000002729AA651D0>, <matplotlib.lines.Line2D object at 0x000002729AFC5990>, <matplotlib.lines.Line2D object at 0x000002729AF3EDD0>, <matplotlib.lines.Line2D object at 0x000002729AFC69D0>, <matplotlib.lines.Line2D object at 0x000002729ADBC150>, <matplotlib.lines.Line2D object at 0x000002729AFC7250>, <matplotlib.lines.Line2D object at 0x000002729AFC7A50>, <matplotlib.lines.Line2D object at 0x000002729AFC7ED0>, <matplotlib.lines.Line2D object at 0x000002729AFC8310>, <matplotlib.lines.Line2D object at 0x000002729AFC8750>, <matplotlib.lines.Line2D object at 0x000002729AD28FD0>, <matplotlib.lines.Line2D object at 0x000002729AF99390>, <matplotlib.lines.Line2D object at 0x000002729AF997D0>, <matplotlib.lines.Line2D object at 0x000002729AFC8BD0>, <matplotlib.lines.Line2D object at 0x000002729AEC9510>, <matplotlib.lines.Line2D object at 0x000002729AF72410>, <matplotlib.lines.Line2D object at 0x000002729AFC9C50>, <matplotlib.lines.Line2D object at 0x000002729AFCA850>, <matplotlib.lines.Line2D object at 0x000002729AF9B090>, <matplotlib.lines.Line2D object at 0x000002729AFCAC90>, <matplotlib.lines.Line2D object at 0x000002729AF9B910>, <matplotlib.lines.Line2D object at 0x000002729AFCB4D0>, <matplotlib.lines.Line2D object at 0x000002729AFCBDD0>, <matplotlib.lines.Line2D object at 0x000002729AFD0310>, <matplotlib.lines.Line2D object at 0x000002729AFD0810>, <matplotlib.lines.Line2D object at 0x000002729ADFB150>, <matplotlib.lines.Line2D object at 0x000002729AD8A190>, <matplotlib.lines.Line2D object at 0x000002729AF81A90>, <matplotlib.lines.Line2D object at 0x000002729ADD1F10>, <matplotlib.lines.Line2D object at 0x000002729AF9A3D0>, <matplotlib.lines.Line2D object at 0x000002729AFD0CD0>, <matplotlib.lines.Line2D object at 0x000002729AF81A10>, <matplotlib.lines.Line2D object at 0x000002729AF731D0>, <matplotlib.lines.Line2D object at 0x000002729AFD2890>, <matplotlib.lines.Line2D object at 0x000002729AFABB10>, <matplotlib.lines.Line2D object at 0x000002729AFD3690>, <matplotlib.lines.Line2D object at 0x000002729AFD3FD0>, <matplotlib.lines.Line2D object at 0x000002729AF9F0D0>, <matplotlib.lines.Line2D object at 0x000002729AFC4910>, <matplotlib.lines.Line2D object at 0x000002729ACE7990>, <matplotlib.lines.Line2D object at 0x000002729AFD52D0>, <matplotlib.lines.Line2D object at 0x000002729AFD5610>, <matplotlib.lines.Line2D object at 0x000002729AF81210>, <matplotlib.lines.Line2D object at 0x000002729AFC6590>, <matplotlib.lines.Line2D object at 0x000002729AFD5C50>, <matplotlib.lines.Line2D object at 0x000002729AFD6A10>, <matplotlib.lines.Line2D object at 0x000002729AFD6ED0>, <matplotlib.lines.Line2D object at 0x000002729AFD73D0>, <matplotlib.lines.Line2D object at 0x000002729AFD7890>, <matplotlib.lines.Line2D object at 0x000002729AFD7D90>, <matplotlib.lines.Line2D object at 0x000002729AE436D0>, <matplotlib.lines.Line2D object at 0x000002729AFC8710>, <matplotlib.lines.Line2D object at 0x000002729AD490D0>, <matplotlib.lines.Line2D object at 0x000002729AD0A210>, <matplotlib.lines.Line2D object at 0x000002729AFD8C10>, <matplotlib.lines.Line2D object at 0x000002729AEF2AD0>, <matplotlib.lines.Line2D object at 0x000002729AFD9A10>, <matplotlib.lines.Line2D object at 0x000002729AFAA7D0>, <matplotlib.lines.Line2D object at 0x000002729AFCAC50>, <matplotlib.lines.Line2D object at 0x000002729AFCB090>, <matplotlib.lines.Line2D object at 0x000002729AFD3550>, <matplotlib.lines.Line2D object at 0x000002729ADC0D90>, <matplotlib.lines.Line2D object at 0x000002729AF5D010>, <matplotlib.lines.Line2D object at 0x000002729AFDA390>, <matplotlib.lines.Line2D object at 0x000002729AFD8290>, <matplotlib.lines.Line2D object at 0x000002729AFD8710>, <matplotlib.lines.Line2D object at 0x000002729AFE0BD0>, <matplotlib.lines.Line2D object at 0x000002729AF73490>, <matplotlib.lines.Line2D object at 0x000002729AFE1090>, <matplotlib.lines.Line2D object at 0x000002729AFD1DD0>, <matplotlib.lines.Line2D object at 0x000002729AFD2290>, <matplotlib.lines.Line2D object at 0x000002729AFAA710>, <matplotlib.lines.Line2D object at 0x000002729AF9ABD0>, <matplotlib.lines.Line2D object at 0x000002729AFE1990>, <matplotlib.lines.Line2D object at 0x000002729AF9B510>, <matplotlib.lines.Line2D object at 0x000002729AF71A10>, <matplotlib.lines.Line2D object at 0x000002729AFDBE10>, <matplotlib.lines.Line2D object at 0x000002729AFE3090>, <matplotlib.lines.Line2D object at 0x000002729AFC47D0>, <matplotlib.lines.Line2D object at 0x000002729AFE4350>, <matplotlib.lines.Line2D object at 0x000002729AFE4B10>, <matplotlib.lines.Line2D object at 0x000002729AFE4F90>, <matplotlib.lines.Line2D object at 0x000002729AFE5590>, <matplotlib.lines.Line2D object at 0x000002729AF9EAD0>, <matplotlib.lines.Line2D object at 0x000002729AFB6310>, <matplotlib.lines.Line2D object at 0x000002729AFB6750>, <matplotlib.lines.Line2D object at 0x000002729AFB6B90>, <matplotlib.lines.Line2D object at 0x000002729AFE5A10>, <matplotlib.lines.Line2D object at 0x000002729AFC7510>, <matplotlib.lines.Line2D object at 0x000002729AEBCD90>, <matplotlib.lines.Line2D object at 0x000002729AF80F90>, <matplotlib.lines.Line2D object at 0x000002729AFE7090>, <matplotlib.lines.Line2D object at 0x000002729AFD02D0>, <matplotlib.lines.Line2D object at 0x000002729AFE0710>, <matplotlib.lines.Line2D object at 0x000002729AFD0B50>, <matplotlib.lines.Line2D object at 0x000002729AFD8F90>, <matplotlib.lines.Line2D object at 0x000002729AF71410>, <matplotlib.lines.Line2D object at 0x000002729AFE98D0>, <matplotlib.lines.Line2D object at 0x000002729AF815D0>, <matplotlib.lines.Line2D object at 0x000002729AFE2610>, <matplotlib.lines.Line2D object at 0x000002729AFE2A90>, <matplotlib.lines.Line2D object at 0x000002729AFE2F50>, <matplotlib.lines.Line2D object at 0x000002729AFCB390>, <matplotlib.lines.Line2D object at 0x000002729AB68D10>, <matplotlib.lines.Line2D object at 0x000002729AF9BCD0>, <matplotlib.lines.Line2D object at 0x000002729AD075D0>, <matplotlib.lines.Line2D object at 0x000002729AFE9D50>, <matplotlib.lines.Line2D object at 0x000002729ACB7310>, <matplotlib.lines.Line2D object at 0x000002729AF1BA10>, <matplotlib.lines.Line2D object at 0x000002729AFF4F90>, <matplotlib.lines.Line2D object at 0x000002729AF958D0>, <matplotlib.lines.Line2D object at 0x000002729AF5E850>, <matplotlib.lines.Line2D object at 0x000002729AF96190>, <matplotlib.lines.Line2D object at 0x000002729AFB6610>, <matplotlib.lines.Line2D object at 0x000002729AFE6A90>, <matplotlib.lines.Line2D object at 0x000002729AF9DC10>, <matplotlib.lines.Line2D object at 0x000002729AFB73D0>, <matplotlib.lines.Line2D object at 0x000002729AFD7850>, <matplotlib.lines.Line2D object at 0x000002729AFE7D10>, <matplotlib.lines.Line2D object at 0x000002729AFE0190>, <matplotlib.lines.Line2D object at 0x000002729AFF5450>, <matplotlib.lines.Line2D object at 0x000002729AFE8610>, <matplotlib.lines.Line2D object at 0x000002729AF98AD0>, <matplotlib.lines.Line2D object at 0x000002729AFE8F90>, <matplotlib.lines.Line2D object at 0x000002729AFE9410>, <matplotlib.lines.Line2D object at 0x000002729AFE9890>, <matplotlib.lines.Line2D object at 0x000002729AFF9D50>, <matplotlib.lines.Line2D object at 0x000002729AFE2710>, <matplotlib.lines.Line2D object at 0x000002729AFFA250>, <matplotlib.lines.Line2D object at 0x000002729AFE3050>, <matplotlib.lines.Line2D object at 0x000002729AFFAB90>, <matplotlib.lines.Line2D object at 0x000002729AFE3990>, <matplotlib.lines.Line2D object at 0x000002729AFE3E10>, <matplotlib.lines.Line2D object at 0x000002729AFFB510>, <matplotlib.lines.Line2D object at 0x000002729ADEC790>, <matplotlib.lines.Line2D object at 0x000002729AFE4C50>, <matplotlib.lines.Line2D object at 0x000002729AFE50D0>, <matplotlib.lines.Line2D object at 0x000002729AFFC310>, <matplotlib.lines.Line2D object at 0x000002729AF95990>, <matplotlib.lines.Line2D object at 0x000002729AFFD590>, <matplotlib.lines.Line2D object at 0x000002729AF962D0>, <matplotlib.lines.Line2D object at 0x000002729AFE6750>, <matplotlib.lines.Line2D object at 0x000002729AFFDE50>, <matplotlib.lines.Line2D object at 0x000002729AFFEC50>, <matplotlib.lines.Line2D object at 0x000002729AFFF110>, <matplotlib.lines.Line2D object at 0x000002729AFC7A10>, <matplotlib.lines.Line2D object at 0x000002729AFFF590>, <matplotlib.lines.Line2D object at 0x000002729AF5F810>]
## [<matplotlib.lines.Line2D object at 0x000002729AFE8710>]
## <matplotlib.lines.Line2D object at 0x000002729AFD3E90>
## Text(0.5, 1.0, 'Trayectorias GBM — Futuro E-mini S&P 500 (1,000 simulaciones, 4 años)')
## Text(0.5, 0, 'Días hábiles')
## Text(0, 0.5, 'Precio del Futuro (USD)')
## <matplotlib.legend.Legend object at 0x000002729AF83790>
## <matplotlib.lines.Line2D object at 0x000002729AE6B0D0>
## <matplotlib.lines.Line2D object at 0x000002729AD17A90>
## <matplotlib.lines.Line2D object at 0x00000272A2174050>
## <matplotlib.lines.Line2D object at 0x00000272A216CB50>
## <matplotlib.lines.Line2D object at 0x000002729AF81290>
## <matplotlib.lines.Line2D object at 0x00000272A2176450>
## <matplotlib.lines.Line2D object at 0x00000272A2177110>
## <matplotlib.lines.Line2D object at 0x00000272A216C250>
## <matplotlib.lines.Line2D object at 0x00000272A217CB50>
## <matplotlib.lines.Line2D object at 0x00000272A217D590>
## <matplotlib.lines.Line2D object at 0x00000272A217E290>
## <matplotlib.lines.Line2D object at 0x00000272A217EF50>
## <matplotlib.lines.Line2D object at 0x00000272A217FC10>
## <matplotlib.lines.Line2D object at 0x00000272A2184910>
## <matplotlib.lines.Line2D object at 0x00000272A2185A50>
## <matplotlib.lines.Line2D object at 0x00000272A2186790>
Figura 5. Trayectorias del contrato ES=F bajo GBM (1,000 simulaciones, 16 trimestres). Las líneas verticales grises marcan los vencimientos trimestrales de roll-over. Elaboración propia. CME Group (2026); Hull (2018, cap. 15).
## === P&L Y MARGIN CALL TRIMESTRAL — POSICIÓN CORTA ===
## Trim. Año P&L corto promedio P&L percentil 5% P&L percentil 95% Margin Call prom. MC peor caso (99%)
## 1 1 $ -467,181 $ -2,943,835 $ 1,831,511 $ 1,324,433 $ 4,362,395
## 2 1 $ -488,001 $ -2,999,885 $ 1,871,113 $ 807,578 $ 4,227,411
## 3 1 $ -478,179 $ -3,204,525 $ 2,135,134 $ 737,438 $ 4,208,441
## 4 1 $ -480,955 $ -3,327,110 $ 2,121,926 $ 700,892 $ 4,536,387
## 5 2 $ -459,251 $ -3,392,227 $ 2,021,201 $ 685,974 $ 4,851,971
## 6 2 $ -589,343 $ -3,450,325 $ 2,024,931 $ 664,582 $ 4,599,031
## 7 2 $ -513,262 $ -3,690,922 $ 2,224,577 $ 670,937 $ 5,042,268
## 8 2 $ -429,243 $ -3,410,620 $ 2,384,801 $ 628,754 $ 5,413,377
## 9 3 $ -567,829 $ -3,888,380 $ 2,295,409 $ 686,206 $ 5,506,213
## 10 3 $ -533,962 $ -3,851,202 $ 2,566,117 $ 636,459 $ 5,120,867
## 11 3 $ -656,400 $ -4,193,177 $ 2,395,830 $ 698,811 $ 5,823,781
## 12 3 $ -617,985 $ -4,260,477 $ 2,501,548 $ 737,581 $ 5,863,460
## 13 4 $ -742,795 $ -4,422,388 $ 2,465,247 $ 808,102 $ 6,423,080
## 14 4 $ -556,775 $ -4,435,883 $ 2,915,601 $ 758,345 $ 5,755,200
## 15 4 $ -511,586 $ -4,359,041 $ 3,033,205 $ 741,443 $ 6,236,573
## 16 4 $ -621,582 $ -4,681,963 $ 2,889,183 $ 759,327 $ 6,441,554
## <BarContainer object of 16 artists>
## <matplotlib.collections.FillBetweenPolyCollection object at 0x000002729AC0A450>
## <matplotlib.lines.Line2D object at 0x000002729AE1CF90>
## Text(0.5, 1.0, 'P&L Promedio Trimestral — Roll-Over')
## Text(0.5, 0, 'Trimestre')
## Text(0, 0.5, 'P&L (USD)')
## <matplotlib.legend.Legend object at 0x000002729AFA5510>
## (array([1.01489306e-09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 2.02978611e-09,
## 1.01489306e-09, 0.00000000e+00, 1.01489306e-09, 0.00000000e+00,
## 1.01489306e-09, 1.01489306e-09, 2.02978611e-09, 1.01489306e-09,
## 2.02978611e-09, 3.04467917e-09, 4.05957222e-09, 1.01489306e-09,
## 2.02978611e-09, 4.05957222e-09, 2.02978611e-09, 6.08935833e-09,
## 4.05957222e-09, 4.05957222e-09, 7.10425139e-09, 9.13403750e-09,
## 1.62382889e-08, 1.11638236e-08, 7.10425139e-09, 1.21787167e-08,
## 1.72531819e-08, 1.72531819e-08, 2.43574333e-08, 2.63872194e-08,
## 3.04467917e-08, 3.75510430e-08, 2.43574333e-08, 4.16106153e-08,
## 2.84170055e-08, 3.04467917e-08, 3.65361500e-08, 5.48042250e-08,
## 3.75510430e-08, 5.48042250e-08, 5.37893319e-08, 4.66850805e-08,
## 4.66850805e-08, 4.76999736e-08, 4.05957222e-08, 4.16106153e-08,
## 3.95808291e-08, 3.14616847e-08, 3.75510430e-08, 2.43574333e-08,
## 1.21787167e-08, 7.10425139e-09, 1.11638236e-08, 7.10425139e-09]), array([-51471724.56963772, -50486399.07646799, -49501073.58329826,
## -48515748.09012853, -47530422.5969588 , -46545097.10378907,
## -45559771.61061934, -44574446.1174496 , -43589120.62427987,
## -42603795.13111015, -41618469.63794041, -40633144.14477068,
## -39647818.65160095, -38662493.15843122, -37677167.66526149,
## -36691842.17209175, -35706516.67892203, -34721191.18575229,
## -33735865.69258256, -32750540.19941283, -31765214.7062431 ,
## -30779889.21307337, -29794563.71990364, -28809238.22673391,
## -27823912.73356418, -26838587.24039445, -25853261.74722471,
## -24867936.25405498, -23882610.76088525, -22897285.26771552,
## -21911959.77454579, -20926634.28137606, -19941308.78820633,
## -18955983.2950366 , -17970657.80186687, -16985332.30869713,
## -16000006.8155274 , -15014681.32235767, -14029355.82918794,
## -13044030.33601821, -12058704.84284848, -11073379.34967875,
## -10088053.85650901, -9102728.36333928, -8117402.87016956,
## -7132077.37699983, -6146751.88383009, -5161426.39066036,
## -4176100.89749063, -3190775.4043209 , -2205449.91115117,
## -1220124.41798144, -234798.92481171, 750526.56835803,
## 1735852.06152776, 2721177.55469749, 3706503.04786722,
## 4691828.54103695, 5677154.03420668, 6662479.52737641,
## 7647805.02054615]), <BarContainer object of 60 artists>)
## (array([7.10425139e-09, 1.11638236e-08, 7.10425139e-09, 1.21787167e-08,
## 2.43574333e-08, 3.75510430e-08, 3.14616847e-08, 3.95808291e-08,
## 4.16106153e-08, 4.05957222e-08, 4.76999736e-08, 4.66850805e-08,
## 4.66850805e-08, 5.37893319e-08, 5.48042250e-08, 3.75510430e-08,
## 5.48042250e-08, 3.65361500e-08, 3.04467917e-08, 2.84170055e-08,
## 4.16106153e-08, 2.43574333e-08, 3.75510430e-08, 3.04467917e-08,
## 2.63872194e-08, 2.43574333e-08, 1.72531819e-08, 1.72531819e-08,
## 1.21787167e-08, 7.10425139e-09, 1.11638236e-08, 1.62382889e-08,
## 9.13403750e-09, 7.10425139e-09, 4.05957222e-09, 4.05957222e-09,
## 6.08935833e-09, 2.02978611e-09, 4.05957222e-09, 2.02978611e-09,
## 1.01489306e-09, 4.05957222e-09, 3.04467917e-09, 2.02978611e-09,
## 1.01489306e-09, 2.02978611e-09, 1.01489306e-09, 1.01489306e-09,
## 0.00000000e+00, 1.01489306e-09, 0.00000000e+00, 1.01489306e-09,
## 2.02978611e-09, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00,
## 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 1.01489306e-09]), array([-7647805.02054615, -6662479.52737642, -5677154.03420669,
## -4691828.54103696, -3706503.04786722, -2721177.55469749,
## -1735852.06152776, -750526.56835803, 234798.9248117 ,
## 1220124.41798143, 2205449.91115116, 3190775.40432089,
## 4176100.89749063, 5161426.39066036, 6146751.88383009,
## 7132077.37699982, 8117402.87016955, 9102728.36333928,
## 10088053.85650901, 11073379.34967874, 12058704.84284847,
## 13044030.3360182 , 14029355.82918793, 15014681.32235767,
## 16000006.8155274 , 16985332.30869713, 17970657.80186686,
## 18955983.29503659, 19941308.78820632, 20926634.28137605,
## 21911959.77454579, 22897285.26771551, 23882610.76088525,
## 24867936.25405498, 25853261.74722471, 26838587.24039444,
## 27823912.73356417, 28809238.2267339 , 29794563.71990363,
## 30779889.21307336, 31765214.70624309, 32750540.19941283,
## 33735865.69258256, 34721191.18575229, 35706516.67892202,
## 36691842.17209175, 37677167.66526148, 38662493.15843122,
## 39647818.65160095, 40633144.14477068, 41618469.63794041,
## 42603795.13111014, 43589120.62427987, 44574446.1174496 ,
## 45559771.61061934, 46545097.10378907, 47530422.59695879,
## 48515748.09012853, 49501073.58329826, 50486399.07646799,
## 51471724.56963772]), <BarContainer object of 60 artists>)
## <matplotlib.lines.Line2D object at 0x00000272A22F64D0>
## <matplotlib.lines.Line2D object at 0x00000272A2207E90>
## Text(0.5, 1.0, 'Distribución P&L Acumulado — 4 años')
## Text(0.5, 0, 'P&L (USD)')
## Text(0, 0.5, 'Densidad')
## <matplotlib.legend.Legend object at 0x00000272A2263250>
## P&L promedio acumulado — posición CORTA : $ -8,714,330
## P&L promedio acumulado — posición LARGA : $ 8,714,330
## Margin Call total promedio (4 años) : $ 12,046,860
Figura 6. P&L trimestral promedio de la posición corta con rango de incertidumbre P5–P95 (izquierda) y distribución del P&L acumulado a cuatro años para posición corta y larga (derecha). Elaboración propia. CME Group (2026); Hull (2018, cap. 2).
P&L de la cobertura. En un mercado con drift históricamente positivo el S&P 500 sube alrededor del 10% anual con dividendos, una posición corta en futuros pierde dinero en promedio. Eso no es un error del modelo: es el costo explícito de la cobertura. La posición corta no está diseñada para generar rentabilidad por sí sola; está para compensar las pérdidas del portafolio de acciones cuando el mercado cae. Cuando el mercado sube, el futuro corto pierde y el portafolio de acciones gana se compensan. Cuando el mercado cae, el futuro corto gana y amortigua las pérdidas. Esa es la mecánica básica.
Roll-over trimestral. Al vencimiento de cada contrato, se cierra la posición y se abre una nueva al precio vigente. En condiciones de contango precio futuro más caro que el spot, el inversor en posición corta se beneficia parcialmente porque el contrato nuevo está “más caro” que el que vence. En backwardation ocurre lo contrario. La diferencia se acumula a lo largo de los 16 trimestres y debe contabilizarse como parte del costo o beneficio total de la estrategia de roll-over.
Margin call y liquidez. La tabla muestra que el peor caso del 99% en un trimestre puede exigir aportes significativos al margen. El margin call no es una pérdida definitiva es una exigencia de liquidez: el capital se deposita y queda disponible cuando la posición se cierra favorablemente. Sin embargo, el fondo necesita tener esa reserva disponible en efectivo en todo momento, lo que tiene un costo de oportunidad real.
¿Corto o largo? Una posición exclusivamente larga en futuros amplificaría la exposición al mercado, no la cubriría. Es, en esencia, apalancamiento. En un mercado que sube, ganaría más, pero en una caída las pérdidas serían mayores que las del portafolio solo. La posición corta es la única coherente con el objetivo de protección.
\[VE_{cubierto} \approx V_P \times (1 + r_f^{trim}) \qquad r_f^{trim} = (1 + r_f)^{1/4} - 1\]
Una cobertura perfecta con futuros convierte el portafolio en un activo libre de riesgo durante el período cubierto (Hull, 2018, cap. 3). Tasa libre de riesgo trimestral: 1.092%.
## Escenario Valor esperado (USD) Δ vs capital inicial Volatilidad (USD) VaR 95% (USD)
## Sin cobertura $ 20,686,774 $ +686,774 $ 1,974,009 $ 2,429,940
## Con cobertura (posición corta futuros) $ 20,219,593 $ +219,593 $ 2,525,011 $ 3,861,678
## Valor teórico V_P × (1 + rf_trim) $ 20,218,397 $ +218,397 — —
##
## Reducción de volatilidad por cobertura: -27.9129%
## [<matplotlib.lines.Line2D object at 0x00000272A23EAF10>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x00000272A2434A50>
## [<matplotlib.lines.Line2D object at 0x00000272A24420D0>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x00000272A2455190>
## <matplotlib.lines.Line2D object at 0x00000272A22BDD50>
## <matplotlib.lines.Line2D object at 0x00000272A247D4D0>
## Text(0.5, 1.0, 'Distribución del Valor Trimestral del Portafolio — Con y Sin Cobertura')
## Text(0.5, 0, 'Valor del portafolio al vencimiento trimestral (USD)')
## Text(0, 0.5, 'Densidad de probabilidad')
## <matplotlib.legend.Legend object at 0x00000272A22A3790>
Figura 7. Distribución del valor trimestral del portafolio con y sin cobertura. La distribución azul es más estrecha, lo que refleja la reducción de riesgo que aporta la posición corta en futuros. La línea verde marca el valor teórico libre de riesgo. Elaboración propia. Hull (2018, cap. 3).
El valor esperado del portafolio cubierto debería acercarse a \(V_P \times (1 + r_f^{trim})\), que es el retorno que obtendría un inversor que simplemente pusiera su capital en un instrumento libre de riesgo por un trimestre. La diferencia entre lo calculado y ese valor teórico se explica por dos factores: el error de redondeo al convertir contratos fraccionarios en enteros, y el riesgo idiosincrático residual de NEE, UNP y PLD que los futuros del índice no pueden eliminar.
Lo más relevante de esta tabla no es el valor esperado en sí mismo, sino la reducción de volatilidad. El portafolio sin cobertura puede terminar el trimestre en un rango muy amplio de valores. Con la cobertura, ese rango se estrecha de manera importante: el peor escenario del 5% es materialmente menos costoso. Para una inversión institucional de $20M, esa reducción de incertidumbre vale más que cualquier cálculo de retorno esperado en valor promedio. El costo de esa certeza es el P&L negativo esperado del futuro corto en mercados alcistas —el precio del seguro.
## === ANÁLISIS DE SENSIBILIDAD: CONTRATOS SEGÚN BETA OBJETIVO ===
## β objetivo β actual Δ beta N* entero Posición VE (USD) Vol. (USD) VaR 95%
## 0.0 0.7987 -0.7987 -50 Corta — reduce exposición $ 21,153,955 $ 2,417,047 $ 2,816,269
## 0.8 0.7987 0.0013 0 Neutra $ 20,696,118 $ 1,972,881 $ 2,451,926
## 1.5 0.7987 0.7013 44 Larga — añade exposición $ 20,275,655 $ 2,417,560 $ 3,587,530
El análisis de sensibilidad hace explícita una decisión que a veces se trata como técnica pero que en realidad es estratégica: ¿qué nivel de exposición al mercado quiere mantener el inversor?
Con beta objetivo = 0.8 se venden menos contratos que en la cobertura total. El portafolio sigue expuesto al mercado, pero de forma moderada. Es una posición razonable para quien cree que el mercado tiene más probabilidad de subir que de caer en el horizonte de cobertura, y quiere participar parcialmente en ese movimiento. La reducción de volatilidad es menor, pero también lo es el costo de oportunidad.
Con beta objetivo = 1.5 se compran contratos adicionales es una posición larga neta en futuros sobre lo que ya tiene el portafolio de acciones. Eso no es cobertura: es apalancamiento. Amplifica los retornos en mercados alcistas, pero también amplifica las pérdidas en caídas, y el margin call en escenarios adversos puede ser devastador para la liquidez. Para un portafolio institucional con objetivos de largo plazo, esa estrategia no es coherente con el mandato de protección.
La TRM Tasa Representativa del Mercado mide el precio del dólar en pesos colombianos y es uno de los activos financieros más volátiles del mercado colombiano. En la última década acumuló una depreciación superior al 150% frente al dólar, con episodios muy marcados: la caída del petróleo en 2015–2016 llevó la TRM de $1,800 a $3,400, la pandemia de 2020 la empujó por encima de $4,200, y la incertidumbre política y fiscal de finales de 2022 la acercó a $5,000 en noviembre.
Factores que presionan al alza el dólar (deprecian el COP):
Proyecciones institucionales a 12 meses:
| Fuente | Escenario | TRM proyectada (Mar 2027) |
|---|---|---|
| Banco de la República (ene. 2026) | Base | $4,000 – $4,300 COP/USD |
| Bancolombia Research (feb. 2026) | Base | $4,150 COP/USD |
| Corficolombiana (mar. 2026) | Base | $4,200 COP/USD |
| Consenso de mercado | Pesimista (petróleo < $60) | $4,600+ COP/USD |
| Consenso de mercado | Optimista (Fed recorta agresivo) | $3,800 COP/USD |
Fuentes: Banco de la República, Informe de Política Monetaria, enero 2026; Bancolombia Research, Perspectivas Cambiarias, febrero 2026; Corficolombiana, Informe Semanal de Divisas, marzo 2026.
Dado que el escenario base implica una TRM entre $4,000 y $4,300 al momento de inicio de los forwards (año 6 de la inversión), y considerando una depreciación histórica del COP de alrededor del 4–6% anual, las cuotas del crédito en pesos podrían ser un 25–40% más costosas que a la TRM actual. Esa es exactamente la exposición que el forward de divisas busca mitigar.
## [<matplotlib.lines.Line2D object at 0x000002729AA4D150>]
## <matplotlib.lines.Line2D object at 0x00000272A239B2D0>
## <matplotlib.collections.FillBetweenPolyCollection object at 0x00000272A247E090>
## Text(0.5, 1.0, 'Evolución Histórica TRM USD/COP — 2016 a 2026')
## Text(0, 0.5, 'COP por 1 USD')
## <matplotlib.legend.Legend object at 0x000002729AFC8290>
## (array([ 0.25816074, 0. , 0. , 0.25816074, 0. ,
## 0. , 0. , 0. , 0.25816074, 0.25816074,
## 0.51632148, 0.51632148, 1.03264296, 1.2908037 , 1.2908037 ,
## 3.35608962, 5.42137555, 6.71217925, 6.19585777, 10.32642961,
## 15.48964442, 21.42734145, 19.87837701, 23.75078811, 24.00894885,
## 24.52527033, 34.59353921, 40.2730755 , 44.40364734, 56.02088066,
## 63.76570287, 33.30273551, 38.72411106, 31.75377107, 30.20480662,
## 20.65285923, 21.42734145, 17.2967696 , 15.23148368, 11.10091184,
## 6.97033999, 6.45401851, 5.93769703, 6.45401851, 2.83976814,
## 2.83976814, 1.54896444, 1.80712518, 1.80712518, 2.06528592,
## 1.54896444, 0.25816074, 0.77448222, 0.77448222, 0.25816074,
## 0.25816074, 0.51632148, 0.25816074, 0.51632148, 0. ,
## 0. , 0. , 0.25816074, 0.51632148, 0. ,
## 0.25816074, 0. , 0. , 0. , 0.25816074,
## 0. , 0. , 0. , 0. , 0. ,
## 0. , 0. , 0. , 0.25816074, 0.25816074]), array([-4.47814067e-02, -4.32915776e-02, -4.18017485e-02, -4.03119194e-02,
## -3.88220903e-02, -3.73322612e-02, -3.58424321e-02, -3.43526030e-02,
## -3.28627739e-02, -3.13729448e-02, -2.98831157e-02, -2.83932866e-02,
## -2.69034575e-02, -2.54136284e-02, -2.39237993e-02, -2.24339702e-02,
## -2.09441411e-02, -1.94543120e-02, -1.79644829e-02, -1.64746538e-02,
## -1.49848247e-02, -1.34949955e-02, -1.20051664e-02, -1.05153373e-02,
## -9.02550824e-03, -7.53567913e-03, -6.04585003e-03, -4.55602092e-03,
## -3.06619182e-03, -1.57636271e-03, -8.65336090e-05, 1.40329550e-03,
## 2.89312460e-03, 4.38295370e-03, 5.87278281e-03, 7.36261191e-03,
## 8.85244102e-03, 1.03422701e-02, 1.18320992e-02, 1.33219283e-02,
## 1.48117574e-02, 1.63015865e-02, 1.77914156e-02, 1.92812447e-02,
## 2.07710739e-02, 2.22609030e-02, 2.37507321e-02, 2.52405612e-02,
## 2.67303903e-02, 2.82202194e-02, 2.97100485e-02, 3.11998776e-02,
## 3.26897067e-02, 3.41795358e-02, 3.56693649e-02, 3.71591940e-02,
## 3.86490231e-02, 4.01388522e-02, 4.16286813e-02, 4.31185104e-02,
## 4.46083395e-02, 4.60981686e-02, 4.75879977e-02, 4.90778268e-02,
## 5.05676559e-02, 5.20574850e-02, 5.35473141e-02, 5.50371433e-02,
## 5.65269724e-02, 5.80168015e-02, 5.95066306e-02, 6.09964597e-02,
## 6.24862888e-02, 6.39761179e-02, 6.54659470e-02, 6.69557761e-02,
## 6.84456052e-02, 6.99354343e-02, 7.14252634e-02, 7.29150925e-02,
## 7.44049216e-02]), <BarContainer object of 80 artists>)
## [<matplotlib.lines.Line2D object at 0x00000272A20A73D0>]
## Text(0.5, 1.0, 'Distribución de Retornos Diarios TRM')
## Text(0.5, 0, 'Retorno logarítmico diario')
## Text(0, 0.5, 'Densidad')
## <matplotlib.legend.Legend object at 0x00000272A23CF490>
## TRM spot al 2026-03-27: 3,687.34 COP/USD
## Curtosis de exceso retornos diarios: 3.5781 (>0 = colas mas pesadas)
## Asimetria: 0.7722
Figura 8. Evolución histórica de la TRM (arriba) y distribución de retornos diarios con comparación frente a la distribución normal teórica (abajo). La curtosis positiva confirma la presencia de colas más pesadas. Datos: Yahoo Finance (USDCOP=X, 2016–2026). Elaboración propia.
La curtosis positiva en los retornos de la TRM confirma algo que el historial deja claro: el peso colombiano no sigue una distribución normal. Los eventos extremos —depreciaciones del 20–30% en semanas— ocurren con más frecuencia de lo que la normal predice. Eso tiene una implicación práctica directa: la distribución normal subestimaría el riesgo cambiario en los percentiles extremos, que son exactamente los escenarios que la cobertura necesita proteger. Es la razón por la que se complementa la simulación normal con una distribución t-Student calibrada con datos históricos.
El crédito seleccionado es el Wells Fargo SBA 504 Loan para equipos industriales, a tasa fija de 6.95% efectivo anual a diez años. Las tasas SBA 504 en el primer trimestre de 2026 se ubican entre el 6.7% y el 7.5% para préstamos de equipo a diez años. Se usa 6.95% como tasa representativa para un prestatario calificado.
Fuentes: GoSBA Loans, “SBA Loan Rates Today”, 13 de marzo de 2026; NerdWallet, “SBA Loan Rates May 2026”; Wells Fargo SBA Lending, https://www.wellsfargo.com/biz/sba/
Sistema francés — cuota mensual constante: \[C = PV \times \frac{i}{1-(1+i)^{-n}}\] donde \(PV\) = monto financiado (90% del activo), \(i\) = tasa mensual efectiva, \(n = 120\) meses.
## === PARÁMETROS DEL CRÉDITO — WELLS FARGO SBA 504 ===
## TRM spot utilizada : 3,687.34 COP/USD
## Valor maquinaria en USD : $ 94,919.37
## Pago inicial (10%) : $ 9,491.94
## Monto financiado (90%) : $ 85,427.43
## Tasa mensual efectiva : 0.561498%
## Cuota mensual (constante) : $ 980.39
## Total pagado (120 cuotas) : $ 117,646.41
## Total intereses pagados : $ 32,218.98
## <BarContainer object of 10 artists>
## <BarContainer object of 10 artists>
## Text(0.5, 1.0, 'Composición Anual de la Cuota — Sistema Francés (USD)')
## Text(0.5, 0, 'Año')
## Text(0, 0.5, 'USD')
## <matplotlib.legend.Legend object at 0x00000272A23A5510>
## [<matplotlib.lines.Line2D object at 0x00000272A21916D0>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x000002729ADC7D50>
## Text(0.5, 1.0, 'Evolución del Saldo del Crédito (USD)')
## Text(0.5, 0, 'Mes')
## Text(0, 0.5, 'Saldo pendiente (USD)')
Figura 9. Composición anual de la cuota (capital vs intereses) y evolución del saldo del crédito. El crecimiento de la porción de capital y la reducción del saldo son las características definitorias del sistema francés. Elaboración propia. SBA (2026); Wells Fargo (2026).
La cuota constante es la característica central del sistema francés. Al inicio del crédito, la mayor parte de cada cuota corresponde a intereses —el saldo es alto y los intereses se calculan sobre ese saldo. Con el tiempo, conforme el capital se va pagando, la porción de intereses disminuye y la porción de amortización aumenta. El saldo total cae de forma acelerada hacia el final del crédito. Esto tiene una implicación importante para la cobertura: los años 6 a 9, cuando se activan los forwards, corresponden al período en que el saldo todavía es relevante (se supera el punto de inflexión alrededor del año 7–8), lo que justifica cubrir precisamente ese período.
## === COMPARACIÓN — CRÉDITO EN USD vs CRÉDITO EQUIVALENTE EN COP ===
## Concepto Crédito USD → COP (TRM fija) Crédito equivalente en COP
## Cuota mensual COP 3,615,020 COP 4,653,316
## Total pagado (120 cuotas) COP 433,802,342 COP 558,397,878
## Total intereses COP 118,802,342 COP 243,397,878
## Diferencia / Ahorro vs COP directo — COP +124,595,537
La diferencia de tasas —6.95% en dólares vs 13.5% en pesos genera un ahorro financiero muy significativo en términos de costo del capital, asumiendo TRM estable. El problema es que la TRM no es estable: en diez años, el COP puede acumular una depreciación importante que encarece cada cuota en pesos por encima de la TRM actual. Si la TRM sube de $3,960 a $4,800 a lo largo de los diez años algo completamente plausible según las proyecciones institucionales, el costo total del crédito en pesos supera al equivalente colombiano, revirtiendo completamente el beneficio de la tasa más baja. Esa vulnerabilidad es el argumento central que justifica la cobertura cambiaria.
Movimiento Geométrico Browniano mensual: \[S_t = S_{t-1} \cdot \exp\!\left[\left(\mu - \tfrac{\sigma^2}{2}\right)dt + \sigma\sqrt{dt}\,Z_t\right]\]
## TRM spot (S₀) : 3,687.34 COP/USD
## Retorno mensual promedio (μ) : 0.00172189 (2.0663% anualizado)
## Desv. estándar mensual (σ) : 0.03680035 (12.7480% anualizada)
## Grados de libertad MLE (df) : 14.5232 (df < 30 → colas pesadas)
## === ANÁLISIS DE COLAS — TRM al mes 120 (COP/USD) ===
## Distribución TRM media mes 120 Percentil 1% Percentil 99% Mínimo Máximo
## Normal 4,557 1,690 10,531 1,216 16,899
## t-Student (df = 14.5) 4,499 1,545 9,846 1,182 17,026
## [<matplotlib.lines.Line2D object at 0x000002729ADD2AD0>, <matplotlib.lines.Line2D object at 0x000002729ADFAD50>, <matplotlib.lines.Line2D object at 0x000002729ADF7610>, <matplotlib.lines.Line2D object at 0x000002729AEBC650>, <matplotlib.lines.Line2D object at 0x000002729AE26610>, <matplotlib.lines.Line2D object at 0x000002729AEBD2D0>, <matplotlib.lines.Line2D object at 0x000002729AEBF910>, <matplotlib.lines.Line2D object at 0x000002729AD74950>, <matplotlib.lines.Line2D object at 0x000002729AEBDFD0>, <matplotlib.lines.Line2D object at 0x000002729ACF50D0>, <matplotlib.lines.Line2D object at 0x000002729AF3C450>, <matplotlib.lines.Line2D object at 0x000002729AEC6F10>, <matplotlib.lines.Line2D object at 0x000002729AEBCCD0>, <matplotlib.lines.Line2D object at 0x000002729AF02910>, <matplotlib.lines.Line2D object at 0x000002729AC98F50>, <matplotlib.lines.Line2D object at 0x000002729ADBB190>, <matplotlib.lines.Line2D object at 0x000002729AD05AD0>, <matplotlib.lines.Line2D object at 0x000002729AE271D0>, <matplotlib.lines.Line2D object at 0x000002729AD04D50>, <matplotlib.lines.Line2D object at 0x000002729AD4CED0>, <matplotlib.lines.Line2D object at 0x000002729AD06E90>, <matplotlib.lines.Line2D object at 0x000002729AD05450>, <matplotlib.lines.Line2D object at 0x000002729AD04F90>, <matplotlib.lines.Line2D object at 0x000002729AD05610>, <matplotlib.lines.Line2D object at 0x000002729ADBFA10>, <matplotlib.lines.Line2D object at 0x000002729AD46F50>, <matplotlib.lines.Line2D object at 0x000002729AD06C90>, <matplotlib.lines.Line2D object at 0x000002729AD2B1D0>, <matplotlib.lines.Line2D object at 0x000002729AEA3A50>, <matplotlib.lines.Line2D object at 0x00000272A20EB810>, <matplotlib.lines.Line2D object at 0x000002729AEA2B90>, <matplotlib.lines.Line2D object at 0x000002729AED1C50>, <matplotlib.lines.Line2D object at 0x000002729AEA2290>, <matplotlib.lines.Line2D object at 0x000002729AEA0F90>, <matplotlib.lines.Line2D object at 0x000002729ADD1890>, <matplotlib.lines.Line2D object at 0x000002729AFEB610>, <matplotlib.lines.Line2D object at 0x000002729ADA3290>, <matplotlib.lines.Line2D object at 0x000002729AD4E5D0>, <matplotlib.lines.Line2D object at 0x000002729AE006D0>, <matplotlib.lines.Line2D object at 0x000002729AE03750>, <matplotlib.lines.Line2D object at 0x000002729AE02850>, <matplotlib.lines.Line2D object at 0x000002729AE03FD0>, <matplotlib.lines.Line2D object at 0x000002729AE10D90>, <matplotlib.lines.Line2D object at 0x00000272A2442A10>, <matplotlib.lines.Line2D object at 0x000002729AE00B10>, <matplotlib.lines.Line2D object at 0x000002729AE02590>, <matplotlib.lines.Line2D object at 0x000002729AEA3810>, <matplotlib.lines.Line2D object at 0x000002729AE02ED0>, <matplotlib.lines.Line2D object at 0x000002729AE03D90>, <matplotlib.lines.Line2D object at 0x000002729AE00F50>, <matplotlib.lines.Line2D object at 0x00000272A2465410>, <matplotlib.lines.Line2D object at 0x000002729AE1E590>, <matplotlib.lines.Line2D object at 0x000002729ADDAB10>, <matplotlib.lines.Line2D object at 0x000002729ACD4F50>, <matplotlib.lines.Line2D object at 0x000002729AD05890>, <matplotlib.lines.Line2D object at 0x000002729ACD5F50>, <matplotlib.lines.Line2D object at 0x000002729AD071D0>, <matplotlib.lines.Line2D object at 0x000002729AEECC10>, <matplotlib.lines.Line2D object at 0x000002729AE27310>, <matplotlib.lines.Line2D object at 0x000002729ACD5610>, <matplotlib.lines.Line2D object at 0x000002729AD9EBD0>, <matplotlib.lines.Line2D object at 0x000002729ACD7990>, <matplotlib.lines.Line2D object at 0x000002729ACD5490>, <matplotlib.lines.Line2D object at 0x000002729AEB4B50>, <matplotlib.lines.Line2D object at 0x000002729ADF52D0>, <matplotlib.lines.Line2D object at 0x000002729AEB7210>, <matplotlib.lines.Line2D object at 0x000002729AEB6F90>, <matplotlib.lines.Line2D object at 0x000002729ACE48D0>, <matplotlib.lines.Line2D object at 0x000002729AEB7F50>, <matplotlib.lines.Line2D object at 0x000002729AEB5650>, <matplotlib.lines.Line2D object at 0x000002729AEB77D0>, <matplotlib.lines.Line2D object at 0x000002729AEB5710>, <matplotlib.lines.Line2D object at 0x000002729AEB4410>, <matplotlib.lines.Line2D object at 0x000002729AEB4F90>, <matplotlib.lines.Line2D object at 0x000002729AEB55D0>, <matplotlib.lines.Line2D object at 0x000002729AEB47D0>, <matplotlib.lines.Line2D object at 0x000002729AD7FCD0>, <matplotlib.lines.Line2D object at 0x000002729AE12E90>, <matplotlib.lines.Line2D object at 0x000002729AF03910>, <matplotlib.lines.Line2D object at 0x000002729AE01D50>, <matplotlib.lines.Line2D object at 0x000002729AEE1310>, <matplotlib.lines.Line2D object at 0x000002729AEE2B90>, <matplotlib.lines.Line2D object at 0x000002729ACF5E50>, <matplotlib.lines.Line2D object at 0x000002729AE936D0>, <matplotlib.lines.Line2D object at 0x000002729AEE2490>, <matplotlib.lines.Line2D object at 0x000002729AF7DD50>, <matplotlib.lines.Line2D object at 0x000002729AED0390>, <matplotlib.lines.Line2D object at 0x000002729AEE32D0>, <matplotlib.lines.Line2D object at 0x000002729AEE1290>, <matplotlib.lines.Line2D object at 0x000002729AEE09D0>, <matplotlib.lines.Line2D object at 0x000002729AEE0610>, <matplotlib.lines.Line2D object at 0x000002729AED4550>, <matplotlib.lines.Line2D object at 0x000002729AD47ED0>, <matplotlib.lines.Line2D object at 0x000002729AC5C310>, <matplotlib.lines.Line2D object at 0x000002729ABB8550>, <matplotlib.lines.Line2D object at 0x000002729ABBB190>, <matplotlib.lines.Line2D object at 0x000002729AD6EF10>, <matplotlib.lines.Line2D object at 0x000002729AB96650>, <matplotlib.lines.Line2D object at 0x000002729AD4A6D0>, <matplotlib.lines.Line2D object at 0x000002729ABCF3D0>, <matplotlib.lines.Line2D object at 0x000002729AE68050>, <matplotlib.lines.Line2D object at 0x000002729ACD6590>, <matplotlib.lines.Line2D object at 0x000002729AC09210>, <matplotlib.lines.Line2D object at 0x00000272A2473190>, <matplotlib.lines.Line2D object at 0x000002729AEF2AD0>, <matplotlib.lines.Line2D object at 0x000002729ACF6210>, <matplotlib.lines.Line2D object at 0x000002729AEF1C50>, <matplotlib.lines.Line2D object at 0x000002729ADF9290>, <matplotlib.lines.Line2D object at 0x000002729AED3B10>, <matplotlib.lines.Line2D object at 0x000002729AD4D050>, <matplotlib.lines.Line2D object at 0x000002729AE1EC50>, <matplotlib.lines.Line2D object at 0x000002729AF00850>, <matplotlib.lines.Line2D object at 0x000002729AD2BA10>, <matplotlib.lines.Line2D object at 0x000002729AEE83D0>, <matplotlib.lines.Line2D object at 0x000002729AEB6D50>, <matplotlib.lines.Line2D object at 0x000002729AE25C90>, <matplotlib.lines.Line2D object at 0x000002729AED7FD0>, <matplotlib.lines.Line2D object at 0x000002729ACA4F90>, <matplotlib.lines.Line2D object at 0x000002729ACA7F50>, <matplotlib.lines.Line2D object at 0x000002729AC4B650>, <matplotlib.lines.Line2D object at 0x000002729AECBF10>, <matplotlib.lines.Line2D object at 0x000002729AE020D0>, <matplotlib.lines.Line2D object at 0x000002729AC4A990>, <matplotlib.lines.Line2D object at 0x000002729AC4A790>, <matplotlib.lines.Line2D object at 0x000002729ABF3C90>, <matplotlib.lines.Line2D object at 0x000002729AD6C590>, <matplotlib.lines.Line2D object at 0x000002729AEC4290>, <matplotlib.lines.Line2D object at 0x000002729AC2EA90>, <matplotlib.lines.Line2D object at 0x000002729AEB48D0>, <matplotlib.lines.Line2D object at 0x000002729AEB5CD0>, <matplotlib.lines.Line2D object at 0x000002729ACD6BD0>, <matplotlib.lines.Line2D object at 0x000002729ACD4510>, <matplotlib.lines.Line2D object at 0x000002729ACB5490>, <matplotlib.lines.Line2D object at 0x000002729ACD60D0>, <matplotlib.lines.Line2D object at 0x000002729ACB5F90>, <matplotlib.lines.Line2D object at 0x000002729ACB6110>, <matplotlib.lines.Line2D object at 0x000002729ACB6710>, <matplotlib.lines.Line2D object at 0x000002729AC66410>, <matplotlib.lines.Line2D object at 0x000002729AECB610>, <matplotlib.lines.Line2D object at 0x000002729AEEAED0>, <matplotlib.lines.Line2D object at 0x000002729ADCB910>, <matplotlib.lines.Line2D object at 0x000002729AEE1490>, <matplotlib.lines.Line2D object at 0x000002729AE68D90>, <matplotlib.lines.Line2D object at 0x000002729AC5B5D0>, <matplotlib.lines.Line2D object at 0x000002729ACBD4D0>, <matplotlib.lines.Line2D object at 0x000002729AE74050>, <matplotlib.lines.Line2D object at 0x000002729ACBE710>, <matplotlib.lines.Line2D object at 0x000002729ACBCF90>, <matplotlib.lines.Line2D object at 0x000002729ACBE210>, <matplotlib.lines.Line2D object at 0x000002729AEE0C10>, <matplotlib.lines.Line2D object at 0x000002729AE00490>, <matplotlib.lines.Line2D object at 0x000002729AEB7990>, <matplotlib.lines.Line2D object at 0x000002729AEEF510>, <matplotlib.lines.Line2D object at 0x000002729AEE1390>, <matplotlib.lines.Line2D object at 0x000002729ACA3650>, <matplotlib.lines.Line2D object at 0x000002729ACD12D0>, <matplotlib.lines.Line2D object at 0x000002729AD3A050>, <matplotlib.lines.Line2D object at 0x000002729AEA31D0>, <matplotlib.lines.Line2D object at 0x000002729AF28750>, <matplotlib.lines.Line2D object at 0x000002729AC99550>, <matplotlib.lines.Line2D object at 0x000002729AE13890>, <matplotlib.lines.Line2D object at 0x000002729AC9A150>, <matplotlib.lines.Line2D object at 0x000002729AEF1190>, <matplotlib.lines.Line2D object at 0x000002729AD04250>, <matplotlib.lines.Line2D object at 0x000002729ACD2C90>, <matplotlib.lines.Line2D object at 0x000002729AD08910>, <matplotlib.lines.Line2D object at 0x000002729AD06F50>, <matplotlib.lines.Line2D object at 0x000002729AE76110>, <matplotlib.lines.Line2D object at 0x000002729AC3EDD0>, <matplotlib.lines.Line2D object at 0x000002729AC3E9D0>, <matplotlib.lines.Line2D object at 0x000002729AD04090>, <matplotlib.lines.Line2D object at 0x000002729AC8F690>, <matplotlib.lines.Line2D object at 0x000002729ABD63D0>, <matplotlib.lines.Line2D object at 0x000002729AC4B2D0>, <matplotlib.lines.Line2D object at 0x000002729ABB8A90>, <matplotlib.lines.Line2D object at 0x0000027288740E90>, <matplotlib.lines.Line2D object at 0x000002729AC27510>, <matplotlib.lines.Line2D object at 0x000002729AE74C90>, <matplotlib.lines.Line2D object at 0x000002729AE1C790>, <matplotlib.lines.Line2D object at 0x000002729AEBC450>, <matplotlib.lines.Line2D object at 0x000002729ABCF350>, <matplotlib.lines.Line2D object at 0x000002729AD06990>, <matplotlib.lines.Line2D object at 0x000002729AEB64D0>, <matplotlib.lines.Line2D object at 0x000002729AB0EE90>, <matplotlib.lines.Line2D object at 0x000002729AB0D650>, <matplotlib.lines.Line2D object at 0x000002729ABCE390>, <matplotlib.lines.Line2D object at 0x000002729AEC9690>, <matplotlib.lines.Line2D object at 0x000002729AB0C210>, <matplotlib.lines.Line2D object at 0x000002729AEE3CD0>, <matplotlib.lines.Line2D object at 0x000002729AB6BED0>, <matplotlib.lines.Line2D object at 0x000002729AB6A710>, <matplotlib.lines.Line2D object at 0x000002729AEE2D10>, <matplotlib.lines.Line2D object at 0x000002729AEF03D0>, <matplotlib.lines.Line2D object at 0x000002729ADA0950>, <matplotlib.lines.Line2D object at 0x000002729AD4B550>, <matplotlib.lines.Line2D object at 0x000002729AB13910>, <matplotlib.lines.Line2D object at 0x000002729AC5AED0>, <matplotlib.lines.Line2D object at 0x000002729AE699D0>, <matplotlib.lines.Line2D object at 0x000002729AEE3E90>, <matplotlib.lines.Line2D object at 0x000002729AB116D0>]
## [<matplotlib.lines.Line2D object at 0x000002729A9C85D0>]
## <matplotlib.lines.Line2D object at 0x000002729AB13E90>
## <matplotlib.lines.Line2D object at 0x000002729ADBB050>
## <matplotlib.lines.Line2D object at 0x000002729AB12450>
## Text(62, 1228.651969194253, 'Inicio\ncob.\n(año 6)')
## Text(0.5, 1.0, 'GBM Normal — 1000 simulaciones')
## Text(0.5, 0, 'Mes')
## Text(0, 0.5, 'USD/COP')
## <matplotlib.legend.Legend object at 0x000002729AE74990>
## [<matplotlib.lines.Line2D object at 0x000002729AB12890>, <matplotlib.lines.Line2D object at 0x000002729AAEDC50>, <matplotlib.lines.Line2D object at 0x000002729AB0CED0>, <matplotlib.lines.Line2D object at 0x000002729AC4F3D0>, <matplotlib.lines.Line2D object at 0x000002729AB97750>, <matplotlib.lines.Line2D object at 0x000002729AA15DD0>, <matplotlib.lines.Line2D object at 0x000002729AEBC810>, <matplotlib.lines.Line2D object at 0x000002729AA144D0>, <matplotlib.lines.Line2D object at 0x000002729AA15C50>, <matplotlib.lines.Line2D object at 0x000002729AA15ED0>, <matplotlib.lines.Line2D object at 0x000002729AB0C150>, <matplotlib.lines.Line2D object at 0x000002729AB0E890>, <matplotlib.lines.Line2D object at 0x000002729AE761D0>, <matplotlib.lines.Line2D object at 0x000002729AB0CC90>, <matplotlib.lines.Line2D object at 0x000002729AA957D0>, <matplotlib.lines.Line2D object at 0x000002729AB0E050>, <matplotlib.lines.Line2D object at 0x000002729ACE4910>, <matplotlib.lines.Line2D object at 0x000002729AE261D0>, <matplotlib.lines.Line2D object at 0x000002729AD05990>, <matplotlib.lines.Line2D object at 0x000002729AA15750>, <matplotlib.lines.Line2D object at 0x000002729AA94150>, <matplotlib.lines.Line2D object at 0x000002729AA956D0>, <matplotlib.lines.Line2D object at 0x000002729AB95F10>, <matplotlib.lines.Line2D object at 0x000002729ACB5A50>, <matplotlib.lines.Line2D object at 0x000002729AA14ED0>, <matplotlib.lines.Line2D object at 0x000002729A936150>, <matplotlib.lines.Line2D object at 0x000002729A925C50>, <matplotlib.lines.Line2D object at 0x000002729A927A50>, <matplotlib.lines.Line2D object at 0x000002729A9263D0>, <matplotlib.lines.Line2D object at 0x000002729AEBDE90>, <matplotlib.lines.Line2D object at 0x000002729A925F50>, <matplotlib.lines.Line2D object at 0x000002729AD6C690>, <matplotlib.lines.Line2D object at 0x000002729ACA46D0>, <matplotlib.lines.Line2D object at 0x000002729A935790>, <matplotlib.lines.Line2D object at 0x000002729AC2C290>, <matplotlib.lines.Line2D object at 0x000002729A927C50>, <matplotlib.lines.Line2D object at 0x000002729ACB48D0>, <matplotlib.lines.Line2D object at 0x000002729AA59490>, <matplotlib.lines.Line2D object at 0x000002729A5DD4D0>, <matplotlib.lines.Line2D object at 0x000002729AFD3B90>, <matplotlib.lines.Line2D object at 0x000002729A87AE90>, <matplotlib.lines.Line2D object at 0x000002729ADDBC50>, <matplotlib.lines.Line2D object at 0x000002729AD6C0D0>, <matplotlib.lines.Line2D object at 0x000002729A87A190>, <matplotlib.lines.Line2D object at 0x00000272A2186510>, <matplotlib.lines.Line2D object at 0x000002729ADD8690>, <matplotlib.lines.Line2D object at 0x000002729AA35E10>, <matplotlib.lines.Line2D object at 0x000002729AA37450>, <matplotlib.lines.Line2D object at 0x000002729AEBF090>, <matplotlib.lines.Line2D object at 0x000002729A9368D0>, <matplotlib.lines.Line2D object at 0x000002729AA35450>, <matplotlib.lines.Line2D object at 0x000002729AA36510>, <matplotlib.lines.Line2D object at 0x000002729AF14150>, <matplotlib.lines.Line2D object at 0x000002729AEBEF10>, <matplotlib.lines.Line2D object at 0x000002729AEC7B50>, <matplotlib.lines.Line2D object at 0x000002729A8EDF90>, <matplotlib.lines.Line2D object at 0x000002729AD05D50>, <matplotlib.lines.Line2D object at 0x000002729A936BD0>, <matplotlib.lines.Line2D object at 0x000002729A8ED650>, <matplotlib.lines.Line2D object at 0x000002729AB11B90>, <matplotlib.lines.Line2D object at 0x000002729AB0B550>, <matplotlib.lines.Line2D object at 0x000002729A879390>, <matplotlib.lines.Line2D object at 0x000002729AEE2B50>, <matplotlib.lines.Line2D object at 0x000002729AEE2950>, <matplotlib.lines.Line2D object at 0x000002729AB09250>, <matplotlib.lines.Line2D object at 0x000002729AEC9010>, <matplotlib.lines.Line2D object at 0x000002729AB0A390>, <matplotlib.lines.Line2D object at 0x000002729AE03290>, <matplotlib.lines.Line2D object at 0x000002729AB09090>, <matplotlib.lines.Line2D object at 0x000002729A87A890>, <matplotlib.lines.Line2D object at 0x000002729AB0BF10>, <matplotlib.lines.Line2D object at 0x000002729AB09490>, <matplotlib.lines.Line2D object at 0x000002729AE02750>, <matplotlib.lines.Line2D object at 0x000002729AEA1BD0>, <matplotlib.lines.Line2D object at 0x000002729ACD27D0>, <matplotlib.lines.Line2D object at 0x000002729A9E1D10>, <matplotlib.lines.Line2D object at 0x000002729A898FD0>, <matplotlib.lines.Line2D object at 0x000002729AC98890>, <matplotlib.lines.Line2D object at 0x000002729ACD1550>, <matplotlib.lines.Line2D object at 0x000002729AEF3190>, <matplotlib.lines.Line2D object at 0x000002729AEA2350>, <matplotlib.lines.Line2D object at 0x000002729A9E32D0>, <matplotlib.lines.Line2D object at 0x000002729A9E3F10>, <matplotlib.lines.Line2D object at 0x000002729A9E3510>, <matplotlib.lines.Line2D object at 0x000002729AA173D0>, <matplotlib.lines.Line2D object at 0x000002729A5DC8D0>, <matplotlib.lines.Line2D object at 0x000002729AEBF890>, <matplotlib.lines.Line2D object at 0x000002729A926610>, <matplotlib.lines.Line2D object at 0x000002729ACD50D0>, <matplotlib.lines.Line2D object at 0x000002729AB0DD90>, <matplotlib.lines.Line2D object at 0x000002729A88F450>, <matplotlib.lines.Line2D object at 0x000002729AA66690>, <matplotlib.lines.Line2D object at 0x000002729A9E1E10>, <matplotlib.lines.Line2D object at 0x000002729A8FB6D0>, <matplotlib.lines.Line2D object at 0x000002729A8FA190>, <matplotlib.lines.Line2D object at 0x000002729AA36650>, <matplotlib.lines.Line2D object at 0x000002729A8F8490>, <matplotlib.lines.Line2D object at 0x00000272A21B48D0>, <matplotlib.lines.Line2D object at 0x000002729AFD63D0>, <matplotlib.lines.Line2D object at 0x000002729ACD5D10>, <matplotlib.lines.Line2D object at 0x000002729A354610>, <matplotlib.lines.Line2D object at 0x000002729A935A50>, <matplotlib.lines.Line2D object at 0x000002729AB24090>, <matplotlib.lines.Line2D object at 0x000002729AA44090>, <matplotlib.lines.Line2D object at 0x000002729AC8C250>, <matplotlib.lines.Line2D object at 0x000002729A936250>, <matplotlib.lines.Line2D object at 0x000002729AAAF010>, <matplotlib.lines.Line2D object at 0x000002729A925F10>, <matplotlib.lines.Line2D object at 0x000002729AA37090>, <matplotlib.lines.Line2D object at 0x000002729ACBC390>, <matplotlib.lines.Line2D object at 0x000002729AAADBD0>, <matplotlib.lines.Line2D object at 0x000002729A963D90>, <matplotlib.lines.Line2D object at 0x000002729A9E3190>, <matplotlib.lines.Line2D object at 0x000002729A31A150>, <matplotlib.lines.Line2D object at 0x000002729AEF1290>, <matplotlib.lines.Line2D object at 0x000002729ACD3250>, <matplotlib.lines.Line2D object at 0x000002729AB0AB50>, <matplotlib.lines.Line2D object at 0x000002729A9A1F50>, <matplotlib.lines.Line2D object at 0x000002729A9A0AD0>, <matplotlib.lines.Line2D object at 0x000002729ACD15D0>, <matplotlib.lines.Line2D object at 0x000002729A9A0210>, <matplotlib.lines.Line2D object at 0x000002729AEF3810>, <matplotlib.lines.Line2D object at 0x000002729A9A1310>, <matplotlib.lines.Line2D object at 0x000002729A9A0B90>, <matplotlib.lines.Line2D object at 0x000002729A8F9610>, <matplotlib.lines.Line2D object at 0x000002729A9E27D0>, <matplotlib.lines.Line2D object at 0x000002729A9A2410>, <matplotlib.lines.Line2D object at 0x000002729AAB0F10>, <matplotlib.lines.Line2D object at 0x000002729A9E3C50>, <matplotlib.lines.Line2D object at 0x000002729AEF0390>, <matplotlib.lines.Line2D object at 0x000002729ADC9150>, <matplotlib.lines.Line2D object at 0x000002729AB0B290>, <matplotlib.lines.Line2D object at 0x000002729AA28A50>, <matplotlib.lines.Line2D object at 0x000002729ACD19D0>, <matplotlib.lines.Line2D object at 0x000002729AA2A750>, <matplotlib.lines.Line2D object at 0x000002729AA2A490>, <matplotlib.lines.Line2D object at 0x000002729A9A1A10>, <matplotlib.lines.Line2D object at 0x000002729AEE0450>, <matplotlib.lines.Line2D object at 0x000002729AAB23D0>, <matplotlib.lines.Line2D object at 0x000002729AA2A110>, <matplotlib.lines.Line2D object at 0x000002729AB0A950>, <matplotlib.lines.Line2D object at 0x000002729A8B7E50>, <matplotlib.lines.Line2D object at 0x000002729A924690>, <matplotlib.lines.Line2D object at 0x000002729AA2A550>, <matplotlib.lines.Line2D object at 0x000002729AB09390>, <matplotlib.lines.Line2D object at 0x000002729A9A3110>, <matplotlib.lines.Line2D object at 0x000002729AA29A10>, <matplotlib.lines.Line2D object at 0x000002729AA93A90>, <matplotlib.lines.Line2D object at 0x000002729AA93210>, <matplotlib.lines.Line2D object at 0x000002729A5E1410>, <matplotlib.lines.Line2D object at 0x000002729A5E3890>, <matplotlib.lines.Line2D object at 0x000002729ADD3C10>, <matplotlib.lines.Line2D object at 0x000002729AA45D10>, <matplotlib.lines.Line2D object at 0x000002729A936190>, <matplotlib.lines.Line2D object at 0x000002729AA66610>, <matplotlib.lines.Line2D object at 0x000002729AAAEAD0>, <matplotlib.lines.Line2D object at 0x000002729AA96F50>, <matplotlib.lines.Line2D object at 0x000002729A927410>, <matplotlib.lines.Line2D object at 0x000002729AAAF890>, <matplotlib.lines.Line2D object at 0x000002729AA17D50>, <matplotlib.lines.Line2D object at 0x000002729AB10210>, <matplotlib.lines.Line2D object at 0x000002729AE10B10>, <matplotlib.lines.Line2D object at 0x00000272A20106D0>, <matplotlib.lines.Line2D object at 0x000002729AD29450>, <matplotlib.lines.Line2D object at 0x000002729AC698D0>, <matplotlib.lines.Line2D object at 0x000002729AEE1D50>, <matplotlib.lines.Line2D object at 0x000002729AE021D0>, <matplotlib.lines.Line2D object at 0x00000272A2010FD0>, <matplotlib.lines.Line2D object at 0x000002729A9A2B50>, <matplotlib.lines.Line2D object at 0x000002729AA92FD0>, <matplotlib.lines.Line2D object at 0x000002729AA2B450>, <matplotlib.lines.Line2D object at 0x00000272A2012690>, <matplotlib.lines.Line2D object at 0x000002729ACA3D50>, <matplotlib.lines.Line2D object at 0x00000272A2013910>, <matplotlib.lines.Line2D object at 0x000002729ACBC210>, <matplotlib.lines.Line2D object at 0x000002729A884690>, <matplotlib.lines.Line2D object at 0x00000272A2054B10>, <matplotlib.lines.Line2D object at 0x00000272A2054F90>, <matplotlib.lines.Line2D object at 0x000002729AA35890>, <matplotlib.lines.Line2D object at 0x000002729A8EDD50>, <matplotlib.lines.Line2D object at 0x00000272A2055450>, <matplotlib.lines.Line2D object at 0x00000272A2056250>, <matplotlib.lines.Line2D object at 0x00000272A2056710>, <matplotlib.lines.Line2D object at 0x000002729AEB7050>, <matplotlib.lines.Line2D object at 0x00000272A2056BD0>, <matplotlib.lines.Line2D object at 0x000002729A937950>, <matplotlib.lines.Line2D object at 0x000002729AEEFDD0>, <matplotlib.lines.Line2D object at 0x00000272A2057510>, <matplotlib.lines.Line2D object at 0x000002729A924290>, <matplotlib.lines.Line2D object at 0x000002729AA64710>, <matplotlib.lines.Line2D object at 0x000002729ACD5010>, <matplotlib.lines.Line2D object at 0x00000272A2034BD0>, <matplotlib.lines.Line2D object at 0x00000272A20354D0>, <matplotlib.lines.Line2D object at 0x00000272A2035990>, <matplotlib.lines.Line2D object at 0x00000272A2035E10>, <matplotlib.lines.Line2D object at 0x00000272A20362D0>, <matplotlib.lines.Line2D object at 0x00000272A2056B90>, <matplotlib.lines.Line2D object at 0x000002729AA17010>, <matplotlib.lines.Line2D object at 0x00000272A20574D0>, <matplotlib.lines.Line2D object at 0x000002729ABCF910>]
## [<matplotlib.lines.Line2D object at 0x00000272A25F7410>]
## <matplotlib.lines.Line2D object at 0x000002729A9A2790>
## <matplotlib.lines.Line2D object at 0x000002729AE5C310>
## <matplotlib.lines.Line2D object at 0x000002729A925850>
## Text(62, 1100.9948817111576, 'Inicio\ncob.\n(año 6)')
## Text(0.5, 1.0, 'GBM t-Student (df = 14.5)')
## Text(0.5, 0, 'Mes')
## Text(0, 0.5, 'USD/COP')
## <matplotlib.legend.Legend object at 0x000002729AB08750>
## [<matplotlib.lines.Line2D object at 0x000002729AF4A510>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x000002729AF25A10>
## [<matplotlib.lines.Line2D object at 0x00000272A261A350>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x000002729AF29210>
## <matplotlib.lines.Line2D object at 0x000002729AD08190>
## <matplotlib.lines.Line2D object at 0x000002729AE6B510>
## Text(0.5, 1.0, 'Distribución TRM al Mes 120 — Normal vs t-Student')
## Text(0.5, 0, 'TRM al vencimiento (COP/USD)')
## Text(0, 0.5, 'Densidad')
## <matplotlib.legend.Legend object at 0x000002729ADD8290>
## (np.float64(0.0), np.float64(1.0), np.float64(0.0), np.float64(1.0))
## Text(0.5, 1.0, 'Comparación de Colas — Normal vs t-Student')
Figura 10. Trayectorias GBM de la TRM bajo distribución normal y t-Student (arriba), distribución de la TRM al mes 120 (abajo izquierda) y tabla comparativa de percentiles extremos (abajo derecha). La línea morada marca el inicio de la cobertura en el año 6. Elaboración propia. Datos: Yahoo Finance (USDCOP=X, 2016–2026).
La comparación entre las dos distribuciones tiene una implicación práctica clara: la t-Student genera escenarios extremos TRM muy alta o muy baja con mayor frecuencia que la normal. El percentil 99% bajo t-Student es significativamente más alto que bajo normal, lo que significa que la probabilidad de una depreciación severa del COP está subestimada si se usa solo la distribución normal. Para la cobertura, eso importa mucho: los escenarios extremos son exactamente los que el forward busca proteger.
Los grados de libertad calibrados por MLE por debajo de 30 son evidencia estadística de que los retornos históricos de la TRM tienen colas más pesadas que la normal. No es una decisión arbitraria: es lo que dicen los datos.
La plataforma SET-FX (Sistema Electrónico de Transacciones de Divisas), operada por SET-ICAP y supervisada por el Banco de la República, es el mercado oficial de divisas del sistema financiero colombiano. La estructura de cotizaciones forward al cierre del 28 de marzo de 2026:
| Plazo | Días | Forward Mid (COP/USD) | Puntos swap |
|---|---|---|---|
| 6 meses | 180 | 3,618.50 | +185.30 |
| 9 meses | 270 | 3,672.80 | +239.60 |
| 12 meses | 360 | 3,730.25 | +297.05 |
| 18 meses | 540 | 3,845.10 | +411.90 |
| 24 meses | 720 | 3,962.40 | +529.20 |
Se selecciona el plazo de 12 meses (K = 3,730.25) por ser el más líquido por encima de 6 meses y corresponder al horizonte anual de cada forward de la cobertura.
Fuente: SET-ICAP FX Colombia, sesión de cierre 28/03/2026. https://www.set-fx.com
Paridad Cubierta de Tasas de Interés (CIP): \[F_T = S_0 \times \frac{(1 + r_{COP})^T}{(1 + r_{USD})^T}\]
Si \(r_{COP} > r_{USD}\), el forward implica depreciación teórica del COP proporcional al diferencial de tasas.
## === PRECIO TEÓRICO DEL FORWARD (CIP) vs COTIZACIÓN SET-FX ===
## Spot S₀ : 3,687.34 COP/USD
## Tasa doméstica r_COP : 13.5000%
## Tasa extranjera r_USD : 6.9500%
## Diferencial de tasas : 6.5500%
## Precio teórico CIP : 3,913.17 COP/USD
## Precio SET-FX (K) : 3,730.25 COP/USD
## Basis (SET-FX − CIP) : -182.92 COP/USD (-4.674%)
## → BACKWARDATION: mercado anticipa menor depreciación del COP que la CIP.
## === ESTRUCTURA DE LOS 4 FORWARDS — AÑOS 6 AL 9 ===
## Forward Año cubierto Mes ini Mes fin Cuotas USD del año Notional USD K SET-FX F teórico CIP
## 1 6 61 72 11764.64 17797.38 3730.25 5267.49
## 2 7 73 84 11764.64 17797.38 3730.25 5590.09
## 3 8 85 96 11764.64 17797.38 3730.25 5932.45
## 4 9 97 108 11764.64 17797.38 3730.25 6295.77
## Notional total cubierto : 75% × COP 350,000,000 = COP 262,500,000
## Equivalente USD total : USD 71,189.53 | Por forward: USD 17,797.38
La comparación entre el precio teórico CIP y la cotización SET-FX es un paso que a menudo se omite en ejercicios similares pero que tiene relevancia práctica: si el basis fuera grande y positivo, el forward de mercado estaría “más caro” de lo que justifican las tasas, lo que haría la cobertura más costosa. Un basis cercano a cero indica que el mercado es eficiente en el forward de divisas colombiano a ese plazo lo que es esperable dado el volumen y la transparencia del sistema SET-FX.
La posición en cada forward es larga: el importador o deudor en dólares se perjudica cuando la TRM sube (cada dólar que debe pagar le cuesta más pesos). El forward largo compensa exactamente eso: genera una ganancia cuando ST > K al vencimiento, que compensa el mayor costo de las cuotas en pesos.
## === ANÁLISIS DE PROTECCIÓN DEL FORWARD ===
## Forward Año cob. Distribución TRM media sim. % Protegido % No protegido Payoff prom. (COP)
## 1 6 Normal 4,169 60.4% 39.6% $ 7,801,005
## 1 6 t-Student (df=14.5) 4,135 58.0% 42.0% $ 7,207,147
## 2 7 Normal 4,272 59.7% 40.3% $ 9,639,722
## 2 7 t-Student (df=14.5) 4,224 59.9% 40.1% $ 8,788,463
## 3 8 Normal 4,371 60.0% 40.0% $ 11,395,613
## 3 8 t-Student (df=14.5) 4,279 58.6% 41.4% $ 9,765,468
## 4 9 Normal 4,449 60.8% 39.2% $ 12,794,221
## 4 9 t-Student (df=14.5) 4,384 62.2% 37.8% $ 11,630,598
## <BarContainer object of 4 artists>
## <BarContainer object of 4 artists>
## Text(0, 0.302, '60%')
## Text(0, 0.802, '40%')
## Text(1, 0.2985, '60%')
## Text(1, 0.7985, '40%')
## Text(2, 0.3, '60%')
## Text(2, 0.8, '40%')
## Text(3, 0.304, '61%')
## Text(3, 0.804, '39%')
## [<matplotlib.axis.XTick object at 0x00000272A2794790>, <matplotlib.axis.XTick object at 0x00000272A27B0910>, <matplotlib.axis.XTick object at 0x00000272A249EC90>, <matplotlib.axis.XTick object at 0x00000272A24568D0>]
## [Text(0, 0, 'Fwd 1\nAño 6'), Text(1, 0, 'Fwd 2\nAño 7'), Text(2, 0, 'Fwd 3\nAño 8'), Text(3, 0, 'Fwd 4\nAño 9')]
## Text(0.5, 1.0, 'Protección por Forward — Normal')
## Text(0, 0.5, 'Proporción de simulaciones')
## <matplotlib.legend.Legend object at 0x00000272A2653F10>
## <BarContainer object of 4 artists>
## <BarContainer object of 4 artists>
## Text(0, 0.29, '58%')
## Text(0, 0.7899999999999999, '42%')
## Text(1, 0.2995, '60%')
## Text(1, 0.7995, '40%')
## Text(2, 0.293, '59%')
## Text(2, 0.7929999999999999, '41%')
## Text(3, 0.311, '62%')
## Text(3, 0.8109999999999999, '38%')
## [<matplotlib.axis.XTick object at 0x00000272A24ADE90>, <matplotlib.axis.XTick object at 0x00000272A2465710>, <matplotlib.axis.XTick object at 0x000002729ADF6D10>, <matplotlib.axis.XTick object at 0x000002729AD2F390>]
## [Text(0, 0, 'Fwd 1\nAño 6'), Text(1, 0, 'Fwd 2\nAño 7'), Text(2, 0, 'Fwd 3\nAño 8'), Text(3, 0, 'Fwd 4\nAño 9')]
## Text(0.5, 1.0, 'Protección por Forward — t-Student (df=14.5)')
## Text(0, 0.5, 'Proporción de simulaciones')
## <matplotlib.legend.Legend object at 0x00000272A270E390>
Figura 11. Proporción de escenarios simulados donde el forward generó protección (ST > K) vs escenarios no protegidos, por distribución y por año de vencimiento. Elaboración propia. SET-FX (2026); Hull (2018, cap. 5).
El gráfico de protección hace explícito algo importante: la cobertura no es perfecta en todos los escenarios. Cuando la TRM simulada al vencimiento está por debajo de K, el forward tiene un costo neto se compró protección contra una depreciación que no ocurrió. Eso es exactamente lo que hace cualquier seguro: se paga una prima para el caso adverso, y cuando el adverso no ocurre el seguro “costó” algo.
Lo que sí resulta favorable es que los forwards de los años más lejanos 8 y 9 muestran mayor proporción de escenarios protegidos, lo que es coherente con el drift positivo de la TRM: a medida que pasa más tiempo, es más probable que la TRM haya superado el precio K acordado hoy. La distribución t-Student, al generar escenarios más extremos en ambas colas, produce simultáneamente más casos donde la cobertura es muy valiosa y más casos donde tiene un costo relevante refleja mejor la realidad de una divisa volátil como el COP.
## === FLUJO TOTAL DEL CRÉDITO — CON Y SIN COBERTURA ===
## Distribución Flujo prom. SIN cob. (COP) Flujo prom. CON cob. (COP) Efecto neto cob. Reduc. volatilidad VaR 95% SIN cob. VaR 95% CON cob.
## Normal COP 482,289,977 COP 440,659,416 COP +41,630,561 74.522% COP 694,363,724 COP 494,409,200
## t-Student (df=14.5) COP 478,693,361 COP 441,301,685 COP +37,391,676 73.789% COP 686,061,214 COP 493,193,575
## [<matplotlib.lines.Line2D object at 0x00000272A21CE910>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x00000272A2787BD0>
## <matplotlib.lines.Line2D object at 0x00000272A21CE5D0>
## [<matplotlib.lines.Line2D object at 0x000002729AFB5650>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x000002729AFB6490>
## <matplotlib.lines.Line2D object at 0x000002729AFC9F90>
## <matplotlib.lines.Line2D object at 0x000002729AFB6E90>
## Text(0.5, 1.0, 'Flujo Total en COP — GBM Normal')
## Text(0.5, 0, 'Flujo total crédito en COP')
## Text(0, 0.5, 'Densidad')
## <matplotlib.legend.Legend object at 0x000002729AD29C50>
## [<matplotlib.lines.Line2D object at 0x00000272A20DB250>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x00000272A2759FD0>
## <matplotlib.lines.Line2D object at 0x00000272A20A4BD0>
## [<matplotlib.lines.Line2D object at 0x000002729AD9DD50>]
## <matplotlib.collections.FillBetweenPolyCollection object at 0x00000272A262C210>
## <matplotlib.lines.Line2D object at 0x000002729AD9FF90>
## <matplotlib.lines.Line2D object at 0x000002729ADD8F10>
## Text(0.5, 1.0, 'Flujo Total en COP — GBM t-Student (df=14.5)')
## Text(0.5, 0, 'Flujo total crédito en COP')
## Text(0, 0.5, 'Densidad')
## <matplotlib.legend.Legend object at 0x000002729AC263D0>
##
## === RESUMEN DE EFECTIVIDAD ===
## Distribución Normal:
## Efecto promedio de la cobertura: COP +41,630,561
## Reducción de volatilidad: 74.522%
## Reducción VaR 95%: 28.797%
##
## Distribución t-Student (df=14.5):
## Efecto promedio de la cobertura: COP +37,391,676
## Reducción de volatilidad: 73.789%
## Reducción VaR 95%: 28.112%
Figura 12. Distribución del flujo total del crédito en COP durante 10 años, con y sin cobertura cambiaria, bajo GBM Normal (izquierda) y GBM t-Student (derecha). La distribución azul más estrecha refleja la reducción de dispersión que aporta la cobertura. Elaboración propia. SET-FX (2026); Hull (2018, cap. 5).
El análisis de flujos totales es el punto central de la Parte 2. La cobertura cambiaria no garantiza que el crédito en dólares resulte siempre más barato que el colombiano eso depende de cómo evolucione la TRM en los próximos diez años, algo que ningún modelo puede predecir con certeza. Lo que sí hace es acotar el rango de resultados posibles: la distribución del flujo total en pesos es notablemente más estrecha con cobertura que sin ella.
La reducción de volatilidad y del VaR 95% cuantifican ese beneficio de manera concreta. El peor escenario del 5% bajo cobertura es menos costoso que el mismo escenario sin ella. Para una empresa que necesita planear pagos a diez años, esa certeza tiene un valor real más que cualquier cálculo de ahorro esperado en valor promedio.
La cobertura parcial al 75% tiene una lógica propia: cubrir el 100% significaría ignorar completamente la posibilidad de apreciación del COP. Con el 25% descubierto, si el COP se fortalece en algún período, la empresa se beneficia parcialmente de ese movimiento. Si el COP se deprecia, los cuatro forwards cubren la mayor parte de la exposición en los años de mayor saldo del crédito que son los años 6 a 9.
El portafolio óptimo de Markowitz con NEE, UNP y PLD no es un ejercicio teórico: produce una asignación concreta que mejora el Sharpe Ratio frente a la distribución de pesos iguales. La mejora viene de explotar las diferencias en las covarianzas no de elegir activos con retornos más altos por separado, sino de combinarlos de manera que la volatilidad conjunta sea menor que la suma de sus partes.
El VaR al 99% no se calcula para archivarlo. Es el criterio con el que se dimensiona la cobertura: ¿cuánto capital podría perderse en un día malo? La brecha entre VaR histórico y paramétrico recuerda que los modelos basados en normalidad subestiman los riesgos reales algo que los mercados de 2020 y 2022 dejaron claro.
La posición corta en futuros ES hace exactamente lo que debe: reduce la volatilidad del portafolio a cambio de renunciar a parte del upside en mercados alcistas. El costo de esa cobertura el P&L negativo esperado del futuro en un mercado con drift positivo es el precio del seguro. Que ese costo exista no hace la estrategia incorrecta; la hace honesta. El análisis de roll-over y margin call sirve para recordar que la cobertura con futuros no es gratis ni automática: requiere capital de reserva y gestión activa.
Financiar la maquinaria en dólares a tasa SBA 504 (6.95%) en lugar de en pesos (13.5%) tiene un beneficio financiero claro bajo TRM estable. El problema es que la TRM colombiana no es estable: su historial incluye episodios de depreciación del 30–40% en menos de un año, y las simulaciones con t-Student capturan eso con más fidelidad que la distribución normal.
Los cuatro forwards anuales sobre el 75% del valor cubren los años de mayor exposición 6 a 9, cuando el saldo del crédito todavía es significativo y la incertidumbre cambiaria acumulada es mayor. La reducción del VaR 95% del flujo total en pesos es la métrica que más importa para justificar la decisión: el peor escenario razonable es materialmente menos costoso con cobertura que sin ella.
La estrategia completa —portafolio óptimo, cobertura beta con futuros ES, crédito en USD y forward USD/COP— es coherente y bien dimensionada bajo el marco de Hull (2018). Cada instrumento derivado tiene un rol específico: los futuros eliminan riesgo sistemático de mercado; el forward acota el riesgo cambiario. Ninguno de los dos es gratuito, y eso es parte de la lógica: el riesgo que se elimina con un instrumento es riesgo que alguien más asume por una compensación. Esa compensación es el costo explícito e implícito de la cobertura.
Hull, J. C. (2018). Options, futures, and other derivatives (10.ª ed.). Pearson Education.
Jensen, M. C. (1968). The performance of mutual funds in the period 1945–1964. Journal of Finance, 23(2), 389–416. https://doi.org/10.1111/j.1540-6261.1968.tb00815.x
Markowitz, H. (1952). Portfolio selection. Journal of Finance, 7(1), 77–91. https://doi.org/10.2307/2975974
Sharpe, W. F. (1964). Capital asset prices: A theory of market equilibrium under conditions of risk. Journal of Finance, 19(3), 425–442. https://doi.org/10.2307/2977928
Banco de la República de Colombia. (2026, enero). Informe de política monetaria. https://www.banrep.gov.co
Bancolombia Research. (2026, febrero). Perspectivas cambiarias USD/COP 2026–2027.
CME Group. (2026). E-mini S&P 500 futures — contract specifications & performance bond requirements Q1 2026. https://www.cmegroup.com
Corficolombiana. (2026, marzo). Informe semanal de divisas.
GoSBA Loans. (2026, 13 de marzo). SBA loan rates today. https://gosba.com
SET-ICAP FX Colombia. (2026, 28 de marzo). Cotizaciones forward USD/COP — sesión de cierre. https://www.set-fx.com
Small Business Administration (SBA). (2026). SBA 504 loan program — interest rates Q1 2026. https://www.sba.gov/funding-programs/loans/504-loans
Wells Fargo Bank, N.A. (2026). SBA lending solutions. https://www.wellsfargo.com/biz/sba/
Yahoo Finance / Federal Reserve Economic Data (FRED). (2026). Datos históricos de precios y tasas 2016–2026. https://finance.yahoo.com | https://fred.stlouisfed.org
Compilar con:
rmarkdown::render("Trabajo_Final_FINAL_v3.Rmd") en
RStudio.