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)
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. ”
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.
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).
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).
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.
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).
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)
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:
No negatividad: Garantiza precios positivos mediante una distribución lognormal (Hull, 2021).
Sencillez matemática: Permite soluciones cerradas (p. ej., modelo Black-Scholes) y simulaciones eficientes (Black & Scholes, 1973).
Consistencia con mercados eficientes: Modela trayectorias continuas, alineadas con la incorporación gradual de información (Fama, 1970).
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()
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")
| 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
)
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")
| 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 |
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")
## -----------------------------------------
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.
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).
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).
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).
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).
✔️ 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.
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.
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:
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.
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).
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).
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.
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).
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
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:
Tendencia estocástica: Incorpora una deriva (μ) que refleja el retorno esperado del activo, alineado con proyecciones macroeconómicas (Banco de la República, 2023).
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:
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.
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
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
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")
| 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 |
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")
| 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
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:
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.
El comportamiento mensual de la estrategia de cobertura evidencia que:
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).
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.
Banco de la República. (2023). Tasa de intervención de política monetaria. https://www.banrep.gov.co
Banco de la República. (2023). Tasa Representativa del Mercado (TRM). https://www.banrep.gov.co
Black, F., & Scholes, M. (1973). Journal of Political Economy, 81(3), 637–654.
Bloomberg Línea. (2025, mayo). Precio del dólar en Colombia no pasaría de COP$4.300 hasta 2026. https://www.bloomberglinea.com/latinoamerica/colombia/precio-del-dolar-en-colombia-no-pasaria-de-cop4300-hasta-2026/
BVC. (2023). Futuros sobre TRM (TRMM25): Características técnicas. Bolsa de Valores de Colombia.
BVC. (2023). Futuros sobre TRM (TRMM25): Especificaciones y márgenes. Bolsa de Valores de Colombia.
Cont, R., & Tankov, P. (2003). Financial modelling with jump processes.
El Espectador. (2025, marzo). Dólar en Colombia: Proyecciones para marzo de 2025 y factores a tener en cuenta. https://www.elespectador.com/economia/dolar-en-colombia-proyecciones-para-marzo-de-2025-y-factores-a-tener-en-cuenta-noticias-hoy/
El País. (2025, mayo 15). El PIB de Colombia crece en el primer trimestre del año 2,7% gracias al consumo privado. https://elpais.com/america-colombia/2025-05-15/el-pib-de-colombia-crece-en-el-primer-trimestre-del-ano-27-gracias-al-consumo-privado.html
Fama, E. F. (1970). The Journal of Finance, 25(2), 383–417.
FMI. (2023). World Economic Outlook: Inflation and Exchange Rates. Fondo Monetario Internacional.
Growth Corp. (n.d.). Rates & Terms. https://www.growthcorp.com/sba-504-terms/
Hull, J. C. (2021). Options, Futures, and Other Derivatives (11.ª ed.). Pearson.
Kolb, R. W., & Overdahl, J. A. (2010). Financial Derivatives: Pricing and Risk Management. Wiley.
La República. (2025). Precio del dólar en Colombia 2025. https://www.larepublica.co/finanzas/precio-de-dolar-en-colombia-2025-4071709
Mandelbrot, B. (1963). The Journal of Business, 36(4), 394–419.
Reuters. (2025, mayo 20). Colombia public debt puts sovereign rating at risk, Moody’s analyst says. https://www.reuters.com/world/americas/colombia-public-debt-puts-sovereign-rating-risk-moodys-analyst-says-2025-05-20/