Parte 1. Proceso del Crédito

1.1 Setup


1.2 Análisis fundamental de la TRM

Análisis fundamental de la TRM en 2025

La dinámica del peso colombiano frente al dólar en 2025 está marcada por un entorno mixto:
- Tasas de interés altas tanto en Estados Unidos como en Colombia.
- Una inflación en Colombia que aún no logra converger a la meta del 3%.
- Factores externos como el precio del petróleo y la reducción de la inversión extranjera directa.

En la siguiente tabla se resumen los principales indicadores macroeconómicos que afectan la TRM:

library(knitr)

condiciones_macro <- data.frame(
  Indicador = c("Tasa de interes Fed (EE. UU.)", 
                "Tasa de interes BanRep (Colombia)", 
                "Inflacion en Colombia (estimada)", 
                "Inflacion en EE. UU. (estimada)", 
                "Precio del petroleo (WTI)", 
                "Deficit fiscal de Colombia", 
                "Inversion extranjera directa (IED)"),
  Valor = c("4.25% - 4.50%", 
            "9.25%", 
            "aprox. 5.1% (a cierre de 2025)", 
            "aprox. 3.3%", 
            "USD 67.61 por barril", 
            "3.7% del PIB", 
            "-24% (acumulado a julio 2025)")
)

proyecciones_trm <- data.frame(
  Fuente = c("Banco de la Republica", "BBVA Research", "Bloomberg Linea"),
  TRM = c("4,200 - 4,500", "4,380", "4,420")
)

kable(condiciones_macro, caption = "Condiciones macroeconomicas relevantes para la TRM en 2025")
Condiciones macroeconomicas relevantes para la TRM en 2025
Indicador Valor
Tasa de interes Fed (EE. UU.) 4.25% - 4.50%
Tasa de interes BanRep (Colombia) 9.25%
Inflacion en Colombia (estimada) aprox. 5.1% (a cierre de 2025)
Inflacion en EE. UU. (estimada) aprox. 3.3%
Precio del petroleo (WTI) USD 67.61 por barril
Deficit fiscal de Colombia 3.7% del PIB
Inversion extranjera directa (IED) -24% (acumulado a julio 2025)
kable(proyecciones_trm, caption = "Proyecciones de la TRM para cierre de 2025 (COP/USD)")
Proyecciones de la TRM para cierre de 2025 (COP/USD)
Fuente TRM
Banco de la Republica 4,200 - 4,500
BBVA Research 4,380
Bloomberg Linea 4,420

Análisis fundamental de la TRM en 2025

El análisis del comportamiento histórico de la Tasa Representativa del Mercado (TRM) revela un patrón de alta volatilidad, caracterizado por movimientos significativos en periodos cortos. Este patrón es un indicador del riesgo inherente al mercado cambiario colombiano, el cual está sujeto a factores externos como los precios de las materias primas y los flujos de capital globales. En el contexto actual de 2025, esta dinámica se ve amplificada por un entorno económico mixto, con tasas de interés altas en Estados Unidos y Colombia, una inflación local que aún no converge a la meta del 3%, una caída del 24% en la inversión extranjera directa y un déficit fiscal del 3.7% del PIB (Banco de la República, 2025).

La proyección para el corto plazo confirma una tendencia alcista. La expectativa central es que el peso colombiano siga una devaluación moderada, con un rango entre 4.200 y 4.500 COP/USD a cierre de 2025 (Bloomberg Línea, 2025). BBVA Research (2025) sitúa el promedio esperado en 4.380 COP/USD, mientras que el Banco de la República (2025) ha señalado que las presiones inflacionarias dificultan una estabilización rápida del tipo de cambio. Asimismo, el precio del petróleo, que se mantiene en 67.61 USD por barril, limita el ingreso de divisas, debilitando la posición externa del país (Bloomberg Línea, 2025).

Desde la perspectiva de un proyecto de adquisición de maquinaria financiado mediante un crédito en dólares, esta expectativa implica un riesgo financiero material. Una TRM en ascenso incrementa de manera directa el valor en pesos colombianos de cada cuota del crédito, afectando la predictibilidad de los flujos de caja y potencialmente la rentabilidad final de la inversión, especialmente si se materializa un escenario pesimista de depreciación mayor.

Por lo tanto, la implementación de una estrategia de cobertura con derivados cambiarios se justifica como un mecanismo fundamental para mitigar este riesgo. Al fijar de antemano el tipo de cambio para una porción significativa de las obligaciones futuras, se logra transformar un costo variable e incierto en uno fijo y planificable, proporcionando la estabilidad financiera necesaria para la viabilidad del proyecto.

1.3 Cargar datos históricos de la TRM

# 1. Cargar los datos históricos de la TRM
trm_data <- read.csv(
  "C:/Users/Santiago Pasos/Documents/Rmarkdown/Tasa_de_cambio_del_peso_colombiano.csv",
  sep = ";", header = TRUE, stringsAsFactors = FALSE
)

# 2. Renombrar columnas
names(trm_data) <- c("fecha", "trm")

# 3. Convertir fecha al formato Date
trm_data$fecha <- as.Date(trm_data$fecha, format = "%d/%m/%Y")

# 4. Limpiar y convertir TRM:
# - Quitar separadores de miles (.)
# - Cambiar coma decimal (,) por punto (.)
# - Convertir a numérico
trm_data$trm <- as.numeric(gsub(",", ".", gsub("\\.", "", trm_data$trm)))

# 5. Resumen rápido
cat("Datos de TRM cargados correctamente\n\n")
## Datos de TRM cargados correctamente
cat("Número de observaciones: ", nrow(trm_data), "\n")
## Número de observaciones:  3654
cat("Periodo: ", format(min(trm_data$fecha), "%d-%m-%Y"), 
    " hasta ", format(max(trm_data$fecha), "%d-%m-%Y"), "\n\n")
## Periodo:  18-09-2015  hasta  18-09-2025
# 6. Mostrar primeros registros en tabla limpia
knitr::kable(head(trm_data, 10), caption = "Primeras observaciones de la TRM (COP/USD)")
Primeras observaciones de la TRM (COP/USD)
fecha trm
2025-09-18 3880.01
2025-09-17 3881.92
2025-09-16 3897.57
2025-09-15 3906.24
2025-09-14 3906.24
2025-09-13 3906.24
2025-09-12 3903.18
2025-09-11 3921.58
2025-09-10 3919.13
2025-09-09 3945.29
library(dplyr)
library(lubridate)
library(plotly)

# 1. Agregar columna de año-mes y obtener TRM de cierre mensual
trm_mensual <- trm_data %>%
  mutate(mes = floor_date(fecha, "month")) %>%
  group_by(mes) %>%
  summarise(trm = last(trm)) %>%
  ungroup()

# 2. Calcular retornos logarítmicos mensuales
trm_mensual <- trm_mensual %>%
  mutate(log_ret = log(trm / lag(trm))) %>%
  filter(!is.na(log_ret))

# 3. Calcular parámetros de la distribución
mu <- mean(trm_mensual$log_ret)      # Retorno mensual promedio
sigma <- sd(trm_mensual$log_ret)     # Volatilidad mensual

cat("Retorno mensual promedio:", round(mu, 6), "\n")
## Retorno mensual promedio: 0.002505
cat("Desviación estándar mensual:", round(sigma, 6), "\n")
## Desviación estándar mensual: 0.039506
# 4. Simulación de Monte Carlo (BMG)
set.seed(123)
n_meses <- 120        # Horizonte de simulación (10 años)
n_sim   <- 1000       # Número de trayectorias
dt      <- 1          # Paso mensual

ultimo_valor <- tail(trm_mensual$trm, 1)  # Último valor observado

# Matriz de trayectorias simuladas
trayectorias <- matrix(NA, nrow = n_meses + 1, ncol = n_sim)
trayectorias[1, ] <- ultimo_valor

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

# Fechas para eje X
fechas_sim <- seq(from = max(trm_mensual$mes), by = "month", length.out = n_meses + 1)

# 5. Visualización interactiva
p <- plot_ly()

# Trayectorias simuladas (muestra de 50)
p <- add_lines(p, x = ~fechas_sim, y = trayectorias[, 1:50],
               line = list(color = 'rgba(0,0,255,0.1)'),
               showlegend = FALSE)

# Promedio de las trayectorias
p <- add_lines(p, x = ~fechas_sim, y = rowMeans(trayectorias),
               line = list(color = 'red', width = 3),
               name = "Promedio Simulado")

# Banda de confianza (percentiles 5% - 95%)
p <- add_ribbons(p, x = ~fechas_sim,
                 ymin = apply(trayectorias, 1, quantile, 0.05),
                 ymax = apply(trayectorias, 1, quantile, 0.95),
                 fillcolor = 'rgba(255,0,0,0.2)',
                 line = list(color = 'transparent'),
                 name = "IC 90%")

# Título y ejes
p <- layout(p,
            title = "Simulación de la TRM (Monte Carlo - 10 años)",
            xaxis = list(title = "Fecha"),
            yaxis = list(title = "TRM (COP/USD)"))

p

##Análisis de resultados:

El análisis cuantitativo del comportamiento histórico de la Tasa Representativa del Mercado (TRM) revela características esenciales para la evaluación de riesgo cambiario. El retorno mensual promedio del 0.25%, si bien aparenta ser modesto, adquiere relevancia al ser anualizado, proyectando una tendencia alcista sostenida del dólar frente al peso colombiano. No obstante, el hallazgo más significativo reside en la desviación estándar mensual del 3.95%, un indicador de volatilidad que supera ampliamente el rendimiento esperado, configurando un escenario de alto riesgo donde las fluctuaciones a corto plazo pueden erosionar cualquier ganancia potencial derivada de la tendencia principal.

Esta volatilidad histórica se contextualiza en el entorno macroeconómico actual de 2025, caracterizado por políticas monetarias restrictivas a nivel global, presiones inflacionarias persistentes en Colombia, y factores externos adversos como la contracción del 24% en la inversión extranjera directa y un precio del petróleo que limita el ingreso de divisas (Banco de la República, 2025). Analistas como BBVA Research (2025) y Bloomberg Línea (2025) proyectan, coherentemente con este panorama, un rango para la TRM entre 4.200 y 4.500 COP/USD, destacando la incertidumbre subyacente.

Para capturar esta incertidumbre de forma dinámica, la simulación de Monte Carlo bajo el modelo de Movimiento Browniano Geométrico (MBG) se implementa utilizando la volatilidad histórica (3.95%) como parámetro de difusión clave. La simulación genera miles de trayectorias posibles, cuya dispersión creciente en el horizonte temporal de diez años ilustra el concepto de acumulación de riesgo. El intervalo de confianza del 90% resultante no solo confirma la tendencia central alcista, sino que, de manera más crítica, cuantifica la probabilidad de ocurrencia de escenarios extremos. Esto permite a los gestores del proyecto evaluar, por ejemplo, la probabilidad de que la TRM exceda un umbral que comprometa la viabilidad financiera de las cuotas del crédito en dólares.

En consecuencia, la evidencia cuantitativa —que combina una tendencia desfavorable con una alta volatilidad— fundamenta sólidamente la implementación de una estrategia de cobertura mediante derivados cambiarios. Como establece Hull (2018), el valor de estos modelos estocásticos reside en su capacidad para transformar la incertidumbre en un riesgo medible y, por lo tanto, gestionable. Fijar una porción significativa del tipo de cambio futuro mediante instrumentos como forwards u opciones se convierte en un imperativo estratégico para asegurar la predictibilidad de los flujos de caja y proteger la rentabilidad final de la inversión.

1.5 Crédito en dólares

library(knitr)
library(dplyr)

# Parámetros del crédito
monto_cop <- 500000000  # Monto total en COP
trm_spot <- 3881.92     # TRM actual
tasa_anual_usd <- 0.095 # 9.5% anual en USD
plazo_anios <- 10
plazo_meses <- plazo_anios * 12
inicial_pct <- 0.10     # 10% de pago inicial
tasa_mensual_usd <- tasa_anual_usd / 12

# Conversión a USD
monto_usd <- monto_cop / trm_spot
monto_inicial_usd <- monto_usd * inicial_pct
monto_financiado_usd <- monto_usd - monto_inicial_usd

# Cálculo de la cuota mensual (sistema francés)
cuota_mensual_usd <- monto_financiado_usd *
  (tasa_mensual_usd * (1 + tasa_mensual_usd)^plazo_meses) /
  ((1 + tasa_mensual_usd)^plazo_meses - 1)

# Tabla de amortización
tabla_amortizacion <- data.frame(
  Mes = 1:plazo_meses,
  Saldo_Inicial = NA,
  Cuota = cuota_mensual_usd,
  Intereses = NA,
  Capital = NA,
  Saldo_Final = NA
)

# Llenar la tabla de amortización
saldo_actual <- monto_financiado_usd
for (i in 1:plazo_meses) {
  interes_mes <- saldo_actual * tasa_mensual_usd
  capital_mes <- cuota_mensual_usd - interes_mes
  saldo_final <- saldo_actual - capital_mes
  
  tabla_amortizacion$Saldo_Inicial[i] <- saldo_actual
  tabla_amortizacion$Intereses[i] <- interes_mes
  tabla_amortizacion$Capital[i] <- capital_mes
  tabla_amortizacion$Saldo_Final[i] <- saldo_final
  
  saldo_actual <- saldo_final
}

# Resumen en tabla
tabla_resumen <- data.frame(
  Concepto = c("Monto total del equipo (COP)", 
               "Monto total del equipo (USD)",
               "Pago inicial (10% en USD)", 
               "Monto financiado (USD)",
               "Tasa de interés anual (USD)",
               "Plazo (años)",
               "Cuota mensual (USD)"),
  Valor = c(format(monto_cop, big.mark = ".", decimal.mark = ","),
            round(monto_usd, 2),
            round(monto_inicial_usd, 2), 
            round(monto_financiado_usd, 2),
            paste0(tasa_anual_usd * 100, "%"),
            plazo_anios,
            round(cuota_mensual_usd, 2))
)

# Simulación de riesgo cambiario (usando BMG)
mu_trm <- 0.005    # Retorno mensual esperado de la TRM
sigma_trm <- 0.04  # Volatilidad mensual de la TRM

# Simular trayectorias de TRM
set.seed(123)
n_sim <- 1000
trm_proyectada <- matrix(NA, nrow = plazo_meses, ncol = n_sim)
trm_proyectada[1, ] <- trm_spot

for (t in 2:plazo_meses) {
  z <- rnorm(n_sim)
  trm_proyectada[t, ] <- trm_proyectada[t-1, ] * exp((mu_trm - 0.5 * sigma_trm^2) + sigma_trm * z)
}

# Calcular cuota en COP para cada mes en cada simulación
cuota_cop_sim <- matrix(NA, nrow = plazo_meses, ncol = n_sim)
for (i in 1:n_sim) {
  cuota_cop_sim[, i] <- cuota_mensual_usd * trm_proyectada[, i]
}

# Estadísticas de la cuota en COP
cuota_cop_promedio <- rowMeans(cuota_cop_sim)
cuota_cop_p5 <- apply(cuota_cop_sim, 1, quantile, probs = 0.05)
cuota_cop_p95 <- apply(cuota_cop_sim, 1, quantile, probs = 0.95)

# Resultados
cat("## RESUMEN DEL CRÉDITO EN DÓLARES\n")
## ## RESUMEN DEL CRÉDITO EN DÓLARES
kable(tabla_resumen, caption = "Parámetros del crédito para maquinaria")
Parámetros del crédito para maquinaria
Concepto Valor
Monto total del equipo (COP) 5e+08
Monto total del equipo (USD) 128802.24
Pago inicial (10% en USD) 12880.22
Monto financiado (USD) 115922.02
Tasa de interés anual (USD) 9.5%
Plazo (años) 10
Cuota mensual (USD) 1500
cat("\n## PRIMEROS 12 MESES DE AMORTIZACIÓN\n")
## 
## ## PRIMEROS 12 MESES DE AMORTIZACIÓN
kable(head(tabla_amortizacion %>% 
             mutate(across(where(is.numeric), round, 2)), 12),
      caption = "Tabla de amortización (primer año)")
Tabla de amortización (primer año)
Mes Saldo_Inicial Cuota Intereses Capital Saldo_Final
1 115922.0 1500 917.72 582.29 115339.7
2 115339.7 1500 913.11 586.90 114752.8
3 114752.8 1500 908.46 591.54 114161.3
4 114161.3 1500 903.78 596.23 113565.1
5 113565.1 1500 899.06 600.95 112964.1
6 112964.1 1500 894.30 605.70 112358.4
7 112358.4 1500 889.50 610.50 111747.9
8 111747.9 1500 884.67 615.33 111132.6
9 111132.6 1500 879.80 620.20 110512.4
10 110512.4 1500 874.89 625.11 109887.3
11 109887.3 1500 869.94 630.06 109257.2
12 109257.2 1500 864.95 635.05 108622.2
cat("\n## RIESGO CAMBIARIO - PROYECCIÓN DE CUOTA EN COP\n")
## 
## ## RIESGO CAMBIARIO - PROYECCIÓN DE CUOTA EN COP
riesgo_cambiario <- data.frame(
  Mes = 1:12,
  Cuota_USD = round(cuota_mensual_usd, 2),
  TRM_Promedio = round(rowMeans(trm_proyectada)[1:12], 2),
  Cuota_COP_Promedio = round(cuota_cop_promedio[1:12], 2),
  Cuota_COP_P5 = round(cuota_cop_p5[1:12], 2),
  Cuota_COP_P95 = round(cuota_cop_p95[1:12], 2)
)

kable(riesgo_cambiario, caption = "Proyección de cuotas en COP con intervalo de confianza (90%)")
Proyección de cuotas en COP con intervalo de confianza (90%)
Mes Cuota_USD TRM_Promedio Cuota_COP_Promedio Cuota_COP_P5 Cuota_COP_P95
1 1500 3881.92 5822890 5822890 5822890
2 1500 3903.84 5855776 5479936 6252879
3 1500 3930.68 5896034 5339984 6497961
4 1500 3947.15 5920730 5280143 6674282
5 1500 3965.64 5948472 5174856 6822950
6 1500 3981.09 5971644 5103661 6967581
7 1500 4006.20 6009310 5058127 7048454
8 1500 4020.67 6031022 5011154 7184838
9 1500 4041.14 6061715 4989935 7281686
10 1500 4065.85 6098791 4966258 7332609
11 1500 4078.96 6118447 4913906 7490391
12 1500 4104.98 6157484 4815435 7629777

##Análisis Financiero del Crédito en USD

El crédito tomado en dólares para financiar la maquinaria presenta un monto de 128.802,24 USD, del cual se financia el 90% equivalente a 115.922,02 USD, con una tasa de interés del 9,5% anual y un plazo de 10 años bajo el sistema de amortización francés. Esto implica una cuota fija aproximada de 1.500 USD mensuales.

“Desde una perspectiva de estructura de pagos, durante el primer año se observa que la proporción destinada a intereses es elevada, lo cual es característico del sistema francés, donde las primeras cuotas amortizan más intereses que capital. A medida que avanza el plazo, la carga de intereses disminuye y aumenta la amortización de capital, lo que reduce gradualmente el saldo final (Ross, Westerfield, & Jaffe, 2018).

“En cuanto al riesgo cambiario, la simulación mediante un proceso de movimiento browniano geométrico (BMG) proyecta un aumento gradual en la TRM desde un valor inicial de 3.881,92 COP/USD hasta niveles superiores a 4.100 COP/USD en el primer año. Esto afecta directamente las cuotas en pesos colombianos, las cuales se ubican en un rango promedio de 5,8 a 6,1 millones COP, con un intervalo de confianza del 90% entre 4,9 y 7,6 millones COP. Este rango refleja la volatilidad inherente del mercado cambiario, donde factores externos como la política monetaria de la Reserva Federal y la estabilidad fiscal de Colombia pueden influir en la trayectoria del tipo de cambio (Banco de la República, 2023).

Financieramente, la decisión de endeudarse en dólares es eficiente si los ingresos de la empresa están dolarizados o si existe cobertura cambiaria (hedging). De lo contrario, la compañía estaría expuesta a una depreciación del peso, lo que aumentaría sus obligaciones en moneda local y podría deteriorar sus márgenes de rentabilidad. Por lo tanto, se recomienda complementar el financiamiento con un esquema de cobertura en derivados cambiarios, como forwards o swaps, que permitan mitigar el riesgo asociado a la TRM (Hull, 2018).

En conclusión, el crédito en dólares es viable y ofrece un esquema de pago previsible

1.6 Crédito en pesos (TRM simulada)

library(knitr)
library(plotly)
library(dplyr)
library(kableExtra)

# Amortización en USD
amort_usd <- data.frame(
  mes = 1:plazo_meses,
  fecha = seq(from = as.Date(max(trm_mensual$mes)) + months(1), 
              by = "month", length.out = plazo_meses),
  saldo_usd = NA,
  cuota_usd = cuota_mensual_usd,
  interes_usd = NA,
  capital_usd = NA
)

# Calcular la amortización
amort_usd$saldo_usd[1] <- monto_financiado_usd
for (i in 1:plazo_meses) {
  amort_usd$interes_usd[i] <- amort_usd$saldo_usd[i] * tasa_mensual_usd
  amort_usd$capital_usd[i] <- cuota_mensual_usd - amort_usd$interes_usd[i]
  if (i < plazo_meses) {
    amort_usd$saldo_usd[i+1] <- amort_usd$saldo_usd[i] - amort_usd$capital_usd[i]
  }
}

# Conversión a COP con TRM simulada (trayectoria promedio)
trm_simulada <- rowMeans(trayectorias)[2:(plazo_meses+1)]
amort_usd$trm <- trm_simulada
amort_usd$cuota_cop <- amort_usd$cuota_usd * amort_usd$trm
amort_usd$saldo_cop <- amort_usd$saldo_usd * amort_usd$trm
amort_usd$interes_cop <- amort_usd$interes_usd * amort_usd$trm
amort_usd$capital_cop <- amort_usd$capital_usd * amort_usd$trm

# Métricas clave
costo_total_usd <- sum(amort_usd$cuota_usd)
costo_total_cop <- sum(amort_usd$cuota_cop)
costo_financiero_usd <- costo_total_usd - monto_financiado_usd
costo_financiero_cop <- costo_total_cop - (monto_financiado_usd * trm_spot)

# Primeras 12 cuotas
tabla_amort <- amort_usd[1:12, c("mes", "fecha", "cuota_usd", "trm", "cuota_cop")]
tabla_amort$fecha <- format(tabla_amort$fecha, "%Y-%m")
tabla_amort$cuota_usd <- round(tabla_amort$cuota_usd, 2)
tabla_amort$trm <- round(tabla_amort$trm, 2)
tabla_amort$cuota_cop <- round(tabla_amort$cuota_cop, 0)

colnames(tabla_amort) <- c("Mes", "Fecha", "Cuota (USD)", "TRM", "Cuota (COP)")

kable(tabla_amort, caption = "Primeras 12 cuotas del crédito en COP") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Primeras 12 cuotas del crédito en COP
Mes Fecha Cuota (USD) TRM Cuota (COP)
1 2025-10 1500 4031.00 6046516
2 2025-11 1500 4048.50 6072764
3 2025-12 1500 4055.37 6083067
4 2026-01 1500 4064.23 6096362
5 2026-02 1500 4069.95 6104931
6 2026-03 1500 4085.35 6128038
7 2026-04 1500 4089.97 6134964
8 2026-05 1500 4100.54 6150825
9 2026-06 1500 4115.27 6172920
10 2026-07 1500 4118.33 6177511
11 2026-08 1500 4134.20 6201305
12 2026-09 1500 4147.72 6221597
# Gráficos
# 1. Evolución de la cuota en COP
p1 <- plot_ly(amort_usd, x = ~fecha) %>%
  add_lines(y = ~cuota_cop, name = "Cuota en COP", line = list(color = "#003366")) %>%
  layout(title = "Evolución de la Cuota en COP con TRM simulada",
         xaxis = list(title = "Fecha"),
         yaxis = list(title = "Cuota mensual (COP)"))

# 2. Comparación de saldos en USD vs COP
p2 <- plot_ly(amort_usd, x = ~fecha) %>%
  add_lines(y = ~saldo_usd, name = "Saldo en USD", yaxis = "y1", 
            line = list(color = "#FF5733")) %>%
  add_lines(y = ~saldo_cop/1000, name = "Saldo en COP (miles)", yaxis = "y2",
            line = list(color = "#3366CC")) %>%
  layout(title = "Evolución del Saldo del Crédito",
         xaxis = list(title = "Fecha"),
         yaxis = list(title = "Saldo (USD)", side = "left"),
         yaxis2 = list(title = "Saldo (miles COP)", side = "right", 
                       overlaying = "y"),
         legend = list(x = 0.1, y = 0.9))

# 3. Composición de la cuota
p3 <- plot_ly(amort_usd, x = ~fecha) %>%
  add_lines(y = ~interes_cop, name = "Interés en COP", 
            line = list(color = "#FF0000")) %>%
  add_lines(y = ~capital_cop, name = "Capital en COP",
            line = list(color = "#00AA00")) %>%
  layout(title = "Composición de la Cuota en COP",
         xaxis = list(title = "Fecha"),
         yaxis = list(title = "Monto (COP)"))

# Resumen de métricas
resumen_credito <- data.frame(
  Métrica = c("Monto financiado (USD)", "Monto financiado (COP al inicio)",
              "Total a pagar (USD)", "Total a pagar (COP proyectado)",
              "Costo financiero (USD)", "Costo financiero (COP)",
              "TRM promedio durante el crédito"),
  Valor = c(round(monto_financiado_usd, 2),
            round(monto_financiado_usd * trm_spot, 0),
            round(costo_total_usd, 2),
            round(costo_total_cop, 0),
            round(costo_financiero_usd, 2),
            round(costo_financiero_cop, 0),
            round(mean(amort_usd$trm), 2))
)

cat("## ANÁLISIS DEL COMPORTAMIENTO DEL CRÉDITO TRANSFORMADO A PESOS\n\n")
## ## ANÁLISIS DEL COMPORTAMIENTO DEL CRÉDITO TRANSFORMADO A PESOS
cat("### Resumen del Crédito\n")
## ### Resumen del Crédito
kable(resumen_credito, caption = "Métricas clave del crédito") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Métricas clave del crédito
Métrica Valor
Monto financiado (USD) 115922.02
Monto financiado (COP al inicio) 450000000.00
Total a pagar (USD) 180000.31
Total a pagar (COP proyectado) 847732436.00
Costo financiero (USD) 64078.29
Costo financiero (COP) 397732436.00
TRM promedio durante el crédito 4709.62
cat("\n### Visualizaciones\n")
## 
## ### Visualizaciones
p1
p2
p3
cat("\n### Conclusiones del Análisis\n")
## 
## ### Conclusiones del Análisis
cat("1. Riesgo cambiario: La cuota en COP varía según la TRM simulada.\n")
## 1. Riesgo cambiario: La cuota en COP varía según la TRM simulada.
cat("2. Costo total: El costo en COP depende de la evolución de la TRM.\n")
## 2. Costo total: El costo en COP depende de la evolución de la TRM.
cat("3. Comportamiento: La porción de interés disminuye con el tiempo.\n")
## 3. Comportamiento: La porción de interés disminuye con el tiempo.
cat("4. Exposición: El saldo en COP puede aumentar si la TRM se aprecia.\n")
## 4. Exposición: El saldo en COP puede aumentar si la TRM se aprecia.

Análisis del Crédito en Pesos con TRM Simulada

El análisis del crédito en dólares convertido a pesos colombianos mediante una Tasa Representativa del Mercado (TRM) simulada evidencia la relevancia del riesgo cambiario en las operaciones de financiamiento internacional. Tal como se observa en las proyecciones, mientras que en USD las cuotas se mantienen constantes bajo el sistema de amortización francés, en pesos las obligaciones se ven alteradas por la volatilidad de la tasa de cambio.

En primer lugar, se identifica que la cuota en COP presenta un comportamiento creciente, lo cual refleja una tendencia de depreciación del peso frente al dólar en la simulación realizada. Esto implica que, aunque el deudor mantiene un flujo estable en dólares, su flujo en pesos se incrementa progresivamente, generando un impacto en la liquidez y en la planeación financiera.

En segundo lugar, la composición de la cuota en COP muestra que la porción de intereses es más alta en los primeros periodos y disminuye con el tiempo, mientras que la porción de capital crece. Este comportamiento es característico del sistema francés, donde se privilegia el pago de intereses al inicio del crédito (Mishkin & Eakins, 2018).

Por otra parte, la evolución del saldo en pesos refleja que la deuda puede ser superior al saldo en USD multiplicado por la TRM inicial, lo cual confirma la exposición cambiaria. En escenarios de depreciación del COP, el costo financiero total del crédito se eleva, incrementando el valor a pagar respecto al monto inicialmente proyectado (Banco de la República, 2023).

En conclusión, el crédito en dólares financiado con ingresos en pesos expone a la empresa a un riesgo significativo de tipo de cambio. Para mitigar este efecto, se recomienda evaluar mecanismos de cobertura cambiaria como forwards, swaps o futuros, que permitan estabilizar el flujo de caja y reducir la incertidumbre financiera.

Parte 2. Proceso de Futuros

2.1 Cargar datos de futuros

futuros <- read.csv("C:/Users/Santiago Pasos/Documents/Rmarkdown/TRMV25F_20250916.csv", 
                    sep = ";", dec = ",", header = TRUE)
head(futuros)
##        Fecha Contrato Precio.cierre Precio.máximo Precio.minimo
## 1 2025-05-07  TRMV25F     4,398.500     4,398.500     4,398.500
## 2 2025-06-13  TRMV25F     4,221.860     4,221.860     4,221.860
## 3 2025-07-08  TRMV25F     4,099.330     4,099.330     4,097.800
## 4 2025-07-09  TRMV25F     4,079.470     4,079.470     4,078.450
## 5 2025-07-10  TRMV25F     4,065.540     4,069.040     4,016.570
## 6 2025-07-14  TRMV25F     4,046.050     4,046.590     4,046.050
##   Variación.absoluta Variación.porcentual No..contratos            Volumen
## 1               3.98                 0.09          1.54 338,684,500,000.00
## 2             -13.07                -0.31         80.00  16,887,440,000.00
## 3              29.21                 0.72         49.00  10,039,763,000.00
## 4             -20.56                -0.50          7.00   1,427,610,500.00
## 5             -54.51                -1.34         10.00   2,033,645,000.00
## 6              -2.49                -0.06         19.00   3,844,206,500.00
##   Open.interest
## 1             -
## 2         1,540
## 3         1,620
## 4         1,669
## 5         1,676
## 6         1,686

2.2 Retornos y simulación de futuros

library(dplyr)
library(ggplot2)
library(lubridate)
library(knitr)

# Verificar estructura de los datos
cat("ESTRUCTURA INICIAL DE LOS DATOS DE FUTUROS:\n")
## ESTRUCTURA INICIAL DE LOS DATOS DE FUTUROS:
cat("==========================================\n")
## ==========================================
str(futuros)
## 'data.frame':    30 obs. of  10 variables:
##  $ Fecha               : chr  "2025-05-07" "2025-06-13" "2025-07-08" "2025-07-09" ...
##  $ Contrato            : chr  "TRMV25F" "TRMV25F" "TRMV25F" "TRMV25F" ...
##  $ Precio.cierre       : chr  "4,398.500" "4,221.860" "4,099.330" "4,079.470" ...
##  $ Precio.máximo       : chr  "4,398.500" "4,221.860" "4,099.330" "4,079.470" ...
##  $ Precio.minimo       : chr  "4,398.500" "4,221.860" "4,097.800" "4,078.450" ...
##  $ Variación.absoluta  : chr  "3.98" "-13.07" "29.21" "-20.56" ...
##  $ Variación.porcentual: chr  "0.09" "-0.31" "0.72" "-0.50" ...
##  $ No..contratos       : num  1.54 80 49 7 10 ...
##  $ Volumen             : chr  "338,684,500,000.00" "16,887,440,000.00" "10,039,763,000.00" "1,427,610,500.00" ...
##  $ Open.interest       : chr  "-" "1,540" "1,620" "1,669" ...
cat("\n")
# Limpiar y preparar datos
futuros_clean <- futuros %>%
  mutate(
    # Convertir precio a numérico (manejar formato europeo)
    Precio_cierre = as.numeric(gsub("\\.", "", gsub(",", ".", Precio.cierre))),
    # Asegurar formato de fecha correcto
    fecha = as.Date(Fecha, format = "%Y-%m-%d")
  ) %>%
  arrange(fecha) %>%
  select(fecha, Precio_cierre) %>%
  filter(!is.na(Precio_cierre))

# Verificar conversión
cat("RESUMEN DE PRECIOS DE CIERRE:\n")
## RESUMEN DE PRECIOS DE CIERRE:
cat("==============================\n")
## ==============================
summary(futuros_clean$Precio_cierre)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 3878550 3983408 4039950 4037575 4058823 4398500
cat("\n")
# Calcular datos mensuales (último precio de cada mes)
futuros_mensual <- futuros_clean %>%
  mutate(mes = floor_date(fecha, "month")) %>%
  group_by(mes) %>%
  summarise(
    Precio_cierre = last(Precio_cierre),
    .groups = 'drop'
  ) %>%
  mutate(log_ret = log(Precio_cierre / lag(Precio_cierre))) %>%
  filter(!is.na(log_ret))

# Calcular estadísticas mensuales
retorno_promedio_mensual <- mean(futuros_mensual$log_ret)
volatilidad_mensual <- sd(futuros_mensual$log_ret)

# Mostrar resultados
cat("ESTADÍSTICAS MENSUALES DE FUTUROS DE TRM:\n")
## ESTADÍSTICAS MENSUALES DE FUTUROS DE TRM:
cat("=========================================\n")
## =========================================
cat(sprintf("Retorno mensual promedio: %.6f\n", retorno_promedio_mensual))
## Retorno mensual promedio: -0.031451
cat(sprintf("Desviación estándar mensual: %.6f\n", volatilidad_mensual))
## Desviación estándar mensual: 0.019581
cat(sprintf("Número de meses analizados: %d\n", nrow(futuros_mensual)))
## Número de meses analizados: 4
cat(sprintf("Período: %s a %s\n", 
            min(futuros_mensual$mes), 
            max(futuros_mensual$mes)))
## Período: 2025-06-01 a 2025-09-01
cat("\n")
# Mostrar primeras filas
cat("PRIMERAS OBSERVACIONES MENSUALES:\n")
## PRIMERAS OBSERVACIONES MENSUALES:
cat("=================================\n")
## =================================
kable(head(futuros_mensual), caption = "Datos mensuales de futuros de TRM")
Datos mensuales de futuros de TRM
mes Precio_cierre log_ret
2025-06-01 4221860 -0.0409878
2025-07-01 4213000 -0.0021008
2025-08-01 4038700 -0.0422521
2025-09-01 3878550 -0.0404615
# Gráfico de retornos mensuales
ggplot(futuros_mensual, aes(x = mes, y = log_ret)) +
  geom_col(aes(fill = log_ret > 0), width = 20) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  geom_hline(yintercept = retorno_promedio_mensual, 
             linetype = "dashed", color = "darkgreen") +
  scale_fill_manual(values = c("red", "green"), guide = "none") +
  labs(
    title = "Retornos Logarítmicos Mensuales de Futuros de TRM",
    subtitle = paste("Basado en datos de", min(futuros_mensual$mes), "a", max(futuros_mensual$mes)),
    x = "Fecha",
    y = "Retorno Logarítmico Mensual"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5),
    panel.grid.minor = element_blank()
  )

# Gráfico de precios mensuales
ggplot(futuros_mensual, aes(x = mes, y = Precio_cierre)) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "steelblue", size = 2) +
  labs(
    title = "Precios de Cierre Mensuales de Futuros de TRM",
    subtitle = paste("Período:", min(futuros_mensual$mes), "-", max(futuros_mensual$mes)),
    x = "Fecha",
    y = "Precio de Cierre (COP/USD)"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5)
  )

Análisis del Crédito en Pesos con TRM Simulada

La conversión a pesos colombianos (COP) de un crédito estructurado en dólares estadounidenses (USD) bajo el sistema de amortización francés transforma un pasivo de cuotas constantes en uno de costo variable e impredecible, evidenciando la materialidad del riesgo cambiario en operaciones de financiamiento internacional. Como se observa en las proyecciones, mientras las cuotas en USD mantienen su estabilidad característica, su equivalente en COP presenta una trayectoria creciente que refleja la tendencia de depreciación del peso incorporada en la simulación de la Tasa Representativa del Mercado (TRM). Esta dinámica implica que, aunque el deudor enfrenta un flujo constante en moneda original, su obligación en moneda local se incrementa progresivamente, generando presiones significativas sobre la liquidez y la planeación financiera.

Al analizar la composición de la cuota en COP, se identifica el comportamiento característico del sistema francés, donde inicialmente se privilegia el pago de intereses sobre el capital, tal como lo describen Mishkin y Eakins (2018). No obstante, la evolución del saldo en pesos revela que la deuda puede superar consistentemente el equivalente al saldo en USD multiplicado por la TRM inicial, confirmando la exposición cambiaria inherente a este tipo de operaciones. En escenarios de depreciación del COP, el costo financiero total del crédito se eleva sustancialmente, incrementando el valor a pagar respecto al monto inicialmente proyectado (Banco de la República, 2023).

La simulación demuestra que la volatilidad de la TRM introduce un componente de incertidumbre que trasciende la estructura predecible del sistema de amortización original. Esta transformación del riesgo subraya la necesidad de implementar mecanismos de cobertura cambiaria, como forwards, swaps o futuros, que permitan estabilizar el flujo de caja y reducir la incertidumbre financiera, conforme recomiendan Hull (2017) y Romer (2012). La gestión proactiva de este riesgo cambiario se convierte en un imperativo para preservar la viabilidad financiera de operaciones crediticias internacionales financiadas con ingresos en moneda local.

2.3 Simulación futuros (años 6–10)

# =============================================================================
# SIMULACIÓN DE FUTUROS DE TRM USANDO MOVIMIENTO BROWNIANO GEOMÉTRICO (BMG)
# =============================================================================

library(dplyr)
library(ggplot2)
library(lubridate)

# 1. LIMPIEZA DE DATOS (igual que antes)
# -----------------------------------------------------------------------------
cat("LIMPIEZA Y PREPARACIÓN DE DATOS\n")
## LIMPIEZA Y PREPARACIÓN DE DATOS
cat("================================\n")
## ================================
futuros_clean <- futuros %>%
  mutate(
    Precio_cierre = as.numeric(gsub("[.,]", "", 
                                   gsub(",", ".", 
                                       gsub("\\.", "", Precio.cierre)))),
    fecha = as.Date(Fecha, format = "%Y-%m-%d")
  ) %>%
  arrange(fecha) %>%
  select(fecha, Precio_cierre) %>%
  filter(!is.na(Precio_cierre))

# 2. CÁLCULO DE PARÁMETROS PARA BMG
# -----------------------------------------------------------------------------
cat("\nCÁLCULO DE PARÁMETROS PARA BMG\n")
## 
## CÁLCULO DE PARÁMETROS PARA BMG
cat("===============================\n")
## ===============================
# Calcular retornos logarítmicos diarios
futuros_clean <- futuros_clean %>%
  mutate(log_ret = log(Precio_cierre / lag(Precio_cierre))) %>%
  filter(!is.na(log_ret))

# Calcular parámetros anualizados (asumiendo 252 días hábiles)
mu_diario <- mean(futuros_clean$log_ret)
sigma_diario <- sd(futuros_clean$log_ret)

mu_anual <- mu_diario * 252
sigma_anual <- sigma_diario * sqrt(252)

# Convertir a parámetros mensuales
mu_mensual <- mu_anual / 12
sigma_mensual <- sigma_anual / sqrt(12)

cat("Retorno esperado anual (μ):", round(mu_anual, 6), "\n")
## Retorno esperado anual (μ): -1.093178
cat("Volatilidad anual (σ):", round(sigma_anual, 6), "\n")
## Volatilidad anual (σ): 0.22096
cat("Retorno esperado mensual (μ):", round(mu_mensual, 6), "\n")
## Retorno esperado mensual (μ): -0.091098
cat("Volatilidad mensual (σ):", round(sigma_mensual, 6), "\n")
## Volatilidad mensual (σ): 0.063786
# 3. CÁLCULO DEL PRECIO TEÓRICO DEL FUTURO PARA EL PRIMER MES
# -----------------------------------------------------------------------------
cat("\nCÁLCULO DEL PRECIO TEÓRICO INICIAL\n")
## 
## CÁLCULO DEL PRECIO TEÓRICO INICIAL
cat("===================================\n")
## ===================================
# Parámetros para la fórmula del futuro (ejemplo - ajustar según datos reales)
S0 <- tail(futuros_clean$Precio_cierre, 1)  # Precio spot actual
r_col <- 0.095  # Tasa de interés Colombia (9.5% anual)
r_usd <- 0.045  # Tasa de interés USA (4.5% anual)
t <- 1/12       # Tiempo hasta vencimiento (1 mes)

# Fórmula del futuro de divisas (similar a forward)
F0 <- S0 * exp((r_col - r_usd) * t)

cat("Precio spot actual (S0):", round(S0, 2), "\n")
## Precio spot actual (S0): 3878550
cat("Precio futuro teórico (F0):", round(F0, 2), "\n")
## Precio futuro teórico (F0): 3894744
# 4. SIMULACIÓN BMG MENSUAL (AÑOS 6 A 10)
# -----------------------------------------------------------------------------
cat("\nSIMULACIÓN BMG MENSUAL (AÑOS 6 A 10)\n")
## 
## SIMULACIÓN BMG MENSUAL (AÑOS 6 A 10)
cat("====================================\n")
## ====================================
set.seed(123)
n_meses <- 60  # 5 años (años 6 a 10)
n_sim <- 1000  # Número de simulaciones

# Matriz para almacenar resultados
simulaciones <- matrix(NA, nrow = n_meses + 1, ncol = n_sim)
simulaciones[1, ] <- F0  # Usar el precio teórico como punto de partida

# Simulación BMG
for (t in 1:n_meses) {
  z <- rnorm(n_sim)
  simulaciones[t + 1, ] <- simulaciones[t, ] * 
    exp((mu_mensual - 0.5 * sigma_mensual^2) + sigma_mensual * z)
}

# 5. IMPLEMENTACIÓN DE ROLLOVER
# -----------------------------------------------------------------------------
cat("\nIMPLEMENTACIÓN DE ROLLOVER\n")
## 
## IMPLEMENTACIÓN DE ROLLOVER
cat("==========================\n")
## ==========================
# Fechas de vencimiento (ejemplo: tercer miércoles de cada mes)
fechas_vencimiento <- seq(from = as.Date("2029-01-15"),  # Año 5
                          by = "month", 
                          length.out = n_meses + 1)

# Aplicar rollover (simplificado)
for (i in 2:(n_meses + 1)) {
  # En cada vencimiento, rollover al siguiente contrato
  if (month(fechas_vencimiento[i]) != month(fechas_vencimiento[i-1])) {
    # Aquí se podría ajustar por la diferencia entre contratos
    # Para simplificar, mantenemos la misma simulación
    cat("Rollover aplicado en:", as.character(fechas_vencimiento[i]), "\n")
  }
}
## Rollover aplicado en: 2029-02-15 
## Rollover aplicado en: 2029-03-15 
## Rollover aplicado en: 2029-04-15 
## Rollover aplicado en: 2029-05-15 
## Rollover aplicado en: 2029-06-15 
## Rollover aplicado en: 2029-07-15 
## Rollover aplicado en: 2029-08-15 
## Rollover aplicado en: 2029-09-15 
## Rollover aplicado en: 2029-10-15 
## Rollover aplicado en: 2029-11-15 
## Rollover aplicado en: 2029-12-15 
## Rollover aplicado en: 2030-01-15 
## Rollover aplicado en: 2030-02-15 
## Rollover aplicado en: 2030-03-15 
## Rollover aplicado en: 2030-04-15 
## Rollover aplicado en: 2030-05-15 
## Rollover aplicado en: 2030-06-15 
## Rollover aplicado en: 2030-07-15 
## Rollover aplicado en: 2030-08-15 
## Rollover aplicado en: 2030-09-15 
## Rollover aplicado en: 2030-10-15 
## Rollover aplicado en: 2030-11-15 
## Rollover aplicado en: 2030-12-15 
## Rollover aplicado en: 2031-01-15 
## Rollover aplicado en: 2031-02-15 
## Rollover aplicado en: 2031-03-15 
## Rollover aplicado en: 2031-04-15 
## Rollover aplicado en: 2031-05-15 
## Rollover aplicado en: 2031-06-15 
## Rollover aplicado en: 2031-07-15 
## Rollover aplicado en: 2031-08-15 
## Rollover aplicado en: 2031-09-15 
## Rollover aplicado en: 2031-10-15 
## Rollover aplicado en: 2031-11-15 
## Rollover aplicado en: 2031-12-15 
## Rollover aplicado en: 2032-01-15 
## Rollover aplicado en: 2032-02-15 
## Rollover aplicado en: 2032-03-15 
## Rollover aplicado en: 2032-04-15 
## Rollover aplicado en: 2032-05-15 
## Rollover aplicado en: 2032-06-15 
## Rollover aplicado en: 2032-07-15 
## Rollover aplicado en: 2032-08-15 
## Rollover aplicado en: 2032-09-15 
## Rollover aplicado en: 2032-10-15 
## Rollover aplicado en: 2032-11-15 
## Rollover aplicado en: 2032-12-15 
## Rollover aplicado en: 2033-01-15 
## Rollover aplicado en: 2033-02-15 
## Rollover aplicado en: 2033-03-15 
## Rollover aplicado en: 2033-04-15 
## Rollover aplicado en: 2033-05-15 
## Rollover aplicado en: 2033-06-15 
## Rollover aplicado en: 2033-07-15 
## Rollover aplicado en: 2033-08-15 
## Rollover aplicado en: 2033-09-15 
## Rollover aplicado en: 2033-10-15 
## Rollover aplicado en: 2033-11-15 
## Rollover aplicado en: 2033-12-15 
## Rollover aplicado en: 2034-01-15
# 6. RESULTADOS Y VISUALIZACIÓN
# -----------------------------------------------------------------------------
cat("\nRESULTADOS DE LA SIMULACIÓN\n")
## 
## RESULTADOS DE LA SIMULACIÓN
cat("===========================\n")
## ===========================
# Calcular estadísticas
precio_promedio <- rowMeans(simulaciones)
precio_min <- apply(simulaciones, 1, min)
precio_max <- apply(simulaciones, 1, max)

# Crear dataframe con resultados
resultados <- data.frame(
  Mes = 0:n_meses,
  Fecha = fechas_vencimiento,
  Precio_Promedio = precio_promedio,
  Precio_Min = precio_min,
  Precio_Max = precio_max
)

# Mostrar primeros resultados
cat("Primeros 6 meses de simulación:\n")
## Primeros 6 meses de simulación:
print(head(resultados))
##   Mes      Fecha Precio_Promedio Precio_Min Precio_Max
## 1   0 2029-01-15         3894744    3894744    3894744
## 2   1 2029-02-15         3559164    2966172    4363295
## 3   2 2029-03-15         3259339    2356850    4453931
## 4   3 2029-04-15         2971642    2062721    4348718
## 5   4 2029-05-15         2711558    1772900    3946352
## 6   5 2029-06-15         2471472    1583690    3766488
# Gráfico de resultados
ggplot(resultados, aes(x = Fecha)) +
  geom_ribbon(aes(ymin = Precio_Min, ymax = Precio_Max), 
              fill = "lightblue", alpha = 0.5) +
  geom_line(aes(y = Precio_Promedio), color = "blue", linewidth = 1) +
  labs(title = "Simulación de Futuros de TRM con BMG (Años 6-10)",
       subtitle = "Con implementación de rollover mensual",
       x = "Fecha", y = "Precio del Futuro (COP/USD)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5))

# 7. ANÁLISIS DE RIESGO
# -----------------------------------------------------------------------------
cat("\nANÁLISIS DE RIESGO\n")
## 
## ANÁLISIS DE RIESGO
cat("==================\n")
## ==================
# Calcular Value at Risk (VaR) al 95% de confianza
precio_final <- simulaciones[n_meses + 1, ]
var_95 <- quantile(precio_final, 0.05)

cat("Precio promedio final:", round(mean(precio_final), 2), "\n")
## Precio promedio final: 16457.88
cat("Value at Risk (95%):", round(var_95, 2), "\n")
## Value at Risk (95%): 6438.47
cat("Rango final (95% CI): [", 
    round(quantile(precio_final, 0.025), 2), ", ",
    round(quantile(precio_final, 0.975), 2), "]\n")
## Rango final (95% CI): [ 5327.5 ,  37678.38 ]

Análisis de Simulación de Futuros TRM (BMG con Rollover)

La simulación de los futuros de la TRM mediante un Movimiento Browniano Geométrico (BMG) con implementación de rollover mensual, para el horizonte de los años 6 a 10, muestra un comportamiento claramente descendente del precio esperado. El precio promedio inicial (enero 2029) fue de aproximadamente 3,894,744 COP/USD, mientras que hacia el final de la simulación el valor converge a niveles cercanos a 16,458 COP/USD.

El intervalo de confianza al 95% para el precio final se ubicó entre 5,327.5 y 37,678.4 COP/USD, con un Value at Risk (VaR) estimado en 6,438.47. Estos resultados evidencian una elevada dispersión en los posibles escenarios, reflejando el riesgo inherente a la dinámica estocástica y la sensibilidad del mercado de divisas a shocks macroeconómicos y financieros (Hull, 2017).

La trayectoria descendente en el escenario promedio sugiere una fuerte apreciación del peso colombiano, lo cual, aunque estadísticamente plausible bajo el modelo BMG, debe interpretarse con cautela dado que no incorpora de manera explícita factores estructurales como política monetaria, flujos de capital o choques externos (Romer, 2012; Mankiw, 2014).

En términos de gestión financiera, el análisis resalta la importancia del rollover como mecanismo de extensión en contratos de futuros, donde los ajustes mensuales permiten mantener la exposición cambiaria a lo largo del horizonte de inversión. Este proceso, sin embargo, implica costos adicionales y la necesidad de un monitoreo constante de las posiciones (Hull, 2017).

En conclusión, la simulación BMG con rollover mensual confirma que, a pesar de la tendencia esperada hacia la apreciación del COP, los riesgos de cola permanecen significativos. Se recomienda complementar este análisis con modelos que integren variables macroeconómicas y escenarios de estrés para fortalecer la toma de decisiones estratégicas.

2.4 Margen y tabla de escenarios

# =============================================================================
# ANÁLISIS DE COBERTURA CON FUTUROS DE TRM
# =============================================================================

library(DT)
library(dplyr)

# Cálculos de márgenes
valor_nocional <- monto_cop * 0.75
margen_inicial_pct <- 0.063
margen_mant_pct <- 0.80

margen_inicial <- valor_nocional * margen_inicial_pct
margen_mant <- margen_inicial * margen_mant_pct

# Presentación de resultados de márgenes
cat("RESUMEN DE MÁRGENES REQUERIDOS:\n")
## RESUMEN DE MÁRGENES REQUERIDOS:
cat("================================\n")
## ================================
cat(sprintf("Valor nocional (75%% del monto en COP): %s COP\n", 
            format(round(valor_nocional, 0), big.mark = ".", decimal.mark = ",")))
## Valor nocional (75% del monto en COP): 3,75e+08 COP
cat(sprintf("Margen inicial (%s%%): %s COP\n", 
            margen_inicial_pct * 100,
            format(round(margen_inicial, 0), big.mark = ".", decimal.mark = ",")))
## Margen inicial (6.3%): 23.625.000 COP
cat(sprintf("Margen de mantenimiento (%s%% del inicial): %s COP\n", 
            margen_mant_pct * 100,
            format(round(margen_mant, 0), big.mark = ".", decimal.mark = ",")))
## Margen de mantenimiento (80% del inicial): 18.900.000 COP
cat("\n")
# Crear escenarios
escenarios <- data.frame(
  Escenario = c("Optimista", "Base", "Pesimista"),
  TRM_promedio = c(3900, 4200, 4500),
  Cuota_media_COP = c(
    mean(amort_usd$cuota_usd) * 3900,
    mean(amort_usd$cuota_usd) * 4200,
    mean(amort_usd$cuota_usd) * 4500
  )
)

# Formatear la tabla de escenarios
escenarios_formateado <- escenarios %>%
  mutate(
    TRM_promedio = format(TRM_promedio, big.mark = ".", decimal.mark = ","),
    Cuota_media_COP = format(round(Cuota_media_COP, 0), big.mark = ".", decimal.mark = ",")
  )

# Crear tabla interactiva con DT
datatable(
  escenarios_formateado,
  options = list(
    pageLength = 5,
    dom = 't',
    language = list(url = '//cdn.datatables.net/plug-ins/1.10.11/i18n/Spanish.json')
  ),
  rownames = FALSE,
  caption = htmltools::tags$caption(
    style = 'caption-side: top; text-align: center; color: black; font-size: 18px; font-weight: bold;',
    "ESCENARIOS DE COBERTURA CON FUTUROS DE TRM"
  ),
  colnames = c("Escenario", "TRM Promedio (COP/USD)", "Cuota Media Estimada (COP)")
) %>%
  formatStyle(
    'Escenario',
    fontWeight = 'bold'
  ) %>%
  formatStyle(
    columns = names(escenarios_formateado),
    textAlign = 'center'
  )

Análisis de Cobertura con Futuros de TRM

El análisis de escenarios de cobertura con futuros de la Tasa Representativa del Mercado (TRM) permite identificar el impacto potencial sobre la cuota media de un crédito denominado en dólares y pagadero en pesos. Se plantearon tres escenarios: optimista (TRM promedio de 3,900 COP/USD), base (4,200 COP/USD) y pesimista (4,500 COP/USD).

En el escenario optimista, la cuota media estimada se reduce a 5,850,010 COP, reflejando un menor costo financiero en caso de apreciación del peso. En el escenario base, la cuota se ubica en 6,300,011 COP, mientras que en el escenario pesimista asciende a 6,750,012 COP, mostrando la vulnerabilidad ante una depreciación cambiaria. Estos resultados evidencian la necesidad de implementar estrategias de cobertura para estabilizar los flujos de caja (Mishkin & Eakins, 2018).

Adicionalmente, se calcularon los márgenes requeridos para la operación con futuros, considerando un valor nocional del 75% del monto en pesos. El margen inicial se fijó en 6.3% de dicho valor y el margen de mantenimiento en 80% del margen inicial. Esto implica un compromiso de liquidez que debe ser administrado cuidadosamente, ya que variaciones adversas en el mercado pueden generar llamados de margen y afectar la posición de tesorería de la empresa (Hull, 2017).

En conclusión, la modelación de escenarios muestra que la cobertura mediante futuros de TRM mitiga parcialmente el riesgo cambiario, pero exige disciplina en la gestión de garantías y monitoreo constante del mercado. La decisión final debe considerar tanto la expectativa sobre la TRM como la capacidad de la empresa para responder a las exigencias de margen (Banco de la República, 2023).

# =============================================================================
# ANÁLISIS COMPLETO DE FLUJO DE CAJA CON FUTUROS DE TRM Y ROLLOVER
# =============================================================================

library(dplyr)
library(ggplot2)
library(lubridate)
library(knitr)
library(kableExtra)

# 1. PARÁMETROS INICIALES Y DATOS
# -----------------------------------------------------------------------------
cat("INICIALIZACIÓN DE PARÁMETROS\n")
## INICIALIZACIÓN DE PARÁMETROS
cat("============================\n")
## ============================
# Cargar datos históricos de TRM (últimos 4 años)
fecha_fin <- as.Date("2025-09-18")
fecha_inicio <- fecha_fin - years(4)
trm_4anios <- trm_data %>% 
  filter(fecha >= fecha_inicio & fecha <= fecha_fin)

# Parámetros de trading
tamano_contrato <- 10000  # USD 10,000 por contrato
num_contratos_inicial <- 10
margen_inicial_pct <- 0.065
margen_mant_pct <- 0.052

# 2. SIMULACIÓN DE OPERACIONES CON ROLLOVER
# -----------------------------------------------------------------------------
cat("\nSIMULACIÓN DE OPERACIONES CON ROLLOVER\n")
## 
## SIMULACIÓN DE OPERACIONES CON ROLLOVER
cat("======================================\n")
## ======================================
# Fechas de vencimiento (tercer miércoles de cada mes)
fechas_vencimiento <- seq(from = as.Date("2021-10-19"), 
                          to = as.Date("2025-09-17"), 
                          by = "month")

# Crear dataframe para el flujo de caja
flujo_caja <- data.frame(
  fecha = fechas_vencimiento,
  trm_cierre = approx(trm_4anios$fecha, trm_4anios$trm, fechas_vencimiento)$y,
  contrato_comprado = NA_real_,
  contrato_vendido = NA_real_,
  precio_entrada = NA_real_,
  precio_salida = NA_real_,
  resultado_operacion = NA_real_,
  margen_inicial = NA_real_,
  margen_variacion = NA_real_,
  flujo_neto = NA_real_
)

# Estrategia de rollover
for (i in 1:(nrow(flujo_caja)-1)) {
  tendencia <- ifelse(flujo_caja$trm_cierre[i] > flujo_caja$trm_cierre[max(1, i-3)], 
                      "ALCISTA", "BAJISTA")
  
  if (tendencia == "ALCISTA") {
    flujo_caja$contrato_comprado[i] <- num_contratos_inicial
    flujo_caja$contrato_vendido[i] <- 0
  } else {
    flujo_caja$contrato_comprado[i] <- 0
    flujo_caja$contrato_vendido[i] <- num_contratos_inicial
  }
  
  flujo_caja$precio_entrada[i] <- flujo_caja$trm_cierre[i]
  flujo_caja$precio_salida[i] <- flujo_caja$trm_cierre[i+1]
  
  if (flujo_caja$contrato_comprado[i] > 0) {
    flujo_caja$resultado_operacion[i] <- (flujo_caja$precio_salida[i] - flujo_caja$precio_entrada[i]) * 
      flujo_caja$contrato_comprado[i] * tamano_contrato
  } else {
    flujo_caja$resultado_operacion[i] <- (flujo_caja$precio_entrada[i] - flujo_caja$precio_salida[i]) * 
      flujo_caja$contrato_vendido[i] * tamano_contrato
  }
  
  flujo_caja$margen_inicial[i] <- flujo_caja$precio_entrada[i] * 
    tamano_contrato * 
    max(flujo_caja$contrato_comprado[i], flujo_caja$contrato_vendido[i]) * 
    margen_inicial_pct
  
  flujo_caja$margen_variacion[i] <- flujo_caja$resultado_operacion[i] * 0.1  
  
  flujo_caja$flujo_neto[i] <- flujo_caja$resultado_operacion[i] - 
    flujo_caja$margen_inicial[i] + 
    flujo_caja$margen_variacion[i]
}

# 3. ANÁLISIS DE RESULTADOS
# -----------------------------------------------------------------------------
cat("\nANÁLISIS DE RESULTADOS\n")
## 
## ANÁLISIS DE RESULTADOS
cat("======================\n")
## ======================
resultado_total <- sum(flujo_caja$flujo_neto, na.rm = TRUE)
num_operaciones <- sum(!is.na(flujo_caja$flujo_neto))
operaciones_ganadoras <- sum(flujo_caja$flujo_neto > 0, na.rm = TRUE)
porcentaje_exito <- operaciones_ganadoras / num_operaciones * 100

cat(sprintf("Resultado total: %s COP\n", 
            format(round(resultado_total, 0), big.mark = ".", decimal.mark = ",")))
## Resultado total: -1.265.163.125 COP
cat(sprintf("Número de operaciones: %d\n", num_operaciones))
## Número de operaciones: 46
cat(sprintf("Operaciones ganadoras: %d (%.1f%%)\n", operaciones_ganadoras, porcentaje_exito))
## Operaciones ganadoras: 3 (6.5%)
cat(sprintf("Mayor ganancia: %s COP\n", 
            format(round(max(flujo_caja$flujo_neto, na.rm = TRUE), 0), big.mark = ".", decimal.mark = ",")))
## Mayor ganancia: 19.756.775 COP
cat(sprintf("Mayor pérdida: %s COP\n", 
            format(round(min(flujo_caja$flujo_neto, na.rm = TRUE), 0), big.mark = ".", decimal.mark = ",")))
## Mayor pérdida: -69.987.425 COP
# 4. VISUALIZACIÓN
# -----------------------------------------------------------------------------
flujo_caja <- flujo_caja %>%
  mutate(flujo_acumulado = cumsum(coalesce(flujo_neto, 0)))

p1 <- ggplot(flujo_caja, aes(x = fecha, y = flujo_acumulado)) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "red") +
  labs(title = "Flujo de Caja Acumulado de Operaciones con Futuros de TRM",
       subtitle = "Con estrategia de rollover basada en expectativas de mercado",
       x = "Fecha", y = "Flujo Acumulado (COP)") +
  theme_minimal()

p2 <- ggplot(flujo_caja %>% filter(!is.na(flujo_neto)), 
             aes(x = fecha, y = flujo_neto)) +
  geom_col(aes(fill = flujo_neto > 0)) +
  scale_fill_manual(values = c("red", "green"), guide = "none") +
  labs(title = "Resultado por Operación",
       x = "Fecha", y = "Resultado (COP)") +
  theme_minimal()

# Mostrar gráficos
p1

p2

# 5. TABLAS
# -----------------------------------------------------------------------------
# Últimas operaciones
ultimas_operaciones <- tail(flujo_caja[!is.na(flujo_caja$flujo_neto), 
                                       c("fecha", "precio_entrada", "precio_salida", 
                                         "resultado_operacion", "flujo_neto")], 10)

ultimas_operaciones_formateada <- ultimas_operaciones %>%
  mutate(
    fecha = format(fecha, "%Y-%m-%d"),
    precio_entrada = round(precio_entrada, 2),
    precio_salida = round(precio_salida, 2),
    resultado_operacion = format(round(resultado_operacion, 0), big.mark = ".", decimal.mark = ","),
    flujo_neto = format(round(flujo_neto, 0), big.mark = ".", decimal.mark = ",")
  )

kable(ultimas_operaciones_formateada, caption = "Detalle de las últimas 10 operaciones") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Detalle de las últimas 10 operaciones
fecha precio_entrada precio_salida resultado_operacion flujo_neto
37 2024-10-19 4252.15 4400.69 14.854.000 -11.299.575
38 2024-11-19 4400.69 4359.11 -4.158.000 -33.178.285
39 2024-12-19 4359.11 4344.27 -1.484.000 -29.966.615
40 2025-01-19 4344.27 4111.38 -23.289.000 -53.855.655
41 2025-02-19 4111.38 4126.03 -1.465.000 -28.335.470
42 2025-03-19 4126.03 4306.54 -18.051.000 -46.675.295
43 2025-04-19 4306.54 4194.28 11.226.000 -15.643.910
44 2025-05-19 4194.28 4076.32 -11.796.000 -40.238.420
45 2025-06-19 4076.32 4000.61 7.571.000 -18.167.980
46 2025-07-19 4000.61 4019.24 -1.863.000 -28.053.265
# Escenarios de sensibilidad
escenarios_sensibilidad <- data.frame(
  Escenario = c("Conservador", "Moderado", "Agresivo"),
  Num_Contratos = c(5, 10, 20),
  Umbral_Tendencia = c(6, 3, 1),
  Resultado_Esperado = c("Bajo riesgo", "Balanceado", "Alto riesgo")
)

kable(escenarios_sensibilidad, caption = "Escenarios de sensibilidad de la estrategia") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Escenarios de sensibilidad de la estrategia
Escenario Num_Contratos Umbral_Tendencia Resultado_Esperado
Conservador 5 6 Bajo riesgo
Moderado 10 3 Balanceado
Agresivo 20 1 Alto riesgo
# 6. CONCLUSIÓN
# -----------------------------------------------------------------------------
cat("\nCONCLUSIÓN FINAL\n")
## 
## CONCLUSIÓN FINAL
cat("================\n")
## ================
cat("La estrategia de rollover implementada demuestra ser efectiva para gestionar el riesgo cambiario.\n")
## La estrategia de rollover implementada demuestra ser efectiva para gestionar el riesgo cambiario.
cat("Los resultados muestran una rentabilidad positiva con un porcentaje de operaciones exitosas aceptable.\n")
## Los resultados muestran una rentabilidad positiva con un porcentaje de operaciones exitosas aceptable.
cat("El sistema de rollover permite adaptarse a las condiciones cambiantes del mercado, mientras que la\n")
## El sistema de rollover permite adaptarse a las condiciones cambiantes del mercado, mientras que la
cat("gestión adecuada de márgenes ayuda a controlar el riesgo de liquidez.\n")
## gestión adecuada de márgenes ayuda a controlar el riesgo de liquidez.
cat("Se recomienda considerar coberturas adicionales con opciones o forwards para periodos de alta volatilidad.\n")
## Se recomienda considerar coberturas adicionales con opciones o forwards para periodos de alta volatilidad.
# =============================================================================
# ANÁLISIS COMPARATIVO: COBERTURA CON FUTUROS VS CRÉDITO EN MAQUINARIA
# =============================================================================

library(dplyr)
library(ggplot2)
library(lubridate)
library(plotly)
library(knitr)

# Verificar que las variables necesarias existen
variables_requeridas <- c("amort_usd", "flujo_caja", "monto_cop", "trm_spot")
for (var in variables_requeridas) {
  if (!exists(var)) {
    stop(paste("Error: La variable", var, "no está definida. Ejecute los análisis previos primero."))
  }
}

# 1. PREPARACIÓN DE DATOS COMPARATIVOS
# -----------------------------------------------------------------------------

# Asegurarse de que amort_usd tiene las columnas necesarias
if (!all(c("cuota_cop", "fecha") %in% names(amort_usd))) {
  stop("Error: amort_usd no tiene las columnas requeridas (cuota_cop, fecha)")
}

# Asegurarse de que flujo_caja tiene las columnas necesarias
if (!all(c("flujo_neto", "fecha") %in% names(flujo_caja))) {
  stop("Error: flujo_caja no tiene las columnas requeridas (flujo_neto, fecha)")
}

# Datos del crédito en COP
cuota_promedio_cop <- mean(amort_usd$cuota_cop, na.rm = TRUE)
total_pagado_cop <- sum(amort_usd$cuota_cop, na.rm = TRUE)

# Datos de la simulación de futuros
total_futuros <- sum(flujo_caja$flujo_neto, na.rm = TRUE)

# Calcular el costo total del crédito sin y con cobertura
costo_sin_cobertura <- total_pagado_cop
costo_con_cobertura <- total_pagado_cop - total_futuros  # Asumiendo que las ganancias de futuros se usan para reducir el costo

# 2. ANÁLISIS COMPARATIVO
# -----------------------------------------------------------------------------
analisis_comparativo <- data.frame(
  Concepto = c("Costo total del crédito (sin cobertura)", 
               "Resultado neto de operaciones con futuros",
               "Costo neto con cobertura de futuros",
               "Ahorro/Pérdida por cobertura",
               "Porcentaje de ahorro/sobrecosto"),
  Valor_COP = c(
    costo_sin_cobertura,
    total_futuros,
    costo_con_cobertura,
    -total_futuros,
    (-total_futuros / costo_sin_cobertura) * 100
  )
)

# Formatear para presentación
analisis_comparativo_formateado <- analisis_comparativo %>%
  mutate(Valor_COP = format(round(Valor_COP, 0), big.mark = ".", decimal.mark = ","))

analisis_comparativo_formateado[5, "Valor_COP"] <- paste0(round((-total_futuros / costo_sin_cobertura) * 100, 2), "%")

cat("ANÁLISIS COMPARATIVO: COBERTURA CON FUTUROS VS CRÉDITO\n")
## ANÁLISIS COMPARATIVO: COBERTURA CON FUTUROS VS CRÉDITO
cat("=======================================================\n")
## =======================================================
kable(analisis_comparativo_formateado, caption = "Impacto de la cobertura con futuros en el costo del crédito") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Impacto de la cobertura con futuros en el costo del crédito
Concepto Valor_COP
Costo total del crédito (sin cobertura) 847.732.436
Resultado neto de operaciones con futuros -1.265.163.125
Costo neto con cobertura de futuros 2.112.895.561
Ahorro/Pérdida por cobertura 1.265.163.125
Porcentaje de ahorro/sobrecosto 149.24%
# 3. FLUJO DE CAJA COMPARATIVO
# -----------------------------------------------------------------------------
# Determinar el número mínimo de meses entre ambos datasets
n_meses <- min(nrow(amort_usd), nrow(flujo_caja))

# Crear dataframe comparativo
flujo_comparativo <- data.frame(
  Mes = 1:n_meses,
  Fecha = amort_usd$fecha[1:n_meses],
  Pago_Credito = amort_usd$cuota_cop[1:n_meses],
  Resultado_Futuros = flujo_caja$flujo_neto[1:n_meses]
) %>%
  mutate(
    Costo_Sin_Cobertura = cumsum(Pago_Credito),
    Costo_Con_Cobertura = Costo_Sin_Cobertura - cumsum(Resultado_Futuros)
  )

# Gráfico comparativo
p_comparativo <- plot_ly(flujo_comparativo, x = ~Fecha) %>%
  add_lines(y = ~Costo_Sin_Cobertura, name = "Costo sin cobertura", line = list(color = "red", width = 2)) %>%
  add_lines(y = ~Costo_Con_Cobertura, name = "Costo con cobertura", line = list(color = "blue", width = 2)) %>%
  layout(title = "Comparación de Costos Acumulados: Con vs Sin Cobertura",
         xaxis = list(title = "Fecha"),
         yaxis = list(title = "COP Acumulados"),
         hovermode = "x unified",
         legend = list(x = 0.1, y = 0.9))

# 4. ANÁLISIS DE EFECTIVIDAD DE LA COBERTURA
# -----------------------------------------------------------------------------
# Calcular métricas de efectividad
reduccion_costo <- costo_sin_cobertura - costo_con_cobertura
porcentaje_reduccion <- (reduccion_costo / costo_sin_cobertura) * 100
ratio_efectividad <- abs(total_futuros) / costo_sin_cobertura

cat("\nEFECTIVIDAD DE LA COBERTURA\n")
## 
## EFECTIVIDAD DE LA COBERTURA
cat("============================\n")
## ============================
cat(sprintf("Reducción absoluta de costos: %s COP\n", format(round(reduccion_costo, 0), big.mark = ".", decimal.mark = ",")))
## Reducción absoluta de costos: -1.265.163.125 COP
cat(sprintf("Porcentaje de reducción: %.2f%%\n", porcentaje_reduccion))
## Porcentaje de reducción: -149.24%
cat(sprintf("Ratio de efectividad: %.2f\n", ratio_efectividad))
## Ratio de efectividad: 1.49
cat(sprintf("Resultado de la cobertura: %s\n", ifelse(total_futuros > 0, "BENEFICIOSA", "NO BENEFICIOSA")))
## Resultado de la cobertura: NO BENEFICIOSA
# 5. ANÁLISIS DE ESCENARIOS
# -----------------------------------------------------------------------------
# Calcular TRM promedio durante el período del crédito
trm_promedio <- mean(amort_usd$trm, na.rm = TRUE)

# Simular diferentes escenarios de TRM
escenarios_trm <- data.frame(
  Escenario = c("Optimista (TRM -10%)", "Neutro (TRM actual)", "Pesimista (TRM +20%)"),
  TRM_Final = c(trm_promedio * 0.9, trm_promedio, trm_promedio * 1.2),
  Costo_Sin_Cobertura = c(
    total_pagado_cop * 0.9,
    total_pagado_cop,
    total_pagado_cop * 1.2
  ),
  Costo_Con_Cobertura = c(
    total_pagado_cop * 0.9 - total_futuros,
    total_pagado_cop - total_futuros,
    total_pagado_cop * 1.2 - total_futuros
  )
)

escenarios_trm <- escenarios_trm %>%
  mutate(
    Ahorro = Costo_Sin_Cobertura - Costo_Con_Cobertura,
    Beneficio = Ahorro > 0
  )

cat("\nANÁLISIS POR ESCENARIOS DE TRM\n")
## 
## ANÁLISIS POR ESCENARIOS DE TRM
cat("==============================\n")
## ==============================
kable(escenarios_trm %>% mutate(
  TRM_Final = round(TRM_Final, 2),
  Costo_Sin_Cobertura = format(round(Costo_Sin_Cobertura, 0), big.mark = ".", decimal.mark = ","),
  Costo_Con_Cobertura = format(round(Costo_Con_Cobertura, 0), big.mark = ".", decimal.mark = ","),
  Ahorro = format(round(Ahorro, 0), big.mark = ".", decimal.mark = ",")
), caption = "Impacto de diferentes escenarios de TRM en la efectividad de la cobertura") %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Impacto de diferentes escenarios de TRM en la efectividad de la cobertura
Escenario TRM_Final Costo_Sin_Cobertura Costo_Con_Cobertura Ahorro Beneficio
Optimista (TRM -10%) 4238.65 762.959.192 2.028.122.317 -1.265.163.125 FALSE
Neutro (TRM actual) 4709.62 847.732.436 2.112.895.561 -1.265.163.125 FALSE
Pesimista (TRM +20%) 5651.54 1.017.278.923 2.282.442.048 -1.265.163.125 FALSE
# 6. CONCLUSIÓN Y RECOMENDACIÓN
# -----------------------------------------------------------------------------
cat("\nCONCLUSIÓN Y RECOMENDACIÓN FINAL\n")
## 
## CONCLUSIÓN Y RECOMENDACIÓN FINAL
cat("================================\n")
## ================================
if (total_futuros > 0) {
  #LA COBERTURA CON FUTUROS FUE BENEFICIOSA
  cat("La estrategia de cobertura con futuros de TRM logró reducir el costo total del crédito\n")
  cat("para la maquinaria amarilla. Los resultados indican que:\n\n")
  cat("1. Se generaron ganancias con las operaciones de futuros que compensaron\n")
  cat("   parcialmente el costo del crédito.\n")
  cat("2. La cobertura protegió contra el riesgo de devaluación del peso.\n")
  cat("3. El uso de futuros demostró ser una herramienta efectiva para gestionar\n")
  cat("   el riesgo cambiario en operaciones de financiamiento internacional.\n\n")
  cat("RECOMENDACIÓN: Mantener una estrategia similar de cobertura para operaciones\n")
  cat("futuras, ajustando los parámetros según las condiciones del mercado.\n")
} else {
  cat("LA COBERTURA CON FUTUROS NO FUE BENEFICIOSA\n\n")
  cat("La estrategia de cobertura con futuros de TRM no logró reducir el costo total\n")
  cat("del crédito para la maquinaria amarilla. Las posibles razones incluyen:\n\n")
  cat("1. Mal timing en las operaciones de futuros.\n")
  cat("2. Costos de transacción y márgenes que superaron los beneficios.\n")
  cat("3. Condiciones del mercado no favorables para la estrategia implementada.\n\n")
  cat("RECOMENDACIÓN: Revisar la estrategia de cobertura, considerar otros instrumentos\n")
  cat("financieros u optimizar los parámetros de operación.\n")
}
## LA COBERTURA CON FUTUROS NO FUE BENEFICIOSA
## 
## La estrategia de cobertura con futuros de TRM no logró reducir el costo total
## del crédito para la maquinaria amarilla. Las posibles razones incluyen:
## 
## 1. Mal timing en las operaciones de futuros.
## 2. Costos de transacción y márgenes que superaron los beneficios.
## 3. Condiciones del mercado no favorables para la estrategia implementada.
## 
## RECOMENDACIÓN: Revisar la estrategia de cobertura, considerar otros instrumentos
## financieros u optimizar los parámetros de operación.
cat("\nANÁLISIS DE SENSIBILIDAD\n")
## 
## ANÁLISIS DE SENSIBILIDAD
cat("=======================\n")
## =======================
cat("El análisis por escenarios muestra que la efectividad de la cobertura depende\n")
## El análisis por escenarios muestra que la efectividad de la cobertura depende
cat("críticamente de la evolución de la TRM. En escenarios de mayor devaluación,\n")
## críticamente de la evolución de la TRM. En escenarios de mayor devaluación,
cat("la cobertura resulta más beneficiosa, mientras que en escenarios de estabilidad\n")
## la cobertura resulta más beneficiosa, mientras que en escenarios de estabilidad
cat("o revaluación, los costos de la cobertura pueden superar los beneficios.\n")
## o revaluación, los costos de la cobertura pueden superar los beneficios.
# 7. GRÁFICO FINAL COMPARATIVO
# -----------------------------------------------------------------------------
p_comparativo

Referencias

-Banco de la República. (2023). Informe de estabilidad financiera. Banco de la República de Colombia. Recuperado de https://www.banrep.gov.co/

-Banco de la República. (2025). Informe de inflación y panorama fiscal - primer trimestre de 2025. Banco de la República de Colombia. Recuperado de https://www.banrep.gov.co/

-BBVA Research. (2025). Perspectivas económicas para Colombia: septiembre 2025. BBVA Research. Recuperado de https://www.bbvaresearch.com

-Bloomberg Línea. (2025, 15 de septiembre). Peso colombiano enfrenta presiones mixtas en camino a cerrar 2025. Bloomberg Línea. Recuperado de https://www.bloomberglinea.com

-Hull, J. C. (2018). Options, futures, and other derivatives (10th ed.). Pearson.

-Mishkin, F. S., & Eakins, S. G. (2018). Financial markets and institutions (9th ed.). Pearson.

-Romer, D. (2012). Advanced macroeconomics (4th ed.). McGraw-Hill.

-Ross, S. A., Westerfield, R. W., & Jaffe, J. F. (2018). Corporate finance (12th ed.). McGraw-Hill Education.