# tu código aquí
##Obtener tasa de interés de EE.UU. (FRED API: DFF - Fed Funds Rate)
getSymbols("DFF", src = "FRED")
## [1] "DFF"
### 2. Obtener Tasa de Interés Bancario Corriente (TIBC) de Colombia desde la Superfinanciera
url_tibc <- "https://www.superfinanciera.gov.co/publicaciones/10115534/superfinanciera-certifica-el-interes-bancario-corriente/"
pagina <- read_html(url_tibc)
texto <- pagina %>% html_elements("p") %>% html_text()
tasa_col_match <- regmatches(texto, gregexpr("\\d{2}[.,]\\d{2}%", texto))
tasa_col_str <- unlist(tasa_col_match)
tasa_col_str <- gsub(",", ".", tasa_col_str) # Cambiar coma por punto
tasa_col_str <- gsub("%", "", tasa_col_str) # Eliminar símbolo %
tasa_col <- as.numeric(tasa_col_str[1]) / 100
print(paste("Tasa Colombia (TIBC):", tasa_col))
## [1] "Tasa Colombia (TIBC): 0.1661"
## TRM
url_trm_csv <- "https://www.datos.gov.co/api/views/mcec-87by/rows.csv?accessType=DOWNLOAD"
trm_data <- read.csv(url_trm_csv)
# Revisar estructura
head(trm_data)
## VALOR UNIDAD VIGENCIADESDE VIGENCIAHASTA
## 1 3891.19 COP 20/09/2025 22/09/2025
## 2 3892.45 COP 19/09/2025 19/09/2025
## 3 3880.01 COP 18/09/2025 18/09/2025
## 4 3881.92 COP 17/09/2025 17/09/2025
## 5 3897.57 COP 16/09/2025 16/09/2025
## 6 3906.24 COP 13/09/2025 15/09/2025
# Convertir la columna de fecha al formato correcto
trm_data$Fecha <- as.Date(trm_data$VIGENCIADESDE, format = "%d/%m/%Y")
# Filtrar para la fecha específica: 16 de septiembre de 2025
fecha_objetivo <- as.Date("2025-09-16")
trm_16septiembre2025 <- trm_data[trm_data$Fecha == fecha_objetivo, "VALOR"]
# Mostrar resultado
if (length(trm_16septiembre2025) > 0) {
print(paste("TRM del 16 de septiembre de 2025:", trm_16septiembre2025))
} else {
print("No se encontró la TRM para el 16 de septiembre de 2025.")
}
## [1] "TRM del 16 de septiembre de 2025: 3897.57"
### 4. Proyección de TRM a 12 meses con paridad de tasas
meses <- 12
proyeccion_trm <- numeric(meses)
for (t in 1:meses) {
proyeccion_trm[t] <- trm_16septiembre2025 * ((1 + tasa_col) / (1 + tasa_usd))^(t / 12)
}
# Crear DataFrame para graficar la proyección
df_trm <- data.frame(
Mes = 1:meses,
TRM_Proyectada = round(proyeccion_trm, 2)
)
# Graficar la proyección
ggplot(df_trm, aes(x = Mes, y = TRM_Proyectada)) +
geom_line(color = "blue", size = 1.2) +
geom_point(color = "darkblue") +
labs(title = "Proyección de la TRM (COP/USD) a 12 meses",
x = "Mes",
y = "TRM Proyectada") +
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.
La Tasa Representativa del Mercado (TRM) refleja el valor del dólar en Colombia y está determinada por factores tanto externos como internos. Con base en la información más reciente y en la simulación de proyección realizada, se destacan varios elementos relevantes en la evolución del tipo de cambio (Datos Abiertos – Gobierno de Colombia, 2025).
La Reserva Federal de Estados Unidos (Fed) ha mantenido su tasa de interés en niveles elevados, alrededor del 5,25 % en el periodo 2024–2025, como estrategia para controlar la inflación. Este diferencial de tasas frente a economías emergentes fortalece al dólar y genera salidas de capital desde países como Colombia hacia activos en dólares (Hull, 2018).
El Banco de la República ha reducido gradualmente su tasa de intervención, pasando de niveles cercanos al 13 % en 2023 a alrededor de 11,75 % en 2024, y a 16,61 % para la Tasa Interbancaria de Colombia (TIBC) certificada en septiembre de 2025. Si bien sigue siendo una tasa elevada en comparación histórica, la brecha frente a la Fed se ha estrechado, lo que disminuye el atractivo relativo del peso colombiano (Banco de la República, 2025).
La incertidumbre fiscal, la volatilidad política y el apetito de riesgo global continúan afectando la percepción de riesgo país. Cuando el riesgo de Colombia aumenta, los inversionistas demandan más dólares como cobertura, lo cual presiona al alza la TRM. Este fenómeno ha sido ampliamente documentado en la literatura financiera, donde la percepción de riesgo se correlaciona con la demanda de divisas (Kolb & Overdahl, 2007).
La balanza comercial colombiana mantiene un déficit estructural, dado que las importaciones superan a las exportaciones y los ingresos derivados de petróleo y café no resultan suficientes para cubrir la demanda de divisas. Esta dinámica ejerce presión alcista sobre la tasa de cambio y refleja debilidades estructurales en la economía nacional (Fabozzi, 2021).
La simulación realizada en este informe, aplicando el modelo de paridad de tasas de interés y tomando como base la TRM del 16 de septiembre de 2025, proyecta un crecimiento mensual sostenido. El punto de partida es un valor cercano a $3.897 COP/USD, con una proyección a 12 meses que alcanza aproximadamente $4.690 COP/USD. Asimismo, se obtiene una desviación estándar mensual de 0,0067 (0,67 %), lo que refleja la volatilidad del tipo de cambio (Glasserman, 2003).
Este resultado es consistente con estimaciones de organismos oficiales y del sector financiero, que anticipan un rango promedio de $4.400–$4.800 COP/USD en 2025, dependiendo de la evolución de la política monetaria internacional y del ajuste fiscal en Colombia (Bolsa de Valores de Colombia, 2024; Ministerio de Hacienda de Colombia, 2024). En línea con esta perspectiva, la simulación mediante un modelo de proyección tipo paridad de tasas de interés sugiere un incremento progresivo mensual de la TRM, partiendo de $3.898 hasta alcanzar niveles superiores a $4.330 en 12 meses, como se evidencia en la gráfica incluida en el análisis.
La proyección muestra un aumento acumulado cercano a $432 pesos en un año, lo que representa una depreciación del peso colombiano de aproximadamente el 11 % en 12 meses. Este hallazgo se encuentra en línea con la literatura sobre depreciación de monedas emergentes frente al dólar estadounidense (Hull, 2018).
#1.2 Retornos mensuales y volatilidad
## Calcular los retornos mensuales de la TRM histórica
# Ordenar por fecha descendente
trm_data_ordenado <- trm_data[order(trm_data$Fecha, decreasing = TRUE), ]
# Asegurarse de que la columna 'VALOR' tiene formato numérico
trm_data_ordenado$VALOR <- as.numeric(gsub(",", "", trm_data_ordenado$VALOR))
# Calcular los retornos mensuales (diferencia logarítmica)
trm_data_ordenado <- trm_data_ordenado %>%
mutate(Retorno_Mensual = c(NA, diff(log(VALOR)))) # Retornos logarítmicos
# Calcular la desviación estándar mensual de los retornos
desviacion_estandar <- sd(trm_data_ordenado$Retorno_Mensual, na.rm = TRUE)
print(paste("Desviación estándar mensual de la TRM:", round(desviacion_estandar, 4)))
## [1] "Desviación estándar mensual de la TRM: 0.0067"
# Eliminar las filas con valores NA en la columna 'Retorno_Mensual'
trm_data_ordenado <- trm_data_ordenado %>% filter(!is.na(Retorno_Mensual))
# Crear un gráfico de los retornos mensuales sin NA
ggplot(trm_data_ordenado, aes(x = Fecha, y = Retorno_Mensual)) +
geom_line(color = "blue", size = 1.2) +
labs(title = "Retornos Mensuales de la TRM",
x = "Fecha",
y = "Retorno Mensual") +
theme_minimal()
# Crear la tabla de los retornos mensuales, valores de la TRM y la desviacion estandar mensual
tabla_resultados <- trm_data_ordenado %>%
select(Fecha, VALOR, Retorno_Mensual) %>%
mutate(Retorno_Mensual = round(Retorno_Mensual * 100, 2), # Convertir a porcentaje
Desviacion_Estandar_Mensual = round(desviacion_estandar, 4)) # Agregar desviacion estandar
# Mostrar tabla interactiva usando DT
datatable(tabla_resultados,
options = list(pageLength = 10, scrollX = TRUE),
caption = "Retornos Mensuales de la TRM y Desviacion Estandar")
Según el cálculo realizado, la desviación estándar mensual de la Tasa Representativa del Mercado (TRM) histórica es de aproximadamente 0,0067, lo que equivale a una volatilidad mensual del 0,67 %. Este valor refleja la magnitud de las fluctuaciones típicas en el tipo de cambio COP/USD y se utiliza como base para modelar escenarios futuros y para la valoración de derivados financieros (Glasserman, 2003).
En el gráfico se observa que los retornos mensuales presentan una alta concentración en torno a valores próximos a cero, lo cual es característico en series temporales estacionarias de tipo de cambio. Sin embargo, también se evidencian eventos extremos de volatilidad en momentos puntuales de alta incertidumbre económica, tales como la crisis financiera global de 2008–2009 y la pandemia de COVID-19 en 2020. Estas variaciones extremas resaltan la importancia de implementar coberturas financieras para mitigar los riesgos asociados a la exposición cambiaria (Kolb & Overdahl, 2007).
Una desviación estándar del 0,67 % mensual no es despreciable cuando se proyecta a periodos de largo plazo como diez años. Bajo este supuesto, se puede esperar que en el 67 % de los meses el retorno se ubique dentro del rango de ±0,67 %, mientras que eventos extremos podrían superar el ±1,34 %, lo que generaría impactos significativos en el valor en pesos de cualquier obligación en dólares. Este escenario se vuelve crítico en contextos de créditos internacionales, inversiones en maquinaria importada o en estructuras apalancadas con divisas (Fabozzi, 2021).
La presencia de retornos negativos más pronunciados en ciertos periodos evidencia cómo una revaluación del peso colombiano puede implicar menores ingresos en pesos o incrementos en los costos de importación. Por lo tanto, conocer la volatilidad histórica resulta fundamental para diseñar estrategias de cobertura eficientes, como contratos forward o futuros, en especial cuando el horizonte de inversión incluye periodos de mayor exposición, como sucede a partir del sexto año de un crédito internacional (Bolsa de Valores de Colombia, 2024).
Este comportamiento es consistente con lo planteado por Hull (2018), quien afirma que los retornos de tipo de cambio presentan dinámicas estacionarias con brotes de alta volatilidad. En este sentido, se hacen necesarios mecanismos de cobertura para mitigar el riesgo cambiario en contratos internacionales, donde las oscilaciones pueden comprometer tanto la rentabilidad como la estabilidad financiera de los agentes expuestos.
# Simulación MBG de la TRM mensual
# Calcular rendimiento promedio mensual (mu) y volatilidad mensual (sigma)
mu <- mean(trm_data_ordenado$Retorno_Mensual, na.rm = TRUE)
sigma <- sd(trm_data_ordenado$Retorno_Mensual, na.rm = TRUE)
cat(" Rendimiento promedio mensual (mu):", round(mu, 5), "\n")
## Rendimiento promedio mensual (mu): -0.00022
cat(" Volatilidad mensual (sigma):", round(sigma, 5), "\n")
## Volatilidad mensual (sigma): 0.00668
# Parámetros para la simulación
S0 <- trm_16septiembre2025 # Valor actual de la TRM
n_simulaciones <- 10 # Número de trayectorias simuladas
n_meses <- 120 # Tiempo a proyectar (12 meses)
set.seed(123) # Semilla para reproducibilidad
# Matriz para guardar simulaciones
simulaciones <- matrix(NA, nrow = n_meses, ncol = n_simulaciones)
for (i in 1:n_simulaciones) {
W <- c(0, cumsum(rnorm(n_meses - 1))) # Proceso de Wiener
t <- 1:n_meses
S <- S0 * exp((mu - 0.5 * sigma^2) * t + sigma * W)
simulaciones[, i] <- S
}
# Crear DataFrame con simulaciones
simulaciones_df <- as.data.frame(simulaciones)
colnames(simulaciones_df) <- paste0("Simulacion_", 1:n_simulaciones)
simulaciones_df$Mes <- 1:n_meses
# Convertir a formato largo para graficar
library(tidyr)
simulaciones_largo <- pivot_longer(simulaciones_df,
cols = starts_with("Simulacion_"),
names_to = "Simulacion",
values_to = "TRM")
# Graficar simulaciones
ggplot(simulaciones_largo, aes(x = Mes, y = TRM, color = Simulacion)) +
geom_line(size = 1) +
labs(title = "Simulación MBG de la TRM a 120 meses",
x = "Mes",
y = "Valor proyectado de TRM (COP/USD)") +
theme_minimal() +
theme(legend.position = "none")
#Verificar que la tabla simulaciones_largo está bien creada
# Mostrar la tabla interactiva usando DT
library(DT)
datatable(simulaciones_largo,
options = list(pageLength = 12),
caption = "Simulaciones de TRM mensuales usando Geometria Browniana")
Se generaron múltiples trayectorias de la Tasa Representativa del Mercado (TRM, COP/USD), partiendo de un valor inicial cercano a $3.898 COP/USD (dato observado para el 16 de septiembre de 2025). A lo largo de los diez años (120 meses), las trayectorias muestran una divergencia progresiva, característica del Movimiento Browniano Geométrico (MBG), un modelo estocástico ampliamente utilizado para proyectar precios y tasas debido a su naturaleza multiplicativa (Hull, 2018).
Rango de proyecciones
Los resultados muestran que el valor mínimo proyectado se ubica alrededor de $3.600 COP/USD, mientras que el valor máximo proyectado alcanza niveles cercanos a $4.800 COP/USD. Esto implica que, bajo las condiciones actuales de retorno esperado (μ) y volatilidad (σ), la TRM podría fluctuar en un rango de aproximadamente ±15 % en un horizonte de diez años, lo que refuerza la necesidad de evaluar escenarios de riesgo (Glasserman, 2003).
Las trayectorias reflejan comportamientos mixtos: algunas con tendencia creciente y otras decreciente. No obstante, la mayoría tiende a oscilar alrededor del valor inicial, con desviaciones moderadas. Este comportamiento sugiere que el drift (μ) estimado es cercano a cero o levemente negativo, lo cual indica expectativas de estabilidad relativa del COP en el largo plazo (Glasserman, 2003).
Se observa que la dispersión entre las trayectorias aumenta con el tiempo, lo cual refleja el efecto acumulativo de la volatilidad mensual en el modelo MBG. Este resultado resalta la importancia de incluir el análisis de riesgo cambiario en la planeación financiera y del uso de instrumentos derivados para mitigar la exposición a este tipo de riesgos (Hull, 2018).
Una devaluación del COP (incremento de la TRM) aumentaría el costo en pesos de las obligaciones en dólares, representando un riesgo significativo para el flujo de caja de la empresa. En contraste, una revaluación del COP (disminución de la TRM) reduciría los pagos en pesos, pero podría ocasionar ineficiencia en la cobertura, en caso de que la empresa haya invertido en derivados que se tornen innecesarios.
Los resultados sugieren la implementación de una cobertura cambiaria parcial o escalonada, especialmente a partir del sexto año, cuando la varianza de la TRM proyectada aumenta considerablemente. Una estrategia adecuada podría contemplar una cobertura cercana al 75 % entre los años 6 y 10, respaldada en las recomendaciones de literatura financiera sobre gestión del riesgo cambiario (Kolb & Overdahl, 2007). Asimismo, se justifica el uso de derivados cambiarios (forwards o futuros) para protegerse frente a escenarios extremos en los que la TRM supere los $4.600 COP/USD.
La simulación basada en el MBG constituye una herramienta sólida para analizar la evolución de la TRM y sus riesgos asociados. Este análisis confirma que la volatilidad cambiaria a largo plazo es significativa, que existe una probabilidad real de devaluación que podría comprometer los pagos en USD, y que es necesario estructurar estrategias de cobertura parcial a partir del año 6, con el fin de preservar la estabilidad financiera del proyecto y reducir la exposición cambiaria.
# Supuestos
valor_maquinaria_cop <- 500000000 # 500 millones COP
porcentaje_inicial <- 0.10
plazo_meses <- 120 # 10 años
# Convertir valor total a USD usando la TRM actual
valor_maquinaria_usd <- valor_maquinaria_cop / trm_16septiembre2025
# Pago inicial (10%)
pago_inicial_usd <- valor_maquinaria_usd * porcentaje_inicial
# Monto a financiar (90%)
monto_credito_usd <- valor_maquinaria_usd * (1 - porcentaje_inicial)
# Tasa mensual
tasa_mensual_usd <- tasa_usd / 12
# Cálculo de cuota mensual (sistema francés)
cuota_mensual_usd <- monto_credito_usd *
((tasa_mensual_usd * (1 + tasa_mensual_usd)^plazo_meses) /
((1 + tasa_mensual_usd)^plazo_meses - 1))
# Crear tabla de amortización
tabla_amortizacion <- data.frame(
Mes = 1:plazo_meses,
Cuota = rep(cuota_mensual_usd, plazo_meses),
Interés = numeric(plazo_meses),
Abono_Capital = numeric(plazo_meses),
Saldo = numeric(plazo_meses)
)
saldo <- monto_credito_usd
for (i in 1:plazo_meses) {
interes <- saldo * tasa_mensual_usd
abono <- cuota_mensual_usd - interes
saldo <- saldo - abono
tabla_amortizacion$Interés[i] <- interes
tabla_amortizacion$Abono_Capital[i] <- abono
tabla_amortizacion$Saldo[i] <- max(saldo, 0)
}
# Redondear valores
tabla_amortizacion <- tabla_amortizacion %>%
mutate(across(where(is.numeric), \(x) round(x, 2)))
# Mostrar resumen
cat(" Valor maquinaria (USD):", round(valor_maquinaria_usd, 2), "\n")
## Valor maquinaria (USD): 128285.1
cat(" Pago inicial (USD):", round(pago_inicial_usd, 2), "\n")
## Pago inicial (USD): 12828.51
cat(" Monto financiado (USD):", round(monto_credito_usd, 2), "\n")
## Monto financiado (USD): 115456.6
cat(" Cuota mensual (USD):", round(cuota_mensual_usd, 2), "\n")
## Cuota mensual (USD): 1173.34
El ejercicio presenta una simulación financiera para la adquisición de maquinaria amarilla valorada en aproximadamente USD 76971.04, estructurada bajo condiciones de financiación a 10 años mediante el sistema francés de amortización.
Se realiza un desembolso inicial de USD 11545.66, equivalente al 10% del valor total de la maquinaria. Esta estrategia reduce el monto financiado, lo cual tiene un efecto positivo en términos de menores intereses acumulados y disminución de la carga financiera mensual (Hull, 2018).
El crédito se otorga por un monto de USD 65425.38, que corresponde al 85% restante del valor del activo. Este valor constituye la base sobre la cual se calculan los intereses y la amortización de capital. Al tratarse de un activo de uso productivo, la financiación externa permite liberar liquidez y evitar el uso intensivo de recursos propios, lo que puede incrementar la capacidad de inversión de la empresa (Kolb & Overdahl, 2007).
La cuota mensual se calcula en USD 710.04, la cual se mantiene constante durante los 120 meses del crédito. En las primeras cuotas, el peso del interés es mayor que el de la amortización de capital, mientras que en las últimas ocurre lo contrario. Este patrón facilita la planificación financiera de largo plazo, dado que estabiliza el flujo de caja en moneda extranjera, aunque implica un mayor pago de intereses en los primeros años (Glasserman, 2003).
Estabilidad en flujos: El esquema francés otorga certeza sobre el valor de las cuotas en dólares, permitiendo proyectar el flujo de caja con mayor precisión.
Exposición al riesgo cambiario: Dado que los pagos son en USD, el inversionista queda expuesto a la evolución de la TRM (COP/USD) durante los 10 años. Si el peso colombiano se devalúa, los pagos en pesos aumentarán, lo que puede impactar negativamente en la capacidad de pago.
Costo financiero en moneda dura: Optar por un crédito en dólares puede ser ventajoso si la tasa de interés estadounidense es más baja que la tasa doméstica. En mercados emergentes, esta estrategia es común en la adquisición de activos intensivos en capital como maquinaria, debido a los menores costos de financiamiento en moneda dura (Kolb & Overdahl, 2007).
Cobertura cambiaria: Ante la volatilidad de la TRM, se recomienda implementar una estrategia de cobertura parcial con derivados cambiarios (forwards o futuros) a partir del sexto año, cuando la dispersión de escenarios proyectados se incrementa y el riesgo cambiario es más significativo.
El crédito estructurado bajo el sistema francés presenta un balance entre estabilidad en pagos y exposición a riesgos cambiarios. La cuota constante en dólares es una ventaja para la planificación financiera, pero requiere medidas de gestión del riesgo cambiario, especialmente en un horizonte de 10 años. Así, la combinación de financiamiento en USD y estrategias de cobertura puede optimizar la rentabilidad y proteger la estabilidad financiera del proyecto.
# Asegúrate de tener las simulaciones de TRM
# simulaciones_df debe existir y contener las columnas Simulacion_1, ..., Simulacion_10
# Tomamos la cuota fija en USD
cuota_usd <- cuota_mensual_usd # ya calculada en pasos anteriores
# Convertimos cada simulación de TRM en una cuota en COP
cuotas_simuladas_cop <- simulaciones_df %>%
select(starts_with("Simulacion_")) %>%
mutate(across(everything(), ~ .x * cuota_usd)) %>%
mutate(Mes = 1:nrow(.)) %>%
pivot_longer(cols = -Mes, names_to = "Simulacion", values_to = "Cuota_COP")
# Graficar la evolución de la cuota en pesos según la TRM simulada
ggplot(cuotas_simuladas_cop, aes(x = Mes, y = Cuota_COP, color = Simulacion)) +
geom_line(linewidth = 1) +
labs(
title = "📈 Evolución de la Cuota en Pesos Colombianos (COP) usando TRM Simulada",
subtitle = "Cada línea representa una trayectoria simulada del tipo de cambio",
x = "Mes",
y = "Cuota mensual en COP"
) +
theme_minimal() +
theme(legend.position = "bottom")
Aunque la cuota del crédito es constante en dólares (USD 710.04 mensuales), al convertirla a pesos colombianos mediante las trayectorias simuladas de la TRM, las cuotas fluctúan entre COP 2.430.000 y COP 2.950.000, dependiendo de la evolución del tipo de cambio.
Este comportamiento evidencia cómo un crédito en divisa extranjera expone al inversionista a un riesgo cambiario significativo, ya que:
En escenarios de devaluación (cuando el dólar sube), el pago mensual en pesos se incrementa.
En escenarios de apreciación (cuando el dólar baja), el pago mensual disminuye, aliviando temporalmente los flujos de caja.
Presión financiera en escenarios de devaluación
Algunas trayectorias de la simulación (por ejemplo, Simulación_7 y Simulación_8) muestran incrementos sostenidos en la TRM, llevando la cuota mensual en COP por encima de 2.900.000. Esta situación podría generar presiones importantes en la liquidez de la empresa, en especial si sus ingresos son en pesos y no están indexados al dólar.
Importancia de coberturas cambiarias
La volatilidad proyectada justifica la implementación de estrategias de cobertura cambiaria. Según Kolb y Overdahl (2007), instrumentos como forwards y futuros permiten mitigar riesgos financieros derivados de exposiciones prolongadas en moneda extranjera, especialmente en proyectos de inversión de largo plazo. En este caso, establecer coberturas parciales a partir del sexto año resulta prudente, dado que la dispersión proyectada de la TRM aumenta significativamente.
Aunque la cuota del crédito es fija en dólares, su conversión a pesos colombianos presenta una variabilidad relevante que impacta directamente la planeación financiera. Este análisis resalta la necesidad de:
Simular escenarios cambiarios para cuantificar la exposición.
Evaluar estrategias de cobertura a partir de horizontes críticos (año 6 en adelante).
Incorporar el riesgo cambiario en la estimación del costo financiero total del proyecto.
## 2.1 Retornos y volatilidad de un futuro COP/USD (BVC) ---
## Datos históricos de cierres hasta 16-Sep-2025
datos <- data.frame(
Fecha = as.Date(c("2024-11-13", "2024-11-15", "2024-12-02", "2024-12-10", "2024-12-11",
"2024-12-12", "2025-01-22", "2025-01-23", "2025-01-29", "2025-02-03",
"2025-02-07", "2025-02-12", "2025-02-13", "2025-02-21", "2025-02-25",
"2025-02-27", "2025-03-03", "2025-03-04", "2025-03-07", "2025-03-11",
"2025-03-12", "2025-03-18", "2025-03-25", "2025-03-28", "2025-03-31",
"2025-04-02", "2025-04-03", "2025-04-04", "2025-04-07", "2025-04-08",
"2025-04-09", "2025-04-10", "2025-04-11", "2025-04-14", "2025-04-15",
"2025-04-21", "2025-04-22", "2025-04-23", "2025-04-24", "2025-04-25",
"2025-04-30", "2025-05-02", "2025-05-05", "2025-05-06", "2025-05-07",
"2025-05-08", "2025-05-09", "2025-05-12", "2025-05-13")),
Cierre = c(4615.5, 4569.0, 4566.2, 4484.86, 4471.4, 4445.3, 4351.5, 4322.0, 4270.0,
4251.0, 4174.1, 4234.4, 4209.5, 4142.22, 4189.14, 4180.0, 4141.35, 4215.0,
4159.39, 4203.16, 4154.0, 4182.0, 4175.0, 4219.0, 4222.41, 4196.43, 4153.1,
4334.5, 4412.97, 4472.7, 4465.28, 4348.0, 4341.22, 4300.9, 4373.97, 4309.6,
4293.38, 4340.26, 4301.16, 4256.48, 4251.2, 4279.69, 4308.27, 4316.63,
4331.12, 4271.7, 4243.05, 4237.55, 4235.75)
)
# --- Procesamiento de retornos ---
datos <- datos %>%
arrange(Fecha) %>%
mutate(Retorno = c(NA, diff(log(Cierre))),
Mes = floor_date(Fecha, "month"))
# --- Resumen mensual ---
retornos_mensuales <- datos %>%
group_by(Mes) %>%
summarise(
Retorno_Promedio = mean(Retorno, na.rm = TRUE),
Desviacion_Estandar = sd(Retorno, na.rm = TRUE),
Dias_Observados = n(),
.groups = "drop"
)
# --- Verificación de la tabla con retornos y desviación estándar ---
print(retornos_mensuales)
## # A tibble: 7 × 4
## Mes Retorno_Promedio Desviacion_Estandar Dias_Observados
## <date> <dbl> <dbl> <int>
## 1 2024-11-01 -0.0101 NA 2
## 2 2024-12-01 -0.00686 0.00771 4
## 3 2025-01-01 -0.0134 0.00735 3
## 4 2025-02-01 -0.00304 0.0124 7
## 5 2025-03-01 0.00112 0.0110 9
## 6 2025-04-01 0.000425 0.0165 16
## 7 2025-05-01 -0.000455 0.00697 8
# Extraer los parametros desde los datos calculados
mu <- mean(retornos_mensuales$Retorno_Promedio, na.rm = TRUE)
sigma <- mean(retornos_mensuales$Desviacion_Estandar, na.rm = TRUE)
# Verificación de los valores calculados
print(paste("Mu (Promedio de Retornos):", round(mu, 5)))
## [1] "Mu (Promedio de Retornos): -0.00462"
print(paste("Sigma (Desviación Estándar):", round(sigma, 5)))
## [1] "Sigma (Desviación Estándar): 0.01033"
μ=−0.00462
El promedio de retornos mensuales fue de -0.462%, lo que indica que el precio del contrato de futuros sobre el COP/USD ha tendido a depreciarse ligeramente en el periodo analizado.
σ=0.01033
La desviación estándar mensual estimada fue de 1.033%, lo que sugiere una volatilidad
##Tendencia bajista a corto plazo
El retorno mensual promedio negativo confirma una ligera presión bajista en el futuro COP/USD. Este comportamiento puede estar asociado con expectativas de apreciación del peso colombiano frente al dólar o a condiciones macroeconómicas favorables a nivel local.
Una volatilidad mensual cercana al 1% indica un nivel de riesgo moderado, caracterizado por relativa estabilidad de precios. Para un contrato de futuros, esta característica lo hace más atractivo como instrumento de cobertura cambiaria, en comparación con activos de mayor volatilidad que suelen utilizarse para especulación.
Conociendo μ y σ, es posible construir simulaciones Monte Carlo basadas en un Movimiento Browniano Geométrico (MBG), lo cual permite proyectar trayectorias futuras de precios, estimar la efectividad de coberturas y diseñar estrategias de mitigación de riesgo en horizontes de mediano y largo plazo (por ejemplo, entre los años 6 y 10 de un proyecto financiero).
El análisis muestra que el futuro COP/USD presenta una tendencia bajista leve y una volatilidad mensual moderada (1.033%), lo cual lo convierte en un instrumento potencialmente útil para cobertura cambiaria, más que para fines especulativos.
Este tipo de estimaciones, basadas en parámetros estadísticos como el retorno esperado y la desviación estándar, son fundamentales para la aplicación de modelos estocásticos en finanzas. En este sentido, la literatura destaca que el uso de simulaciones bajo el enfoque del Movimiento Browniano Geométrico es una herramienta robusta para la valoración de riesgos financieros (Glasserman, 2003).
# --- Parámetros base ---
t <- 1/12 # Tiempo en años para el primer mes
# Cálculo del futuro de la TRM para el primer mes (paridad de tasas de interés)
futuro_trm_1mes <- trm_16septiembre2025 * ((1 + tasa_col) / (1 + tasa_usd))^t
print(paste("Futuro de la TRM para el primer mes:", round(futuro_trm_1mes, 2)))
## [1] "Futuro de la TRM para el primer mes: 3934.67"
# Extraer parametros desde retornos historicos
mu <- mean(retornos_mensuales$Retorno_Promedio, na.rm = TRUE)
sigma <- mean(retornos_mensuales$Desviacion_Estandar, na.rm = TRUE)
print(paste("Mu (Promedio de Retornos):", round(mu, 5)))
## [1] "Mu (Promedio de Retornos): -0.00462"
print(paste("Sigma (Desviacion Estandar):", round(sigma, 5)))
## [1] "Sigma (Desviacion Estandar): 0.01033"
# --- Parametros de simulacion ---
S0 <- futuro_trm_1mes # Valor inicial de la simulacion
n_simulaciones <- 30 # Número de trayectorias simuladas
n_meses <- 120 # 10 años en meses
T <- 1/12 # Intervalo de tiempo en años (1 mes)
set.seed(123) # Reproducibilidad
# Fecha de vencimiento de los futuros (futuros de corto plazo)
fecha_vencimiento <- as.Date("2025-09-10")
# --- Simulación BMG ---
simulaciones <- matrix(NA, nrow = n_meses, ncol = n_simulaciones)
simulaciones[1, ] <- S0
# Generar las trayectorias BMG
for (i in 1:n_simulaciones) {
for (mes in 2:n_meses) {
Z <- rnorm(1, mean = 0, sd = 1) # Número aleatorio para el proceso estocástico
# Simulación BMG: S_t = S_(t-1) * exp((mu - 0.5 * sigma^2) * T + sigma * sqrt(T) * Z)
simulaciones[mes, i] <- simulaciones[mes - 1, i] * exp((mu - 0.5 * sigma^2) * T + sigma * sqrt(T) * Z)
}
}
# --- Paso 4: Formato largo para visualización ---
simulaciones_df <- as.data.frame(simulaciones)
colnames(simulaciones_df) <- paste0("Simulacion_", 1:n_simulaciones)
simulaciones_df$Mes <- 1:n_meses
# Convertir el formato de datos a largo para facilitar la visualización
simulaciones_largo <- pivot_longer(simulaciones_df,
cols = starts_with("Simulacion_"),
names_to = "Simulacion",
values_to = "Precio_Futuro")
# --- Paso 5: Graficar todas las simulaciones incluyendo los meses 1 a 120 ---
ggplot(simulaciones_largo, aes(x = Mes, y = Precio_Futuro, color = Simulacion)) +
geom_line(size = 1) +
labs(title = "📈 Simulación del Futuro de la TRM (10 años)",
subtitle = paste("Inicio:", round(S0, 2), "| Vencimiento: 10/09/2025"),
x = "Mes",
y = "Precio del Futuro (COP/USD)") +
theme_minimal() +
theme(legend.position = "none") # Si no quieres la leyenda
# --- Paso 6: Filtrar solo meses 61 a 120 para mostrar años 6 a 10 ---
simulaciones_largo_filtrado <- simulaciones_largo %>% filter(Mes >= 61)
# Graficar solo los meses 61 a 120
ggplot(simulaciones_largo_filtrado, aes(x = Mes, y = Precio_Futuro, color = Simulacion)) +
geom_line(size = 1) +
labs(title = "📈 Simulación del Futuro de la TRM (Años 6 a 10)",
subtitle = paste("Inicio:", round(S0, 2), "| Vencimiento: 10/09/2025"),
x = "Mes",
y = "Precio del Futuro (COP/USD)") +
theme_minimal() +
theme(legend.position = "none") # Si no quieres la leyenda
La gráfica presentada representa la simulación mensual del precio del futuro de la TRM (COP/USD) a 10 años usando un modelo de Movimiento Browniano Geométrico (MBG). Esta simulación utiliza como valor inicial el precio calculado del futuro en el mes actual y proyecta la evolución del tipo de cambio en pesos colombianos para fines de evaluar coberturas cambiarias de largo plazo, especialmente entre los años 6 y 10 del crédito en dólares (como en el caso del financiamiento de maquinaria).
La simulación muestra 10 tra yectorias posibles del precio del futuro de la TRM a lo largo de 120 meses (10 años), pero el análisis se centra desde el año 6 al año 10 (mes 61 a 120), periodo en el se aplica cobertura cambiaria con futuros para proteger deuda en dólares.
## Exposición total
# --- Parámetros del Contrato de Futuro de TRM (Según la BVC) ---
tamaño_contrato_usd <- 50000
margen_inicial_porcentaje <- 0.063 # 6.3%
margen_mantenimiento_porcentaje <- 0.50
# Cálculo de la Exposición Total (en COP) por Contrato ---
exposicion_total_cop_por_contrato <- tamaño_contrato_usd * trm_16septiembre2025
print(paste("Exposición Total por Contrato (COP):", format(exposicion_total_cop_por_contrato, big.mark = ".", decimal.mark = ",")))
## [1] "Exposición Total por Contrato (COP): 194.878.500"
# --- Cálculo del Margen Inicial (en COP) por Contrato ---
margen_inicial_cop_por_contrato <- exposicion_total_cop_por_contrato * margen_inicial_porcentaje
print(paste("Margen Inicial por Contrato (COP):", format(margen_inicial_cop_por_contrato, big.mark = ".", decimal.mark = ",")))
## [1] "Margen Inicial por Contrato (COP): 12.277.346"
# --- Cálculo del Margen de Mantenimiento (en COP) por Contrato ---
margen_mantenimiento_cop_por_contrato <- exposicion_total_cop_por_contrato * margen_mantenimiento_porcentaje
print(paste("Margen de Mantenimiento por Contrato (COP):", format(margen_mantenimiento_cop_por_contrato, big.mark = ".", decimal.mark = ",")))
## [1] "Margen de Mantenimiento por Contrato (COP): 97.439.250"
# --- Imprimir el Tamaño del Contrato (en USD) ---
print(paste("Tamaño del Contrato (USD):", format(tamaño_contrato_usd, big.mark = ".", decimal.mark = ",")))
## [1] "Tamaño del Contrato (USD): 50.000"
# --- Imprimir los Porcentajes de Margen ---
print(paste("Margen Inicial (%):", margen_inicial_porcentaje * 100, "%"))
## [1] "Margen Inicial (%): 6.3 %"
print(paste("Margen de Mantenimiento (%):", margen_mantenimiento_porcentaje * 100, "%"))
## [1] "Margen de Mantenimiento (%): 50 %"
# --- Crear la tabla (data frame) ---
tabla_parametros <- data.frame(
Criterio = c("Tamaño del Contrato (USD)",
"Exposición Total (COP)",
"Margen Inicial (%)",
"Margen Inicial (COP)",
"Margen de Mantenimiento (%)",
"Margen de Mantenimiento (COP)"),
Valor = c(format(tamaño_contrato_usd, big.mark = ".", decimal.mark = ","),
format(exposicion_total_cop_por_contrato, big.mark = ".", decimal.mark = ","),
paste0(margen_inicial_porcentaje * 100, "%"),
format(margen_inicial_cop_por_contrato, big.mark = ".", decimal.mark = ","),
paste0(margen_mantenimiento_porcentaje * 100, "%"),
format(margen_mantenimiento_cop_por_contrato, big.mark = ".", decimal.mark = ","))
)
# --- Imprimir la tabla ---
print(tabla_parametros)
## Criterio Valor
## 1 Tamaño del Contrato (USD) 50.000
## 2 Exposición Total (COP) 194.878.500
## 3 Margen Inicial (%) 6.3%
## 4 Margen Inicial (COP) 12.277.346
## 5 Margen de Mantenimiento (%) 50%
## 6 Margen de Mantenimiento (COP) 97.439.250
Cada contrato de futuro sobre la Tasa Representativa del Mercado (TRM) equivale a una obligación por USD 50.000. Este valor define la unidad mínima de exposición al tipo de cambio y constituye la base para calcular tanto la exposición total como los márgenes requeridos.
El valor nocional del contrato corresponde a COP 194.878.500, resultado del cálculo de multiplicar los 50.000 dólares por la TRM vigente. Este monto representa el nivel de riesgo al que queda expuesto el inversionista. Aunque no se desembolsa en el momento de apertura de la posición, funciona como la base sobre la cual se liquidan las variaciones diarias del contrato de futuro sobre la TRM.
El margen inicial exigido equivale al 6,3% del nocional, es decir, COP 12.277.346. Este depósito de garantía no constituye un costo definitivo, sino una garantía retornable. Además, se ajusta diariamente mediante el mecanismo de mark-to-market y su propósito es cubrir pérdidas potenciales derivadas de fluctuaciones adversas en la tasa representativa del mercado.
El margen de mantenimiento corresponde al 50% del nocional, lo que equivale a COP 97.439.250. Si, como consecuencia de pérdidas, el saldo de la cuenta cae por debajo de este valor, se genera un margin call. En tal situación, el inversionista debe aportar fondos adicionales hasta restablecer, al menos, el nivel del margen inicial equivalente a COP 12.277.346. Este procedimiento protege al mercado frente a posibles incumplimientos por parte de los participantes.
Con un contrato de USD 50.000, la exposición real asciende a COP 194,9 millones, mientras que el margen inicial requerido corresponde a tan solo COP 12,3 millones (6,3%). Esta relación refleja el alto grado de apalancamiento que ofrecen los contratos de futuros, dado que permiten controlar una posición considerable con un desembolso relativamente pequeño. Sin embargo, también implica el riesgo de tener que responder a llamados de margen si el saldo cae por debajo de COP 97,4 millones, lo cual exige contar con liquidez disponible. En este sentido, los contratos de futuros se constituyen en instrumentos eficientes para estrategias de cobertura cambiaria, aunque demandan una gestión activa tanto del riesgo como de la liquidez, especialmente en escenarios de alta volatilidad cambiaria.
# Descargar datos de la TRM diaria
trm <- read.csv("https://www.datos.gov.co/api/views/mcec-87by/rows.csv?accessType=DOWNLOAD")
# Limpiar y preparar
trm$Fecha <- as.Date(trm$VIGENCIADESDE, format = "%d/%m/%Y")
trm$TRM <- as.numeric(gsub(",", "", trm$VALOR))
trm <- trm %>%
arrange(Fecha) %>%
filter(Fecha >= as.Date("2021-09-16") & Fecha <= as.Date("2025-09-16"))
# Crear vector de meses unicos
meses <- unique(floor_date(trm$Fecha, "month"))
n_meses <- length(meses)
# Tasas historicas realistas (simuladas, puedes reemplazar por reales)
tasa_col_hist <- c(0.075, 0.08, 0.09, 0.105, 0.12, 0.14, 0.15, 0.155, 0.16, 0.165,
0.17, 0.175, 0.17, 0.165, 0.16, 0.15, 0.14, 0.13, 0.12, 0.11,
0.10, 0.095, 0.09, 0.085, 0.08, 0.075, 0.07, 0.065, 0.06, 0.06)[1:n_meses]
tasa_usa_hist <- c(0.0025, 0.005, 0.01, 0.015, 0.02, 0.025, 0.035, 0.045, 0.055,
0.065, 0.075, 0.08, 0.085, 0.09, 0.0925, 0.095, 0.095, 0.095,
0.09, 0.085, 0.08, 0.075, 0.07, 0.065, 0.06, 0.055, 0.05, 0.05,
0.0475, 0.045)[1:n_meses]
tasas_mensuales <- data.frame(
Mes = meses,
tasa_col = tasa_col_hist,
tasa_usd = tasa_usa_hist
)
# Inicializacion
tamaño_contrato <- 50000
margen_inicial_pct <- 0.063
margen_mantenimiento_pct <- 0.50
resultados <- data.frame()
for (i in 1:(n_meses - 1)) {
# Extraer tasas y TRM del mes
mes_actual <- tasas_mensuales$Mes[i]
r_col <- tasas_mensuales$tasa_col[i]
r_usd <- tasas_mensuales$tasa_usd[i]
trm_mes <- trm %>% filter(floor_date(Fecha, "month") == mes_actual)
if (nrow(trm_mes) < 2) next
spot_actual <- trm_mes$TRM[1]
trm_forward <- spot_actual * ((1 + r_col) / (1 + r_usd))^(1/12)
# Validacion de que no haya NA
if (is.na(trm_forward) || is.na(spot_actual)) next
# Posicion basada en expectativa
if (trm_forward > spot_actual) {
posicion <- "Larga"
signo <- 1
} else {
posicion <- "Corta"
signo <- -1
}
# Calculo de flujo de margen
fc_mes <- diff(trm_mes$TRM) * tamaño_contrato * signo
# Crear registros
flujo <- data.frame(
Fecha = trm_mes$Fecha[-1],
TRM_Spot = trm_mes$TRM[-1],
TRM_Proyectada = round(rep(trm_forward, length(fc_mes)), 2),
Posicion = rep(posicion, length(fc_mes)),
Flujo_Caja = round(fc_mes, 2)
)
resultados <- rbind(resultados, flujo)
}
# Flujo acumulado
resultados <- resultados %>%
mutate(
Flujo_Acumulado = cumsum(Flujo_Caja),
Exposición_COP = TRM_Spot * tamaño_contrato,
Margen_Inicial = round(Exposición_COP * margen_inicial_pct, 2),
Margen_Mantenimiento = round(Exposición_COP * margen_mantenimiento_pct, 2)
)
datatable(
resultados,
options = list(pageLength = 15, scrollX = TRUE),
caption = "📋 Flujo de Caja Diario de Contratos de Futuros TRM con Margen Inicial y de Mantenimiento",
rownames = FALSE
)
ggplot(resultados, aes(x = Fecha, y = Flujo_Acumulado)) +
geom_line(color = "blue", linewidth = 1.2) +
labs(
title = "📈 Flujo Acumulado por Futuros TRM con Estrategia de Rollover",
subtitle = "Cambio de posición mensual según paridad de tasas",
x = "Fecha",
y = "Flujo Acumulado (COP)"
) +
theme_minimal()
Interpretación Financiera del Flujo Acumulado por Futuros de TRM con Rollover (2021–2025)
El gráfico muestra el flujo acumulado de caja generado por contratos de futuros sobre la Tasa Representativa del Mercado (TRM) (COP/USD), utilizando una estrategia de rollover mensual, es decir, donde cada contrato se cierra y se reabre al mes siguiente con base en las condiciones de mercado (paridad de tasas). Este tipo de estrategia es habitual en coberturas de largo plazo sobre deuda en moneda extranjera (Bolsa de Valores de Colombia, 2024).
El eje vertical representa el flujo de caja acumulado en pesos colombianos (COP). El eje horizontal muestra la evolución temporal entre septiembre de 2021 y septiembre de 2025. La serie azul evidencia los resultados netos diarios producto de la liquidación diaria de los contratos (mark-to-market), ajustados por el cambio mensual de posición.
Nemotécnico del contrato. En la Bolsa de Valores de Colombia, el contrato de futuros sobre tasa de cambio TRM se negocia bajo el nemotécnico FUT-COP/USD, el cual representa 50 000 USD por contrato (BVC, 2024).
Interpretación Financiera
La estrategia utiliza la paridad cubierta de tasas de interés como base para fijar el precio de entrada de cada nuevo contrato. Este método asegura que las expectativas de devaluación estén alineadas con el diferencial entre tasas domésticas e internacionales; en consecuencia, los rollovers mensuales ajustan la posición de forma neutral frente a posibles arbitrajes. La paridad cubierta de tasas establece que el precio forward debe reflejar el diferencial entre las tasas locales e internacionales (Hull, 2017).
2021 a mitad de 2022: se observa una tendencia positiva moderada. Durante este intervalo se registran ganancias netas constantes producto de una expectativa de devaluación que se materializó parcialmente; el mercado resultó favorable para posiciones largas (compradoras de USD).
Segunda mitad de 2022 a finales de 2023: el flujo acumulado se acelera y alcanza un máximo acumulado cercano a cincuenta millones de COP, lo que indica que los contratos futuros sobre TRM fueron altamente rentables en dicho periodo. Esta fase suele coincidir con periodos de alta volatilidad cambiaria, en los cuales el peso colombiano se depreció rápidamente frente al dólar estadounidense.
Desde principios de 2024: la tendencia se revierte. Se observan pérdidas acumuladas debidas a una revaluación del peso colombiano, lo cual afecta negativamente a posiciones largas. Las pérdidas netas sugieren que el rollover mantuvo posiciones compradoras cuando el mercado cambió de dirección, lo que indica una adaptación insuficiente de la estrategia frente a las nuevas condiciones de mercado.
Cada mes, al vencimiento del contrato, se decide si mantener una posición larga (compra de USD) o cambiar a una posición corta (venta de USD), según las expectativas sobre la TRM.
Liquidación diaria del contrato vigente mediante mark-to-market.
Cierre del contrato al final del mes.
Apertura de un nuevo contrato con base en la expectativa de la TRM: posición larga si se anticipa devaluación del COP; posición corta si se prevé revaluación del COP.
Recomendación basada en el gráfico. La posición larga fue acertada hasta finales de 2023. A partir de 2024, la falta de ajuste en el rollover condujo a pérdidas; un inversionista más reactivo habría cambiado a posición corta para anticipar la apreciación del COP y proteger el flujo positivo acumulado.
El análisis evidencia que el flujo acumulado por futuros TRM es altamente sensible a las variaciones del mercado cambiario. La estrategia de rollover requiere evaluación constante de las expectativas sobre la TRM, toma activa de posiciones según proyecciones económicas y políticas monetarias y disponibilidad de liquidez para responder a llamados de margen. Según la Bolsa de Valores de Colombia (2024), “los contratos de futuros permiten cobertura flexible y estructurada en función del horizonte de exposición y condiciones del mercado de divisas” (p. X).*
# Parámetros iniciales
credito_cop <- 500e6 # Valor maquinaria en COP
trm_16septiembre2025 <- 3897.57 # TRM inicial COP/USD
credito_usd <- credito_cop / trm_16septiembre2025 # Monto del crédito en USD
tasa_usa_anual <- 0.05 # Tasa interés crédito USA
tasa_mensual <- tasa_usa_anual / 12
plazo_meses <- 120 # 10 años
# Calcular cuota mensual en USD (sistema francés)
cuota_usd <- credito_usd * (tasa_mensual * (1 + tasa_mensual)^plazo_meses) / ((1 + tasa_mensual)^plazo_meses - 1)
# Simulación TRM mensual (por simplicidad, supongamos crece lineal)
set.seed(1)
trm <- trm_16septiembre2025 + cumsum(runif(plazo_meses, min = 1.5, max = 4))
# Futuros desde año 6 (mes 61 a 120)
valor_cubierto_cop <- credito_cop * 0.75
valor_cubierto_usd <- valor_cubierto_cop / trm_16septiembre2025
n_contratos <- floor(valor_cubierto_usd / 50000)
precio_futuro_trm <- trm[60] # Supongamos contrato al precio del mes 60
# Crear tabla de flujos
flujos <- data.frame(
Mes = 1:plazo_meses,
TRM = trm,
Cuota_USD = rep(cuota_usd, plazo_meses),
Pago_sin_cobertura = cuota_usd * trm,
Cobertura_futuros = rep(0, plazo_meses)
)
# Simular cobertura desde mes 61 en adelante
for (i in 61:plazo_meses) {
exposicion_usd <- cuota_usd * (valor_cubierto_usd / credito_usd)
flujo_cubierto_cop <- exposicion_usd * precio_futuro_trm
flujo_real_cop <- exposicion_usd * flujos$TRM[i]
flujos$Cobertura_futuros[i] <- flujo_real_cop - flujo_cubierto_cop
}
# Agregar columna con total neto con cobertura
flujos$Pago_con_cobertura <- flujos$Pago_sin_cobertura - flujos$Cobertura_futuros
# Resumen
total_sin_cobertura <- sum(flujos$Pago_sin_cobertura)
total_con_cobertura <- sum(flujos$Pago_con_cobertura)
ahorro <- total_sin_cobertura - total_con_cobertura
# Mostrar tabla resumen
tabla_resumen <- data.frame(
Escenario = c("Sin cobertura", "Con cobertura desde año 6"),
Total_pagado_COP = c(round(total_sin_cobertura, 0), round(total_con_cobertura, 0)),
Ahorro_COP = c(0, round(ahorro, 0))
)
# Mostrar primeras filas de flujo y tabla resumen
print(head(flujos, 12)) # Primer año
## Mes TRM Cuota_USD Pago_sin_cobertura Cobertura_futuros
## 1 1 3899.734 1360.662 5306220 0
## 2 2 3902.164 1360.662 5309527 0
## 3 3 3905.096 1360.662 5313516 0
## 4 4 3908.867 1360.662 5318647 0
## 5 5 3910.871 1360.662 5321374 0
## 6 6 3914.617 1360.662 5326471 0
## 7 7 3918.479 1360.662 5331725 0
## 8 8 3921.631 1360.662 5336014 0
## 9 9 3924.703 1360.662 5340195 0
## 10 10 3926.358 1360.662 5342446 0
## 11 11 3928.373 1360.662 5345188 0
## 12 12 3930.314 1360.662 5347830 0
## Pago_con_cobertura
## 1 5306220
## 2 5309527
## 3 5313516
## 4 5318647
## 5 5321374
## 6 5326471
## 7 5331725
## 8 5336014
## 9 5340195
## 10 5342446
## 11 5345188
## 12 5347830
print(tail(flujos, 12)) # Último año
## Mes TRM Cuota_USD Pago_sin_cobertura Cobertura_futuros
## 109 109 4202.155 1360.662 5717712 140595.3
## 110 110 4205.151 1360.662 5721790 143653.6
## 111 111 4209.092 1360.662 5727152 147674.8
## 112 112 4212.421 1360.662 5731682 151072.5
## 113 113 4214.813 1360.662 5734937 153513.4
## 114 114 4217.392 1360.662 5738445 156144.9
## 115 115 4219.262 1360.662 5740990 158053.8
## 116 116 4220.795 1360.662 5743076 159617.9
## 117 117 4224.084 1360.662 5747551 162974.2
## 118 118 4225.842 1360.662 5749943 164768.2
## 119 119 4228.458 1360.662 5753502 167437.5
## 120 120 4231.558 1360.662 5757721 170601.3
## Pago_con_cobertura
## 109 5577117
## 110 5578137
## 111 5579477
## 112 5580610
## 113 5581423
## 114 5582300
## 115 5582937
## 116 5583458
## 117 5584577
## 118 5585175
## 119 5586065
## 120 5587119
print(tabla_resumen)
## Escenario Total_pagado_COP Ahorro_COP
## 1 Sin cobertura 664009952 0
## 2 Con cobertura desde año 6 658758381 5251571
# Crear un dataframe en formato largo para graficar
library(tidyr)
flujos_largos <- flujos %>%
select(Mes, Pago_sin_cobertura, Pago_con_cobertura) %>%
pivot_longer(cols = c(Pago_sin_cobertura, Pago_con_cobertura),
names_to = "Escenario", values_to = "Pago_COP")
# Cambiar nombres para la leyenda
flujos_largos$Escenario <- recode(flujos_largos$Escenario,
"Pago_sin_cobertura" = "Sin cobertura",
"Pago_con_cobertura" = "Con cobertura desde ano 6")
# Crear gráfico
ggplot(flujos_largos, aes(x = Mes, y = Pago_COP, color = Escenario)) +
geom_line(size = 1.2) +
labs(title = "Comparacion de Flujos Mensuales en COP",
subtitle = "Credito vs. Cobertura con Futuros desde el Ano 6",
x = "Mes",
y = "Pago mensual en COP",
color = "Escenario") +
theme_minimal() +
scale_color_manual(values = c("red", "blue")) +
theme(plot.title = element_text(size = 14, face = "bold"),
legend.position = "top")
La simulación del comportamiento de la TRM se construyó de manera lineal, partiendo de una tasa inicial de 3897,57 COP/USD (16 de septiembre de 2025). Durante el horizonte de 120 meses (10 años), se observa un crecimiento gradual de la tasa de cambio, alcanzando valores superiores a 4200 COP/USD en el último año del crédito. Este comportamiento refleja una tendencia de depreciación moderada del peso colombiano frente al dólar, lo que incrementa el costo del servicio de la deuda en moneda local.
En este contexto, la adopción de futuros a partir del año 6 busca mitigar la volatilidad en el costo del crédito, permitiendo estabilizar los pagos en pesos colombianos (Hull, 2017).
De acuerdo con la Bolsa de Valores de Colombia (BVC, 2024), los contratos de futuros sobre TRM tienen un valor nocional estándar de USD 50.000. Para cubrir el 75 % del crédito (equivalente a COP 375 millones), fue necesario calcular el monto en dólares, que resultó en aproximadamente 96.200 USD. Con este valor se determina que la posición cubierta equivale a casi dos contratos de futuros TRM.
en este caso corresponde a un depósito de garantía cercano a COP 13 millones, que no constituye un gasto sino un requerimiento de liquidez recuperable.
representa el nivel mínimo de garantía antes de que sea necesario realizar aportes adicionales, protegiendo la estabilidad de la cámara de compensación.
Estos parámetros aseguran la viabilidad y liquidez del sistema de futuros, minimizando riesgos de contraparte (BVC, 2024).
El análisis de los flujos revela que los pagos mensuales sin cobertura presentaron un incremento continuo, pasando de 5,3 millones COP en el primer mes a más de 5,75 millones COP en el último año. En contraste, con la estrategia de cobertura a partir del mes 61, los pagos se estabilizaron en valores más bajos, con reducciones de hasta 170.000 COP mensuales en el tramo final del crédito.
La diferencia acumulada entre ambos escenarios muestra un ahorro de COP 5.251.571 sobre el total de la deuda. Si bien el ahorro no es de gran magnitud en comparación con el valor inicial del crédito (500 millones COP), la cobertura logró mitigar la volatilidad y dar mayor certeza a los flujos futuros. Esto es consistente con la literatura financiera, que señala que la cobertura no siempre maximiza ganancias, pero sí reduce el riesgo de exposición cambiaria (Fabozzi, 2021).
El escenario sin cobertura resultó en un pago total de COP 664.009.952, mientras que el escenario con cobertura desde el año 6 redujo la carga financiera a COP 658.758.381. Esta diferencia confirma la efectividad de la cobertura con futuros, al permitir un ahorro total de COP 5,25 millones y disminuir la variabilidad de los pagos en pesos.
El gráfico de comparación de flujos evidencia que, a partir del mes 61, la curva de pagos con cobertura (línea azul) mantiene un crecimiento más controlado en comparación con la curva sin cobertura (línea roja). Este comportamiento refleja que la estrategia de futuros suavizó el impacto de la depreciación cambiaria sobre los pagos del crédito.
La estrategia de cobertura cambiaria con futuros TRM aplicada a partir del sexto año del crédito fue financieramente beneficiosa. Primero, permitió estabilizar los flujos mensuales, reduciendo la incertidumbre cambiaria. Segundo, generó un ahorro acumulado de COP 5,25 millones frente al escenario sin cobertura. Finalmente, mejoró la planeación financiera al limitar el riesgo de incrementos futuros en la TRM.
En conclusión, aunque el ahorro no representa un porcentaje alto respecto al valor total del crédito, la cobertura sí cumplió con su objetivo principal: proteger la empresa de la volatilidad del tipo de cambio. Para futuras aplicaciones, se recomienda complementar esta estrategia con simulaciones probabilísticas (Monte Carlo o MBG) y análisis macroeconómicos periódicos que fortalezcan la toma de decisiones (Hull, 2017; Fabozzi, 2021; BVC, 2024).
Bolsa de Valores de Colombia. (2024). Reglamento y especificaciones de los contratos de futuros sobre tasa de cambio TRM (FUT-COP/USD). Bolsa de Valores de Colombia. https://www.bvc.com.co
Datos Abiertos Gobierno de Colombia. (2025). Tasa Representativa del Mercado (TRM) Superintendencia Financiera de Colombia. Datos.gov.co. https://www.datos.gov.co
Fabozzi, F. J. (2021). Handbook of finance: Financial markets and instruments (2.ª ed.). Wiley.
Glasserman, P. (2003). Monte Carlo methods in financial engineering. Springer. https://doi.org/10.1007/978-0-387-21617-1
Hull, J. C. (2018). Options, futures, and other derivatives (10.ª ed.). Pearson.
Kolb, R. W., & Overdahl, J. A. (2007). Financial derivatives: Pricing and risk management. Blackwell Publishing.