library(quantmod)
library(httr)
library(jsonlite)
library(xml2)
library(rvest)
library(ggplot2)
library(dplyr)
library(knitr)
library(DT)
library(ggplot2)
library(dplyr)
library(tidyr)
library(lubridate)
library(tidyverse)
##Obtener tasa de interés de EE.UU. (FRED API: DFF - Fed Funds Rate)
getSymbols("DFF", src = "FRED")
## [1] "DFF"
tasa_usd <- as.numeric(last(DFF)) / 100 # Convertir a decimal
### 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 4169.47 COP 22/05/2025 22/05/2025
## 2 4172.76 COP 21/05/2025 21/05/2025
## 3 4168.03 COP 20/05/2025 20/05/2025
## 4 4194.28 COP 17/05/2025 19/05/2025
## 5 4196.66 COP 16/05/2025 16/05/2025
## 6 4194.18 COP 15/05/2025 15/05/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: 15 de mayo de 2025
fecha_objetivo <- as.Date("2025-05-15")
trm_15mayo2025 <- trm_data[trm_data$Fecha == fecha_objetivo, "VALOR"]
# Mostrar resultado
if (length(trm_15mayo2025) > 0) {
print(paste("TRM del 15 de mayo de 2025:", trm_15mayo2025))
} else {
print("No se encontró la TRM para el 15 de mayo de 2025.")
}
## [1] "TRM del 15 de mayo de 2025: 4194.18"
### 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_15mayo2025 * ((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()
Análisis Fundamental de la TRM (COP/USD)
La Tasa Representativa del Mercado (TRM) refleja el precio del dólar en Colombia y está influenciada por factores económicos tanto locales como internacionales. Actualmente, se ha observado una tendencia al alza de la TRM debido a varios factores macroeconómicos:
Política Monetaria Internacional: La Reserva Federal de EE. UU. ha mantenido tasas de interés elevadas (alrededor del 5.25% en 2024) con el fin de contener la inflación. Esto genera una mayor demanda por activos en dólares, fortaleciendo la moneda estadounidense frente a otras divisas, incluido el peso colombiano (JP Morgan Research, 2024).
Política Monetaria en Colombia: Aunque el Banco de la República ha comenzado a reducir su tasa de intervención, ubicándola en 11.75% en mayo de 2024, esta sigue siendo elevada en términos históricos, pero menor frente a períodos anteriores, lo que ha reducido parcialmente la presión apreciativa sobre el peso colombiano (Banco de la República, 2024).
Flujos de capital y riesgo país: Las decisiones de inversión extranjera directa y el apetito de riesgo por mercados emergentes han sido volátiles, lo que ha contribuido a una mayor incertidumbre sobre la TRM. Un deterioro en la percepción de riesgo del país (por temas fiscales o políticos) suele presionar al alza el dólar (Ministerio de Hacienda de Colombia, 2024).
Factores estructurales: La balanza comercial sigue siendo deficitaria y los ingresos por exportaciones no compensan completamente las necesidades de divisas. Esto ejerce una presión alcista adicional sobre la tasa de cambio (Ministerio de Hacienda de Colombia, 2024).
Expectativas de Precio de la TRM a 12 Meses
Diversas proyecciones de entidades financieras y gubernamentales coinciden en una tendencia moderadamente alcista de la TRM a lo largo de los próximos 12 meses. Según el Ministerio de Hacienda de Colombia, se proyecta un promedio de TRM alrededor de $4,400 – $4,800 COP/USD para 2025, dependiendo de la evolución de las tasas de interés en Estados Unidos y la consolidación fiscal nacional (Ministerio de Hacienda de Colombia, 2024).
En línea con esta perspectiva, la simulación realizada usando un modelo de proyección tipo paridad de tasas de interés sugiere un incremento progresivo mensual de la TRM, partiendo de $4,250 hasta alcanzar niveles superiores a $4,690 en 12 meses, como se evidencia en la Gráfica.
Perfecto. A continuación tienes el texto corregido con la desviación estándar mensual actualizada a 0.0067 (0.67%), listo para ser usado en tu informe financiero o académico:
## 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 desviación estándar 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 desviación estándar
# Mostrar tabla interactiva usando DT
datatable(tabla_resultados,
options = list(pageLength = 10, scrollX = TRUE),
caption = "Retornos Mensuales de la TRM y Desviación Estándar")
Según el cálculo realizado, la desviación estándar mensual de la 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 valoración de derivados.
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 típico en series temporales estacionarias de tipo de cambio. No obstante, 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 necesidad de cobertura financiera para mitigar riesgos asociados a la exposición cambiaria.
Una desviación estándar del 0.67% mensual no es despreciable cuando se proyecta a periodos de largo plazo como 10 años. Se puede esperar que en el 67% de los meses, el retorno esté dentro del rango de ±0.67%, mientras que eventos extremos pueden superar ±1.34%, generando potenciales impactos significativos en el valor en pesos de cualquier obligación en dólares. Esta realidad se vuelve crítica para créditos internacionales, inversiones en maquinaria importada, o cualquier estructura apalancada con divisas.
La presencia de retornos negativos más pronunciados en ciertos periodos muestra cómo una revaluación del peso colombiano puede implicar menores ingresos en pesos o incrementos en los costos de importación. Por ende, conocer la volatilidad histórica es fundamental para diseñar estrategias de cobertura eficientes, como contratos forward o futuros, especialmente si el horizonte de inversión incluye momentos de mayor exposición, como se plantea a partir del año 6 del crédito.
Este comportamiento es consistente con lo planteado por Hull quien afirma que los retornos de tipo de cambio presentan dinámicas estacionarias con brotes de alta volatilidad, siendo necesarios mecanismos de cobertura para mitigar el riesgo de tipo de cambio en contratos internacionales (Hull, 2018).
# 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.00023
cat("📊 Volatilidad mensual (sigma):", round(sigma, 5), "\n")
## 📊 Volatilidad mensual (sigma): 0.00669
# Parámetros para la simulación
S0 <- trm_15mayo2025 # 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
head(simulaciones_largo)
## # A tibble: 6 × 3
## Mes Simulacion TRM
## <int> <chr> <dbl>
## 1 1 Simulacion_1 4193.
## 2 1 Simulacion_2 4193.
## 3 1 Simulacion_3 4193.
## 4 1 Simulacion_4 4193.
## 5 1 Simulacion_5 4193.
## 6 1 Simulacion_6 4193.
# Mostrar la tabla interactiva usando DT
library(DT)
datatable(simulaciones_largo,
options = list(pageLength = 12),
caption = "Simulaciones de TRM mensuales usando Geometría Browniana")
1. Comportamiento general de las simulaciones
• Se simularon múltiples trayectorias de la TRM, partiendo desde un valor inicial cercano a $4.193 COP/USD.
• A lo largo de los 10 años (120 meses), las trayectorias muestran una divergencia progresiva, lo cual es típico del MBG, debido a su naturaleza estocástica y multiplicativa.
Hull, J. C. (2018). Options, Futures, and Other Derivatives. 10th Edition. Pearson. (Mencionar al introducir el modelo de simulación MBG). Esta ya la tengo en el otro word
2. Rango de proyecciones
• Valor mínimo proyectado: Cerca de $3.600 COP/USD. * • Valor máximo proyectado: Aproximadamente $4.800 COP/USD.
• Esto indica que, bajo las condiciones actuales de media y volatilidad, el mercado espera que la TRM pueda fluctuar en un rango de aproximadamente ±15% en un horizonte de 10 años.
3. Tendencia central
• Aunque hay trayectorias con clara tendencia al alza y otras a la baja, la mayoría tiende a oscilar alrededor del valor inicial con leves desviaciones.
• Esto sugiere que el drift (μ) o retorno promedio de la TRM en el modelo es cercano a cero o ligeramente negativo, lo que implica expectativas de estabilidad o leve revaluación del COP en el largo plazo, bajo el supuesto actual (Glasserman, 2003).
4. Volatilidad
• Las diferencias entre trayectorias se amplifican con el tiempo, lo que refleja el efecto acumulativo de la volatilidad mensual en el MBG.
• Esta dispersión creciente es clave para el análisis de riesgo cambiario a largo plazo y para evaluar la importancia de mecanismos de cobertura como los futuros.
Hull, J. C. (2018). Options, Futures, and Other Derivatives. 10th Edition. Pearson. (Mencionar al introducir el modelo de simulación MBG). Esta ya la tengo en el otro word
5. Riesgo para pagos del crédito
• La devaluación (TRM creciente) implicaría pagos más altos en pesos para cuotas en USD → riesgo para el flujo de caja de la empresa.
• La revaluación (TRM decreciente) implicaría pagos menores, pero puede significar menor necesidad de cobertura → podría hacer innecesario parte del gasto en futuros si se materializa.
6. Decisiones estratégicas basadas en la simulación
• Es prudente estructurar una cobertura cambiaria parcial o escalonada (como el 75% entre año 6-10 propuesto) (Kolb, R. W., & Overdahl, J. A., 2007).
• La simulación justifica el uso de derivados (futuros/forwards) para protegerse de trayectorias como las de la curva fucsia y violeta que llevan la TRM por encima de $4.600 COP/USD.
Conclusión: Esta simulación proporciona una base sólida para evaluar el impacto del tipo de cambio en los pagos de un crédito en USD. Además, justifica la necesidad de cobertura desde el año 6, cuando la varianza proyectada de la TRM es significativa y podría comprometer la estabilidad financiera del proyecto si no se protege adecuadamente.
# Supuestos
valor_maquinaria_cop <- 300000000 # 300 millones COP
porcentaje_inicial <- 0.15
plazo_meses <- 120 # 10 años
# Convertir valor total a USD usando la TRM actual
valor_maquinaria_usd <- valor_maquinaria_cop / trm_15mayo2025
# Pago inicial (15%)
pago_inicial_usd <- valor_maquinaria_usd * porcentaje_inicial
# Monto a financiar (85%)
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): 71527.69
cat("💰 Pago inicial (USD):", round(pago_inicial_usd, 2), "\n")
## 💰 Pago inicial (USD): 10729.15
cat("🏦 Monto financiado (USD):", round(monto_credito_usd, 2), "\n")
## 🏦 Monto financiado (USD): 60798.54
cat("📆 Cuota mensual (USD):", round(cuota_mensual_usd, 2), "\n")
## 📆 Cuota mensual (USD): 625.14
Lo anterior presenta una simulación financiera del crédito para la adquisición de maquinaria amarilla por un valor total de USD 71,527.69, estructurada bajo las siguientes condiciones:
Interpretación financiera del crédito simulado
1. Pago inicial del 15% Se realiza un pago inicial de USD 10,729.15, lo que corresponde al 15% del valor total de la maquinaria. Este pago disminuye el monto a financiar mediante el crédito, lo cual reduce tanto los intereses totales como el compromiso financiero mensual del proyecto.
2. Monto financiado (85%) El monto financiado es de USD 60,798.54, que representa el 85% restante del valor de la maquinaria. Este valor constituye el principal del crédito sobre el cual se aplicarán los intereses y se calcularán las cuotas bajo el sistema francés.
3. Cuota mensual constante (sistema francés) Bajo el sistema de amortización francés, se paga una cuota mensual constante de USD 625.14 durante 10 años. Este sistema distribuye el pago en cuotas iguales en el tiempo, donde las primeras incluyen una mayor proporción de intereses y menor de capital, mientras que las últimas contienen mayor componente de amortización del capital.
Esto facilita la planificación financiera de largo plazo al mantener constante el flujo de salida mensual en moneda extranjera.
Implicaciones financieras
• Estabilidad en flujos: Este esquema da previsibilidad en las salidas de caja en dólares, pero expone al inversionista a riesgos cambiarios a lo largo del tiempo, dado que los pagos futuros deberán convertirse a pesos colombianos.
• Exposición al riesgo cambiario: Dado que las cuotas están en USD, el inversionista está sujeto a la evolución de la TRM durante los 10 años del crédito. Esta es una de las razones por las que se plantea la cobertura cambiaria con futuros a partir del sexto año.
• Costo financiero en moneda dura: El uso de crédito en dólares puede ser ventajoso si las tasas de interés estadounidenses son significativamente más bajas que las tasas locales. De hecho, es habitual que inversionistas empresariales busquen financiamiento en mercados con tasas más competitivas para activos de capital intensivo como maquinaria (Kolb, R. W., & Overdahl, J. A., 2007).
# 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")
1. Variabilidad cambiaria y su efecto directo en el flujo de caja en COP
Aunque la cuota es constante en dólares, al transformarla a pesos según cada trayectoria simulada de la TRM, las cuotas mensuales fluctúan considerablemente entre aproximadamente COP 2.250.000 y COP 2.950.000, dependiendo del comportamiento de la tasa de cambio.
Esto evidencia cómo un crédito en divisa extranjera con pagos en moneda local expone al riesgo de tipo de cambio, que se traduce en incertidumbre en el flujo de caja. Como puede observarse:
o En escenarios de devaluación (cuando el dólar sube), el pago mensual en pesos se incrementa.
o En escenarios de apreciación del peso (cuando el dólar baja), el pago mensual disminuye.
2. Presión financiera ante devaluaciones sostenidas
Algunos escenarios (por ejemplo, Simulación_8 y Simulación_7) muestran un incremento sostenido de la TRM, lo cual lleva la cuota mensual por encima de COP 2.900.000. Esto implicaría una presión considerable sobre los flujos operativos o financieros del inversionista, en especial si sus ingresos están en pesos y no indexados al dólar.
3. Importancia de coberturas cambiarias
Esta volatilidad justifica la necesidad de estrategias de cobertura con futuros de divisas (a partir del año 6 como se plantea), ya que la ausencia de cobertura puede poner en riesgo la viabilidad financiera del proyecto ante movimientos adversos del tipo de cambio.
Según Kolb y Overdahl (2007), los derivados financieros como futuros y forwards son herramientas clave para mitigar riesgos financieros derivados de exposiciones en moneda extranjera, especialmente en proyectos de inversión de largo plazo.
Conclusión: Aunque la cuota del crédito en dólares es fija, su conversión a pesos presenta una variabilidad significativa, afectando la planeación financiera. Este análisis subraya la importancia de:
• Simular escenarios cambiarios.
• Evaluar coberturas a partir de un horizonte determinado.
• Considerar el impacto de la exposición cambiaria dentro del costo total del financiamiento.
# Crear el dataframe con los datos proporcionados
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)
)
# Ordenar por fecha y calcular retornos logarítmicos
datos <- datos %>%
arrange(Fecha) %>%
mutate(Retorno = c(NA, diff(log(Cierre))),
Mes = floor_date(Fecha, "month"))
# Calcular el retorno promedio mensual y la desviación estándar mensual
retornos_mensuales <- datos %>%
group_by(Mes) %>%
summarise(
Retorno_Promedio = mean(Retorno, na.rm = TRUE),
Desviación_Estándar = sd(Retorno, na.rm = TRUE),
Dias_Observados = n()
)
# Verificación de la tabla con retornos y desviación estándar
print(retornos_mensuales)
## # A tibble: 7 × 4
## Mes Retorno_Promedio Desviación_Estándar 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
# Corregir si hay NA en la desviación estándar, reemplazamos con 0
retornos_mensuales <- retornos_mensuales %>%
mutate(
Desviación_Estándar = ifelse(is.na(Desviación_Estándar), 0, Desviación_Estándar)
)
# Verificación del resultado final
print(retornos_mensuales)
## # A tibble: 7 × 4
## Mes Retorno_Promedio Desviación_Estándar Dias_Observados
## <date> <dbl> <dbl> <int>
## 1 2024-11-01 -0.0101 0 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 parámetros desde los datos calculados
mu <- mean(retornos_mensuales$Retorno_Promedio, na.rm = TRUE)
sigma <- mean(retornos_mensuales$Desviación_Estándar, 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.00885"
• Promedio de Retornos Mensuales (μ):*
μ=−0.00462
Esto indica un retorno mensual promedio negativo de -0.462%, lo cual implica que el precio del activo subyacente ha tendido a depreciarse ligeramente cada mes durante el periodo observado (noviembre de 2024 a mayo de 2025).
• Desviación Estándar Mensual (σ):
σ=0.00885
Esto representa una volatilidad mensual del 0.885%, lo cual sugiere una variabilidad moderada en los precios del futuro a lo largo del tiempo.
Interpretación financiera
1. Tendencia bajista a corto plazo: El retorno mensual promedio negativo sugiere que el activo subyacente de este contrato de futuros ha venido perdiendo valor en el corto plazo. Esto puede deberse a expectativas negativas del mercado, presión bajista sobre el activo base o condiciones macroeconómicas adversas.
2. Riesgo moderado: La desviación estándar mensual inferior al 1% refleja una volatilidad relativamente baja, lo cual puede interpretarse como un activo con comportamientos de precios relativamente estables. Para un futuro, esto puede ser atractivo en contextos de cobertura, donde se busca minimizar incertidumbre, más que especular.
3. Aplicación práctica en cobertura cambiaria o de commodities: Este tipo de análisis es fundamental para calcular escenarios simulados y estimar la efectividad de una cobertura con futuros. Por ejemplo, al conocer μ y σ, puedes usar simulación Monte Carlo para proyectar el comportamiento del precio del futuro en el tiempo, lo cual es útil al cubrir un crédito en divisa extranjera desde el año 6 al 10.
Como señala Glasserman (2003), la simulación estocástica basada en MBG es una técnica robusta para evaluar la evolución de instrumentos financieros y cuantificar su riesgo.
# --- 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_15mayo2025 * ((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: 4233.25"
# Extraer parámetros desde retornos históricos
mu <- mean(retornos_mensuales$Retorno_Promedio, na.rm = TRUE)
sigma <- mean(retornos_mensuales$Desviación_Estándar, na.rm = TRUE)
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.00885"
# --- Parámetros de simulación ---
S0 <- futuro_trm_1mes # Valor inicial de la simulación
n_simulaciones <- 10 # 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-06-11")
# --- 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: 11/06/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: 11/06/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).
1. Cálculo del Precio del Futuro de la TRM (Mes 1)
El precio teórico de un futuro sobre la TRM (tipo de cambio) se calcula usando:
2. Interpretación financiera de la simulación MBG
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.
Observaciones clave:
**1. Tendencia central ligeramente decreciente:**
La mayoría de las trayectorias muestran una desvalorización gradual del dólar frente al peso colombiano, consistente con el retorno promedio negativo (μ=−0.00462) calculado a partir de datos históricos. Esto sugiere que el peso tendería a apreciarse, lo cual genera riesgo para quien tiene deuda en USD (es decir, se encarece la deuda si el peso se deprecia, pero mejora si se aprecia). Aunque algunas trayectorias presentan ligeros repuntes o estabilizaciones, la mayoría de las simulaciones muestra una tendencia decreciente en el precio del futuro. Esto puede interpretarse como una expectativa de apreciación del peso colombiano frente al dólar en el largo plazo.
**2. Volatilidad creciente en el tiempo:**
Aunque el modelo MBG asume volatilidad constante, el efecto acumulado se refleja en una mayor dispersión en los precios simulados hacia el final del periodo. Esto se evidencia en el rango más amplio de precios entre los meses 100 y 120. Volatilidad moderada: A pesar de tratarse de una simulación de 5 años (60 meses), el rango de precios oscila entre aproximadamente $3.870 y $4.320 COP/USD, lo que indica volatilidad contenida frente a horizontes de corto plazo. La desviación estándar histórica mensual estimada fue cercana a 0,88% (ver análisis previo), lo cual es consistente con este comportamiento.
**3. Cobertura efectiva a partir del año 6:**
Dado que los futuros son instrumentos de vencimiento corto (30-90 días), las coberturas entre los años 6 y 10 deben implementarse con rollover de futuros mensuales o trimestrales, comprando contratos nuevos al vencimiento del anterior. Esta estrategia permitiría fijar el tipo de cambio mes a mes, reduciendo la exposición cambiaria.
**4. Riesgo de base:**
Si bien el modelo estima un valor teórico para el futuro, en la práctica puede haber riesgo de base (diferencia entre el precio del futuro y la TRM spot al vencimiento). Este puede ser reducido mediante cobertura continua y selección de contratos líquidos.
Conclusión: La simulación MBG del futuro de la TRM permite anticipar comportamientos posibles del tipo de cambio durante la cobertura de una deuda en dólares a largo plazo. Los resultados sugieren que, bajo los parámetros históricos estimados, la cobertura con futuros desde el año 6 hasta el 10 es adecuada para protegerse de un escenario de depreciación del COP, aunque se debe considerar el riesgo de base y realizar ajustes periódicos vía rollover. La simulación del futuro de la TRM para los años 6 a 10 muestra una leve depreciación del USD frente al COP en promedio, con trayectorias diversas pero controladas en volatilidad, lo cual es coherente con la estimación mensual de retornos negativos y una desviación estándar cercana a 0,88%.
Este análisis es clave para entidades expuestas a riesgos cambiarios de largo plazo, que desean anticipar escenarios para planear coberturas financieras o estructurales.
## 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_15mayo2025
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): 209.709.000"
# --- 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): 13.211.667"
# --- 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): 104.854.500"
# --- 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) 209.709.000
## 3 Margen Inicial (%) 6.3%
## 4 Margen Inicial (COP) 13.211.667
## 5 Margen de Mantenimiento (%) 50%
## 6 Margen de Mantenimiento (COP) 104.854.500
1. Tamaño del Contrato
• USD 50.000 Cada contrato representa una obligación por 50.000 dólares estadounidenses. Esto define la escala del compromiso y permite calcular la exposición total.
2. Exposición Total
**• COP 209.709.000* Representa el valor total nocional de la posición (cantidad de USD del contrato × precio de la TRM en COP). En este caso:
50.000 × 4.194,18=209.709.000 COP
Esta es la base sobre la cual se calcula el margen requerido. Aunque no se paga este total al entrar en el contrato, es el monto que se expone a riesgo de variación del tipo de cambio.
3. Margen Inicial
• 6,3% del total expuesto = COP 13.211.667 Es el depósito de garantía exigido al momento de abrir la posición. Este porcentaje es definido por la cámara de compensación y busca cubrir movimientos adversos esperados a corto plazo.
El margen inicial actúa como colateral frente al incumplimiento de obligaciones diarias por variación de precio del contrato. No es un costo, sino una garantía retornable, ajustada diariamente mediante mark-to-market.
4. Margen de Mantenimiento • 50% del margen inicial = COP 104.854.500 Este margen representa el umbral mínimo por debajo del cual el saldo de la cuenta de garantías no debe caer. Si el valor de mercado del contrato se mueve en contra del inversionista y su cuenta de garantías baja por debajo de este valor, se emite un llamado de margen (margin call).
Se deberá entonces reponer fondos hasta al menos el nivel del margen inicial. Este mecanismo protege la estabilidad del mercado y evita impagos por parte de los participantes.
Conclusión:
• Estos criterios son fundamentales al momento de planear estrategias de cobertura cambiaria, ya que determinan la liquidez requerida para mantener posiciones abiertas en el tiempo.
• En este caso, cubrir una obligación equivalente a USD 50.000 requiere inicialmente solo el 6,3% de su valor nocional, lo que lo convierte en un instrumento eficiente en términos de apalancamiento.
• Sin embargo, es crucial monitorear las fluctuaciones del mercado y tener liquidez disponible para responder ante llamados de margen, especialmente en contextos de alta volatilidad del tipo de cambio.
# 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-05-01") & Fecha <= as.Date("2025-05-15"))
# Crear vector de meses únicos
meses <- unique(floor_date(trm$Fecha, "month"))
n_meses <- length(meses)
# Tasas históricas 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
)
# Inicialización
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)
# Validación de que no haya NA
if (is.na(trm_forward) || is.na(spot_actual)) next
# Posición basada en expectativa
if (trm_forward > spot_actual) {
posicion <- "Larga"
signo <- 1
} else {
posicion <- "Corta"
signo <- -1
}
# Cálculo 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: Contrato de Futuros de Tasa de Cambio – Requisitos de Margen y Exposición
Interpretación Financiera del Flujo Acumulado por Futuros de TRM con Rollover (2021–2024)
El gráfico muestra el flujo acumulado de caja generado por contratos de futuros sobre la 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 (BVC, 2024).
• El eje vertical representa el flujo de caja acumulado en pesos colombianos (COP).
• El eje horizontal muestra la evolución temporal entre mediados de 2020 y finales de 2023.
• La serie azul evidencia los resultados netos mensuales producto de la liquidación diaria de los contratos (mark-to-market), ajustados por el cambio mensual de posición.
Interpretación Financiera
1. Rentabilidad por Diferencial de Tasas (Paridad de Tasas)
La estrategia usa 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. De esta forma, los rollovers mensuales ajustan la posición de forma neutral respecto a arbitrajes.
La paridad cubierta de tasas establece que el precio forward debe reflejar el diferencial entre las tasas locales e internacionales (Hull, 2017).
2. Comportamiento del Flujo Acumulado
• 2021 a mitad de 2022: tendencia positiva moderada. Se observa una ganancia neta constante producto de una expectativa de devaluación que se materializó parcialmente. El mercado estuvo favorable para posiciones largas (compradoras de USD).
• Mitad de 2022 a principios de 2023: se acelera el crecimiento del flujo hasta un máximo acumulado cercano a 50 millones COP, indicando que los contratos futuros sobre TRM fueron altamente rentables. Esto suele coincidir con periodos de alta volatilidad cambiaria, donde el COP se depreció rápidamente frente al USD.
• Desde principios de 2023: se revierte la tendencia. Se observan pérdidas acumuladas debido a la revaluación del peso colombiano, lo cual afecta negativamente a una posición larga. Las pérdidas netas sugieren que el rollover mantuvo posiciones compradoras cuando el mercado bajó, lo que indica una estrategia inadecuada frente a la nueva dirección del mercado.
Estrategia de Rollover y Cambios de Posición
Cada mes, al vencer el contrato, se decide si mantiene una posición larga (compra de USD) o cambia a una posición corta (venta de USD). El éxito depende de su expectativa sobre la TRM:
Proceso de Rollover:
Liquidación diaria del contrato vigente (mark-to-market).
Al vencimiento mensual, se cierra el contrato actual.
Se abre un nuevo contrato según:
o Posición larga si se espera devaluación del COP. o Posición corta si se espera revaluación del COP.
Recomendación basada en el gráfico:
• La posición larga fue acertada hasta inicio de 2023. • A partir de ahí, la falta de ajuste en el rollover condujo a pérdidas. Un inversionista más reactivo habría cambiado a una posición corta, anticipando la apreciación del COP y protegiendo el flujo positivo acumulado.
Conclusión:
El análisis evidencia que el flujo acumulado por futuros TRM es altamente sensible a los cambios del mercado cambiario. La estrategia de rollover requiere:
• Evaluación constante de expectativas de TRM. • Toma activa de posiciones según proyecciones económicas y políticas monetarias.
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”.
# Parámetros iniciales
credito_cop <- 300e6 # Valor maquinaria en COP
trm_15mayo2025 <- 4144.55 # TRM inicial COP/USD
credito_usd <- credito_cop / trm_15mayo2025 # 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_15mayo2025 + 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_15mayo2025
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 4146.714 767.7469 3183627 0
## 2 2 4149.144 767.7469 3185493 0
## 3 3 4152.076 767.7469 3187744 0
## 4 4 4155.847 767.7469 3190638 0
## 5 5 4157.851 767.7469 3192177 0
## 6 6 4161.597 767.7469 3195053 0
## 7 7 4165.459 767.7469 3198018 0
## 8 8 4168.611 767.7469 3200438 0
## 9 9 4171.683 767.7469 3202797 0
## 10 10 4173.338 767.7469 3204067 0
## 11 11 4175.353 767.7469 3205614 0
## 12 12 4177.294 767.7469 3207105 0
## Pago_con_cobertura
## 1 3183627
## 2 3185493
## 3 3187744
## 4 3190638
## 5 3192177
## 6 3195053
## 7 3198018
## 8 3200438
## 9 3202797
## 10 3204067
## 11 3205614
## 12 3207105
print(tail(flujos, 12)) # Último año
## Mes TRM Cuota_USD Pago_sin_cobertura Cobertura_futuros
## 109 109 4449.135 767.7469 3415809 79330.21
## 110 110 4452.131 767.7469 3418110 81055.86
## 111 111 4456.072 767.7469 3421135 83324.80
## 112 112 4459.401 767.7469 3423692 85241.94
## 113 113 4461.793 767.7469 3425528 86619.18
## 114 114 4464.372 767.7469 3427508 88104.01
## 115 115 4466.242 767.7469 3428944 89181.08
## 116 116 4467.775 767.7469 3430121 90063.62
## 117 117 4471.064 767.7469 3432646 91957.41
## 118 118 4472.822 767.7469 3433995 92969.66
## 119 119 4475.438 767.7469 3436003 94475.82
## 120 120 4478.538 767.7469 3438384 96260.97
## Pago_con_cobertura
## 109 3336479
## 110 3337054
## 111 3337811
## 112 3338450
## 113 3338909
## 114 3339404
## 115 3339763
## 116 3340057
## 117 3340688
## 118 3341026
## 119 3341528
## 120 3342123
print(tabla_resumen)
## Escenario Total_pagado_COP Ahorro_COP
## 1 Sin cobertura 397418533 0
## 2 Con cobertura desde año 6 394455360 2963173
# 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")
Interpretación financiera integral de la cobertura cambiaria con futuros TRM para adquisición de maquinaria amarilla con crédito en dólares
1. Simulación del Futuro de la TRM (Años 6 a 10)
La gráfica de simulación muestra diferentes trayectorias posibles del precio del futuro de la TRM entre los años 6 y 10. Este ejercicio, realizado con Movimiento Browniano Geométrico (MBG), captura la volatilidad e incertidumbre del mercado cambiario a largo plazo. Se observa una dispersión significativa entre las trayectorias, lo que refleja un riesgo cambiario considerable para obligaciones pactadas en USD, como es el caso del crédito para la maquinaria amarilla.
La cotización inicial de 4233,25 COP/USD para el año 6 indica el nivel de referencia sobre el cual se valoran los futuros. Algunas trayectorias proyectan depreciación (TRM creciente), lo que implicaría mayor carga en pesos al pagar el crédito. Otras muestran apreciación del peso, lo cual reduciría los pagos. Ante este entorno incierto, cubrirse con futuros a partir del año 6 permite estabilizar el costo de la deuda en COP, transfiriendo el riesgo al mercado (Hull, 2017).
2. Criterios contractuales de futuros BVC
Según la ficha técnica de la Bolsa de Valores de Colombia (BVC, 2024), los contratos de futuros sobre TRM tienen un tamaño estándar de USD 50.000. La exposición total de COP 209,7 millones representa el valor nocional cubierto, correspondiente a la obligación en dólares a partir del año 6.
• Margen inicial (6,3%): Corresponde al depósito de garantía exigido para abrir la posición, que asciende a COP 13,2 millones. Este monto es un costo inicial pero no un gasto, ya que puede recuperarse si la posición no genera pérdidas.
• Margen de mantenimiento (50%): Se activa si el valor del contrato cae por debajo del 50% del margen inicial. En este caso, se deben aportar hasta COP 104,9 millones si el mercado se mueve en contra.
Estos márgenes permiten a la BVC garantizar la liquidez y seguridad del sistema, evitando riesgos de contraparte (BVC, 2024).
3. Flujo acumulado de margen con estrategia de rollover
El gráfico de flujo acumulado muestra el resultado neto de realizar rollover mensual entre contratos futuros a lo largo de 4 años, según la paridad de tasas. Se evidencia que la estrategia fue inicialmente ganadora (crecimiento del flujo hasta más de COP 50 millones), pero hacia mediados de 2023 presenta una caída significativa.
Esto refleja la naturaleza especulativa del rollover si no se gestiona con base en expectativas racionales del mercado. Cada rollover implica una nueva posición futura basada en las condiciones vigentes; si el mercado se mueve contra la expectativa (por ejemplo, si se mantiene una posición corta esperando apreciación del COP y este se deprecia), se incurre en pérdidas.
En este sentido, el análisis prospectivo y macroeconómico es clave para decidir si mantener o revertir posiciones al momento del rollover ((Fabozzi, 2021).
4. Comparación de escenarios: Crédito sin cobertura vs. con cobertura (desde año 6)
El análisis financiero final compara dos escenarios sobre el costo total en COP del crédito en dólares.
En términos gráficos, se observa que a partir del mes 60 (año 6), la línea roja (con cobertura) crece a un ritmo más estable y más lento que la azul (sin cobertura). Esto evidencia que la cobertura con futuros logró contener el aumento del costo en COP debido a la volatilidad de la TRM, generando un ahorro total superior a COP 2,9 millones al cierre del crédito.
Conclusión:
La estrategia de cobertura cambiaria con futuros TRM, iniciada en el año 6 del crédito, fue financieramente beneficiosa:
• Protegió contra escenarios de devaluación del peso colombiano que habrían encarecido los pagos del crédito en COP.
• Limitó la variabilidad de los flujos mensuales, lo que mejora la planeación financiera.
• Permitió un ahorro efectivo frente al escenario sin cobertura, aún considerando el margen inicial como requerimiento de liquidez temporal.
No obstante, es importante recordar que la efectividad de la cobertura depende de la correcta proyección de la TRM y del manejo disciplinado de los rollovers. Para futuras decisiones, se recomienda acompañar este tipo de cobertura con análisis macroeconómicos periódicos y modelos probabilísticos como simulación Monte Carlo o MBG.
Bolsa de Valores de Colombia. (2024). Bolsa de Valores de Colombia. Obtenido de Ficha técnica de contratos de futuros de tasa de cambio: https://www.bvc.com.co/
Fabozzi, F. (2021). The Handbook of Fixed Income Securities. New York: McGraw-Hill.
Glasserman, P. (2003). Monte Carlo Methods in Financial Engineering. Springer.
Kolb, R. W., & Overdahl, J. A. (2007). Financial Derivatives: Pricing and Risk Management. Hoboken: Wiley.
Banco de la República. (2024). Informe de Política Monetaria - Abril 2024. Obtenido de https://www.banrep.gov.co/es/informe-politica-monetaria
Hull, J. C. (2018). Options, futures, and other derivatives (10th ed.).
JP Morgan Research. (2024). Latin America FX Outlook.
Ministerio de Hacienda de Colombia. (2024). Ministerio de Hacienda de Colombia. Obtenido de https://www.minhacienda.gov.co