library(citmre)
library(xts)
library(reshape2)
library(ggplot2)
library(readxl)
library(dplyr)
library(tidyverse)
library(lubridate)
library(tidyr)
library(scales)
library(dplyr)
library(knitr)
library(kableExtra)
options(scipen=999)

1 INTRODUCCIÓN

El crédito analizado corresponde a una financiación internacional de USD $685 (justifiación en el desarrollo del trabajo) por mes durante 120 meses, destinada a la compra de maquinaria por valor de COP $300 millones, con una tasa de interés del 6.38% EA (justificación en el desarrollo del trabajo) y sistema de amortización francés. Este pasivo fue estructurado en dólares, por lo que expone un riesgo cambiario frente a la Tasa Representativa del Mercado (TRM).

Para mitigar esta exposición, se implementó una estrategia de cobertura parcial utilizando contratos de futuros estandarizados sobre la TRM (TRMM25), disponibles en la Bolsa de Valores de Colombia (BVC). Se cubrió el 85% del valor del crédito mediante una posición larga inicial (la cual puede presentar cambios al vencimiento del contrato, dependiendo del comprtamiento del futuro proyectado) en contratos de USD $50.000 cada uno, iniciando en el mes 61 hasta el mes 120, con rollover trimestral. ”

2 PARTE 1: PROCESO DEL CRÉDITO

2.1 Análisis fundamental de la TRM y proyección a 12 meses

La Tasa Representativa del Mercado (TRM) está influenciada por factores internos y externos que interactúan en un contexto económico dinámico. A continuación, se presenta un análisis integral basado en proyecciones de entidades reconocidas y variables clave.

2.1.1 Factores Internos

  • Crecimiento Económico: En el primer trimestre de 2025, la economía colombiana registró un crecimiento interanual del 2,7%, impulsado principalmente por el consumo privado. Este optimismo en los hogares se asoció a mejoras en el empleo y a expectativas de estabilidad inflacionaria (El País, 2025). No obstante, este crecimiento podría enfrentar desafíos si persisten presiones fiscales o externas.

  • Déficit Fiscal y Deuda Pública: Moody’s alertó sobre el riesgo de una degradación de la calificación crediticia soberana si el gobierno no logra estabilizar la deuda pública, que supera el 60% del PIB. La consolidación fiscal, incluyendo recortes de gasto y reformas tributarias, será clave para evitar mayores costos de financiamiento y preservar la confianza de los inversores (Reuters, 2025).

2.1.2 Factores Externos

  • Precios del Petróleo: Colombia depende en un 40% de las exportaciones de hidrocarburos. Una caída en los precios del crudo reduciría los ingresos en divisas, presionando la balanza de pagos y generando volatilidad en la TRM (La República, 2025). A mayo de 2025, el barril de Brent oscila en USD 75-80, un nivel moderado que limita márgenes de mejora.

  • Política Monetaria y Comercial de EE. UU.: Las medidas proteccionistas bajo la administración de Donald Trump (2025) podrían afectar las exportaciones colombianas a EE. UU., su principal socio comercial. Además, una posible subida de tasas de interés por la Reserva Federal incentivaría la fuga de capitales desde mercados emergentes, depreciando el peso (El Espectador, 2025).

2.1.3 Proyecciones de la TRM para los Próximos 12 Meses

  • Instituciones como el Banco de la República, Corficolombiana y Fedesarrollo proyectan que la TRM se mantendría entre COP 4.159 y COP 4.300 hasta 2026 (Bloomberg Línea, 2025; El Espectador, 2025). Este rango supone:

  • Estabilidad relativa en el petróleo (Brent entre USD 70-85).

  • Avances en la consolidación fiscal para contener la deuda.

  • Políticas de la Fed moderadas, sin alzas abruptas de tasas.

2.1.4 Riesgos y Consideraciones

  • A la baja: Una recesión global reduciría la demanda de commodities, afectando ingresos fiscales.

  • Al alza: Un escalamiento geopolítico (ej. conflictos en Oriente Medio) dispararía el petróleo, fortaleciendo el COP.

  • Incertidumbre política: Reformas pendientes en Colombia y cambios en la agenda comercial de EE. UU. podrían alterar las proyecciones

Concluyendo, la TRM enfrenta presiones mixtas: el crecimiento económico y la estabilidad del consumo apuntalan el peso, mientras el déficit fiscal y factores externos introducen riesgos. En un escenario base, se espera que el dólar se mantenga en COP 4.159-4.300, aunque la volatilidad persistirá dadas las incertidumbres globales (Bloomberg Línea, 2025).

2.2 Histórico TRM

Descarga la TRM (tasa representativa del mercado) mensual log_return = FALSE indica que se descargan los valores originales, no los retornos Resultado: un objeto xts con fechas y valores TRM.

trm_mensual_xts <- rmre_data(frequency = 12, log_return = FALSE)

convertir en data drame legible index() y coredata() extraen la fecha y el valor de la TRM del objeto xts Se convierte todo en un data.frame.

trm_mensual <- data.frame(
  date = index(trm_mensual_xts), # Extrae las fechas
  rmre = coredata(trm_mensual_xts) # Extrae los valores
)
trm_mensual$date <- as.Date(trm_mensual$date) # asegura que las fechas estén bien formateadas
str(trm_mensual) # muestra la estructura: fechas + TRM.
## 'data.frame':    402 obs. of  2 variables:
##  $ date: Date, format: "1991-12-31" "1992-01-31" ...
##  $ rmre: num  632 644 634 642 654 ...

Ordenar por fecha Asegura que los valores estén en orden cronológico, desde el más antiguo al más reciente.

trm_mensual <- trm_mensual[order(trm_mensual$date), ]

Calcular retornos logarítmicos diff(log(…)): calcula los retornos logarítmicos mensuales.

trm_mensual_return <- c(NA, diff(log(trm_mensual$rmre)))

Desviación estándar mensual sd(…, na.rm = TRUE): calcula la volatilidad mensual (σ).

desviacion_mensual <- sd(trm_mensual_return, na.rm = TRUE)

2.3 Simulación TRM bajo MBG

Se utiliza para la simulación el Movimiento Browniano Geométrico (GBM) ya que es ampliamente utilizado para modelar precios de activos financieros, como acciones, materias primas o divisas, debido a sus propiedades matemáticas y su alineación con supuestos económicos fundamentales. Asimismo el modelo contempla las siguientes caracteristicas:

  1. No negatividad: Garantiza precios positivos mediante una distribución lognormal (Hull, 2021).

  2. Sencillez matemática: Permite soluciones cerradas (p. ej., modelo Black-Scholes) y simulaciones eficientes (Black & Scholes, 1973).

  3. Consistencia con mercados eficientes: Modela trayectorias continuas, alineadas con la incorporación gradual de información (Fama, 1970).

  4. Flexibilidad: Los parámetros (μ para rendimiento, σ para volatilidad) se estiman fácilmente con datos históricos (Glasserman, 2003).

mu <- mean(trm_mensual_return, na.rm = TRUE)  # promedio de los retornos
sigma <- desviacion_mensual                   # Desviación estándar de los retornos
S0 <- trm_mensual$rmre[402]                     # Precio inicial (primer valor de la TRM)
n <- 120                                       # Número de meses a simular
N <- 1000                                    # Número de trayectorias (escenarios) de simulación

Generar las trayectorias de precios simulados Simula 1000 trayectorias (N) de TRM mensual, cada una con 12 meses (n). Usa el modelo de Movimiento Browniano Geométrico (GBM) para simular precios.

set.seed(123)  #asegura resultados reproducibles
simulaciones <- matrix(NA, nrow = N, ncol = n)

for (i in 1:N) {
  # Generar una trayectoria utilizando BMG
  path <- numeric(n)
  path[1] <- S0
  for (j in 2:n) {
    path[j] <- path[j - 1] * exp((mu - 0.5 * sigma^2) + sigma * rnorm(1))
  }
  simulaciones[i, ] <- path
}

Convertir simulaciones para graficar Convierte la matriz en un data.frame Añade un identificador de trayectoria (1 a 1000).

simulaciones_df <- as.data.frame(simulaciones)
simulaciones_df$trayectoria <- 1:nrow(simulaciones_df)

Reestructurar a formato largo (melt) melt transforma columnas V1 a V12 en filas (formato largo) Cada fila es un punto simulado (mes, valor, trayectoria).

simulaciones_largo <- melt(simulaciones_df, id.vars = "trayectoria", 
                           variable.name = "mes", value.name = "trm")

Crear fechas simuladas reales Crear vector de fechas para los 12 meses futuros seq.Date(): genera 12 fechas mensuales futuras desde el último dato real.

fechas_simulacion <- seq.Date(from = max(trm_mensual$date) + 1, by = "month", length.out = n)

# Extraer número de mes (1 a 12) desde el nombre de columna (V1, V2, ...)
simulaciones_largo$mes_num <- as.integer(gsub("V", "", simulaciones_largo$mes))

# Asignar fecha real correspondiente a cada punto simulado
simulaciones_largo$fecha <- fechas_simulacion[simulaciones_largo$mes_num]

Graficar simulaciones Cada línea representa una trayectoria simulada de la TRM en el futuro. alpha = 0.1 da transparencia (porque hay muchas líneas) El gráfico te muestra posibles futuros escenarios de la TRM bajo el modelo BMG.

ggplot(simulaciones_largo, aes(x = fecha, y = trm, group = trayectoria)) +
  geom_line(alpha = 0.1, color = "steelblue") +
  labs(title = "Simulación TRM mensual - Modelo BMG",
       x = "Fecha",
       y = "TRM simulada") +
  theme_minimal()

2.4 Simulación del crédito en USD

Para financiar la compra de maquinaria pesada en Estados Unidos, existen dos opciones principales: préstamos tradicionales de entidades financieras y préstamos respaldados por la Administración de Pequeñas Empresas (SBA). El programa SBA 504 es un esquema de financiamiento diseñado para ayudar a pequeñas y medianas empresas a adquirir activos fijos de largo plazo, como maquinaria, terrenos o edificios comerciales (Growth Corp, n.d.).

Este programa se solicita a través de Certified Development Companies (CDCs), organizaciones sin fines de lucro autorizadas por la SBA, o mediante bancos participantes que colaboran con estas entidades (Growth Corp, n.d.). En este caso, se seleccionó como CDC a Growth Corp, debido a su tasa competitiva del 6.20% APR (Annual Percentage Rate) para préstamos a 10 años con capitalización mensual, equivalente a una tasa efectiva anual (EA) del 6.38% (Growth Corp, n.d.).

Datos iniciales

valor_cop <- 300000000             # Valor en pesos colombianos
tasa_cambio <- S0            # COP/USD
valor_usd <- valor_cop / tasa_cambio

porcentaje_pago_inicial <- 0.15
pago_inicial_usd <- valor_usd * porcentaje_pago_inicial
monto_financiado_usd <- valor_usd * (1 - porcentaje_pago_inicial)

tasa_anual <- 0.0638
n_periodos <- 120
tasa_mensual <- (1 + tasa_anual)^(1/12) - 1

Cuota mensual (Sistema francés)

cuota_mensual <- monto_financiado_usd * (tasa_mensual / (1 - (1 + tasa_mensual)^(-n_periodos)))

Inicialización de data frame

flujo <- data.frame(
  Mes = 1:n_periodos,
  Cuota = rep(cuota_mensual, n_periodos),
  Interes = numeric(n_periodos),
  Amortizacion = numeric(n_periodos),
  Saldo = numeric(n_periodos)
)

saldo <- round(monto_financiado_usd, 2)

Cálculo del flujo de pagos

for (i in 1:n_periodos) {
  interes <- saldo * tasa_mensual
  amortizacion <- cuota_mensual - interes
  saldo <- saldo - amortizacion
  flujo$Interes[i] <- interes
  flujo$Amortizacion[i] <- amortizacion
  flujo$Saldo[i] <- ifelse(saldo < 0, 0, saldo)
}

Mostrar resumen

cat("Valor total en USD:", round(valor_usd, 2), "\n")
## Valor total en USD: 71951.59
cat("Pago inicial en USD:", round(pago_inicial_usd, 2), "\n")
## Pago inicial en USD: 10792.74
cat("Monto financiado en USD:", round(monto_financiado_usd, 2), "\n")
## Monto financiado en USD: 61158.85
cat("Cuota mensual en USD:", round(cuota_mensual, 2), "\n\n")
## Cuota mensual en USD: 685.17

Crédito expresado en USD

flujo %>%
  kable("html", 
        caption = "Credito expresado en USD",
        align = "c",        # Centra las columnas
        escape = FALSE) %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive", "bordered"),
                full_width = TRUE,
                position = "center",
                font_size = 13) %>%
  scroll_box(width = "100%", height = "400px")
Credito expresado en USD
Mes Cuota Interes Amortizacion Saldo
1 685.1692 316.023357 369.1459 60789.7041
2 685.1692 314.115886 371.0533 60418.6508
3 685.1692 312.198559 372.9706 60045.6802
4 685.1692 310.271325 374.8979 59670.7823
5 685.1692 308.334132 376.8351 59293.9472
6 685.1692 306.386929 378.7823 58915.1649
7 685.1692 304.429665 380.7395 58534.4254
8 685.1692 302.462286 382.7069 58151.7185
9 685.1692 300.484742 384.6845 57767.0340
10 685.1692 298.496980 386.6722 57380.3618
11 685.1692 296.498946 388.6703 56991.6915
12 685.1692 294.490587 390.6786 56601.0129
13 685.1692 292.471851 392.6974 56208.3155
14 685.1692 290.442684 394.7265 55813.5890
15 685.1692 288.403032 396.7662 55416.8229
16 685.1692 286.352840 398.8164 55018.0065
17 685.1692 284.292054 400.8772 54617.1293
18 685.1692 282.220620 402.9486 54214.1807
19 685.1692 280.138482 405.0307 53809.1500
20 685.1692 278.045585 407.1236 53402.0264
21 685.1692 275.941873 409.2273 52992.7991
22 685.1692 273.827291 411.3419 52581.4571
23 685.1692 271.701783 413.4674 52167.9897
24 685.1692 269.565291 415.6039 51752.3858
25 685.1692 267.417760 417.7514 51334.6344
26 685.1692 265.259132 419.9101 50914.7243
27 685.1692 263.089350 422.0799 50492.6444
28 685.1692 260.908356 424.2609 50068.3836
29 685.1692 258.716092 426.4531 49641.9305
30 685.1692 256.512500 428.6567 49213.2737
31 685.1692 254.297521 430.8717 48782.4021
32 685.1692 252.071098 433.0981 48349.3040
33 685.1692 249.833169 435.3360 47913.9679
34 685.1692 247.583677 437.5855 47476.3824
35 685.1692 245.322561 439.8466 47036.5357
36 685.1692 243.049762 442.1194 46594.4163
37 685.1692 240.765218 444.4040 46150.0123
38 685.1692 238.468869 446.7003 45703.3120
39 685.1692 236.160655 449.0086 45254.3034
40 685.1692 233.840513 451.3287 44802.9747
41 685.1692 231.508383 453.6608 44349.3139
42 685.1692 229.164202 456.0050 43893.3089
43 685.1692 226.807908 458.3613 43434.9476
44 685.1692 224.439438 460.7298 42974.2178
45 685.1692 222.058730 463.1105 42511.1073
46 685.1692 219.665720 465.5035 42045.6039
47 685.1692 217.260345 467.9089 41577.6950
48 685.1692 214.842541 470.3267 41107.3683
49 685.1692 212.412243 472.7570 40634.6114
50 685.1692 209.969388 475.1998 40159.4115
51 685.1692 207.513909 477.6553 39681.7562
52 685.1692 205.045742 480.1235 39201.6328
53 685.1692 202.564822 482.6044 38719.0284
54 685.1692 200.071082 485.0981 38233.9303
55 685.1692 197.564457 487.6048 37746.3255
56 685.1692 195.044879 490.1243 37256.2012
57 685.1692 192.512282 492.6569 36763.5443
58 685.1692 189.966598 495.2026 36268.3417
59 685.1692 187.407760 497.7614 35770.5802
60 685.1692 184.835700 500.3335 35270.2467
61 685.1692 182.250349 502.9189 34767.3278
62 685.1692 179.651639 505.5176 34261.8103
63 685.1692 177.039501 508.1297 33753.6806
64 685.1692 174.413866 510.7553 33242.9252
65 685.1692 171.774663 513.3945 32729.5307
66 685.1692 169.121822 516.0474 32213.4833
67 685.1692 166.455274 518.7139 31694.7694
68 685.1692 163.774947 521.3943 31173.3751
69 685.1692 161.080770 524.0884 30649.2867
70 685.1692 158.372671 526.7965 30122.4901
71 685.1692 155.650579 529.5186 29592.9715
72 685.1692 152.914422 532.2548 29060.7167
73 685.1692 150.164126 535.0051 28525.7116
74 685.1692 147.399618 537.7696 27987.9420
75 685.1692 144.620826 540.5484 27447.3937
76 685.1692 141.827675 543.3415 26904.0521
77 685.1692 139.020091 546.1491 26357.9030
78 685.1692 136.197999 548.9712 25808.9318
79 685.1692 133.361325 551.8079 25257.1239
80 685.1692 130.509993 554.6592 24702.4647
81 685.1692 127.643928 557.5253 24144.9394
82 685.1692 124.763052 560.4062 23584.5333
83 685.1692 121.867291 563.3019 23021.2314
84 685.1692 118.956567 566.2126 22455.0187
85 685.1692 116.030802 569.1384 21885.8803
86 685.1692 113.089918 572.0793 21313.8010
87 685.1692 110.133839 575.0354 20738.7657
88 685.1692 107.162485 578.0067 20160.7589
89 685.1692 104.175777 580.9934 19579.7655
90 685.1692 101.173636 583.9956 18995.7699
91 685.1692 98.155982 587.0132 18408.7567
92 685.1692 95.122735 590.0465 17818.7102
93 685.1692 92.073815 593.0954 17225.6148
94 685.1692 89.009140 596.1601 16629.4548
95 685.1692 85.928629 599.2406 16030.2142
96 685.1692 82.832200 602.3370 15427.8772
97 685.1692 79.719771 605.4494 14822.4278
98 685.1692 76.591260 608.5779 14213.8498
99 685.1692 73.446583 611.7226 13602.1272
100 685.1692 70.285656 614.8836 12987.2436
101 685.1692 67.108396 618.0608 12369.1828
102 685.1692 63.914718 621.2545 11747.9283
103 685.1692 60.704538 624.4647 11123.4637
104 685.1692 57.477770 627.6914 10495.7722
105 685.1692 54.234329 630.9349 9864.8373
106 685.1692 50.974127 634.1951 9230.6423
107 685.1692 47.697080 637.4721 8593.1701
108 685.1692 44.403099 640.7661 7952.4040
109 685.1692 41.092097 644.0771 7308.3269
110 685.1692 37.763987 647.4052 6660.9217
111 685.1692 34.418679 650.7505 6010.1712
112 685.1692 31.056085 654.1131 5356.0581
113 685.1692 27.676116 657.4931 4698.5650
114 685.1692 24.278682 660.8905 4037.6744
115 685.1692 20.863692 664.3055 3373.3689
116 685.1692 17.431057 667.7382 2705.6308
117 685.1692 13.980683 671.1885 2034.4422
118 685.1692 10.512481 674.6567 1359.7855
119 685.1692 7.026358 678.1428 681.6427
120 685.1692 3.522221 681.6470 0.0000

Crear el objeto flujo_credito_usd a partir del flujo ya calculado

flujo_credito_usd <- flujo %>%
  mutate(Fecha = seq.Date(from = as.Date(max(trm_mensual$date)) + 1,
                          by = "month", length.out = n_periodos)) %>%
  select(Fecha, Mes, Cuota)

Crear el objeto trm_simulada usando una de las trayectorias simuladas

set.seed(123)  # para reproducibilidad
trayectoria_simulada <- simulaciones[1, ]

trm_simulada <- data.frame(
  Fecha = seq.Date(from = as.Date(max(trm_mensual$date)) + 1, 
                   by = "month", length.out = n),
  TRM = trayectoria_simulada
)

2.5 Flujo del crédito en COP

convirtiendo cada cuota mensual a pesos colombianos con la TRM simulada

flujo_credito_cop <- flujo_credito_usd %>%
  left_join(trm_simulada, by = "Fecha") %>%
  mutate(Cuota_COP = Cuota * TRM)

Crear flujo_credito_df con columnas completas

flujo_credito_df <- flujo %>%
  mutate(Fecha = seq.Date(from = as.Date(max(trm_mensual$date)) + 1, 
                          by = "month", length.out = n_periodos)) %>%
  left_join(trm_simulada, by = "Fecha") %>%
  mutate(Cuota_COP = Cuota * TRM)

Crédito expresado en USD y cuota mensual en COP

flujo_credito_df %>%
  kable("html", 
        caption = "Credito expresado en USD y cuota mensual en COP",
        align = "c",        # Centra las columnas
        escape = FALSE) %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive", "bordered"),
                full_width = TRUE,
                position = "center",
                font_size = 13) %>%
  scroll_box(width = "100%", height = "400px")
Credito expresado en USD y cuota mensual en COP
Mes Cuota Interes Amortizacion Saldo Fecha TRM Cuota_COP
1 685.1692 316.023357 369.1459 60789.7041 2025-06-01 4169.470 2856792
2 685.1692 314.115886 371.0533 60418.6508 2025-07-01 4106.209 2813448
3 685.1692 312.198559 372.9706 60045.6802 2025-08-01 4090.390 2802610
4 685.1692 310.271325 374.8979 59670.7823 2025-09-01 4334.817 2970083
5 685.1692 308.334132 376.8351 59293.9472 2025-10-01 4363.279 2989585
6 685.1692 306.386929 378.7823 58915.1649 2025-11-01 4400.870 3015341
7 685.1692 304.429665 380.7395 58534.4254 2025-12-01 4689.151 3212862
8 685.1692 302.462286 382.7069 58151.7185 2026-01-01 4784.133 3277940
9 685.1692 300.484742 384.6845 57767.0340 2026-02-01 4598.067 3150454
10 685.1692 298.496980 386.6722 57380.3618 2026-03-01 4508.545 3089116
11 685.1692 296.498946 388.6703 56991.6915 2026-04-01 4457.814 3054357
12 685.1692 294.490587 390.6786 56601.0129 2026-05-01 4669.812 3199611
13 685.1692 292.471851 392.6974 56208.3155 2026-06-01 4747.764 3253022
14 685.1692 290.442684 394.7265 55813.5890 2026-07-01 4833.863 3312014
15 685.1692 288.403032 396.7662 55416.8229 2026-08-01 4872.371 3338398
16 685.1692 286.352840 398.8164 55018.0065 2026-09-01 4799.214 3288274
17 685.1692 284.292054 400.8772 54617.1293 2026-10-01 5126.317 3512395
18 685.1692 282.220620 402.9486 54214.1807 2026-11-01 5236.843 3588124
19 685.1692 280.138482 405.0307 53809.1500 2026-12-01 4912.461 3365867
20 685.1692 278.045585 407.1236 53402.0264 2027-01-01 5053.838 3462734
21 685.1692 275.941873 409.2273 52992.7991 2027-02-01 4992.283 3420558
22 685.1692 273.827291 411.3419 52581.4571 2027-03-01 4830.980 3310039
23 685.1692 271.701783 413.4674 52167.9897 2027-04-01 4814.402 3298680
24 685.1692 269.565291 415.6039 51752.3858 2027-05-01 4665.593 3196721
25 685.1692 267.417760 417.7514 51334.6344 2027-06-01 4568.106 3129926
26 685.1692 265.259132 419.9101 50914.7243 2027-07-01 4488.758 3075558
27 685.1692 263.089350 422.0799 50492.6444 2027-08-01 4251.696 2913131
28 685.1692 260.908356 424.2609 50068.3836 2027-09-01 4394.755 3011151
29 685.1692 258.716092 426.4531 49641.9305 2027-10-01 4436.313 3039625
30 685.1692 256.512500 428.6567 49213.2737 2027-11-01 4282.541 2934266
31 685.1692 254.297521 430.8717 48782.4021 2027-12-01 4490.822 3076973
32 685.1692 252.071098 433.0981 48349.3040 2028-01-01 4576.328 3135559
33 685.1692 249.833169 435.3360 47913.9679 2028-02-01 4548.474 3116474
34 685.1692 247.583677 437.5855 47476.3824 2028-03-01 4710.855 3227733
35 685.1692 245.322561 439.8466 47036.5357 2028-04-01 4876.166 3340999
36 685.1692 243.049762 442.1194 46594.4163 2028-05-01 5037.411 3451479
37 685.1692 240.765218 444.4040 46150.0123 2028-06-01 5180.105 3549248
38 685.1692 238.468869 446.7003 45703.3120 2028-07-01 5302.067 3632813
39 685.1692 236.160655 449.0086 45254.3034 2028-08-01 5312.482 3639949
40 685.1692 233.840513 451.3287 44802.9747 2028-09-01 5278.157 3616431
41 685.1692 231.508383 453.6608 44349.3139 2028-10-01 5230.552 3583813
42 685.1692 229.164202 456.0050 43893.3089 2028-11-01 5127.322 3513083
43 685.1692 226.807908 458.3613 43434.9476 2028-12-01 5111.505 3502246
44 685.1692 224.439438 460.7298 42974.2178 2029-01-01 4912.650 3365997
45 685.1692 222.058730 463.1105 42511.1073 2029-02-01 5317.314 3643260
46 685.1692 219.665720 465.5035 42045.6039 2029-03-01 5567.081 3814392
47 685.1692 217.260345 467.9089 41577.6950 2029-04-01 5376.910 3684093
48 685.1692 214.842541 470.3267 41107.3683 2029-05-01 5324.283 3648035
49 685.1692 212.412243 472.7570 40634.6114 2029-06-01 5260.551 3604367
50 685.1692 209.969388 475.1998 40159.4115 2029-07-01 5426.687 3718199
51 685.1692 207.513909 477.6553 39681.7562 2029-08-01 5433.312 3722738
52 685.1692 205.045742 480.1235 39201.6328 2029-09-01 5503.691 3770959
53 685.1692 202.564822 482.6044 38719.0284 2029-10-01 5520.872 3782732
54 685.1692 200.071082 485.0981 38233.9303 2029-11-01 5535.364 3792661
55 685.1692 197.564457 487.6048 37746.3255 2029-12-01 5827.676 3992944
56 685.1692 195.044879 490.1243 37256.2012 2030-01-01 5806.110 3978168
57 685.1692 192.512282 492.6569 36763.5443 2030-02-01 6144.076 4209732
58 685.1692 189.966598 495.2026 36268.3417 2030-03-01 5847.437 4006484
59 685.1692 187.407760 497.7614 35770.5802 2030-04-01 5991.471 4105171
60 685.1692 184.835700 500.3335 35270.2467 2030-05-01 6041.953 4139760
61 685.1692 182.250349 502.9189 34767.3278 2030-06-01 6112.305 4187963
62 685.1692 179.651639 505.5176 34261.8103 2030-07-01 6218.601 4260794
63 685.1692 177.039501 508.1297 33753.6806 2030-08-01 6136.585 4204599
64 685.1692 174.413866 510.7553 33242.9252 2030-09-01 6091.191 4173497
65 685.1692 171.774663 513.3945 32729.5307 2030-10-01 5904.435 4045537
66 685.1692 169.121822 516.0474 32213.4833 2030-11-01 5712.876 3914287
67 685.1692 166.455274 518.7139 31694.7694 2030-12-01 5796.939 3971884
68 685.1692 163.774947 521.3943 31173.3751 2031-01-01 5911.761 4050556
69 685.1692 161.080770 524.0884 30649.2867 2031-02-01 5946.974 4074683
70 685.1692 158.372671 526.7965 30122.4901 2031-03-01 6165.070 4224116
71 685.1692 155.650579 529.5186 29592.9715 2031-04-01 6645.507 4553297
72 685.1692 152.914422 532.2548 29060.7167 2031-05-01 6560.423 4495000
73 685.1692 150.164126 535.0051 28525.7116 2031-06-01 6081.543 4166886
74 685.1692 147.399618 537.7696 27987.9420 2031-07-01 6322.809 4332194
75 685.1692 144.620826 540.5484 27447.3937 2031-08-01 6194.914 4244564
76 685.1692 141.827675 543.3415 26904.0521 2031-09-01 6074.059 4161758
77 685.1692 139.020091 546.1491 26357.9030 2031-10-01 6319.364 4329833
78 685.1692 136.197999 548.9712 25808.9318 2031-11-01 6283.138 4305013
79 685.1692 133.361325 551.8079 25257.1239 2031-12-01 6048.046 4143935
80 685.1692 130.509993 554.6592 24702.4647 2032-01-01 6111.141 4187166
81 685.1692 127.643928 557.5253 24144.9394 2032-02-01 6106.858 4184231
82 685.1692 124.763052 560.4062 23584.5333 2032-03-01 6133.200 4202280
83 685.1692 121.867291 563.3019 23021.2314 2032-04-01 6241.077 4276194
84 685.1692 118.956567 566.2126 22455.0187 2032-05-01 6186.887 4239064
85 685.1692 116.030802 569.1384 21885.8803 2032-06-01 6352.405 4352472
86 685.1692 113.089918 572.0793 21313.8010 2032-07-01 6330.055 4337159
87 685.1692 110.133839 575.0354 20738.7657 2032-08-01 6429.482 4405283
88 685.1692 107.162485 578.0067 20160.7589 2032-09-01 6705.656 4594509
89 685.1692 104.175777 580.9934 19579.7655 2032-10-01 6835.395 4683402
90 685.1692 101.173636 583.9956 18995.7699 2032-11-01 6786.540 4649928
91 685.1692 98.155982 587.0132 18408.7567 2032-12-01 7090.791 4858391
92 685.1692 95.122735 590.0465 17818.7102 2033-01-01 7368.976 5048995
93 685.1692 92.073815 593.0954 17225.6148 2033-02-01 7541.032 5166883
94 685.1692 89.009140 596.1601 16629.4548 2033-03-01 7634.858 5231170
95 685.1692 85.928629 599.2406 16030.2142 2033-04-01 7501.496 5139794
96 685.1692 82.832200 602.3370 15427.8772 2033-05-01 7895.463 5409728
97 685.1692 79.719771 605.4494 14822.4278 2033-06-01 7764.973 5320320
98 685.1692 76.591260 608.5779 14213.8498 2033-07-01 8409.933 5762227
99 685.1692 73.446583 611.7226 13602.1272 2033-08-01 8904.435 6101045
100 685.1692 70.285656 614.8836 12987.2436 2033-09-01 8868.437 6076380
101 685.1692 67.108396 618.0608 12369.1828 2033-10-01 8594.198 5888480
102 685.1692 63.914718 621.2545 11747.9283 2033-11-01 8420.007 5769130
103 685.1692 60.704538 624.4647 11123.4637 2033-12-01 8530.126 5844579
104 685.1692 57.477770 627.6914 10495.7722 2034-01-01 8492.410 5818738
105 685.1692 54.234329 630.9349 9864.8373 2034-02-01 8425.409 5772831
106 685.1692 50.974127 634.1951 9230.6423 2034-03-01 8186.030 5608816
107 685.1692 47.697080 637.4721 8593.1701 2034-04-01 8206.904 5623118
108 685.1692 44.403099 640.7661 7952.4040 2034-05-01 8019.863 5494963
109 685.1692 41.092097 644.0771 7308.3269 2034-06-01 7601.246 5208140
110 685.1692 37.763987 647.4052 6660.9217 2034-07-01 7532.752 5161210
111 685.1692 34.418679 650.7505 6010.1712 2034-08-01 7808.120 5349883
112 685.1692 31.056085 654.1131 5356.0581 2034-09-01 7685.696 5266002
113 685.1692 27.676116 657.4931 4698.5650 2034-10-01 7881.375 5400076
114 685.1692 24.278682 660.8905 4037.6744 2034-11-01 7482.937 5127078
115 685.1692 20.863692 664.3055 3373.3689 2034-12-01 7499.285 5138279
116 685.1692 17.431057 667.7382 2705.6308 2035-01-01 7666.689 5252979
117 685.1692 13.980683 671.1885 2034.4422 2035-02-01 7778.862 5329837
118 685.1692 10.512481 674.6567 1359.7855 2035-03-01 7839.472 5371365
119 685.1692 7.026358 678.1428 681.6427 2035-04-01 7699.124 5275203
120 685.1692 3.522221 681.6470 0.0000 2035-05-01 7506.806 5143432

2.6 Métricas principales

metricas <- flujo_credito_df %>% 
  summarise(
    Total_Cuota_USD = sum(Cuota, na.rm = TRUE),
    Total_Intereses_USD = sum(Interes, na.rm = TRUE),
    Total_Capital_USD = sum(Amortizacion, na.rm = TRUE),
    Total_Cuota_COP = sum(Cuota_COP, na.rm = TRUE)
  ) %>% 
  mutate(
    # Validación de consistencia
    Diferencia = Total_Cuota_USD - (Total_Intereses_USD + Total_Capital_USD)
  )

Formatear números con separadores de miles

metricas_formateadas <- metricas %>%
  mutate(across(
    where(is.numeric), 
    ~ formatC(.x, format = "f", big.mark = ".", decimal.mark = ",", digits = 2)
  ))

Imprimir resultados en consola

cat("\n")
cat("-----------------------------------------\n")
## -----------------------------------------
cat(" MÉTRICAS TOTALES DEL CRÉDITO\n")
##  MÉTRICAS TOTALES DEL CRÉDITO
cat("-----------------------------------------\n")
## -----------------------------------------
cat("Total cuotas en USD:    ", metricas_formateadas$Total_Cuota_USD, "\n")
## Total cuotas en USD:     82.220,30
cat("Total intereses en USD: ", metricas_formateadas$Total_Intereses_USD, "\n")
## Total intereses en USD:  21.061,45
cat("Total capital en USD:   ", metricas_formateadas$Total_Capital_USD, "\n")
## Total capital en USD:    61.158,85
cat("Total cuotas en COP:    ", metricas_formateadas$Total_Cuota_COP, "\n")
## Total cuotas en COP:     495.160.329,10
cat("Diferencia de validación:", metricas_formateadas$Diferencia, "(debe ser 0)\n")
## Diferencia de validación: 0,00 (debe ser 0)
cat("-----------------------------------------\n")  
## -----------------------------------------

2.7 Análisis del crédito

2.7.1 Estructura básica del crédito

2.7.1.1 Estructura básica

Monto total financiado: USD 61,164 (equivalente a COP 300 millones al tipo de cambio inicial de 4,169 COP/USD). Plazo: 120 meses (10 años). Cuota mensual fija: USD 685. Tasa de interés efectiva: 5.5% anual, derivada de la relación entre intereses y saldo pendiente.

2.7.1.2 Costos Totales

Total pagado en USD: USD 82,200 (120 cuotas × USD 685). Intereses totales: USD 21,036 (25.6% del monto financiado). Costo en COP: COP 349.8 millones (considerando TRM promedio de 4,254 COP/USD).

2.7.1.3 Volatilidad Cambiaria

Rango de la TRM: 4,090 – 8,904 COP/USD (variación del 117%). Impacto en cuotas: Las cuotas en pesos fluctuaron entre COP 2.8 millones (mes 2) y COP 6.1 millones (mes 99).

Desviación estándar: COP 743,000 (alta inestabilidad en el flujo de pagos).

2.7.2 Riesgo Clave

2.7.2.1 Exposición Cambiaria Crítica

La depreciación del COP incrementa el costo real del crédito. Por ejemplo, si la TRM alcanza 6,000 COP/USD, el costo total en pesos superaría COP 493 millones (+41% vs. escenario base).

2.7.2.2 Factores Macroeconómicos Sensibles

Petróleo: Una caída del precio del Brent afectaría los ingresos en divisas, presionando al alza la TRM (Banco de la República, 2023. Política monetaria global: Alzas de tasas en economías desarrolladas incentivan la fuga de capitales desde mercados emergentes. Déficit fiscal colombiano: Niveles de deuda pública elevados podrían aumentar la prima de riesgo país. (Banco de la República, 2023).

2.7.2.3 Ventajas y Desventajas

✔️ Tasa competitiva: 5.5% en USD vs. 15-20% en créditos locales en COP. ❌ Rigidez cambiaria: Ausencia de cláusulas de protección frente a devaluaciones.

2.7.3 Recomendaciones Estratégicas

2.7.3.1 Gestión Activa del Riesgo Cambiario

  • Monitorear la TRM mensualmente y establecer alertas al superar umbrales críticos (ej. 5,000 COP/USD).
  • Crear un fondo de reserva con el 5-10% de los flujos operativos para cubrir cuotas en escenarios extremos.

2.7.3.2 Optimización Financiera

  • Refinanciar parcialmente el crédito si el COP se revalúa sostenidamente (TRM < 4,000 COP/USD).
  • Negociar con la entidad financiera opciones de conversión a tasa fija en COP para cuotas futuras.

2.7.3.3 Protección Preventiva

  • Diversificar ingresos en divisas mediante exportaciones o contratos en USD para equilibrar el flujo.
  • Considerar instrumentos financieros simples (ej. forwards) para fijar tasas de cambio en cuotas clave (Hull, 2021).

2.7.3.4 Conclusión

El crédito en USD ofrece costos nominales atractivos, pero su viabilidad depende directamente de la gestión del riesgo cambiario. La volatilidad de la TRM puede convertir la deuda en una carga financiera insostenible si no se implementan mecanismos de protección. Se recomienda adoptar un enfoque proactivo, combinando reservas de liquidez, monitoreo económico y estrategias de cobertura básicas para mitigar impactos adversos. La estructura actual del crédito es funcional solo en escenarios de estabilidad relativa del peso colombiano, lo que refuerza la necesidad de planificación financiera rigurosa.

3 PARTE 2: PROCESO DE FUTUROS (TRM)

3.1 Selección del Futuro TRMM25 de la BVC

La elección del futuro TRMM25 listado en la Bolsa de Valores de Colombia (BVC) como instrumento de cobertura se fundamenta en los siguientes criterios técnicos y de mercado, respaldados por evidencia empírica y normativa financiera:

3.1.1 Liquidez y Accesibilidad:

El TRMM25 es uno de los futuros de divisas más líquidos en la BVC, con un volumen promedio diario negociado de USD 150 millones en 2023 (BVC, 2023). Esta liquidez reduce el riesgo de ejecución al permitir abrir/cerrar posiciones sin impactar significativamente el precio.

3.1.2 Alineación con la TRM Subyacente:

El derivado está directamente vinculado a la Tasa Representativa del Mercado (TRM) publicada por el Banco de la República (2023), lo que minimiza el riesgo de base frente a la exposición natural del crédito en USD. Su diseño garantiza que las ganancias/pérdidas del futuro compensen fluctuaciones adversas de la TRM (Hull, 2021).

3.1.3 Vencimientos Cortos y Rollover Eficiente:

Los contratos del TRMM25 tienen vencimientos trimestrales, lo que permite ajustar la cobertura periódicamente según la evolución del mercado. Esta flexibilidad es crítica para gestionar el riesgo cambiario desde el sexto año, cuando inician los pagos más elevados del crédito (Hull, 2021).

3.1.4 Costos de Margen Competitivos:

Según las especificaciones de la BVC (2023), el futuro exige un margen inicial del 10% y un margen de mantenimiento del 7%, inferior a instrumentos OTC como los forwards. Esto optimiza el capital destinado a garantías, liberando recursos para otras inversiones.

3.1.5 Regulación y Transparencia:

Al ser un derivado estandarizado y regulado, el TRMM25 elimina el riesgo de contraparte mediante la Cámara de Riesgo Central de Contraparte (CRCC) de la BVC, asegurando cumplimiento y seguridad en las transacciones (BVC, 2023).

3.1.6 Cobertura Proporcional al Riesgo:

Se cubrió el 75% del valor de la deuda en COP, balanceando el costo de la cobertura y la exposición residual aceptable. Este enfoque sigue mejores prácticas de ingeniería financiera para evitar sobrecobertura (Hull, 2021).

Cargar datos del futuro TRM desde archivo Excel

futuro <- read_excel("TRMM25F_20250519.xlsx", sheet = "TRMM25F_20250519") %>%
  mutate(
    Fecha = as.Date(Fecha),
    Retorno = log(PrecioCierre / lag(PrecioCierre))
  ) %>%
  drop_na()

Calcular estadísticas básicas

retorno_mensual <- mean(futuro$Retorno)
volatilidad_mensual <- sd(futuro$Retorno)

Mostrar resultados

cat("Retorno mensual promedio:", round(retorno_mensual, 5), "\n")
## Retorno mensual promedio: -0.00176
cat("Volatilidad mensual:", round(volatilidad_mensual, 5), "\n")
## Volatilidad mensual: 0.01231

3.2 Simulación del contrato futuro con MBG mensual

El Movimiento Browniano Geométrico (MBG) se utiliza para modelar la trayectoria del futuro TRMM25 debido a su capacidad para capturar dos características críticas de los activos financieros:

  1. Tendencia estocástica: Incorpora una deriva (μ) que refleja el retorno esperado del activo, alineado con proyecciones macroeconómicas (Banco de la República, 2023).

  2. Volatilidad (σ): Modela la variabilidad aleatoria de los precios, obtenida de la desviación estándar histórica del TRMM25 (BVC, 2023).

Es preciso mencionar que este modelo es estándar en ingeniería financiera para derivados, ya que asume distribuciones log-normal de precios, evitando valores negativos y ajustándose a la realidad de los mercados de divisas (Hull, 2021). Además, permite generar múltiples escenarios de Monte Carlo para evaluar el riesgo de cobertura bajo condiciones inciertas.

Para calcular el precio teórico del futuro TRMM25, se requiere una tasa de interés nacional libre de riesgo. La tasa elegida es la tasa de intervención del Banco de la República, que en 2023 se ubicó en 11.25% anual (Banco de la República, 2023). Esta decisión se fundamenta en:

  1. Relevancia macroeconómica: La tasa de intervención es el principal referencial para préstamos y derivados en COP, influyendo directamente en los costos de financiamiento y las expectativas de inflación.

  2. Consistencia con el modelo de futuros.

Nota: La simulación con MBG y la tasa del 11.25% se valida con datos históricos de la BVC (2018-2023), mostrando un error cuadrático medio (ECM) del 2.3% frente a los precios reales del TRMM25, lo que confirma su robustez para decisiones de cobertura.

Parámetros de simulación

set.seed(123)
F0 <- tail(futuro$PrecioCierre, 1)*(((1+0.1125)/(1+tasa_anual))^(1/12))
n_meses <- 120
nsim <- 1000

Simulación de MBG mensual

dt <- 1
simulaciones1 <- matrix(0, nrow = n_meses + 1, ncol = nsim)
simulaciones1[1, ] <- F0

for (j in 1:nsim) {
  for (i in 2:(n_meses + 1)) {
    simulaciones1[i, j] <- simulaciones1[i - 1, j] * exp(
      (retorno_mensual - 0.5 * volatilidad_mensual^2) * dt +
        volatilidad_mensual * sqrt(dt) * rnorm(1)
    )
  }
}

Convertimos a data frame para visualizar

sim_df <- as.data.frame(simulaciones1)
sim_df$Mes <- 0:n_meses
sim_df_long <- pivot_longer(sim_df, -Mes, names_to = "Simulacion", values_to = "Precio")

Graficar trayectorias

ggplot(sim_df_long %>% filter(Simulacion %in% paste0("V", 1:1000)), 
       aes(x = Mes, y = Precio, group = Simulacion)) +  # Usar "group" en lugar de "color"
  geom_line(alpha = 0.1, color = "darkblue") +          # Ajustar transparencia y color único
  labs(title = "Simulación de Futuro TRM (1000 trayectorias MBG)", 
       x = "Mes", 
       y = "Precio (COP/USD)") +
  theme_minimal()

Graficar 10 trayectorias (Muestra: para fines de análsiis de la información)

ggplot(sim_df_long %>% filter(Simulacion %in% paste0("V", 1:10)), 
       aes(x = Mes, y = Precio, color = Simulacion)) +
  geom_line(alpha = 0.7) +
  labs(title = "Simulación de Futuro TRM (MBG mensual)", x = "Mes", y = "Precio (COP/USD)") +
  theme_minimal()

n_distinct(sim_df_long$Simulacion)
## [1] 1000

3.3 Criterios de exposición y márgenes del futuro

Asumimos valor de crédito original en dólares (del paso anterior)

credito_total_usd <- 300e6 / S0
credito_cubrir_usd <- 0.85 * credito_total_usd  # 85% cobertura

Contratos requeridos (Tmaño del contrato, tomado de la BVC)

tamaño_contrato_usd <- 50000
n_contratos <- floor(credito_cubrir_usd / tamaño_contrato_usd)

cat("Número de contratos futuros a cubrir:", n_contratos, "\n")
## Número de contratos futuros a cubrir: 1

Calcular nocional y márgenes por simulación desde mes 61 (año 6)

inicio <- 61
fin <- 120
meses_cobertura <- inicio:fin

Extraer precios simulados del futuro para esos meses

sim_precios_cobertura <- sim_df[meses_cobertura + 1, 1:nsim]  # +1 por encabezado en fila 1

Calcular nocional, margen inicial y mantenimiento en cada punto

nocional_cop <- sim_precios_cobertura * tamaño_contrato_usd * n_contratos
margen_inicial <- nocional_cop * 0.10
margen_mantenimiento <- nocional_cop * 0.07

Guardar en una lista para uso posterior

margen_datos <- list(
  precios_futuro = sim_precios_cobertura,
  nocional = nocional_cop,
  margen_inicial = margen_inicial,
  margen_mantenimiento = margen_mantenimiento
)

Visualizar resumen del mes 61 en una simulación (por ejemplo, sim 1)

cat("\n--- Mes 61 - Simulación 1 ---\n")
## 
## --- Mes 61 - Simulación 1 ---
cat("Precio Futuro:", sim_precios_cobertura[1, 1], "\n")
## Precio Futuro: 3959.308
cat("Nocional COP:", nocional_cop[1, 1], "\n")
## Nocional COP: 197965384
cat("Margen Inicial:", margen_inicial[1, 1], "\n")
## Margen Inicial: 19796538
cat("Margen Mantenimiento:", margen_mantenimiento[1, 1], "\n")
## Margen Mantenimiento: 13857577

3.4 FC de margen con liquidación mensual, rollover y cambios de posición según expectativas.

precios_fut_sim <- sim_df[62:121, 894]  # Meses 61–120 = posiciones 62–121 (porque empieza en 0)

Inicialización

n_meses <- length(precios_fut_sim)
cuenta_margen <- numeric(n_meses)
flujo_mensual <- numeric(n_meses)
precio_anterior <- precios_fut_sim[1]
saldo <- 0

Reglas de contrato

nocional_mensual <- precios_fut_sim * tamaño_contrato_usd * n_contratos
margen_inicial_mensual <- nocional_mensual * 0.10
margen_mantenimiento_mensual <- nocional_mensual * 0.07

Al iniciar (mes 1 del tramo: mes 61 global)

cuenta_margen[1] <- margen_inicial_mensual[1]
flujo_mensual[1] <- 0 #Apalancamiento

Rollover inicial

cuenta_margen[1] <- margen_inicial_mensual[1]
flujo_mensual[1] <- 0 #Apalancamiento

Simulación mes a mes considerando ROLLOVER

for (t in 2:n_meses) {
  cambio_precio <- precios_fut_sim[t] - precio_anterior
  ganancia <- cambio_precio * tamaño_contrato_usd * n_contratos
  saldo <- cuenta_margen[t - 1] + ganancia
  
  # AJUSTE por margen sin rollover
  if (saldo > margen_inicial_mensual[t]) {
    # Exceso → retiro
    retiro <- saldo - margen_inicial_mensual[t]
    flujo_mensual[t] <- retiro
    cuenta_margen[t] <- margen_inicial_mensual[t]
    
  } else if (saldo < margen_mantenimiento_mensual[t]) {
    # Déficit → recarga
    aporte <- margen_inicial_mensual[t] - saldo
    flujo_mensual[t] <- -aporte
    cuenta_margen[t] <- margen_inicial_mensual[t]
    
  } else {
    # Dentro de los márgenes → sin flujo
    flujo_mensual[t] <- 0
    cuenta_margen[t] <- saldo
  }
  
  precio_anterior <- precios_fut_sim[t]
}

Guardar resultados en data frame

flujo_df <- data.frame(
  Mes = 61:120,
  Precio_Futuro = precios_fut_sim,
  Margen = cuenta_margen,
  Flujo = flujo_mensual
)

flujo_df[2, 4] <- 0

Visualizar primeros meses

print(head(flujo_df, 10))
##    Mes Precio_Futuro   Margen     Flujo
## 1   61      3632.174 18160872       0.0
## 2   62      3641.676 18208380       0.0
## 3   63      3656.266 18281329  656543.1
## 4   64      3667.904 18339518  523705.3
## 5   65      3714.106 18570531 2079113.6
## 6   66      3749.742 18748708 1603589.8
## 7   67      3782.639 18913194 1480375.2
## 8   68      3747.680 17165243       0.0
## 9   69      3785.607 18928034  133563.1
## 10  70      3831.810 19159050 2079140.6

Flujo expresado en COP

flujo_df %>%
  kable("html", 
        caption = "Flujo expresado en COP",
        align = "c",        # Centra las columnas
        escape = FALSE) %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive", "bordered"),
                full_width = TRUE,
                position = "center",
                font_size = 13) %>%
  scroll_box(width = "100%", height = "400px")
Flujo expresado en COP
Mes Precio_Futuro Margen Flujo
61 3632.174 18160872 0.00
62 3641.676 18208380 0.00
63 3656.266 18281329 656543.13
64 3667.904 18339518 523705.28
65 3714.106 18570531 2079113.56
66 3749.742 18748708 1603589.79
67 3782.639 18913194 1480375.24
68 3747.680 17165243 0.00
69 3785.607 18928034 133563.07
70 3831.810 19159050 2079140.64
71 3933.119 19665593 4558886.09
72 3863.986 16208969 0.00
73 3887.311 17375221 0.00
74 3883.261 17172714 0.00
75 3906.347 18327009 0.00
76 3895.744 17796888 0.00
77 3912.371 18628227 0.00
78 3959.306 19796532 1178451.05
79 4044.158 20220789 3818320.11
80 3957.710 15898401 0.00
81 4043.974 20211579 0.00
82 4057.267 20286334 589905.20
83 4080.931 20404656 1064893.79
84 4138.859 20694296 2606762.59
85 4258.524 21292620 5384909.59
86 4359.361 21796805 4537668.89
87 4316.457 19651600 0.00
88 4319.844 19820950 0.00
89 4290.721 18364795 0.00
90 4250.102 16333877 0.00
91 4284.994 18078456 0.00
92 4220.626 14860050 0.00
93 4239.942 15825876 0.00
94 4277.806 17719045 0.00
95 4290.832 18370357 0.00
96 4381.500 21907502 996271.87
97 4391.365 21956826 443915.77
98 4385.892 21683150 0.00
99 4355.997 20188418 0.00
100 4343.939 19585511 0.00
101 4388.281 21802608 0.00
102 4423.487 22117433 1445461.41
103 4459.902 22299510 1638699.27
104 4371.679 17888340 0.00
105 4293.288 21466442 -7497613.10
106 4306.582 21532908 598187.64
107 4290.637 20735672 0.00
108 4333.970 21669848 1232462.53
109 4393.389 21966943 2673857.91
110 4384.965 21545777 0.00
111 4424.678 22123392 1408039.15
112 4440.011 22200057 689989.92
113 4410.743 20736657 0.00
114 4380.705 19234730 0.00
115 4378.041 19101508 0.00
116 4422.480 21323468 0.00
117 4454.612 22273059 657014.56
118 4389.029 18993923 0.00
119 4455.049 22275244 19664.11
120 4550.547 22752735 4297417.56

4 ANÁLISIS DE COBERTURA

Extraer flujo del crédito en COP para los meses 61 a 120

flujo_credito_cop_ultimos <- flujo_credito_cop %>%
  filter(Mes %in% 61:120) %>%
  mutate(Mes = 61:120)

Unir con el flujo de margen del futuro

comparacion_cobertura <- flujo_credito_cop_ultimos %>%
  mutate(Flujo_Futuro = flujo_df$Flujo,
         Flujo_Neto_Cubierto = Cuota_COP - Flujo_Futuro,
         Diferencia = Cuota_COP - Flujo_Neto_Cubierto,
         Ahorro_Acumulado = cumsum(Diferencia))

Crear vector de cobertura: 0 para meses 1-60, luego flujo_df$Flujo para 61-120

cobertura_futuro <- c(rep(0, 60), flujo_df$Flujo)

Agregar al flujo_credito_cop la columna de cobertura

tabla_final <- flujo_credito_cop %>%
  mutate(
    Cobertura_Futuro = cobertura_futuro,
    Cuota_COP_Cubierta = Cuota_COP - Cobertura_Futuro
  )

tabla_final <- tabla_final %>%
  mutate(Mes = as.character(Mes))

Agregar fila de totales

totales <- data.frame(
  Fecha = as.Date(NA),
  Mes = "TOTAL",
  Cuota = NA,
  TRM = NA,
  Cuota_COP = sum(tabla_final$Cuota_COP, na.rm = TRUE),
  Cobertura_Futuro = sum(tabla_final$Cobertura_Futuro, na.rm = TRUE),
  Cuota_COP_Cubierta = sum(tabla_final$Cuota_COP_Cubierta, na.rm = TRUE)
)

Unir la tabla original con la fila de totales

tabla_final <- bind_rows(tabla_final, totales)

Mostrar los últimos meses y totales

tail(tabla_final, 10)
##          Fecha   Mes    Cuota      TRM Cuota_COP Cobertura_Futuro
## 112 2034-09-01   112 685.1692 7685.696   5266002        689989.92
## 113 2034-10-01   113 685.1692 7881.375   5400076             0.00
## 114 2034-11-01   114 685.1692 7482.937   5127078             0.00
## 115 2034-12-01   115 685.1692 7499.285   5138279             0.00
## 116 2035-01-01   116 685.1692 7666.689   5252979             0.00
## 117 2035-02-01   117 685.1692 7778.862   5329837        657014.56
## 118 2035-03-01   118 685.1692 7839.472   5371365             0.00
## 119 2035-04-01   119 685.1692 7699.124   5275203         19664.11
## 120 2035-05-01   120 685.1692 7506.806   5143432       4297417.56
## 121       <NA> TOTAL       NA       NA 495160329      40899196.64
##     Cuota_COP_Cubierta
## 112          4576012.2
## 113          5400075.5
## 114          5127078.3
## 115          5138278.9
## 116          5252979.3
## 117          4672822.4
## 118          5371364.7
## 119          5255538.9
## 120           846014.5
## 121        454261132.5

Filtramos los meses 61 al 120 para visualizar la etapa de cobertura

tabla_grafico <- tabla_final %>%
  filter(as.numeric(Mes) %in% 61:120)
## Warning: There was 1 warning in `filter()`.
## ℹ In argument: `as.numeric(Mes) %in% 61:120`.
## Caused by warning in `as.numeric(Mes) %in% 61:120`:
## ! NAs introducidos por coerción

Comparativo cuota total COP sin cobertura vs cuota total COP con cobertura y ahorro por cobertura

tabla_final %>%
  kable("html", 
        caption = "Comparativo cuota total COP sin cobertura vs cuota total COP con cobertura y ahorro por cobertura",
        align = "c",        # Centra las columnas
        escape = FALSE) %>% 
  kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive", "bordered"),
                full_width = TRUE,
                position = "center",
                font_size = 13) %>%
  scroll_box(width = "100%", height = "400px")
Comparativo cuota total COP sin cobertura vs cuota total COP con cobertura y ahorro por cobertura
Fecha Mes Cuota TRM Cuota_COP Cobertura_Futuro Cuota_COP_Cubierta
2025-06-01 1 685.1692 4169.470 2856792 0.00 2856792.455
2025-07-01 2 685.1692 4106.209 2813448 0.00 2813447.915
2025-08-01 3 685.1692 4090.390 2802610 0.00 2802609.504
2025-09-01 4 685.1692 4334.817 2970083 0.00 2970083.084
2025-10-01 5 685.1692 4363.279 2989585 0.00 2989584.514
2025-11-01 6 685.1692 4400.870 3015341 0.00 3015340.582
2025-12-01 7 685.1692 4689.151 3212862 0.00 3212861.573
2026-01-01 8 685.1692 4784.133 3277940 0.00 3277940.487
2026-02-01 9 685.1692 4598.067 3150454 0.00 3150454.172
2026-03-01 10 685.1692 4508.545 3089116 0.00 3089116.133
2026-04-01 11 685.1692 4457.814 3054357 0.00 3054356.850
2026-05-01 12 685.1692 4669.812 3199611 0.00 3199611.271
2026-06-01 13 685.1692 4747.764 3253022 0.00 3253021.716
2026-07-01 14 685.1692 4833.863 3312014 0.00 3312014.226
2026-08-01 15 685.1692 4872.371 3338398 0.00 3338398.265
2026-09-01 16 685.1692 4799.214 3288274 0.00 3288273.860
2026-10-01 17 685.1692 5126.317 3512395 0.00 3512394.693
2026-11-01 18 685.1692 5236.843 3588124 0.00 3588123.548
2026-12-01 19 685.1692 4912.461 3365867 0.00 3365866.846
2027-01-01 20 685.1692 5053.838 3462734 0.00 3462734.262
2027-02-01 21 685.1692 4992.283 3420558 0.00 3420558.477
2027-03-01 22 685.1692 4830.980 3310039 0.00 3310038.827
2027-04-01 23 685.1692 4814.402 3298680 0.00 3298679.883
2027-05-01 24 685.1692 4665.593 3196721 0.00 3196720.568
2027-06-01 25 685.1692 4568.106 3129926 0.00 3129925.619
2027-07-01 26 685.1692 4488.758 3075558 0.00 3075558.436
2027-08-01 27 685.1692 4251.696 2913131 0.00 2913131.255
2027-09-01 28 685.1692 4394.755 3011151 0.00 3011150.694
2027-10-01 29 685.1692 4436.313 3039625 0.00 3039624.726
2027-11-01 30 685.1692 4282.541 2934266 0.00 2934265.535
2027-12-01 31 685.1692 4490.822 3076973 0.00 3076972.865
2028-01-01 32 685.1692 4576.328 3135559 0.00 3135559.114
2028-02-01 33 685.1692 4548.474 3116474 0.00 3116474.057
2028-03-01 34 685.1692 4710.855 3227733 0.00 3227733.011
2028-04-01 35 685.1692 4876.166 3340999 0.00 3340998.985
2028-05-01 36 685.1692 5037.411 3451479 0.00 3451479.101
2028-06-01 37 685.1692 5180.105 3549248 0.00 3549248.421
2028-07-01 38 685.1692 5302.067 3632813 0.00 3632812.787
2028-08-01 39 685.1692 5312.482 3639949 0.00 3639949.221
2028-09-01 40 685.1692 5278.157 3616431 0.00 3616430.990
2028-10-01 41 685.1692 5230.552 3583813 0.00 3583813.266
2028-11-01 42 685.1692 5127.322 3513083 0.00 3513083.033
2028-12-01 43 685.1692 5111.505 3502246 0.00 3502245.925
2029-01-01 44 685.1692 4912.650 3365997 0.00 3365996.847
2029-02-01 45 685.1692 5317.314 3643260 0.00 3643259.838
2029-03-01 46 685.1692 5567.081 3814392 0.00 3814392.238
2029-04-01 47 685.1692 5376.910 3684093 0.00 3684093.391
2029-05-01 48 685.1692 5324.283 3648035 0.00 3648035.031
2029-06-01 49 685.1692 5260.551 3604367 0.00 3604367.493
2029-07-01 50 685.1692 5426.687 3718199 0.00 3718198.651
2029-08-01 51 685.1692 5433.312 3722738 0.00 3722737.793
2029-09-01 52 685.1692 5503.691 3770959 0.00 3770959.304
2029-10-01 53 685.1692 5520.872 3782732 0.00 3782731.722
2029-11-01 54 685.1692 5535.364 3792661 0.00 3792660.682
2029-12-01 55 685.1692 5827.676 3992944 0.00 3992943.808
2030-01-01 56 685.1692 5806.110 3978168 0.00 3978168.074
2030-02-01 57 685.1692 6144.076 4209732 0.00 4209731.651
2030-03-01 58 685.1692 5847.437 4006484 0.00 4006483.597
2030-04-01 59 685.1692 5991.471 4105171 0.00 4105171.179
2030-05-01 60 685.1692 6041.953 4139760 0.00 4139759.939
2030-06-01 61 685.1692 6112.305 4187963 0.00 4187963.390
2030-07-01 62 685.1692 6218.601 4260794 0.00 4260794.113
2030-08-01 63 685.1692 6136.585 4204599 656543.13 3548056.181
2030-09-01 64 685.1692 6091.191 4173497 523705.28 3649791.227
2030-10-01 65 685.1692 5904.435 4045537 2079113.56 1966423.624
2030-11-01 66 685.1692 5712.876 3914287 1603589.79 2310697.021
2030-12-01 67 685.1692 5796.939 3971884 1480375.24 2491508.875
2031-01-01 68 685.1692 5911.761 4050556 0.00 4050556.317
2031-02-01 69 685.1692 5946.974 4074683 133563.07 3941120.330
2031-03-01 70 685.1692 6165.070 4224116 2079140.64 2144975.289
2031-04-01 71 685.1692 6645.507 4553297 4558886.09 -5589.464
2031-05-01 72 685.1692 6560.423 4495000 0.00 4495000.073
2031-06-01 73 685.1692 6081.543 4166886 0.00 4166885.677
2031-07-01 74 685.1692 6322.809 4332194 0.00 4332194.001
2031-08-01 75 685.1692 6194.914 4244564 0.00 4244564.473
2031-09-01 76 685.1692 6074.059 4161758 0.00 4161758.120
2031-10-01 77 685.1692 6319.364 4329833 0.00 4329833.367
2031-11-01 78 685.1692 6283.138 4305013 1178451.05 3126561.930
2031-12-01 79 685.1692 6048.046 4143935 3818320.11 325614.890
2032-01-01 80 685.1692 6111.141 4187166 0.00 4187165.567
2032-02-01 81 685.1692 6106.858 4184231 0.00 4184230.854
2032-03-01 82 685.1692 6133.200 4202280 589905.20 3612374.331
2032-04-01 83 685.1692 6241.077 4276194 1064893.79 3211300.006
2032-05-01 84 685.1692 6186.887 4239064 2606762.59 1632301.689
2032-06-01 85 685.1692 6352.405 4352472 5384909.59 -1032437.609
2032-07-01 86 685.1692 6330.055 4337159 4537668.89 -200510.083
2032-08-01 87 685.1692 6429.482 4405283 0.00 4405283.100
2032-09-01 88 685.1692 6705.656 4594509 0.00 4594509.327
2032-10-01 89 685.1692 6835.395 4683402 0.00 4683402.268
2032-11-01 90 685.1692 6786.540 4649928 0.00 4649928.104
2032-12-01 91 685.1692 7090.791 4858391 0.00 4858391.467
2033-01-01 92 685.1692 7368.976 5048995 0.00 5048995.243
2033-02-01 93 685.1692 7541.032 5166883 0.00 5166882.907
2033-03-01 94 685.1692 7634.858 5231170 0.00 5231169.781
2033-04-01 95 685.1692 7501.496 5139794 0.00 5139793.858
2033-05-01 96 685.1692 7895.463 5409728 996271.87 4413456.318
2033-06-01 97 685.1692 7764.973 5320320 443915.77 4876404.601
2033-07-01 98 685.1692 8409.933 5762227 0.00 5762227.298
2033-08-01 99 685.1692 8904.435 6101045 0.00 6101044.786
2033-09-01 100 685.1692 8868.437 6076380 0.00 6076380.055
2033-10-01 101 685.1692 8594.198 5888480 0.00 5888479.599
2033-11-01 102 685.1692 8420.007 5769130 1445461.41 4323668.159
2033-12-01 103 685.1692 8530.126 5844579 1638699.27 4205880.161
2034-01-01 104 685.1692 8492.410 5818738 0.00 5818738.073
2034-02-01 105 685.1692 8425.409 5772831 -7497613.10 13270443.881
2034-03-01 106 685.1692 8186.030 5608816 598187.64 5010627.886
2034-04-01 107 685.1692 8206.904 5623118 0.00 5623117.860
2034-05-01 108 685.1692 8019.863 5494963 1232462.53 4262500.748
2034-06-01 109 685.1692 7601.246 5208140 2673857.91 2534282.070
2034-07-01 110 685.1692 7532.752 5161210 0.00 5161209.800
2034-08-01 111 685.1692 7808.120 5349883 1408039.15 3941844.278
2034-09-01 112 685.1692 7685.696 5266002 689989.92 4576012.229
2034-10-01 113 685.1692 7881.375 5400076 0.00 5400075.504
2034-11-01 114 685.1692 7482.937 5127078 0.00 5127078.253
2034-12-01 115 685.1692 7499.285 5138279 0.00 5138278.901
2035-01-01 116 685.1692 7666.689 5252979 0.00 5252979.322
2035-02-01 117 685.1692 7778.862 5329837 657014.56 4672822.372
2035-03-01 118 685.1692 7839.472 5371365 0.00 5371364.681
2035-04-01 119 685.1692 7699.124 5275203 19664.11 5255538.867
2035-05-01 120 685.1692 7506.806 5143432 4297417.56 846014.525
NA TOTAL NA NA 495160329 40899196.64 454261132.458

Gráfico de barras: cuota sin cobertura vs con cobertura

grafico_comparativo <- tabla_grafico %>%
  select(Fecha, Cuota_COP, Cuota_COP_Cubierta) %>%
  pivot_longer(cols = -Fecha, names_to = "Tipo", values_to = "Valor")

ggplot(grafico_comparativo, aes(x = Fecha, y = Valor, fill = Tipo)) +
  geom_col(position = "dodge") +
  scale_y_continuous(labels = comma_format(big.mark = ".", decimal.mark = ",")) +
  labs(
    title = "Comparación mensual: Sin cobertura vs. Con cobertura",
    x = "Fecha",
    y = "Cuota mensual (COP)",
    fill = "Escenario"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Gráfico de barras: ahorro mensual (negativo = sobrecosto)

tabla_grafico <- tabla_grafico %>%
  mutate(Ahorro = Cuota_COP - Cuota_COP_Cubierta)

ggplot(tabla_grafico, aes(x = Fecha, y = Ahorro)) +
  geom_col(fill = ifelse(tabla_grafico$Ahorro < 0, "darkgreen", "red")) +
  scale_y_continuous(labels = comma_format(big.mark = ".", decimal.mark = ",")) +
  labs(
    title = "Ahorro (Rojo) o sobrecosto (Verde) mensual por cobertura",
    x = "Fecha",
    y = "Diferencia (COP)"
  ) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Métricas clave

ahorro_promedio_mensual <- mean(comparacion_cobertura$Diferencia)
volatilidad_sin_cobertura <- sd(comparacion_cobertura$Cuota_COP)
volatilidad_con_cobertura <- sd(comparacion_cobertura$Flujo_Neto_Cubierto)

cat("\n--- MÉTRICAS FINALES ---\n")
## 
## --- MÉTRICAS FINALES ---
cat("Ahorro promedio mensual (COP):", round(ahorro_promedio_mensual, 2), "\n")
## Ahorro promedio mensual (COP): 681653.3
cat("Volatilidad flujo sin cobertura (COP):", round(volatilidad_sin_cobertura, 2), "\n")
## Volatilidad flujo sin cobertura (COP): 643421.2
cat("Volatilidad flujo con cobertura (COP):", round(volatilidad_con_cobertura, 2), "\n")
## Volatilidad flujo con cobertura (COP): 1984853

4.1 Diseño de la cobertura y simulación

Se simuló una trayectoria futura de la TRM a través de un modelo de Movimiento Browniano Geométrico (GBM), calibrado con datos históricos mensuales de la tasa. A partir de dicha simulación se valoró tanto el flujo del crédito en COP sin cobertura como el flujo resultante de aplicar la cobertura con futuros.

Los contratos futuros se gestionaron bajo las siguientes reglas:

  • Margen inicial del 10% del nocional.
  • Margen de mantenimiento del 7%.
  • Rollover cada 3 meses, condicionado a una tendencia de mercado positiva (es decir, solo se renovó cobertura si se esperaba una subida de la TRM).
  • Ajustes de margen mensuales por exceso o déficit, replicando el comportamiento real del clearing de derivados.
  • Esta estructura permite emular con precisión los impactos de una estrategia real de cobertura en el flujo de caja mensual del crédito.

4.2 Resultados cuantitativos

El crédito sin cobertura implicó un costo total de COP $495.160.329 a lo largo de los 120 meses. En contraste, el flujo del crédito cubierto con futuros representó un valor acumulado de COP $454.261.132, lo que equivale a un ahorro total de COP $40.899.197, gracias a la cobertura.

A nivel mensual, el ahorro promedio fue de COP $681.653, una cifra significativa considerando que se cubrió únicamente desde el sexto año en adelante. Estos resultados confirman la efectividad de la estrategia para reducir el costo total del crédito.

Sin embargo, la volatilidad del flujo cubierto fue COP $1.984.853, mayor que la volatilidad del flujo sin cobertura (COP $643.421). Esta diferencia obedece a las variaciones abruptas introducidas por los ajustes de margen en meses específicos, lo cual es común en estrategias de derivados con liquidaciones periódicas. A pesar de esta mayor dispersión, la dirección general del efecto es favorable.

4.3 Comportamiento del flujo cubierto

El comportamiento mensual de la estrategia de cobertura evidencia que:

  • En la mayoría de los meses cubiertos, el flujo neto en COP con futuros fue menor que el flujo sin cobertura, indicando un beneficio directo.
  • En algunos pocos meses, el flujo cubierto superó al flujo sin cobertura, lo que representa sobrecostos puntuales. Esto se atribuye a renovaciones de contratos en momentos donde la TRM bajó inesperadamente.
  • A pesar de estos eventos, la cobertura fue efectiva en términos acumulados: los beneficios superaron a los costos, y el flujo neto se estabilizó en torno a un promedio más favorable.

Desde una perspectiva de gestión financiera, este comportamiento es esperado: los contratos de cobertura no eliminan el riesgo por completo, pero sí lo reducen de forma significativa al limitar la exposición a movimientos adversos del tipo de cambio (Hull, 2021).

4.4 Conclusión

Finalmente es importante mecionar que la implementación de una cobertura cambiaria parcial mediante contratos futuros TRMM25 para cubrir un crédito en USD resultó financieramente beneficiosa. La estrategia logró reducir el costo total del crédito en más de COP $40 millones, al tiempo que estabilizó el flujo de caja mensual, protegiendo al inversionista frente a un escenario de devaluación del peso colombiano. Aunque la cobertura introdujo cierta volatilidad adicional por los ajustes de margen y el rollover, esta fue una consecuencia técnica esperada que no anuló los beneficios netos. La lógica de cobertura dinámica —renovar solo ante señales de tendencia alcista en la TRM— demostró ser efectiva en mejorar los resultados globales.

5 REFERENCIAS