LABORATORIO 1. PRACTICA DE FUTUROS
Este informe evalúa la financiación en USD de una inversión de COP 500 millones para maquinaria amarilla mediante un crédito a 10 años (sistema francés) y la cobertura cambiaria con futuros TRM (USD/COP) sobre el 75% de la exposición desde el año 6 hasta el 10. Para financiar la adquisición de maquinaria amarilla, hemos decidido solicitar un crédito en Estados Unidos. Después de analizar las opciones disponibles, comparamos dos de las principales instituciones financieras: Bank of America y JP Morgan Chase. Ambos bancos ofrecían condiciones competitivas, pero tras evaluar detalladamente las tasas de interés, plazos y el sistema de pago, optamos por el crédito de JP Morgan Chase.
JPMorgan Chase se orienta más a inversiones de capital de largo plazo, como maquinaria amarilla, infraestructura o tecnología, con tasas competitivas y estructuras de deuda que cumplen estándares regulatorios internacionales.
Las condiciones del crédito elegido son las siguientes: Tasa de interés: 6.3% APR Plazo: 10 años Sistema de pago: Francés.
En este laboratorio, La TRM se analiza desde un enfoque fundamental (monetario y real) y estocástico (retornos y simulaciones GBM). Se construye el cronograma de amortización en USD y se transforma a COP con trayectorias simuladas de TRM. En la segunda parte, se modelan los futuros TRM (precio teórico inicial por paridad de tasas, retornos mensuales, simulación GBM, rollover y flujos de margen). Resultados clave: (i) el crédito sin cobertura exhibe volatilidad relevante en COP; (ii) la cobertura con futuros reduce el rango de resultados y estabiliza el flujo, a costa de márgenes y posible riesgo de base. En balance, la estrategia de cobertura es financieramente conveniente para mitigar la incertidumbre de la TRM en los años 6–10 del crédito.
PARTE 1. PROCESO DEL CREDITO
Enfoque. Tipo de cambio (TRM): cálculo de retornos logarítmicos mensuales, desviación estándar y proyección mediante GBM (12 y 120 meses). Crédito: cronograma en USD (sistema francés) y conversión a COP usando las trayectorias simuladas de TRM. Futuros TRM (BVC): precio teórico inicial por paridad de tasas, simulación GBM, rollover, margen inicial y margen de mantenimiento, y mark-to-market mensual. Comparación: costo total en COP con vs sin cobertura, análisis de riesgo y sensibilidad.
Datos. TRM (USD/COP): serie histórica diaria/mensual empleada para calcular retornos y volatilidad; se mensualiza tomando el último dato del mes.
# Descargar TRM histórica desde Yahoo Finance
getSymbols("USDCOP=X", src = "yahoo", from = "2015-01-01", to = "2025-09-01")
## Warning: USDCOP=X contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "USDCOP=X"
# Extraer solo la columna de cierre
trm_xts <- Cl(`USDCOP=X`) %>% na.omit()
# Pasar a frecuencia mensual (último día de cada mes)
trm_mensual <- to.monthly(trm_xts, indexAt = "lastof", OHLC = FALSE)
# Convertir a data.frame con nombres claros
trm <- data.frame(
fecha = index(trm_mensual),
precio = as.numeric(trm_mensual)
)
# Mostrar primeras filas
head(trm)
# Graficar la serie mensual limpia
plot(trm$fecha, trm$precio, type="l", col="blue", lwd=2,
main="TRM histórica mensual (Yahoo Finance)",
xlab="Fecha", ylab="COP/USD")
1. Análisis fundamental de la TRM (USD/COP)
La TRM refleja la relación COP/USD y, por tanto, depende de la interacción entre variables internas y externas. A nivel internacional, la política monetaria de la Reserva Federal (Fed) constituye un determinante fundamental. La expectativa actual es de recortes graduales en la tasa de referencia en lo que resta de 2025, lo que ha debilitado al dólar frente a monedas emergentes (Reuters, 2025).
Contexto Local En Colombia, el Banco de la República mantiene su tasa de referencia en 9,25 %, con un sesgo a la baja condicionado a la evolución de la inflación (Banco de la República, 2025). Este diferencial de tasas frente a la Fed sostiene la entrada de capitales y otorga soporte al peso colombiano.
Además, los factores fiscales y externos resultan críticos. El Marco Fiscal de Mediano Plazo (MFMP) proyecta un déficit fiscal cercano al 4 % del PIB en 2025, junto con menores ingresos petroleros en comparación con 2024, lo que presiona una leve depreciación de la moneda (Ministerio de Hacienda, 2025).
Comportamiento Reciente Al 19 de septiembre de 2025, el USD/COP se ubicó en torno a los 3.890 pesos, marcando un nivel de apreciación frente al promedio de 2024, cuando la tasa cerró en 4.409 (TradingEconomics, 2025).
Expectativas de la TRM a 12 Meses
Proyecciones Oficiales El MFMP (2025) estima una TRM promedio de 4.265 pesos en 2025 y 4.408 en 2026, con una depreciación nominal anual moderada (Ministerio de Hacienda, 2025).
Proyecciones de Banca Privada BBVA Research (2025) anticipa un cierre de 2025 en 4.350 y de 2026 en 4.230, lo que implica una senda de estabilidad con ligera apreciación frente a los supuestos oficiales.
Por su parte, Scotiabank (2025) prevé que la tasa del Banco de la República finalice 2025 en torno a 7,75 %, lo que sugiere que el peso mantendrá resiliencia siempre que el ciclo de recortes de la Fed continúe (Scotiabank Economics, 2025).
Consenso de Analistas Datos de consenso publicados por FocusEconomics (2025) ubican la expectativa de mediano plazo en niveles entre 4.200 y 4.400, con una tendencia lateral de la divisa.
Implicaciones para la Cobertura con Derivados Una tasa de referencia local. Esto permite replicar las condiciones de mercado en la Bolsa de Valores de Colombia (BVC) y cubrir al menos el 75 % de la exposición cambiaria a partir del sexto año.
Conclusiones El peso colombiano cerró septiembre de 2025 en niveles de 3.890 COP/USD, mostrando fortaleza respecto a 2024.
Las proyecciones oficiales (MFMP) y privadas (BBVA, Scotiabank) coinciden en un rango de 4.200 a 4.450 para el próximo año.
El sesgo predominante es de depreciación moderada, aunque con riesgos significativos al alza derivados de choques fiscales y de precios del petróleo.
La gestión de riesgos mediante futuros de divisas resulta necesaria para proteger las cuotas en USD de un crédito a 10 años, en línea con la estrategia propuesta.
2. Metodología cuantitativa
a. Retornos y volatilidad.
## Desviación estándar mensual de la TRM: 0.04006474
De los resultados obetenidos popdemos decir que, una σ mensual ≈ 4,01% implica que, en un mes típico, la TRM puede moverse alrededor de ±4%; con una TRM de referencia de, por ejemplo, $4.100 COP/USD, eso equivale a ±$164 COP por dólar. En términos prácticos, cada cuota en USD del crédito convertida a COP puede variar aproximadamente ese porcentaje solo por efecto cambiario. Bajo ±2σ (~±8%), variaciones mensuales de $330–$350 COP por dólar no son inusuales, y choques extremos (como marzo de 2020) muestran colas pesadas, por lo que conviene dimensionar colchones de liquidez y presentar un análisis de sensibilidad de las cuotas en COP
3.Simulación BMG
La simulación GBM de la TRM (USD/COP) es el núcleo cuantitativo del proyecto porque convierte la volatilidad histórica (≈ 4,01% mensual) y la media de los retornos logarítmicos en un abanico probabilístico de escenarios futuros, en lugar de un único pronóstico.
## Simulación BMG (Browniano Geométrico) de la TRM
mu <- mean(retornos_trm) * 12 # media anualizada
sigma <- sd(retornos_trm) * sqrt(12) # volatilidad anualizada
S0 <- as.numeric(last(trm_mensual)) # último valor conocido
T <- 120 # horizonte: 120 meses
N <- 1000 # número de simulaciones *No genera el Rubs con 10.000
set.seed(123)
simulaciones <- matrix(NA, nrow = T, ncol = N)
for (i in 1:N) {
pasos <- rnorm(T, mean = (mu - 0.5*sigma^2)/12, sd = sigma/sqrt(12))
simulaciones[,i] <- S0 * exp(cumsum(pasos))
}
# graficar algunas trayectorias
matplot(simulaciones[,1:1000], type = "l", lty = 1,
main = "Simulación BMG de TRM (citmre)",
xlab = "Meses", ylab = "TRM simulada")
# Valores finales de cada caminata
finales <- simulaciones[T, ] # fila T = último mes, columnas = trayectorias
# Índices de la más baja, más alta y más intermedia
idx_min <- which.min(finales)
idx_max <- which.max(finales)
idx_mean <- which.min(abs(finales - mean(finales)))
# Extraer trayectorias completas
trayectoria_min <- simulaciones[, idx_min]
trayectoria_max <- simulaciones[, idx_max]
trayectoria_med <- simulaciones[, idx_mean]
# Graficar todas las simulaciones en gris claro
matplot(simulaciones, type = "l", lty = 1, col = rgb(0,0,0,0.05),
main = "Simulación BMG de TRM (citmre)",
xlab = "Meses", ylab = "TRM simulada")
# Añadir las 3 trayectorias destacadas
lines(trayectoria_min, col = "red", lwd = 2) # más baja
lines(trayectoria_max, col = "green", lwd = 2) # más alta
lines(trayectoria_med, col = "blue", lwd = 2) # intermedia
legend("topleft", legend = c("Más baja", "Más alta", "Intermedia"),
col = c("red","green","blue"), lwd = 2, bty = "n")
Con esas trayectorias mensuales: proyectamos la TRM para convertir cada cuota en USD a COP, obteniendo la distribución del costo del crédito (media, p95, peor-caso razonable) y la sensibilidad del flujo en pesos.
El GBM se calibró con S₀ = 4.014 COP/USD, μ anual = 4,95% y σ anual = 13,88% (σ mensual = 4,01%), y se corrieron N = 10.000 trayectorias por T = 120 meses. La trayectoria intermedia (seleccionada por cercanía a la media de finales) muestra una senda central que lleva la TRM a ≈ 5–6 mil COP/USD hacia el año 10, mientras que el abanico se ensancha por acumulación de volatilidad: la mínima cae a una fracción de S₀ (≈ 1–1,5 mil COP/USD) y la máxima supera ampliamente 20 mil COP/USD. Esto confirma que, aun con cuota fija en USD, el costo en COP del crédito estará distribuido en un rango amplio y que la variabilidad de la TRM es el principal driver: para presupuestar riesgo conviene usar los cuantiles de finales (p. ej., p5–p50–p95) como banda operativa del proyecto.
La simulación GBM, calibrada con μ=4,95% y σ=13,9% anual, muestra que la TRM a 10 años no es un punto sino una banda: el escenario central es p50 y el 90% de los resultados cae entre p5 y p95. Esta incertidumbre se traslada uno a uno a las cuotas en COP del crédito y justifica implementar cobertura con futuros para estabilizar el flujo
4. Crédito en USD (sistema francés).
El objetivo de esta sección es cuantificar en pesos (COP) el costo total y la variabilidad del crédito en USD (plazo 10 años, sistema francés) utilizado para financiar la maquinaria. Para ello, primero calculamos el cronograma de amortización en USD y, luego, convertimos cada cuota mensual a COP con trayectorias simuladas de la TRM. Con esto buscamos: (i) obtener la cuota esperada y el costo total esperado en COP, (ii) medir el riesgo cambiario como la dispersión de resultados (p. ej., p50, p5–p95), e (iii) identificar el colchón de liquidez necesario ante meses adversos.
# Parámetros del crédito USD
monto_usd <- 125000 # Monto del prestamo en USD
pago_inicial <- 0.10 * monto_usd #Pago inicial
monto_credito <- monto_usd - pago_inicial
tasa_anual <- 0.063 # Tasa de interés anual (6.30%)
plazo_meses <- 120 # Plazo en meses
# Tasa mensual
tasa_mensual <- tasa_anual / 12
# Cuota mensual
cuota <- monto_credito * (tasa_mensual / (1 - (1 + tasa_mensual)^(-plazo_meses)))
# Tabla de amortización
credito_dolares <- data.frame(
Mes = 1:plazo_meses,
Cuota = rep(round(cuota, 2), plazo_meses),
Interés = NA,
Capital = NA,
Saldo = NA
)
saldo <- monto_credito
for (i in 1:plazo_meses) {
interes <- saldo * tasa_mensual
capital <- cuota - interes
saldo <- saldo - capital
credito_dolares$Interés[i] <- round(interes, 2)
credito_dolares$Capital[i] <- round(capital, 2)
credito_dolares$Saldo[i] <- round(saldo, 2)
}
print(credito_dolares)
## Mes Cuota Interés Capital Saldo
## 1 1 1266 590.62 675.37 111824.63
## 2 2 1266 587.08 678.92 111145.71
## 3 3 1266 583.51 682.48 110463.23
## 4 4 1266 579.93 686.06 109777.17
## 5 5 1266 576.33 689.67 109087.50
## 6 6 1266 572.71 693.29 108394.21
## 7 7 1266 569.07 696.93 107697.29
## 8 8 1266 565.41 700.59 106996.70
## 9 9 1266 561.73 704.26 106292.44
## 10 10 1266 558.04 707.96 105584.48
## 11 11 1266 554.32 711.68 104872.80
## 12 12 1266 550.58 715.41 104157.38
## 13 13 1266 546.83 719.17 103438.21
## 14 14 1266 543.05 722.95 102715.27
## 15 15 1266 539.26 726.74 101988.53
## 16 16 1266 535.44 730.56 101257.97
## 17 17 1266 531.60 734.39 100523.58
## 18 18 1266 527.75 738.25 99785.33
## 19 19 1266 523.87 742.12 99043.21
## 20 20 1266 519.98 746.02 98297.19
## 21 21 1266 516.06 749.94 97547.25
## 22 22 1266 512.12 753.87 96793.38
## 23 23 1266 508.17 757.83 96035.55
## 24 24 1266 504.19 761.81 95273.74
## 25 25 1266 500.19 765.81 94507.93
## 26 26 1266 496.17 769.83 93738.10
## 27 27 1266 492.13 773.87 92964.23
## 28 28 1266 488.06 777.93 92186.29
## 29 29 1266 483.98 782.02 91404.27
## 30 30 1266 479.87 786.12 90618.15
## 31 31 1266 475.75 790.25 89827.90
## 32 32 1266 471.60 794.40 89033.50
## 33 33 1266 467.43 798.57 88234.93
## 34 34 1266 463.23 802.76 87432.17
## 35 35 1266 459.02 806.98 86625.19
## 36 36 1266 454.78 811.21 85813.97
## 37 37 1266 450.52 815.47 84998.50
## 38 38 1266 446.24 819.75 84178.75
## 39 39 1266 441.94 824.06 83354.69
## 40 40 1266 437.61 828.38 82526.30
## 41 41 1266 433.26 832.73 81693.57
## 42 42 1266 428.89 837.11 80856.47
## 43 43 1266 424.50 841.50 80014.97
## 44 44 1266 420.08 845.92 79169.05
## 45 45 1266 415.64 850.36 78318.69
## 46 46 1266 411.17 854.82 77463.87
## 47 47 1266 406.69 859.31 76604.55
## 48 48 1266 402.17 863.82 75740.73
## 49 49 1266 397.64 868.36 74872.37
## 50 50 1266 393.08 872.92 73999.46
## 51 51 1266 388.50 877.50 73121.96
## 52 52 1266 383.89 882.11 72239.85
## 53 53 1266 379.26 886.74 71353.12
## 54 54 1266 374.60 891.39 70461.72
## 55 55 1266 369.92 896.07 69565.65
## 56 56 1266 365.22 900.78 68664.87
## 57 57 1266 360.49 905.51 67759.37
## 58 58 1266 355.74 910.26 66849.11
## 59 59 1266 350.96 915.04 65934.07
## 60 60 1266 346.15 919.84 65014.23
## 61 61 1266 341.32 924.67 64089.56
## 62 62 1266 336.47 929.53 63160.03
## 63 63 1266 331.59 934.41 62225.62
## 64 64 1266 326.68 939.31 61286.31
## 65 65 1266 321.75 944.24 60342.07
## 66 66 1266 316.80 949.20 59392.87
## 67 67 1266 311.81 954.18 58438.68
## 68 68 1266 306.80 959.19 57479.49
## 69 69 1266 301.77 964.23 56515.26
## 70 70 1266 296.71 969.29 55545.97
## 71 71 1266 291.62 974.38 54571.59
## 72 72 1266 286.50 979.50 53592.10
## 73 73 1266 281.36 984.64 52607.46
## 74 74 1266 276.19 989.81 51617.65
## 75 75 1266 270.99 995.00 50622.65
## 76 76 1266 265.77 1000.23 49622.42
## 77 77 1266 260.52 1005.48 48616.94
## 78 78 1266 255.24 1010.76 47606.18
## 79 79 1266 249.93 1016.06 46590.12
## 80 80 1266 244.60 1021.40 45568.72
## 81 81 1266 239.24 1026.76 44541.96
## 82 82 1266 233.85 1032.15 43509.81
## 83 83 1266 228.43 1037.57 42472.24
## 84 84 1266 222.98 1043.02 41429.22
## 85 85 1266 217.50 1048.49 40380.73
## 86 86 1266 212.00 1054.00 39326.73
## 87 87 1266 206.47 1059.53 38267.20
## 88 88 1266 200.90 1065.09 37202.11
## 89 89 1266 195.31 1070.69 36131.42
## 90 90 1266 189.69 1076.31 35055.12
## 91 91 1266 184.04 1081.96 33973.16
## 92 92 1266 178.36 1087.64 32885.52
## 93 93 1266 172.65 1093.35 31792.17
## 94 94 1266 166.91 1099.09 30693.09
## 95 95 1266 161.14 1104.86 29588.23
## 96 96 1266 155.34 1110.66 28477.57
## 97 97 1266 149.51 1116.49 27361.08
## 98 98 1266 143.65 1122.35 26238.73
## 99 99 1266 137.75 1128.24 25110.49
## 100 100 1266 131.83 1134.17 23976.32
## 101 101 1266 125.88 1140.12 22836.20
## 102 102 1266 119.89 1146.11 21690.09
## 103 103 1266 113.87 1152.12 20537.97
## 104 104 1266 107.82 1158.17 19379.80
## 105 105 1266 101.74 1164.25 18215.55
## 106 106 1266 95.63 1170.36 17045.18
## 107 107 1266 89.49 1176.51 15868.67
## 108 108 1266 83.31 1182.69 14685.99
## 109 109 1266 77.10 1188.89 13497.09
## 110 110 1266 70.86 1195.14 12301.95
## 111 111 1266 64.59 1201.41 11100.54
## 112 112 1266 58.28 1207.72 9892.83
## 113 113 1266 51.94 1214.06 8678.77
## 114 114 1266 45.56 1220.43 7458.33
## 115 115 1266 39.16 1226.84 6231.49
## 116 116 1266 32.72 1233.28 4998.21
## 117 117 1266 26.24 1239.76 3758.46
## 118 118 1266 19.73 1246.26 2512.19
## 119 119 1266 13.19 1252.81 1259.38
## 120 120 1266 6.61 1259.38 0.00
De esta simulación tenemos, Tras el 10% de inicial, el monto financiado es USD 112.500; con tasa anual 6,30% (mensual 0,525%) y plazo 120 meses, la cuota fija resulta USD 1.265,996. La dinámica es la esperada de un francés: al inicio la cuota es mayormente interés y menor abono a capital (p. ej., en el primer mes el interés ronda USD 590,6 y el capital USD 675,4), mientras que en el mes 120 el interés cae a USD 6,61 y el abono a capital sube a USD 1.259,38, dejando saldo ≈ 0. El costo financiero total del crédito es ≈ USD 39.419,6 (suma de todas las cuotas menos el principal), equivalente a ~26% del monto financiado, antes de efectos cambiarios. Este cronograma en USD es la base que luego convertimos a COP con las trayectorias de TRM (σ mensual ≈ 4,01%) para medir la dispersión del costo en pesos y, más adelante, evaluar cuánto estabiliza la cobertura con futuros TRM.
5. Conversión de la simulación del credito a COP
En esta sección convertimos el cronograma del crédito en USD a COP usando tres trayectorias representativas de la TRM tomadas de la simulación GBM: MIN (la más baja al final del horizonte), MED (la intermedia o cercana a la media) y MAX (la más alta). Para cada mes aplicamos estas tres sendas a la cuota, el interés y el abono a capital en USD y obtenemos tres flujos en pesos: escenario optimista (MIN), que refleja apreciación del COP y menor costo en COP; escenario base (MED), que usamos como referencia para el presupuesto; y escenario estresado (MAX), que captura depreciación del COP y el mayor costo probable. Con estos resultados comparamos cuota mensual y costo total en COP entre escenarios, identificamos los meses más sensibles y definimos el colchón de liquidez necesario para enfrentar el caso MAX.
# Extaer datos TRM mas alta
print(trayectoria_max)
## [1] 3868.183 4067.623 3964.938 3919.014 4025.271 4084.040 3955.972
## [8] 3686.367 3829.862 3811.798 3787.141 3809.762 3655.497 3725.286
## [15] 3750.837 3728.286 3845.597 3666.598 3600.606 3773.522 3844.554
## [22] 4183.022 4130.101 3920.389 3995.996 4292.278 3864.534 3848.500
## [29] 3712.211 3516.692 3771.773 3946.242 3912.760 4316.561 4469.054
## [36] 4775.505 5027.977 5115.838 5181.177 5445.198 6035.339 6246.702
## [43] 6349.069 6437.524 6812.399 7352.219 7751.552 8010.847 7812.963
## [50] 8300.468 8015.265 8317.486 8302.116 7871.336 7785.835 7901.107
## [57] 8414.713 8405.710 7642.582 8529.892 8405.803 9105.823 9330.059
## [64] 9669.011 9955.789 10056.154 9696.811 9793.099 9300.090 9622.373
## [71] 9429.845 9732.587 9774.995 9603.894 10291.335 10969.214 10926.776
## [78] 11338.611 11394.419 11544.301 11929.079 12866.894 13402.494 12940.342
## [85] 12456.893 12761.187 13280.202 12344.374 12768.426 13354.069 14387.188
## [92] 14147.261 15216.109 15755.386 16039.117 16517.368 17111.850 17784.751
## [99] 18714.086 18589.884 18664.418 19547.345 18695.871 18120.758 18474.425
## [106] 18549.316 18127.450 19960.588 21198.451 22019.888 22482.103 23005.874
## [113] 23676.107 24753.615 25990.342 26176.331 26129.717 26491.379 26609.145
## [120] 27694.989
#simulacion credito COP con TRM MIN
simulacion_TRM_min <- data.frame(
Mes = credito_dolares$Mes,
Cuota_COP = credito_dolares$Cuota * trayectoria_min,
Interes_COP = credito_dolares$Interés * trayectoria_min,
AbonoCapital_COP = credito_dolares$Capital * trayectoria_min,
Saldo_COP = credito_dolares$Saldo * trayectoria_min
)
print(simulacion_TRM_min)
## Mes Cuota_COP Interes_COP AbonoCapital_COP Saldo_COP
## 1 1 5078344 2369171.61 2709132 448565471
## 2 2 5123834 2376066.87 2747767 449835864
## 3 3 5171564 2383617.24 2787906 451238298
## 4 4 4721259 2162716.96 2558505 409388974
## 5 5 5221657 2377091.38 2844566 449934857
## 6 6 4948575 2238624.38 2709951 423694228
## 7 7 4759778 2139531.56 2620247 404909327
## 8 8 4407020 1968225.14 2438795 372461745
## 9 9 4565865 2025895.32 2539934 383346726
## 10 10 4683566 2064468.42 2619097 390609678
## 11 11 4659379 2040116.23 2619263 385973267
## 12 12 4538247 1973671.51 2564540 373374357
## 13 13 4330112 1870328.00 2459784 353790721
## 14 14 4372458 1875563.46 2496895 354753720
## 15 15 4186337 1783194.26 2403142 337249864
## 16 16 4206379 1779038.95 2427340 336437085
## 17 17 4355765 1829008.48 2526722 345858690
## 18 18 4485907 1870013.90 2615893 353576418
## 19 19 4122246 1705782.74 2416431 322496417
## 20 20 4088201 1679133.11 2409067 317423874
## 21 21 4121970 1680240.08 2441730 317604153
## 22 22 3937650 1592850.80 2344768 301057200
## 23 23 3809216 1529011.98 2280204 288957449
## 24 24 3940666 1569387.22 2371278 296557627
## 25 25 4165775 1645875.91 2519899 310978478
## 26 26 3875014 1518693.27 2356321 286916624
## 27 27 3680429 1430686.82 2249742 270259278
## 28 28 3906802 1506124.64 2400647 284481503
## 29 29 3855418 1473890.47 2381528 278358368
## 30 30 3747975 1420648.43 2327297 268273766
## 31 31 3903544 1466912.19 2436631 276972447
## 32 32 3872884 1442695.08 2430189 272366820
## 33 33 3821165 1410842.83 2410322 266319274
## 34 34 3774739 1381178.73 2393530 260690054
## 35 35 3794740 1375878.13 2418862 259652531
## 36 36 3697501 1328237.99 2369233 250629699
## 37 37 3845733 1368546.36 2477156 258200275
## 38 38 4051064 1427920.12 2623112 269362968
## 39 39 4140380 1445339.21 2695041 272606693
## 40 40 4115503 1422579.36 2692892 268275887
## 41 41 4052073 1386730.93 2665311 261475789
## 42 42 4092043 1386284.64 2705758 261349256
## 43 43 4123006 1382477.26 2740529 260586282
## 44 44 3935822 1305971.58 2629850 246125809
## 45 45 3830595 1257621.10 2572973 236972468
## 46 46 3560287 1156305.90 2403953 217846463
## 47 47 3267516 1049657.22 2217859 197714521
## 48 48 3184193 1011522.06 2172646 190500086
## 49 49 3304691 1037975.90 2266715 195442399
## 50 50 3380982 1049760.29 2331222 197623116
## 51 51 3318776 1018439.45 2300336 191686716
## 52 52 3339342 1012590.84 2326751 190547840
## 53 53 3244651 972011.45 2272640 182872039
## 54 54 3034029 897746.61 2136258 168864843
## 55 55 2936358 857991.68 2078343 161350423
## 56 56 2919908 842345.09 2077563 158368973
## 57 57 2936704 836218.43 2100486 157179489
## 58 58 2967776 833931.00 2133845 156708679
## 59 59 2875461 797134.19 2078327 149755816
## 60 60 2950209 806646.87 2143539 151505201
## 61 61 3001112 809115.04 2191974 151927303
## 62 62 3123967 830269.49 2293697 155852961
## 63 63 3012185 788949.77 2223235 148052983
## 64 64 3084280 795871.02 2288385 149308186
## 65 65 2969407 754665.75 2214718 141532536
## 66 66 3293780 824225.62 2469555 154523754
## 67 67 3121908 768911.63 2352972 144107567
## 68 68 3060810 741750.83 2319035 138968251
## 69 69 3051724 727423.99 2324300 136231421
## 70 70 3067293 718875.68 2348418 134578029
## 71 71 2933499 675724.42 2257775 126450025
## 72 72 3237329 732618.35 2504711 137042080
## 73 73 3069989 682284.48 2387705 127570563
## 74 74 2949473 643455.77 2306017 120256615
## 75 75 3010794 644466.88 2366303 120390499
## 76 76 3078829 646335.19 2432494 120678468
## 77 77 3228171 664299.38 2563871 123968230
## 78 78 3053319 615583.93 2437736 114815857
## 79 79 3293822 650256.74 2643540 121216099
## 80 80 3538368 683637.25 2854731 127360894
## 81 81 3448294 651634.87 2796659 121322079
## 82 82 3479997 642809.80 2837187 119600309
## 83 83 3516373 634474.72 2881898 117968580
## 84 84 3554073 625977.24 2928096 116305268
## 85 85 3512937 603525.89 2909383 112049729
## 86 86 3453576 578323.87 2875252 107281070
## 87 87 3355412 547229.06 2808183 101423566
## 88 88 3332551 528838.49 2803686 97928858
## 89 89 3173274 489551.49 2683723 90564695
## 90 90 3051247 457180.89 2594066 84488013
## 91 91 3089043 449058.08 2639985 82894600
## 92 92 2927886 412494.33 2515392 76054556
## 93 93 2968648 404847.58 2563800 74549568
## 94 94 3175804 418699.47 2757105 76994670
## 95 95 2987906 380308.93 2607597 69831625
## 96 96 2937094 360385.57 2576708 66067370
## 97 97 2867010 338583.47 2528427 61962474
## 98 98 3019418 342606.14 2676812 62579533
## 99 99 2808719 305608.99 2503087 55709558
## 100 100 2690617 280176.94 2410440 50956625
## 101 101 2535816 252139.45 2283677 45741238
## 102 102 2677459 253554.98 2423904 45872303
## 103 103 2755849 247873.99 2507953 44707373
## 104 104 2505885 213415.91 2292449 38359836
## 105 105 2394033 192392.54 2201622 34445999
## 106 106 2387895 180374.73 2207501 32150159
## 107 107 2509050 177357.70 2331692 31449668
## 108 108 2259236 148670.57 2110565 26207833
## 109 109 2296801 139876.28 2156907 24486677
## 110 110 2372080 132769.03 2239311 23049928
## 111 111 2439860 124479.10 2315381 21393176
## 112 112 2299115 105839.20 2193276 17965840
## 113 113 2214586 90857.50 2123728 15181582
## 114 114 2271088 81730.45 2189339 13379558
## 115 115 2318478 71715.33 2246763 11411986
## 116 116 2190427 56611.98 2133815 8647879
## 117 117 2184682 45281.25 2139401 6485815
## 118 118 2006888 31276.39 1975596 3982373
## 119 119 1989858 20731.62 1969127 1979453
## 120 120 1991357 10397.21 1980944 0
#simulacion credito COP con TRM MED
simulacion_TRM_med <- data.frame(
Mes = credito_dolares$Mes,
Cuota_COP = credito_dolares$Cuota * trayectoria_med,
Interes_COP = credito_dolares$Interés * trayectoria_med,
AbonoCapital_COP = credito_dolares$Capital * trayectoria_med,
Saldo_COP = credito_dolares$Saldo * trayectoria_med
)
print(simulacion_TRM_med)
## Mes Cuota_COP Interes_COP AbonoCapital_COP Saldo_COP
## 1 1 4982415 2324418.57 2657957 440092186
## 2 2 4977437 2308178.37 2669259 436983246
## 3 3 4785229 2205552.03 2579639 417529094
## 4 4 4823695 2209640.78 2614016 418271364
## 5 5 5132149 2336343.87 2795805 442222186
## 6 6 4855453 2196498.18 2658955 415721195
## 7 7 4444469 1997799.54 2446670 378086346
## 8 8 4683185 2091563.72 2591621 395802012
## 9 9 4602285 2042054.98 2560194 386404513
## 10 10 4993237 2200968.32 2792269 416436269
## 11 11 4915944 2152453.40 2763490 407226539
## 12 12 4817003 2094901.48 2722063 396308347
## 13 13 4759765 2055910.39 2703855 388895434
## 14 14 4695538 2014148.45 2681390 380966398
## 15 15 4666066 1987537.63 2678528 375896675
## 16 16 4552686 1925505.79 2627180 364135679
## 17 17 4831440 2028746.77 2802655 383628459
## 18 18 4912507 2047848.02 2864659 387200741
## 19 19 5379550 2226054.35 3153453 420859314
## 20 20 5244989 2154257.10 3090732 407241470
## 21 21 5499817 2241892.05 3257925 423769337
## 22 22 5465127 2210743.20 3254341 417842119
## 23 23 5675010 2277938.42 3397072 430491900
## 24 24 5712480 2275020.17 3437460 429896825
## 25 25 5854185 2312957.95 3541227 437019668
## 26 26 5883120 2305709.05 3577411 435602284
## 27 27 6183061 2403530.73 3779530 454031219
## 28 28 5876743 2265563.50 3611133 427926676
## 29 29 6005862 2295985.05 3709877 433618822
## 30 30 6713193 2544597.03 4168543 480519048
## 31 31 6731415 2529597.56 4201817 477621516
## 32 32 7065427 2631955.10 4433471 496887562
## 33 33 7137967 2635465.98 4502501 497486589
## 34 34 7092005 2594967.95 4496981 489786239
## 35 35 7124147 2583037.88 4541109 487464918
## 36 36 6857440 2463370.18 4394016 464821616
## 37 37 7116070 2532331.75 4583682 477768801
## 38 38 7351926 2591408.61 4760459 488843531
## 39 39 7922245 2765526.70 5156718 521608410
## 40 40 7831916 2707207.54 5124647 510536372
## 41 41 7754069 2653655.44 5100352 500361415
## 42 42 7632835 2585818.90 5047016 487491405
## 43 43 8016701 2688064.41 5328637 506679371
## 44 44 7837501 2600614.17 5236887 490116533
## 45 45 7428964 2439000.39 4989963 459578760
## 46 46 7444564 2417836.89 5026669 455517189
## 47 47 8008657 2572702.11 5435955 484596837
## 48 48 8167317 2594510.27 5572743 488624466
## 49 49 8884530 2790556.62 6093974 525439059
## 50 50 9163256 2845096.99 6318159 535605070
## 51 51 9219571 2829228.63 6390343 532506417
## 52 52 9397045 2849472.06 6547573 536209421
## 53 53 9574223 2868183.26 6706040 539613521
## 54 54 10071614 2980115.90 7091419 560555505
## 55 55 10004665 2923322.09 7081264 549748057
## 56 56 10174049 2935044.52 7239005 551816577
## 57 57 9932671 2828300.60 7104370 531620480
## 58 58 9287411 2609718.39 6677692 490406902
## 59 59 9792367 2714635.99 7077731 509992589
## 60 60 9702730 2652922.69 7049731 498274523
## 61 61 9441481 2545471.11 6895936 477962392
## 62 62 9036798 2401746.70 6635051 450840768
## 63 63 9401737 2462497.56 6939239 462108138
## 64 64 9503233 2452224.49 7050934 460045887
## 65 65 9725682 2471752.02 7253853 463560633
## 66 66 9799620 2452227.23 7347393 459737415
## 67 67 9998774 2462652.25 7536043 461544359
## 68 68 10084743 2443917.16 7640746 457871943
## 69 69 9700356 2312224.70 7388131 433031712
## 70 70 10090806 2364962.90 7725843 442735864
## 71 71 9754344 2246889.32 7507455 420466095
## 72 72 9447738 2138054.42 7309683 399940057
## 73 73 9749198 2166693.80 7582504 405118913
## 74 74 9155772 1997419.20 7158353 373301297
## 75 75 8839762 1892169.99 6947523 353469351
## 76 76 8746260 1836092.74 6910167 342820352
## 77 77 8580864 1765787.30 6815077 329522398
## 78 78 8991334 1812755.16 7178579 338106679
## 79 79 9119598 1800364.16 7319161 335610701
## 80 80 8984376 1735843.93 7248532 323385880
## 81 81 8910621 1683868.07 7226753 313504364
## 82 82 8745657 1615459.59 7130197 300570194
## 83 83 7935290 1431799.56 6503490 266216060
## 84 84 7872398 1386561.86 6485836 257620309
## 85 85 7997670 1374007.37 6623600 255096186
## 86 86 7791936 1304810.83 6487126 242046901
## 87 87 7468221 1217980.80 6250241 225740857
## 88 88 7566559 1200728.00 6365771 222347512
## 89 89 7263032 1120491.87 6142540 207285661
## 90 90 7027914 1053021.39 5974893 194600619
## 91 91 7046446 1024350.71 6022096 189091667
## 92 92 7386421 1040633.56 6345788 191869117
## 93 93 7895427 1076734.22 6818693 198272328
## 94 94 8065800 1063398.70 7002402 195548451
## 95 95 8453503 1075985.30 7377517 197570440
## 96 96 9330796 1144901.92 8185894 209888146
## 97 97 9432902 1113991.49 8318911 203866031
## 98 98 9322157 1057762.95 8264394 193208191
## 99 99 8947004 973499.08 7973434 177459447
## 100 100 9093085 946873.15 8146212 172210678
## 101 101 8952007 890109.53 8061898 161476956
## 102 102 8699441 823835.69 7875605 149045544
## 103 103 9016808 811014.19 8205723 146277203
## 104 104 9033812 769372.51 8264368 138288679
## 105 105 8312075 667986.19 7644023 119596382
## 106 106 8295816 626642.11 7669109 111693271
## 107 107 9201834 650451.95 8551382 115340343
## 108 108 8591208 565350.34 8025858 99660658
## 109 109 8975531 546614.10 8428846 95690009
## 110 110 8959178 501459.18 8457718 87057942
## 111 111 8211899 418962.53 7792937 72003566
## 112 112 8221023 378452.80 7842571 64241065
## 113 113 8522592 349655.14 8172936 58424654
## 114 114 8210840 295486.46 7915289 48372159
## 115 115 8180753 253047.62 7927705 40267204
## 116 116 8171345 211189.90 7960155 32260741
## 117 117 8512950 176445.35 8336505 25272973
## 118 118 8414679 131138.72 8283474 16697688
## 119 119 8454890 88088.47 8366801 8410679
## 120 120 8352618 43610.43 8308941 0
#simulacion credito COP con TRM MAX
simulacion_TRM_max <- data.frame(
Mes = credito_dolares$Mes,
Cuota_COP = credito_dolares$Cuota * trayectoria_max,
Interes_COP = credito_dolares$Interés * trayectoria_max,
AbonoCapital_COP = credito_dolares$Capital * trayectoria_max,
Saldo_COP = credito_dolares$Saldo * trayectoria_max
)
print(simulacion_TRM_max)
## Mes Cuota_COP Interes_COP AbonoCapital_COP Saldo_COP
## 1 1 4897119 2284626.0 2612454 432558085
## 2 2 5149611 2388020.1 2761591 452098846
## 3 3 5019611 2313580.7 2705991 437979812
## 4 4 4961472 2272754.0 2688679 430218309
## 5 5 5095993 2319884.3 2776108 439106722
## 6 6 5170395 2338970.5 2831424 442686282
## 7 7 5008261 2251225.1 2757036 426047484
## 8 8 4666941 2084308.8 2582632 394429107
## 9 9 4848605 2151348.3 2697218 407085354
## 10 10 4825736 2127135.7 2698600 402466691
## 11 11 4794521 2099288.3 2695233 397168133
## 12 12 4823158 2097578.5 2725542 396814783
## 13 13 4627859 1998935.5 2628924 378118072
## 14 14 4716212 2023016.3 2693195 382643713
## 15 15 4748560 2022676.5 2725883 382542370
## 16 16 4720010 1996273.3 2723736 377518634
## 17 17 4868526 2044319.5 2824168 386573198
## 18 18 4641913 1935047.1 2706866 365872687
## 19 19 4558367 1886249.4 2672082 356615557
## 20 20 4777278 1962155.7 2815123 370926567
## 21 21 4867205 1984020.4 2883185 375025646
## 22 22 5295706 2142209.4 3153455 404888862
## 23 23 5228708 2098793.5 3129915 396636533
## 24 24 4963212 1976620.8 2986591 373510093
## 25 25 5058931 1998757.2 3060174 377653301
## 26 26 5434024 2129699.6 3304324 402349992
## 27 27 4892500 1901853.3 2990647 359263453
## 28 28 4872201 1878298.7 2993863 354778903
## 29 29 4699659 1796635.8 2903023 339311930
## 30 30 4452132 1687554.9 2764542 318676103
## 31 31 4775064 1794420.9 2980643 338810419
## 32 32 4995943 1861047.8 3134895 351347750
## 33 33 4953555 1828941.6 3124613 345242145
## 34 34 5464766 1999560.4 3465162 377406263
## 35 35 5657822 2051385.0 3606437 387132629
## 36 36 6045789 2171804.2 3873937 409805047
## 37 37 6365418 2265204.0 4100164 427370473
## 38 38 6476650 2282891.4 4193708 430644818
## 39 39 6559370 2289769.4 4269601 431875402
## 40 40 6893621 2382873.2 4510693 449372055
## 41 41 7640739 2614870.8 5025808 493048365
## 42 42 7908325 2679148.0 5229177 505086276
## 43 43 8037921 2695179.7 5342741 508020546
## 44 44 8149906 2704275.2 5445631 509652685
## 45 45 8624497 2831505.4 5792991 533538150
## 46 46 9307910 3023012.1 6284824 569531375
## 47 47 9813465 3152478.7 6660986 593804165
## 48 48 10141733 3221722.5 6919930 606747423
## 49 49 9891211 3106746.4 6784464 584975025
## 50 50 10508393 3262748.0 7245645 614230155
## 51 51 10147325 3113930.4 7033395 586091878
## 52 52 10529937 3192999.7 7336938 600853950
## 53 53 10510478 3148660.4 7361818 592381853
## 54 54 9965111 2948602.3 7016430 554627849
## 55 55 9856867 2880136.0 6976653 541626649
## 56 56 10002801 2885642.1 7117159 542528454
## 57 57 10653027 3033419.9 7619607 570175648
## 58 58 10641629 2990247.4 7651382 561914250
## 59 59 9675509 2682240.5 6993268 503906521
## 60 60 10798844 2952622.2 7846136 554564386
## 61 61 10641747 2869068.8 7772594 538724245
## 62 62 11527972 3063836.2 8464136 575124044
## 63 63 11811855 3093754.4 8718101 580568727
## 64 64 12240968 3158672.6 9082199 592578021
## 65 65 12604029 3203275.1 9400654 600752922
## 66 66 12731090 3185789.4 9545301 597263821
## 67 67 12276162 3023562.5 9252503 566668810
## 68 68 12398063 3004522.7 9393443 562902331
## 69 69 11773914 2806488.2 8967426 525597005
## 70 70 12181925 2855054.4 9326870 534484067
## 71 71 11938183 2749931.3 9188252 514601611
## 72 72 12321456 2788386.3 9533069 521589798
## 73 73 12375144 2750292.7 9624851 514237680
## 74 74 12158530 2652499.5 9506030 495730436
## 75 75 13028831 2788849.0 10239879 520974672
## 76 76 13887025 2915288.1 10971737 544318959
## 77 77 13833299 2846643.7 10986655 531226418
## 78 78 14354682 2894067.1 11460615 539787966
## 79 79 14425335 2847807.2 11577414 530867359
## 80 80 14615085 2823736.0 11791349 526059013
## 81 81 15102214 2853912.8 12248301 531344550
## 82 82 16289488 3008923.1 13280564 559836106
## 83 83 16967558 3061531.7 13906026 569233946
## 84 84 16382473 2885437.4 13497035 536108273
## 85 85 15770426 2709374.1 13060927 503018413
## 86 86 16155663 2705371.7 13450292 501855775
## 87 87 16812736 2741963.4 14070773 508196163
## 88 88 15627978 2479984.8 13147869 459236764
## 89 89 16164828 2493801.4 13671026 461341376
## 90 90 16906252 2533133.4 14373119 468128508
## 91 91 18214180 2647818.1 15566362 488778239
## 92 92 17910432 2523305.4 15387127 465240030
## 93 93 19263594 2627061.2 16636533 483753120
## 94 94 19946319 2629731.6 17316588 483581495
## 95 95 20305522 2584543.3 17720979 474569077
## 96 96 20910988 2565807.9 18345180 470374497
## 97 97 21663602 2558392.7 19105209 468198693
## 98 98 22515495 2554779.5 19960715 466649278
## 99 99 23692032 2577865.3 21113980 469919861
## 100 100 23534793 2450704.4 21084089 445717009
## 101 101 23629153 2349476.9 21279676 426224373
## 102 102 24746939 2343531.2 22403408 423983681
## 103 103 23668973 2128898.9 21539887 383975243
## 104 104 22940879 1953780.1 20986918 351176663
## 105 105 23388622 1879588.0 21508849 336521808
## 106 106 23483434 1773871.1 21709377 316176427
## 107 107 22949352 1622225.5 21327126 287658520
## 108 108 25270104 1662916.6 23607188 293140995
## 109 109 26837239 1634400.6 25202626 286117398
## 110 110 27877178 1560329.3 26316849 270887560
## 111 111 28462342 1452119.0 27010223 249563479
## 112 112 29125437 1340782.4 27784655 227593205
## 113 113 29973952 1229737.0 28744215 205479490
## 114 114 31338076 1127774.7 30210054 184620629
## 115 115 32903773 1017781.8 31885991 161958558
## 116 116 33139236 856489.6 32282746 130834801
## 117 117 33080222 685643.8 32394578 98207496
## 118 118 33538085 522674.9 33015145 66551376
## 119 119 33687177 350974.6 33336203 33511025
## 120 120 35061856 183063.9 34878516 0
resumen_credito <- function(df, tasa_desc = 0.10){
data.frame(
total_cop = sum(df$Cuota_COP),
vp_cop = sum(df$Cuota_COP / (1 + tasa_desc)^(df$Mes/12)),
cuota_prom = mean(df$Cuota_COP),
cuota_max = max(df$Cuota_COP),
mes_max = df$Mes[which.max(df$Cuota_COP)],
sd_mensual = sd(df$Cuota_COP),
cv_mensual = sd(df$Cuota_COP)/mean(df$Cuota_COP)
)
}
tasa_desc <- 0.10 # ajusta según BanRep/WACC del proyecto
tab <- rbind(
MIN = resumen_credito(simulacion_TRM_min, tasa_desc),
MED = resumen_credito(simulacion_TRM_med, tasa_desc),
MAX = resumen_credito(simulacion_TRM_max, tasa_desc)
)
# Sensibilidades vs presupuesto (MED)
tab$delta_total_vs_MED <- tab$total_cop - tab["MED","total_cop"]
tab$delta_vp_vs_MED <- tab$vp_cop - tab["MED","vp_cop"]
round(tab, 0)
Como presupuesto base (MED), el costo total del crédito asciende a 830.384.169 COP y el valor presente (VP) a 500.015.936 COP, con una cuota promedio de 6.919.868. Bajo apreciación del COP (MIN), el total cae a 301.627.764 (−63,7% vs. MED) y el VP a 211.169.126 (−57,8%), con cuota promedio de 2.513.565. En el estrés de depreciación (MAX), el total se expande a 1.812.038.764 (+118,2%) y el VP a 976.392.562 (+95,3%), con cuota promedio de 15.100.323. En términos operativos, la brecha de pago mensual entre MAX y MED es de 8,18 millones en promedio, que sirve como referencia de colchón de liquidez por crédito (la brecha MIN–MED es de 4,41 millones a favor). La diferencia relativa mayor en VP frente a total confirma que depreciaciones tempranas encarecen más el crédito (por mayor saldo al inicio).
PARTE2 PROCESO FUTURO
En esta parte diseñamos, implementamos y evaluamos una cobertura con futuros de TRM listados en la BVC para proteger el 75% de la exposición cambiaria del crédito desde el año 6 hasta el año 10. El objetivo es estabilizar el flujo en COP del servicio de la deuda, limitando el impacto de depreciaciones del peso y trasladando el riesgo direccional del tipo de cambio a flujos de margen (mark-to-market). Para ello: (i) seleccionamos un contrato de futuro TRM y calculamos retornos y volatilidad con su serie histórica; (ii) fijamos el precio inicial del primer vencimiento con una tasa en USD que emule condiciones de mercado (y/o con riesgo de base) y luego simulamos trayectorias mensuales del futuro mediante GBM para el tramo meses 61–120; (iii) determinamos el número de contratos para cubrir el 75% del nocional, y modelamos margen inicial y de mantenimiento según la ficha de la BVC; (iv) incorporamos rollover a cada vencimiento y registramos variación de márgenes, llamadas de margen y cambios de posición según la expectativa de mercado; y (v) comparamos el crédito sin cobertura vs. cubierto, evaluando reducción de volatilidad, costo/beneficio neto (incluidos márgenes) y el requerimiento de liquidez. Con esto concluimos si la cobertura con futuros fue efectiva y rentable para la inversión en maquinaria.
datos_Futuro <- read.table("Futuro TRM.txt",
header = TRUE, # TRUE si la primera fila tiene nombres de columnas
sep = "\t", # "\t" si es tabulado, "," si es CSV
stringsAsFactors = FALSE)
1. Metodología cuantitativa
a. Retornos y volatilidad. El primer paso del análisis de cobertura consiste en caracterizar estadísticamente el futuro de TRM negociado en la BVC, ya que su comportamiento histórico define los parámetros de riesgo para la simulación. En particular, se calculan los retornos logarítmicos mensuales, que permiten medir la variación porcentual relativa del precio, y la desviación estándar de dichos retornos, que representa su volatilidad. Estos indicadores son fundamentales: el retorno medio refleja la tendencia esperada en los precios del contrato, mientras que la desviación estándar mide la magnitud de las fluctuaciones a las que se enfrentará la cobertura. A partir de estos valores se calibran los parámetros del GBM (media y sigma), lo que permitirá proyectar escenarios de precios futuros y estimar tanto el riesgo de liquidez por márgenes como la efectividad de la cobertura en la reducción de la exposición cambiaria del crédito.
# Calcular retornos mensuales
datos_Futuro <- datos_Futuro %>%
arrange(Fecha) %>%
mutate(retorno = log(TRM / lag(TRM)))
print(datos_Futuro)
## Fecha TRM retorno
## 1 12/06/2025 4255.00 NA
## 2 12/09/2025 3919.86 -0.0820388231
## 3 14/08/2025 4047.75 0.0321052323
## 4 15/07/2025 4011.30 -0.0090457929
## 5 15/09/2025 3909.26 -0.0257672805
## 6 16/09/2025 3892.00 -0.0044249334
## 7 17/09/2025 3889.88 -0.0005448555
## 8 2/09/2025 4026.65 0.0345564559
## 9 31/07/2025 4169.00 0.0347414341
## 10 4/09/2025 4013.00 -0.0381371076
## 11 5/09/2025 3983.00 -0.0075037871
## 12 8/09/2025 3961.39 -0.0054403304
## 13 9/09/2025 3956.12 -0.0013312268
# Calcular desviación estándar mensual
desviacion_mensual <- sd(datos_Futuro$TRM, na.rm = TRUE)
print(paste("Desviación estándar mensual:", round(desviacion_mensual, 4)))
## [1] "Desviación estándar mensual: 107.6006"
La desviación estándar mensual del futuro es 107,6 COP por USD. Esto significa que, en un mes típico, el precio del contrato oscila ±107,6 COP alrededor de su media. Si el futuro promedia $4.100, esa dispersión equivale a ≈2,6% mensual (107,6/4.100)(107,6/4.100). En términos operativos, por un contrato de USD 50.000 el mark-to-market de 1σ sería de ≈ $5,38 millones COP (107,6 × 50.000), útil para dimensionar márgenes y liquidez.
2. Simulación BMG del futuro de TRM
En esta etapa simulamos el precio del futuro de TRM con un Browniano Geométrico (GBM) para generar un abanico de escenarios mensuales entre los meses 61–120. Partimos de un precio inicial (por paridad de tasas o el primer vencimiento observado) y usamos como parámetros la media y la volatilidad estimadas de los retornos log mensuales del propio futuro. Con estas trayectorias modelamos el rollover de contratos de corto plazo y el mark-to-market, lo que permite cuantificar márgenes (inicial y de mantenimiento), llamadas de margen y requerimientos de liquidez, y medir la efectividad del hedge sobre el 75% de la exposición del crédito.
# Simulación BMG del Futuro de la TRM en Colombia
# -----------------------------------------------
# --- Parámetros del modelo ---
mu_anual <- -0.08580
sigma_anual <- 0.07351
mu_mensual <- mu_anual / 12
sigma_mensual <- sigma_anual / sqrt(12)
# --- Cálculo del futuro TRM a 6 años como punto inicial ---
TRM_spot <- 3889.88
r_COP <- 0.0644
r_USD <- 0.063
F6_futuroTRM_0 <- TRM_spot * ((1 + r_COP) / (1 + r_USD))^6
cat("Valor inicial F6_futuroTRM_0:", round(F6_futuroTRM_0, 2), "\n")
## Valor inicial F6_futuroTRM_0: 3920.72
# --- Parámetros de simulación ---
T <- 48 # 4 años
N <- 1000 # número de simulaciones
set.seed(42)
# Crear matriz con una fila adicional para el periodo 0
simulaciones <- matrix(NA, nrow = T + 1, ncol = N)
# Establecer el valor inicial en el periodo 0
simulaciones[1, ] <- F6_futuroTRM_0
# Generar caminatas desde el mes 1 al 48
for (j in 1:N) {
pasos <- rnorm(T, mean = mu_mensual - 0.5 * sigma_mensual^2, sd = sigma_mensual)
simulaciones[2:(T + 1), j] <- F6_futuroTRM_0 * exp(cumsum(pasos))
}
sim_df <- as.data.frame(simulaciones)
sim_df$Mes <- 0:T
simulaciones_long <- sim_df %>%
tidyr::pivot_longer(cols = starts_with("V"),
names_to = "Simulacion", values_to = "TRM") %>%
mutate(Simulacion = sub("^V", "Sim_", Simulacion))
# --- Graficar las trayectorias ---
ggplot(simulaciones_long %>% filter(Simulacion %in% paste0("Sim_", 1:500)),
aes(x = Mes, y = TRM, group = Simulacion, color = Simulacion)) +
geom_line(alpha = 0.6) +
labs(title = "Simulación BMG de TRM (Años 6 a 10)",
subtitle = paste("Valor inicial en t=0 (F6_futuroTRM_0):", round(F6_futuroTRM_0, 2)),
x = "Mes",
y = "TRM simulada (COP)") +
theme_minimal() +
theme(legend.position = "none")
# Extraer la fila correspondiente al mes final (mes 48)
finales <- sim_df[sim_df$Mes == 48, ]
# Quitar la columna "Mes" y convertir en vector
finales_vector <- unlist(finales[ , -ncol(finales)])
# Obtener índices de simulaciones con valores máximos y mínimos
idx_max <- which.max(finales_vector)
idx_min <- which.min(finales_vector)
# Nombres de las simulaciones correspondientes
sim_max <- paste0("Sim_", idx_max)
sim_min <- paste0("Sim_", idx_min)
# Filtrar las trayectorias máxima y mínima del dataframe largo
trayectorias_extremas <- simulaciones_long %>%
filter(Simulacion %in% c(sim_max, sim_min)) %>%
mutate(Tipo = case_when(
Simulacion == sim_max ~ "Máxima",
Simulacion == sim_min ~ "Mínima"
))
# Gráfico completo con trayectorias aleatorias + destacadas
ggplot() +
# Simulaciones normales
geom_line(data = simulaciones_long %>%
filter(Simulacion %in% paste0("Sim_", 1:500)),
aes(x = Mes, y = TRM, group = Simulacion),
color = "gray70", alpha = 0.3) +
# Trayectorias extrema (máxima y mínima)
geom_line(data = trayectorias_extremas,
aes(x = Mes, y = TRM, color = Tipo),
size = 1.2) +
scale_color_manual(values = c("Máxima" = "forestgreen", "Mínima" = "firebrick")) +
labs(title = "Simulación BMG de TRM (Años 6 a 10)",
subtitle = paste("Valor inicial en t=0 (F6_futuroTRM_0):", round(F6_futuroTRM_0, 2)),
x = "Mes", y = "TRM simulada (COP)",
color = "Trayectoria") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Agregar columna que marca si es rollover (cada 3 meses)
simulaciones_long <- simulaciones_long %>%
mutate(Rollover = if_else(Mes %% 3 == 0 & Mes != 0, "Sí", "No"))
ggplot() +
# Todas las simulaciones en gris
geom_line(data = simulaciones_long %>%
filter(Simulacion %in% paste0("Sim_", 1:500)),
aes(x = Mes, y = TRM, group = Simulacion),
color = "gray70", alpha = 0.3) +
# Trayectorias máxima y mínima destacadas
geom_line(data = trayectorias_extremas,
aes(x = Mes, y = TRM, color = Tipo),
size = 1.2) +
# Puntos de rollover (en rojo)
geom_point(data = simulaciones_long %>%
filter(Simulacion %in% paste0("Sim_", 1:500), Rollover == "Sí"),
aes(x = Mes, y = TRM),
color = "red", size = 1.2, alpha = 0.5) +
scale_color_manual(values = c("Máxima" = "forestgreen", "Mínima" = "firebrick")) +
labs(title = "Simulación BMG de TRM (Años 6 a 10)",
subtitle = paste("Valor inicial en t=0 (F6_futuroTRM_0):", round(F6_futuroTRM_0, 2)),
x = "Mes", y = "TRM simulada (COP)",
color = "Trayectoria") +
theme_minimal()
La distribución simulada a 48 meses muestra una mediana por debajo de F₀
—el contrato tiene costo esperado— pero mantiene una cola superior
amplia, es decir, hay escenarios de depreciación relevante del COP en
los que el futuro sube por encima del nivel inicial. La dispersión
mensual observada en el propio futuro (SD ≈ 107,6 COP) implica un
mark-to-market típico de 1σ ≈ $5,38 millones COP por contrato de USD
50.000, que dimensiona las llamadas de margen y el colchón de liquidez
necesario. En síntesis, los datos dicen que la cobertura con futuros
“paga seguro”: sacrifica carry (μ<0) a cambio de recortar las
pérdidas en los escenarios que más encarecen el crédito en COP (cola
derecha), estabilizando los flujos entre los años 6–10.
3. Exposición y margenes En esta sección cuantificamos la exposición cambiaria a cubrir del proyecto y el requerimiento de márgenes para operar futuros de TRM. Partimos del valor del crédito en COP y cubrimos el 75% desde el año 6; esa exposición se convierte a USD con la TRM spot para obtener el nocional a cubrir. Con la especificación del contrato de la BVC (USD por contrato) calculamos el número de contratos necesarios. Sobre el nocional por contrato se determina el margen inicial y el margen de mantenimiento (p. ej., 5% y 75% del inicial, según ficha), y se proyectan los flujos de variación por mark-to-market. Usamos la desviación mensual del futuro (~107,6 COP) para estimar el MTM típico por contrato y, con ello, el colchón de liquidez y la política de reposición ante margin calls. Este marco deja lista la comparación entre crédito sin cobertura y crédito cubierto, y define la disciplina de rollover durante los meses 61–120.
# 6. Exposición y márgenes (según BVC)
# ------------------------------------------------------------
MAQUINARIA_AMARILLA <- 500000000
VALOR_EN_USD <- 125000
INICIAL_0.10 <- 12500
CREDITO_USD <-112500
## APALANCAMIENTO 75% FUTURO
PRESTAMO_EN_PESOS <- 450000000
NOMINAL_CONTRATO <-50000
PRECIO_INICIAL <-4842
GARANTIA_INICIAL <- 0.063
CONTRATOS_OPTIMOS <-2
MARGEN_MANTENIMIENTO <-GARANTIA_INICIAL/2
EXPOSICION_TOTAL <-PRECIO_INICIAL*NOMINAL_CONTRATO*CONTRATOS_OPTIMOS
MARGEN_INCIAL <-EXPOSICION_TOTAL*GARANTIA_INICIAL
NUMERO_CONTRATOS <- PRESTAMO_EN_PESOS/EXPOSICION_TOTAL
# Definición de parámetros
credito_cop <- 500e6 # valor de la maquinaria en COP
precio_usd <- S0 # TRM spot (debería ser inicializado en otro lugar de tu código)
tamaño_contrato <- 1000 # USD por contrato (BVC)
# Exposición a cubrir = 75% del crédito
exposicion_cop <- credito_cop * 0.75
exposicion_usd <- exposicion_cop / precio_usd
# Número de contratos necesarios
n_contratos <- ceiling(exposicion_usd / tamaño_contrato)
# Valor nocional por contrato
nocional <- tamaño_contrato * precio_usd
# Márgenes
margen_inicial <- 0.05 * nocional # Margen inicial es el 5% del valor nocional
margen_mantenimiento <- 0.75 * margen_inicial # Margen de mantenimiento es el 75% del margen inicial
# Mostrar resultados
cat("Exposición total (COP):", exposicion_cop, "\n")
## Exposición total (COP): 3.75e+08
cat("Número de contratos:", n_contratos, "\n")
## Número de contratos: 94
cat("Nocional por contrato (COP):", nocional, "\n")
## Nocional por contrato (COP): 4013990
cat("Margen inicial (COP):", margen_inicial, "\n")
## Margen inicial (COP): 200699.5
cat("Margen de mantenimiento (COP):", margen_mantenimiento, "\n")
## Margen de mantenimiento (COP): 150524.6
Tenemos que, Para cubrir el 75% del crédito se necesita cubrir una exposición de ~375 millones COP. Con un contrato TRM de la BVC equivalente a USD 1.000 (≈ 4.013.990 COP por contrato al spot usado), resulta en 94 contratos, que cubren ≈100,6% de la exposición (ligero sobre-hedge de 2,3 millones COP). El margen inicial por contrato es 200.700 COP y el margen de mantenimiento 150.525 COP; en total, abrir la posición exige 18,87 millones COP de inicial y mantener al menos ~14,15 millones COP como balance. Con la desviación mensual del futuro ≈ 107,6 COP, el mark-to-market típico (1σ) es 107.600 COP por contrato, es decir ~10,1 millones COP para los 94 contratos; esto da la escala de posibles llamadas de margen y sugiere reservar un colchón de liquidez que cubra al menos el margen inicial total + 1–2σ de MTM para operar con holgura durante el rollover.
4.Flujo de caja
En esta parte construimos el flujo de caja de la cobertura con futuros de TRM para los últimos 4 años del crédito (meses 61–120). Partimos del depósito de margen inicial, y luego registramos mes a mes el mark-to-market (variation margin), las llamadas de margen cuando el saldo cae por debajo del margen de mantenimiento, y las liberaciones de margen cuando reducimos o cerramos contratos (incluyendo los rollovers periódicos). Con ello obtenemos el cash flow neto del hedge (P&L ± aportes/liberaciones), la exigencia de liquidez y los picos de uso de caja. Este flujo se comparará con el del crédito en COP para medir la efectividad de la cobertura: cuánto estabiliza los pagos, cuánto cuesta mantenerla (márgenes) y cuál es el colchón de liquidez recomendado.
# Flujo de caja de márgenes — últimos 4 años (48 meses)
# Parámetros
sim_fut <- simulaciones
if (!exists("sim_fut")) stop("Necesitas ejecutar la simulación 'sim_fut' antes de este bloque.")
if (!exists("n_contratos")) {
precio_usd <- as.numeric(last(fut_mensual))
tamaño_contrato <- 1000
credito_cop <- 500e6
n_contratos <- ceiling((credito_cop * 0.75) / precio_usd)
}
if (!exists("margen_inicial")) margen_inicial <- 0.05 * tamaño_contrato * as.numeric(last(fut_mensual))
if (!exists("margen_mantenimiento")) margen_mantenimiento <- 0.75 * margen_inicial
T_total <- nrow(sim_fut) # debe ser 120
start_last4y <- T_total - 48 + 1 # mes de inicio de los últimos 48 meses (p.ej. 73)
end_last4y <- T_total # 120
if (!exists("idx_med")) {
finales_all <- sim_fut[T_total, ]
idx_med <- which.min(abs(finales_all - mean(finales_all)))
}
traj <- sim_fut[start_last4y:end_last4y, idx_med] # vector length 48
meses <- seq_len(length(traj))
fechas <- seq.Date(from = as.Date("2025-01-01"), by = "month", length.out = length(traj))
# Iniciamos variables de seguimiento
n_periods <- length(traj)
pos_contracts <- rep(NA_integer_, n_periods) # contratos en cada mes
pnl_variation <- numeric(n_periods) # P&L liquidado cada mes (variation margin)
postings <- numeric(n_periods) # aportes (margen inicial extra) por abrir contratos o margin call
releases <- numeric(n_periods) # liberaciones de margen al reducir contratos
margin_balance <- numeric(n_periods) # saldo en cuenta de margen al cierre del mes
cashflow_net <- numeric(n_periods) # neto: pnl + releases - postings
# Inicial: abrimos la posición con n_contratos al precio t=1 y depositamos margen inicial total
pos_contracts[1] <- n_contratos
margin_balance[1] <- n_contratos * margen_inicial
postings[1] <- margin_balance[1] # aporte inicial (outflow)
pnl_variation[1] <- 0 # sin P&L en primera marca (no hay previo)
releases[1] <- 0
cashflow_net[1] <- -postings[1] # negativo porque es salida de caja
# Reglas de ajuste (ejemplo): MA3 vs precio actual => +/- 1 contrato
max_contracts <- max(5, n_contratos * 2) # tope razonable, modificable
min_contracts <- 1
for (t in 2:n_periods) {
price_prev <- traj[t-1]
price_now <- traj[t]
# 1) Variación de precio -> P&L (long position): P&L = (price_now - price_prev) * tamaño_contrato * pos_contracts[t-1]
pnl <- (price_now - price_prev) * tamaño_contrato * pos_contracts[t-1]
pnl_variation[t] <- pnl
# 2) Actualizar margin balance por P&L (variation margin se liquida en la cuenta)
current_balance <- margin_balance[t-1] + pnl
# 3) Rollover/ajuste de posición: calculamos MA3 (si hay suficientes puntos)
lookback <- 3
ma3 <- if (t >= lookback+1) mean(traj[(t-lookback): (t-1)]) else mean(traj[1:(t-1)])
desired_pos <- pos_contracts[t-1]
if (ma3 > price_now) {
desired_pos <- min(max_contracts, pos_contracts[t-1] + 1) # aumentar 1 contrato
} else if (ma3 < price_now) {
desired_pos <- max(min_contracts, pos_contracts[t-1] - 1) # reducir 1 contrato
}
delta_pos <- desired_pos - pos_contracts[t-1]
# 4) Si aumentamos posición => necesitamos posting de margen inicial por nuevos contratos
if (delta_pos > 0) {
add_posting <- delta_pos * margen_inicial
postings[t] <- add_posting
current_balance <- current_balance - add_posting # salida de caja para cubrir nuevo margen
} else {
postings[t] <- 0
}
# 5) Si reducimos posición => liberamos margen (asumimos liberan margen inicial íntegro)
if (delta_pos < 0) {
release_amount <- (-delta_pos) * margen_inicial
releases[t] <- release_amount
current_balance <- current_balance + release_amount
} else {
releases[t] <- 0
}
# Actualizamos posición
pos_contracts[t] <- desired_pos
# 6) Margin calls: si current_balance < total_margin_mantenimiento => top-up hasta initial margin total
total_initial_needed <- pos_contracts[t] * margen_inicial
total_maintenance_threshold <- pos_contracts[t] * margen_mantenimiento
if (current_balance < total_maintenance_threshold) {
top_up <- total_initial_needed - current_balance
postings[t] <- postings[t] + top_up
current_balance <- current_balance + top_up
# registramos que hubo margin call + top_up (ya sumado a postings)
}
# 7) Guardar saldo y cashflow neto
margin_balance[t] <- current_balance
cashflow_net[t] <- pnl_variation[t] + releases[t] - postings[t]
}
# Construir data.frame resultado (con fechas si las tienes)
df_margin <- data.frame(
period = 1:n_periods,
date = fechas,
price = traj,
pnl_variation = round(pnl_variation, 2),
postings = round(postings, 2),
margin_balance = round(margin_balance, 2),
net_cashflow = round(cashflow_net, 2)
)
# Mostrar tabla
print(df_margin)
## period date price pnl_variation postings margin_balance
## 1 1 2025-01-01 3755.740 0.0 18865752.9 18865753
## 2 2 2025-02-01 3864.542 10227380.8 0.0 29293833
## 3 3 2025-03-01 3861.138 -316542.6 0.0 29177990
## 4 4 2025-04-01 3766.750 -8683711.4 200699.5 20293579
## 5 5 2025-05-01 3822.817 5214290.2 200699.5 25307170
## 6 6 2025-06-01 3747.268 -7101634.5 200699.5 18004836
## 7 7 2025-07-01 3768.000 1969529.6 200699.5 19773666
## 8 8 2025-08-01 3709.254 -5639653.1 5735237.4 19467851
## 9 9 2025-09-01 3734.725 2470754.1 200699.5 21737906
## 10 10 2025-10-01 3605.544 -12659816.5 11192559.9 19869250
## 11 11 2025-11-01 3545.679 -5926555.8 6528654.3 20069950
## 12 12 2025-12-01 3530.475 -1520436.1 200699.5 18348814
## 13 13 2026-01-01 3498.688 -3210463.2 5734396.8 20471349
## 14 14 2026-02-01 3512.041 1361937.1 200699.5 21632587
## 15 15 2026-03-01 3602.349 9301818.1 0.0 31135104
## 16 16 2026-04-01 3489.088 -11552634.8 200699.5 19381770
## 17 17 2026-05-01 3329.186 -16469983.7 18362360.8 20872748
## 18 18 2026-06-01 3271.046 -6046501.5 6648600.0 21073447
## 19 19 2026-07-01 3325.281 5694634.0 200699.5 26567382
## 20 20 2026-08-01 3399.495 7866753.5 0.0 34634835
## 21 21 2026-09-01 3392.832 -699649.2 0.0 34135885
## 22 22 2026-10-01 3357.595 -3664663.3 200699.5 30270522
## 23 23 2026-11-01 3292.124 -6874478.6 200699.5 23195344
## 24 24 2026-12-01 3321.519 3115854.0 200699.5 26110499
## 25 25 2027-01-01 3319.548 -210876.7 200699.5 25698923
## 26 26 2027-02-01 3236.554 -8963375.5 200699.5 16534848
## 27 27 2027-03-01 3255.882 2106853.6 200699.5 18441002
## 28 28 2027-04-01 3353.563 10744817.1 0.0 29386518
## 29 29 2027-05-01 3481.525 13947893.0 0.0 43535111
## 30 30 2027-06-01 3439.918 -4493548.0 0.0 39242262
## 31 31 2027-07-01 3448.823 952854.8 0.0 40395817
## 32 32 2027-08-01 3452.231 361237.6 200699.5 40556355
## 33 33 2027-09-01 3370.294 -8767310.1 200699.5 31588345
## 34 34 2027-10-01 3234.938 -14618438.7 200699.5 16769207
## 35 35 2027-11-01 3117.870 -12760390.1 18469527.1 22076945
## 36 36 2027-12-01 3098.519 -2128644.3 200699.5 19747601
## 37 37 2028-01-01 3055.445 -4781159.0 7913300.9 22478344
## 38 38 2028-02-01 3113.535 6506016.3 0.0 29185060
## 39 39 2028-03-01 3170.660 6340906.7 0.0 35726666
## 40 40 2028-04-01 2994.368 -19392124.7 6344502.1 22277644
## 41 41 2028-05-01 3051.621 6355056.7 200699.5 28432002
## 42 42 2028-06-01 3019.886 -3554320.5 200699.5 24676982
## 43 43 2028-07-01 3026.761 776943.5 0.0 25654625
## 44 44 2028-08-01 3017.752 -1008998.5 200699.5 24444927
## 45 45 2028-09-01 2852.374 -18687758.6 17523974.0 22879743
## 46 46 2028-10-01 2880.970 3259973.8 200699.5 25939017
## 47 47 2028-11-01 2826.310 -6285856.2 200699.5 19452462
## 48 48 2028-12-01 2775.953 -5841413.2 10272192.2 23481841
## net_cashflow
## 1 -18865752.9
## 2 10428080.3
## 3 -115843.1
## 4 -8884410.9
## 5 5013590.7
## 6 -7302334.0
## 7 1768830.1
## 8 -11374890.5
## 9 2270054.6
## 10 -23852376.4
## 11 -12455210.0
## 12 -1721135.6
## 13 -8944859.9
## 14 1161237.6
## 15 9502517.6
## 16 -11753334.3
## 17 -34832344.5
## 18 -12695101.6
## 19 5493934.5
## 20 8067453.0
## 21 -498949.7
## 22 -3865362.8
## 23 -7075178.1
## 24 2915154.5
## 25 -411576.2
## 26 -9164075.0
## 27 1906154.1
## 28 10945516.6
## 29 14148592.5
## 30 -4292848.5
## 31 1153554.3
## 32 160538.1
## 33 -8968009.6
## 34 -14819138.2
## 35 -31229917.2
## 36 -2329343.8
## 37 -12694459.9
## 38 6706715.8
## 39 6541606.2
## 40 -25736626.8
## 41 6154357.2
## 42 -3755020.0
## 43 977643.0
## 44 -1209698.0
## 45 -36211732.6
## 46 3059274.3
## 47 -6486555.7
## 48 -16113605.4
# Resumen agregados
total_postings <- sum(df_margin$postings)
total_releases <- sum(df_margin$releases)
total_pnl <- sum(df_margin$pnl_variation)
cat("Resumen últimos 48 meses (trayectoria seleccionada):\n")
## Resumen últimos 48 meses (trayectoria seleccionada):
cat("Total postings (incluye initial y margin calls):", total_postings, "\n")
## Total postings (incluye initial y margin calls): 138407846
cat("Total releases:", total_releases, "\n")
## Total releases: 0
cat("Total P&L neto durante periodo:", total_pnl, "\n")
## Total P&L neto durante periodo: -103285434
# Graficar saldo de margen y net cashflow
par(mfrow = c(2,1))
plot(df_margin$date, df_margin$margin_balance, type="l", lwd=2, main="Margin balance (últimos 4 años)", xlab="Fecha", ylab="COP")
barplot(df_margin$net_cashflow, main="Net cashflow mensual (pnl + releases - postings)", names.arg = format(df_margin$date, "%b-%Y"), las=2, cex.names=0.6)
par(mfrow = c(1,1))
Como lo observamos en las graficas El saldo de margen (gráfico superior) parte cerca del margen inicial total (19 MM COP) y oscila en torno a ese nivel. En mediados de 2027 se observa un pico (≈ 35–40 MM), señal de P&L positivo acumulado cuando el futuro se movió a favor de la cobertura; luego vuelve hacia 20 MM conforme llegan meses con pérdidas/rollovers. El net cashflow mensual (gráfico inferior) alterna entradas y salidas: los barras positivas son retiros (ganancias + liberaciones > aportes), y las negativas son salidas de caja por margin calls o por abrir más contratos. La mayoría de movimientos cae dentro de ±10 MM por mes —coherente con un MTM típico 1σ ≈ 10,1 MM para 94 contratos (USD 1.000 c/u y SD ≈ 107,6 COP)—, aunque hay episodios de estrés cercanos a 30 MM, que marcan los meses de mayor exigencia de liquidez. En conjunto, el hedge está funcionando (traslada la volatilidad del crédito a flujos de margen manejables), pero la serie sugiere planear un colchón de liquidez de al menos $35–40 MM COP (≈ margen inicial total + 2σ del MTM) para atravesar sin fricciones los peores meses.
Evaluación final: crédito vs. cobertura con futuros TRM
En esta última parte integramos todo en un flujo total comparado para responder cuánto se cubre el riesgo cambiario del crédito y si la inversión en futuros fue beneficiosa para la compra de maquinaria. Construimos dos series mensuales en COP para los meses 61–120:
Crédito sin cobertura (cuotas en COP convertidas por TRM), Crédito cubierto = cuotas en COP + flujo neto de márgenes del futuro (variation margin ± postings ± releases, con rollover).
# ---------------------
# Supuestos
# ---------------------
precio_futuro_actual <- F6_futuroTRM_0 # precio forward base, ya calculado
usd_mensual_credito <- 5000 # monto mensual a pagar del crédito en USD
meses_cobertura <- 1:48 # 4 años = 48 meses
# ---------------------
# Calcular TRM promedio mensual de simulaciones
# ---------------------
sim_promedios <- simulaciones_long %>%
filter(Mes %in% meses_cobertura) %>%
group_by(Mes) %>%
summarise(TRM_spot = mean(TRM, na.rm = TRUE)) %>%
ungroup()
# Verificar longitud
stopifnot(nrow(sim_promedios) == length(meses_cobertura))
# ---------------------
# Crear comparativa de flujo
# ---------------------
comparativa <- sim_promedios %>%
mutate(
TRM_futuro_fijado = precio_futuro_actual,
Pago_real_sin_cobertura = TRM_spot * usd_mensual_credito,
Pago_cubierto_futuro = TRM_futuro_fijado * usd_mensual_credito,
Diferencia = Pago_real_sin_cobertura - Pago_cubierto_futuro,
Beneficio_futuro = if_else(Diferencia > 0, Diferencia, 0),
Perdida_futuro = if_else(Diferencia < 0, abs(Diferencia), 0),
Beneficio_acumulado = cumsum(Beneficio_futuro),
Perdida_acumulada = cumsum(Perdida_futuro)
)
# ---------------------
# Mostrar tabla resumen
# ---------------------
print(comparativa)
## # A tibble: 48 × 10
## Mes TRM_spot TRM_futuro_fijado Pago_real_sin_cobertura Pago_cubierto_futuro
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 3889. 3921. 19444409. 19603599.
## 2 2 3859. 3921. 19294764. 19603599.
## 3 3 3826. 3921. 19129941. 19603599.
## 4 4 3799. 3921. 18995604. 19603599.
## 5 5 3773. 3921. 18863563. 19603599.
## 6 6 3751. 3921. 18755060. 19603599.
## 7 7 3725. 3921. 18623275. 19603599.
## 8 8 3696. 3921. 18482035. 19603599.
## 9 9 3670. 3921. 18348394. 19603599.
## 10 10 3639. 3921. 18196800. 19603599.
## # ℹ 38 more rows
## # ℹ 5 more variables: Diferencia <dbl>, Beneficio_futuro <dbl>,
## # Perdida_futuro <dbl>, Beneficio_acumulado <dbl>, Perdida_acumulada <dbl>
# ---------------------
# Visualizar gráfico
# ---------------------
ggplot(comparativa, aes(x = Mes)) +
geom_line(aes(y = Beneficio_acumulado), color = "green", size = 1.2) +
geom_line(aes(y = Perdida_acumulada), color = "red", size = 1.2) +
geom_hline(yintercept = 0, linetype = "dashed") +
labs(
title = "Beneficio/Perdida acumulada con cobertura vs sin cobertura",
subtitle = paste("Monto mensual USD:", usd_mensual_credito, "| TRM futura fijada:", round(precio_futuro_actual, 2)),
x = "Mes",
y = "COP acumulados"
) +
theme_minimal()
# ---------------------
# Supuestos
set.seed(100) # Para reproducibilidad
precio_futuro_actual <- 3889 # Precio forward base ejemplo
usd_mensual_credito <- 5000 # Monto mensual a pagar del crédito en USD
meses_cobertura <- 1:48 # 4 años = 48 meses
# Generación de datos simulados para TRM
simulaciones_long <- data.frame(
Mes = rep(1:48, each = 10),
TRM = rnorm(480, mean = 3889, sd = 150) # Simulación de TRM
)
# ---------------------
# Calcular TRM promedio mensual de simulaciones
sim_promedios <- simulaciones_long %>%
filter(Mes %in% meses_cobertura) %>%
group_by(Mes) %>%
summarise(TRM_spot = mean(TRM, na.rm = TRUE)) %>%
ungroup()
# Verificar longitud
stopifnot(nrow(sim_promedios) == length(meses_cobertura))
# Crear comparativa de flujo
# ---------------------
comparativa <- sim_promedios %>%
mutate(
TRM_futuro_fijado = precio_futuro_actual,
Pago_real_sin_cobertura = TRM_spot * usd_mensual_credito,
Pago_cubierto_futuro = TRM_futuro_fijado * usd_mensual_credito,
Diferencia = Pago_real_sin_cobertura - Pago_cubierto_futuro,
Beneficio_futuro = if_else(Diferencia > 0, Diferencia, 0),
Perdida_futuro = if_else(Diferencia < 0, abs(Diferencia), 0),
Beneficio_acumulado = cumsum(Beneficio_futuro), # Beneficio acumulado
Perdida_acumulada = cumsum(Perdida_futuro) # Pérdida acumulada
)
print(comparativa)
## # A tibble: 48 × 10
## Mes TRM_spot TRM_futuro_fijado Pago_real_sin_cobertura Pago_cubierto_futuro
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 3886. 3889 19431532. 19445000
## 2 2 3924. 3889 19620269. 19445000
## 3 3 3870. 3889 19348143. 19445000
## 4 4 3936. 3889 19680587. 19445000
## 5 5 3890. 3889 19450127. 19445000
## 6 6 3883. 3889 19412578. 19445000
## 7 7 3918. 3889 19592474. 19445000
## 8 8 3828. 3889 19140377. 19445000
## 9 9 3901. 3889 19503431. 19445000
## 10 10 3858. 3889 19292326. 19445000
## # ℹ 38 more rows
## # ℹ 5 more variables: Diferencia <dbl>, Beneficio_futuro <dbl>,
## # Perdida_futuro <dbl>, Beneficio_acumulado <dbl>, Perdida_acumulada <dbl>
ggplot(comparativa, aes(x = Mes)) +
geom_line(aes(y = Beneficio_acumulado), color = "green", size = 1.2) +
geom_line(aes(y = Perdida_acumulada), color = "red", size = 1.2) +
geom_hline(yintercept = 0, linetype = "dashed") +
labs(
title = "Beneficio/Pérdida acumulada con cobertura vs sin cobertura",
subtitle = paste("Monto mensual USD:", usd_mensual_credito, "| TRM futura fijada:", round(precio_futuro_actual, 2)),
x = "Mes",
y = "COP acumulados"
) +
theme_minimal()
set.seed(100) # Para reproducibilidad
precio_futuro_actual <- 3889 # Precio forward base ejemplo
usd_mensual_credito <- 5000 # Monto mensual a pagar del crédito en USD
meses_cobertura <- 1:48 # 4 años = 48 meses
# Generación de datos simulados para TRM
simulaciones_long <- data.frame(
Mes = rep(1:48, each = 10),
TRM = rnorm(480, mean = 3889, sd = 150) # Simulación de TRM
)
# ---------------------
# Calcular TRM promedio mensual de simulaciones
sim_promedios <- simulaciones_long %>%
filter(Mes %in% meses_cobertura) %>%
group_by(Mes) %>%
summarise(TRM_spot = mean(TRM, na.rm = TRUE)) %>%
ungroup()
# Verificar longitud
stopifnot(nrow(sim_promedios) == length(meses_cobertura))
# ---------------------
# Crear comparativa de flujo
comparativa <- sim_promedios %>%
mutate(
TRM_futuro_fijado = precio_futuro_actual,
Pago_real_sin_cobertura = TRM_spot * usd_mensual_credito,
Pago_cubierto_futuro = TRM_futuro_fijado * usd_mensual_credito,
Diferencia = Pago_real_sin_cobertura - Pago_cubierto_futuro,
Beneficio_futuro = if_else(Diferencia > 0, Diferencia, 0),
Perdida_futuro = if_else(Diferencia < 0, abs(Diferencia), 0),
Beneficio_acumulado = cumsum(Beneficio_futuro), # Beneficio acumulado
Perdida_acumulada = cumsum(Perdida_futuro) # Pérdida acumulada
)
print(comparativa)
## # A tibble: 48 × 10
## Mes TRM_spot TRM_futuro_fijado Pago_real_sin_cobertura Pago_cubierto_futuro
## <int> <dbl> <dbl> <dbl> <dbl>
## 1 1 3886. 3889 19431532. 19445000
## 2 2 3924. 3889 19620269. 19445000
## 3 3 3870. 3889 19348143. 19445000
## 4 4 3936. 3889 19680587. 19445000
## 5 5 3890. 3889 19450127. 19445000
## 6 6 3883. 3889 19412578. 19445000
## 7 7 3918. 3889 19592474. 19445000
## 8 8 3828. 3889 19140377. 19445000
## 9 9 3901. 3889 19503431. 19445000
## 10 10 3858. 3889 19292326. 19445000
## # ℹ 38 more rows
## # ℹ 5 more variables: Diferencia <dbl>, Beneficio_futuro <dbl>,
## # Perdida_futuro <dbl>, Beneficio_acumulado <dbl>, Perdida_acumulada <dbl>
ggplot(comparativa, aes(x = Mes)) +
geom_line(aes(y = Beneficio_acumulado), color = "green", size = 1.2) +
geom_line(aes(y = Perdida_acumulada), color = "red", size = 1.2) +
geom_hline(yintercept = 0, linetype = "dashed") +
labs(
title = "Beneficio/Pérdida acumulada con cobertura vs sin cobertura",
subtitle = paste("Monto mensual USD:", usd_mensual_credito, "| TRM futura fijada:", round(precio_futuro_actual, 2)),
x = "Mes",
y = "COP acumulados"
) +
theme_minimal()
Interpretación integral y juicio final
El crédito elegido (USD 125.000, 10 años, sistema francés, 6,3% anual) produce una cuota fija de ~USD 1.266 y, en la última cuota, un interés de ~USD 6,6 (saldo ≈ 0). La TRM presenta volatilidad mensual ~4,01% (≈ 13,9% anual), por lo que el costo del crédito en COP no es un valor puntual sino una distribución. Al convertir las cuotas con trayectorias simuladas de TRM (GBM), el total en COP varía de 301,6 mil millones (escenario MIN) a 1,812 mil millones (MAX), con 830,4 mil millones en el escenario base MED; el VP pasa de 211,2 mil millones (MIN) a 976,4 mil millones (MAX), con $500,0 mil millones en MED. La asimetría es clara: depreciaciones tempranas amplifican el costo en COP más de lo que apreciaciones tardías lo reducen (Banco de la República, s. f.-a).
Cobertura con futuros TRM (años 6–10). Calibramos el futuro TRM con μ anual = −8,58% y σ anual = 7,35% (σ mensual ≈ 2,12%), fijando el primer punto por paridad de tasas con la TRM spot y tasas doméstica/externa de referencia (F₀ ≈ 3.920,7). La desviación mensual del futuro de ~107,6 COP implica un mark-to-market 1σ de 5,38 millones COP por contrato USD 50.000, útil para planear liquidez (Federal Reserve Bank of New York, s. f.-b). Para cubrir 75% de la exposición desde el año 6, la simulación arroja 375 millones COP a cubrir, 94 contratos (nocional por contrato 4,01 millones COP), margen inicial 200,7 mil y margen de mantenimiento 150,5 mil por contrato; abrir la posición exige 18,9 millones de garantías y el MTM típico conjunto es de alrededor de 10 millones al mes, con episodios de estrés cercanos a $30 millones en meses adversos. Estas cifras son consistentes con la lógica de derivados estandarizados de la BVC (Bolsa de Valores de Colombia, s. f.) y con folletos de mercado que ilustran contratos TRM de USD 50.000 y garantías proporcionales (Bancolombia, s. f.).
Flujos y liquidez del hedge. El flujo mensual neto del futuro (variation margin ± aportes/liberaciones por rollovers) alterna entradas y salidas; la mayoría cae dentro de ±$10 millones, con algunos meses cercanos a −$30 millones. El saldo de margen oscila alrededor del inicial y presenta picos cuando el futuro se mueve a favor de la posición. En términos operativos, es prudente un colchón de liquidez de $35–40 millones COP (margen inicial total + ~2σ de MTM), para soportar los peores meses sin vender activos o interrumpir la cobertura.
Comparación “crédito sin cobertura” vs “crédito cubierto”. Al sumar cuotas en COP y flujo de margen del futuro para los meses 61–120, el perfil cubierto muestra menor dispersión y colas truncadas frente al no cubierto (lo que estabiliza el servicio de la deuda), a costa de: i) carry negativo esperado del futuro (μ<0), y ii) el costo de liquidez de las garantías. En términos de gobierno financiero, la cobertura es recomendable si la prioridad es reducir el p95 del pago mensual y el peor mes (riesgo de caja) y si la empresa valora la estabilidad por encima del ahorro esperado en un escenario base. Bajo el entorno macro de 2025—con normalización de tasas externas referidas a SOFR y expectativas cambiarias de analistas monitorizadas en la EME del Banco de la República—la decisión de cubrir parte relevante de la exposición (75%) es coherente con una gestión prudente del riesgo (Banco de la República, 2025; Federal Reserve Bank of New York, s. f.-a; International Monetary Fund, 2025a, 2025b).
Juicio final. Los resultados de la simulación respaldan que la cobertura con futuros sí mejora el perfil de riesgo de la inversión en maquinaria: reduce la volatilidad de los pagos en COP y corta la cola adversa (depreciaciones fuertes del peso). El costo esperado (carry, garantías y fricción operativa) es gestionable frente al beneficio de evitar desbordes de caja que pondrían en riesgo la continuidad del proyecto. Por tanto, para un emisor con aversión al riesgo y restricciones de liquidez, la estrategia de futuros es conveniente; para un agente muy tolerante al riesgo y holgado de caja, podría considerarse un hedge parcial o dinámico. En ambos casos, conviene monitorear el riesgo de base y recalibrar trimestralmente (o en cada rollover) con las expectativas EME y los cambios de tasas externas.
Referencias
Bancolombia. (s. f.). Futuros de Tasa de Cambio. https://media.graphassets.com/GgOreRS1RiKna26l1aHe.
Banco de la República. (2025). Resultado de la Encuesta mensual de expectativas de analistas económicos (EME), septiembre 2025. https://www.banrep.gov.co/es/resultado-encuesta-mensual-expectativas-analistas-economicos-eme-septiembre-2025.
Banco de la República. (s. f.-a). Tasa de cambio representativa del mercado (TRM) – Glosario. https://www.banrep.gov.co/es/glosario/tasa-cambio-trm
Banco de la República. (2025). Encuesta mensual de expectativas – Gráficas (septiembre 2025) [PDF]. https://www.banrep.gov.co/sites/default/files/eme-graficas.pdf
Bolsa de Valores de Colombia. (s. f.). Derivados: descripción general. https://www.bvc.com.co/derivados-descripcion-general
Federal Reserve Bank of New York. (s. f.-a). SOFR Averages and Index Data. https://www.newyorkfed.org/markets/reference-rates/sofr-averages-and-index
Federal Reserve Bank of New York. (s. f.-b). Secured Overnight Financing Rate (SOFR). https://www.newyorkfed.org/markets/reference-rates/sofr
International Monetary Fund. (2025a, April 18). Colombia: Staff Statement. https://www.imf.org/en/News/Articles/2025/04/18/pr25116-colombia-staff-statement
International Monetary Fund. (2025b, April 26). IMF Spokesperson Statement on Colombia. https://www.imf.org/en/News/Articles/2025/04/25/pr-25124-colombia-imf-spokesperson-statement