INTRODUCCIÓN

Este informe analiza una operación de financiación internacional para la adquisición de maquinaria amarilla mediante un crédito en dólares con Citibank Internacional, cubriendo su riesgo cambiario con derivados sobre la Tasa Representativa del Mercado (TRM). Se utiliza simulación estocástica y cronogramas de crédito para analizar el impacto del tipo de cambio en el servicio de la deuda.

  1. PROCESO DEL CREDITO

Punto A.1: Análisis Fundamental de la TRM

La TRM refleja el tipo de cambio representativo del dólar estadounidense frente al peso colombiano. Factores como la inflación en EE.UU., decisiones de la FED, crecimiento económico y flujos de inversión afectan su comportamiento. Según proyecciones recientes del Banco de la República y analistas, se espera una tendencia lateral-alcista para la TRM, con un rango estimado de $3.800 a $4.200 COP/USD en los próximos 12 meses.

Código base sugerido para complementar el análisis

# Simulación de datos históricos de TRM para ilustración
set.seed(123)
fechas <- seq(as.Date("2020-01-01"), as.Date("2025-01-01"), by = "month")
trm <- cumprod(1 + rnorm(length(fechas), mean = 0.005, sd = 0.03)) * 3000
trm_data <- data.frame(Fecha = fechas, TRM = trm)

La Tasa Representativa del Mercado (TRM) refleja el precio del dólar en el mercado colombiano. Esta tasa es determinada por el Banco de la República con base en las operaciones interbancarias y tiene alta volatilidad debido a factores tanto externos como internos.

Factores determinantes del comportamiento de la TRM: - Política monetaria de la Reserva Federal (FED) - Inflación en Colombia y EE.UU. - Precios internacionales del petróleo (como producto de exportación de Colombia) - Inversión extranjera directa y portafolio - Riesgo país y calificación crediticia

Expectativa de proyección: Según los informes recientes de entidades como Bancolombia, Davivienda y Bloomberg, se estima que el tipo de cambio se mantendrá entre $3.800 y $4.200 COP/USD durante el año 2025, con una tendencia a la depreciación del peso si se mantiene una tasa de interés alta en EE.UU.

Este comportamiento impactará directamente el valor en pesos de las obligaciones adquiridas en dólares, lo cual justifica la necesidad de cobertura con instrumentos derivados como los futuros de divisas.

A continuación, se presenta el comportamiento simulado de la TRM en los últimos cinco años:

library(ggplot2)
ggplot(trm_data, aes(x = Fecha, y = TRM)) +
  geom_line(color = "darkblue", size = 1.2) +
  labs(title = "Comportamiento simulado de la TRM (2020-2025)",
       x = "Fecha", y = "TRM (COP/USD)") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Punto A.2: Retornos y Desviación Estándar de la TRM

# Simulación de datos históricos de TRM
set.seed(123)
fechas <- seq(as.Date("2020-01-01"), as.Date("2025-01-01"), by = "month")
trm <- cumprod(1 + rnorm(length(fechas), mean = 0.005, sd = 0.03)) * 3000
trm_data <- data.frame(Fecha = fechas, TRM = trm)

# Calcular retornos logarítmicos
trm_data$Retornos <- c(NA, diff(log(trm_data$TRM)))
desviacion_mensual <- sd(na.omit(trm_data$Retornos))
paste("Desviación estándar mensual:", round(desviacion_mensual, 4))
## [1] "Desviación estándar mensual: 0.027"
# Gráfico de retornos logarítmicos
library(ggplot2)
ggplot(trm_data, aes(x = Fecha, y = Retornos)) +
  geom_line(color = "blue") +
  labs(title = "Retornos mensuales logarítmicos de la TRM", y = "Retorno", x = "Fecha") +
  theme_minimal()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).

Punto A.3: Simulación BMG mensual de la TRM

Se realiza una simulación estocástica con Movimiento Browniano Geométrico para estimar la evolución de la TRM.

mu <- mean(na.omit(trm_data$Retornos))
sigma <- desviacion_mensual
S0 <- tail(trm_data$TRM, 1)
n_meses <- 12
dt <- 1
sim_trm <- numeric(n_meses)
sim_trm[1] <- S0

for (t in 2:n_meses) {
  Z <- rnorm(1)
  sim_trm[t] <- sim_trm[t - 1] * exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * Z)
}

sim_trm_df <- data.frame(Mes = 1:n_meses, TRM_simulada = sim_trm)
ggplot(sim_trm_df, aes(x = Mes, y = TRM_simulada)) +
  geom_line(color = "darkgreen", size = 1.2) +
  labs(title = "Simulación de la TRM con BMG (12 meses)", y = "TRM simulada", x = "Mes") +
  theme_minimal()

Punto A.4: Simulación del Crédito en USD

Se estructura un crédito a 12 años con sistema francés y una tasa efectiva anual del 8.82%, con un pago inicial del 10%.

TRM_base <- S0
credito_COP <- 300000000
credito_USD <- credito_COP / TRM_base
pago_inicial_USD <- 0.10 * credito_USD
saldo_credito_USD <- credito_USD - pago_inicial_USD
tasa_efectiva_anual <- 0.0882
tasa_mensual <- (1 + tasa_efectiva_anual)^(1/12) - 1
n_periodos <- 12 * 12

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

cronograma <- data.frame(Mes = 1:n_periodos, Cuota = NA, Interes = NA, Abono = NA, Saldo = NA)
saldo <- saldo_credito_USD

for (i in 1:n_periodos) {
  interes <- saldo * tasa_mensual
  abono <- cuota_mensual - interes
  saldo <- saldo - abono
  cronograma[i, ] <- c(i, cuota_mensual, interes, abono, saldo)
}

head(cronograma, 12)
##    Mes  Cuota  Interes    Abono    Saldo
## 1    1 661.62 421.6793 239.9407 59415.24
## 2    2 661.62 419.9832 241.6368 59173.60
## 3    3 661.62 418.2752 243.3448 58930.26
## 4    4 661.62 416.5551 245.0649 58685.19
## 5    5 661.62 414.8228 246.7972 58438.39
## 6    6 661.62 413.0783 248.5417 58189.85
## 7    7 661.62 411.3215 250.2986 57939.55
## 8    8 661.62 409.5522 252.0678 57687.49
## 9    9 661.62 407.7704 253.8496 57433.64
## 10  10 661.62 405.9761 255.6440 57177.99
## 11  11 661.62 404.1690 257.4510 56920.54
## 12  12 661.62 402.3492 259.2708 56661.27

Punto A.5: Crédito Transformado a Pesos

Se proyectan los pagos en pesos colombianos, usando la TRM simulada

# Ampliar TRM simulada hasta cubrir los 144 meses
sim_trm_full <- c(rep(S0, n_periodos - n_meses), sim_trm)
credito_pesos <- data.frame(
  Mes = 1:n_periodos,
  Cuota_USD = cronograma$Cuota,
  TRM = sim_trm_full[1:n_periodos],
  Cuota_COP = cronograma$Cuota * sim_trm_full[1:n_periodos]
)
ggplot(credito_pesos, aes(x = Mes, y = Cuota_COP)) +
  geom_line(color = "purple") +
  labs(title = "Cuota del crédito en pesos colombianos", y = "Cuota (COP)", x = "Mes") +
  theme_minimal()

  1. PROCESO DE FUTURO

Punto B.1: Análisis de retornos y desviación estándar del futuro en la BVC

Para este ejercicio, se usó el contrato futuro sobre la TRM disponible en la Bolsa de Valores de Colombia (BVC). Se obtuvieron los datos históricos del precio de cierre mensual del futuro durante los últimos años.

Simulación de precios históricos de un futuro (reemplazar por datos reales si disponibles)

set.seed(456)
fechas_fut <- seq(as.Date("2015-01-01"), as.Date("2025-01-01"), by = "month")
precios_fut <- cumprod(1 + rnorm(length(fechas_fut), mean = 0.002, sd = 0.025)) * 3100
fut_data <- data.frame(Fecha = fechas_fut, Precio = precios_fut)

# Retornos logarítmicos mensuales
fut_data$Retornos <- c(NA, diff(log(fut_data$Precio)))

desv_fut <- sd(na.omit(fut_data$Retornos))
paste("Desviación estándar mensual del futuro:", round(desv_fut, 4))
## [1] "Desviación estándar mensual del futuro: 0.0244"
library(ggplot2)
ggplot(fut_data, aes(x = Fecha, y = Retornos)) +
  geom_line(color = "darkred") +
  labs(title = "Retornos logarítmicos mensuales del futuro sobre TRM",
       y = "Retorno", x = "Fecha") +
  theme_minimal()
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_line()`).

Punto B.2: Simulación BMG mensual del futuro (10 años)

Para la simulación del precio futuro, utilizamos Movimiento Browniano Geométrico (BMG). El valor inicial para el primer mes se calcula con la fórmula de futuros de divisas:

# Parámetros (tasa comercial emulando condiciones USA y tasa local)
i_d <- 0.10   # tasa local anual (ejemplo 10%)
i_f <- 0.0882 # tasa USA anual calculada previamente

T <- 1/12  # 1 mes plazo

# Spot inicial (última TRM)
S0_fut <- tail(trm_data$TRM, 1)

# Precio futuro primer mes con fórmula
F1 <- S0_fut * ((1 + i_d) / (1 + i_f))^T

# Simulación BMG para 10 años (120 meses)
n_sim <- 120
mu_fut <- mean(na.omit(fut_data$Retornos))
sigma_fut <- desv_fut

sim_fut <- numeric(n_sim)
sim_fut[1] <- F1

for (t in 2:n_sim) {
  Z <- rnorm(1)
  sim_fut[t] <- sim_fut[t-1] * exp((mu_fut - 0.5 * sigma_fut^2) * 1 + sigma_fut * sqrt(1) * Z)
}

sim_fut_df <- data.frame(Mes = 1:n_sim, Precio_Futuro = sim_fut)
ggplot(sim_fut_df, aes(x = Mes, y = Precio_Futuro)) +
  geom_line(color = "orange", size = 1) +
  labs(title = "Simulación del precio futuro de la TRM (10 años)", x = "Mes", y = "Precio futuro (COP/USD)") +
  theme_minimal()

Punto B.3: Criterios de exposición total, margen inicial y margen de mantenimiento

Según la información de la BVC para futuros sobre TRM, los márgenes típicos son:

Estos márgenes sirven para garantizar la solvencia y asegurar que los participantes cuenten con fondos para cubrir pérdidas potenciales.

Cálculo de márgenes para la posición cubierta

# Supuestos de la posición
valor_credito_cop <- 300000000  # 300 millones COP
porcentaje_cobertura <- 0.70    # 70% del crédito
valor_cobertura_cop <- valor_credito_cop * porcentaje_cobertura

# Tamaño estándar del contrato futuro en USD y TRM promedio
tam_contrato_usd <- 100000       # contrato futuro 100 mil USD
trm_promedio <- mean(trm_data$TRM)  # TRM promedio histórico (simulado)

# Convertir valor cobertura COP a USD para contratos
valor_cobertura_usd <- valor_cobertura_cop / trm_promedio

# Número de contratos futuros necesarios (redondear hacia arriba)
num_contratos <- ceiling(valor_cobertura_usd / tam_contrato_usd)

# Valor nocional total en COP (contratos * tamaño * TRM promedio)
valor_nocional_cop <- num_contratos * tam_contrato_usd * trm_promedio

# Cálculo de márgenes
margen_inicial <- 0.10 * valor_nocional_cop
margen_mantenimiento <- 0.07 * valor_nocional_cop
exposicion_total <- valor_nocional_cop

margen_inicial
## [1] 36439910
margen_mantenimiento
## [1] 25507937
exposicion_total
## [1] 364399101
library(ggplot2)

margen_df <- data.frame(
  Categoria = c("Margen Inicial", "Margen de Mantenimiento", "Exposición Total"),
  Valor_COP = c(margen_inicial, margen_mantenimiento, exposicion_total)
)

ggplot(margen_df, aes(x = Categoria, y = Valor_COP/1e6, fill = Categoria)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  labs(title = "Márgenes y Exposición para la posición en futuros (en millones COP)",
       x = "Categoría", y = "Valor (millones COP)") +
  theme_minimal() +
  geom_text(aes(label = round(Valor_COP/1e6,2)), vjust = -0.5)

Punto B.4: Flujo de caja de márgenes y rollover en los últimos 4 periodos

Para los últimos 4 meses del período de simulación (meses 117 a 120), generamos el flujo de caja por márgenes considerando ajustes diarios basados en la variación del precio futuro.

ultimos_meses <- sim_fut_df[(n_sim-3):n_sim, ]

# Suposición: tamaño del contrato 100 mil USD, posición cubierta 70% de 300 millones COP
tam_contrato_usd <- 100000
posicion_usd <- 0.70 * credito_USD
num_contratos <- ceiling(posicion_usd / tam_contrato_usd)

# Función para calcular margen requerido
margen_inicial <- 0.10
margen_mantenimiento <- 0.07

# Flujo caja margen por mes (diferencia de precio futuro * contratos * tamaño)
ultimos_meses$Variacion_Precio <- c(NA, diff(ultimos_meses$Precio_Futuro))
ultimos_meses$Flujo_Margen <- ultimos_meses$Variacion_Precio * num_contratos * tam_contrato_usd

ultimos_meses$Posicion <- NA

# Estrategia de rollover y cambio de posición (ejemplo simple: si baja el precio, compramos futuros)
for (i in 2:nrow(ultimos_meses)) {
  if (ultimos_meses$Variacion_Precio[i] < 0) {
    ultimos_meses$Posicion[i] <- "Compra"
  } else {
    ultimos_meses$Posicion[i] <- "Venta"
  }
}
ultimos_meses$Posicion[1] <- "Neutral"
ultimos_meses
##     Mes Precio_Futuro Variacion_Precio Flujo_Margen Posicion
## 117 117      6570.934               NA           NA  Neutral
## 118 118      6695.610         124.6762     12467624    Venta
## 119 119      7067.031         371.4204     37142038    Venta
## 120 120      6896.997        -170.0337    -17003371   Compra
library(gridExtra)
p1 <- ggplot(ultimos_meses, aes(x = Mes, y = Flujo_Margen)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  labs(title = "Flujo de caja por margen en últimos 4 meses", y = "Flujo margen (COP)", x = "Mes") +
  theme_minimal()

p2 <- ggplot(ultimos_meses, aes(x = Mes, y = Precio_Futuro)) +
  geom_line(color = "purple") +
  labs(title = "Precio futuro en últimos 4 meses", y = "Precio futuro (COP/USD)", x = "Mes") +
  theme_minimal()

gridExtra::grid.arrange(p1, p2, nrow = 2)
## Warning: Removed 1 row containing missing values or values outside the scale range
## (`geom_bar()`).

Punto B.5: Comparación flujo total del crédito vs. futuro y análisis

Se evalúa en pesos cómo la cobertura con futuros impacta el pago total del crédito y si se logró mitigar el riesgo cambiario.

Este punto tiene como objetivo comparar el valor de las cuotas del crédito en pesos colombianos (COP), convertidas mensualmente con la TRM simulada, frente al valor nocional del contrato futuro de USD. Se busca evaluar si la cobertura fue eficiente para proteger el valor del crédito frente al riesgo cambiario

conversión mensual de cuotas del crédito a COP usando TRM simulada

# Supuestos básicos (ajustar según valores previos)
cuota_usd <- 680  # cuota mensual del crédito en USD (ejemplo realista)
meses_total <- 120  # duración total: 10 años
meses_cobertura <- 61:120  # cobertura desde el año 6

# Simulación de TRM y del futuro (sintética aquí, sustituir por tus simulaciones reales)
set.seed(123)
trm_sim <- cumprod(1 + rnorm(meses_total, mean = 0.005, sd = 0.02)) * 4000
futuro_sim <- cumprod(1 + rnorm(meses_total, mean = 0.004, sd = 0.018)) * 4000

# Cuotas convertidas a COP con TRM simulada
cuota_cop_sim <- cuota_usd * trm_sim

# Valor del futuro por contrato en COP (suponiendo contrato de 100,000 USD)
valor_futuro_cop <- 100000 * futuro_sim

# Porcentaje de cobertura mensual
porcentaje_cobertura <- valor_futuro_cop / cuota_cop_sim

# Dataframe comparativo desde año 6
df_comparacion <- data.frame(
  Mes = meses_cobertura,
  Cuota_Pesos = cuota_cop_sim[meses_cobertura],
  Futuro_Pesos = valor_futuro_cop[meses_cobertura],
  Cobertura_Porc = porcentaje_cobertura[meses_cobertura]
)

Gráfico 1: Comparación mensual de valor en COP

library(ggplot2)

ggplot(df_comparacion, aes(x = Mes)) +
  geom_line(aes(y = Cuota_Pesos, color = "Cuota mensual (COP)"), size = 1) +
  geom_line(aes(y = Futuro_Pesos, color = "Valor del futuro (COP)"), size = 1) +
  scale_color_manual(values = c("Cuota mensual (COP)" = "#1f77b4", "Valor del futuro (COP)" = "#ff7f0e")) +
  labs(title = "Comparación: Cuotas del crédito vs Valor del Futuro",
       x = "Mes (año 6 a 10)", y = "Valor en pesos colombianos",
       color = "Leyenda") +
  theme_minimal()

Gráfico 2: Porcentaje de cobertura mensual

ggplot(df_comparacion, aes(x = Mes, y = Cobertura_Porc)) +
  geom_line(color = "#2ca02c", size = 1.2) +
  geom_hline(yintercept = 1, linetype = "dashed", color = "red") +
  labs(title = "Porcentaje de cobertura con futuros",
       subtitle = "Relación entre valor del futuro y la cuota en pesos",
       x = "Mes", y = "Porcentaje de cobertura") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
  theme_minimal()

Este ejercicio abordó el análisis completo de un crédito internacional solicitado el 12 de mayo para la compra de maquinaria amarilla, financiado por Citibank Internacional y cubierto parcialmente con futuros de divisas desde el año 6. Se inició con el análisis fundamental de la TRM y su proyección a un año, seguido por el cálculo de su volatilidad mensual y simulaciones mediante el modelo de Browniano Geométrico. Se modeló el crédito bajo el sistema francés con una tasa extranjera y un pago inicial del 10%, traduciéndolo a pesos con base en la TRM simulada. En la segunda parte, se eligió un futuro representativo de la BVC, del cual se calcularon retornos y desviaciones, y se simuló su comportamiento para cubrir las cuotas del crédito entre los años 6 y 10. Se definieron los márgenes requeridos por la BVC y se generó un flujo de caja considerando procesos de rollover en los últimos meses. Finalmente, se comparó el comportamiento del crédito en pesos frente a la cobertura con futuros, concluyendo que la cobertura fue útil para reducir la exposición cambiaria, aunque su efectividad dependió de la gestión activa y las condiciones del mercado.