Política monetaria del Banco de la República: La tasa de interés de referencia se redujo al 9.25% en abril de 2025, buscando controlar la inflación y estimular la economía. ([Banco de la República][2])
Inflación: Aunque ha disminuido, la inflación se mantiene por encima de la meta del 3%, lo que podría influir en la TRM. ([Banco de la República][2])
Contexto internacional: Las políticas proteccionistas y la incertidumbre global han aumentado la volatilidad en los mercados, afectando la tasa de cambio. ([Bancolombia][3])
BBVA Research: Proyecta una TRM de $4,350 COP/USD al cierre de 2025 y de $4,230 COP/USD en diciembre de 2026. ([BBVA Research][4])
Corficolombiana: Anticipa presiones de depreciación en lo que resta de 2025, en medio de una alta volatilidad. ([Corficolombiana][5])
La República: Para el primer trimestre de 2025, los analistas proyectan una TRM sobre los $4,400, con posibilidad de alcanzar los $4,900 a final de año. ([Diario La República][6])
Política monetaria de EE.UU.: Los movimientos de la Reserva Federal influirán en los flujos de capital y, por ende, en la TRM.([BBVA Research][4])
Precios del petróleo: Dado que Colombia es un exportador de petróleo, los precios internacionales impactan directamente en la tasa de cambio.
Situación fiscal del país: El déficit fiscal y las decisiones de política económica interna también afectarán la TRM.([BBVA Research][4])
La TRM ha mostrado una tendencia a la apreciación del peso colombiano en lo que va de 2025, con una volatilidad relativamente baja. Sin embargo, factores como la política monetaria interna y externa, la inflación y el contexto internacional podrían generar presiones al alza en la tasa de cambio en los próximos meses.
# 1. Cargar y preparar los datos (sin mostrar mensaje de columnas)
trm_data <- read_csv(
"https://www.datos.gov.co/api/views/mcec-87by/rows.csv?accessType=DOWNLOAD",
show_col_types = FALSE
)
# 2. Formatear fechas y ordenar
trm_data <- trm_data %>%
mutate(
VIGENCIADESDE = dmy(VIGENCIADESDE),
VIGENCIAHASTA = dmy(VIGENCIAHASTA)
) %>%
arrange(VIGENCIADESDE)
# 3. Calcular TRM mensual promedio, desviación estándar y retornos
trm_mensual <- trm_data %>%
mutate(anio = year(VIGENCIADESDE), mes = month(VIGENCIADESDE)) %>%
group_by(anio, mes) %>%
summarise(
TRM_promedio = mean(VALOR, na.rm = TRUE),
Desviacion = sd(VALOR, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(anio, mes) %>%
mutate(
periodo = as.Date(sprintf("%04d-%02d-01", anio, mes)),
Retorno = c(NA, diff(log(TRM_promedio))) # Retornos logarítmicos
)
# 4. Visualización: TRM Mensual Promedio
p1 <- ggplot(trm_mensual, aes(x = periodo, y = TRM_promedio)) +
geom_line(color = "steelblue", linewidth = 1) + # Usar linewidth
labs(title = "TRM Mensual Promedio", x = "Fecha", y = "TRM Promedio") +
scale_x_date(date_labels = "%Y-%m", date_breaks = "2 months") +
theme_minimal()
# 5. Visualización: Retornos Mensuales (eliminar NA)
p2 <- ggplot(trm_mensual %>% filter(!is.na(Retorno)), aes(x = periodo, y = Retorno)) +
geom_line(color = "darkgreen", linewidth = 1) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray40") +
labs(title = "Retornos Mensuales de la TRM (log)", x = "Fecha", y = "Retorno Log") +
scale_x_date(date_labels = "%Y-%m", date_breaks = "2 months") +
theme_minimal()
# 6. Visualización: Desviación Estándar Mensual
p3 <- ggplot(trm_mensual, aes(x = periodo, y = Desviacion)) +
geom_col(fill = "tomato") +
labs(title = "Volatilidad Mensual de la TRM (Desviación Estándar)", x = "Fecha", y = "Desviación") +
scale_x_date(date_labels = "%Y-%m", date_breaks = "2 months") +
theme_minimal()
# 7. Mostrar los gráficos
print(p1)
print(p2)
print(p3)
El gráfico muestra una serie temporal de la TRM promedio mensual en Colombia desde finales de los años 90 hasta mediados de 2025. El eje vertical representa el valor promedio mensual de la tasa de cambio (COP por USD), y el eje horizontal muestra el tiempo.
Desde los niveles iniciales, por debajo de $1.000 COP/USD, se observa una tendencia creciente sostenida a lo largo de los años. Esto refleja una depreciación estructural del peso colombiano frente al dólar estadounidense a lo largo del tiempo, un fenómeno común en economías emergentes.
Hay periodos donde la TRM se incrementa rápidamente: Por ejemplo, entre 2014 y 2016, se evidencia una subida abrupta. Otro pico notable ocurre entre 2020 y 2022, coincidiendo con la pandemia de COVID-19 y tensiones geopolíticas globales. También hay fases de relativa estabilidad o retroceso, como entre 2005 y 2008, o de nuevo entre 2016 y 2019, donde la TRM parece oscilar sin romper nuevos máximos.
En el extremo derecho del gráfico (2022–2023), se alcanza el máximo histórico de la TRM, superando los $5.000 COP/USD. Esto puede asociarse con:
Inestabilidad económica global post-pandemia,
Aumento en tasas de interés de EE. UU. (repatriación de capitales),
Factores internos como reformas fiscales, incertidumbre política, etc.
Aunque la tendencia de largo plazo es ascendente, hay fluctuaciones regulares que indican volatilidad significativa en el corto y mediano plazo. Esta volatilidad podría reflejar la sensibilidad de la economía colombiana a:
Cambios en los precios del petróleo (como país exportador),
Movimientos de capital internacional,
Noticias políticas y fiscales internas.
La tendencia creciente de la TRM indica que a lo largo del tiempo, se necesitan más pesos colombianos para comprar un dólar, es decir, el peso se ha devaluado frente al dólar. Las variaciones abruptas señalan eventos importantes, útiles para análisis económico retrospectivo. Para empresas, inversionistas y planificadores financieros, este gráfico evidencia la necesidad de considerar riesgos cambiarios al operar en monedas extranjeras.
La gráfica muestra los retornos logarítmicos mensuales de la Tasa Representativa del Mercado (TRM) del dólar en Colombia. Este tipo de retorno refleja las variaciones porcentuales relativas del tipo de cambio mes a mes, usando una escala logarítmica que es común en análisis financiero debido a su estabilidad y propiedad aditiva.
La mayoría de los retornos oscilan cerca del 0%, lo que indica que en muchos meses no hubo grandes cambios acumulados en la TRM. Sin embargo, existen desviaciones tanto positivas como negativas significativas, que reflejan meses de fuerte depreciación (valores positivos) o apreciación (valores negativos) del peso colombiano frente al dólar.
Se evidencia una volatilidad no constante a lo largo del tiempo:
Hay periodos de relativa estabilidad (con retornos más cercanos a 0).
otros de alta volatilidad, donde los retornos fluctúan en un rango mucho más amplio.
Este comportamiento es característico de las series financieras, donde los eventos externos (crisis, política monetaria, precios del petróleo, etc.) pueden generar shocks.
Se observan retornos superiores al 10% mensual, que reflejan episodios de fuerte depreciación del peso (por ejemplo, crisis internacionales, decisiones de la Fed o desplome del petróleo). Igualmente, hay caídas abruptas (retornos negativos pronunciados), que indican meses en que el peso se fortaleció fuertemente frente al USD.
Aunque los valores están centrados en cero, parece haber más y mayores picos positivos, lo cual es consistente con un patrón histórico donde el peso tiende más frecuentemente a depreciarse (es decir, el USD sube) en periodos de tensión.
Se observa un comportamiento relativamente plano y estable. Esto puede indicar:
Un régimen de tipo de cambio controlado o estable,
Menores perturbaciones externas,
Baja especulación financiera.
Se observa un aumento gradual en la altura de las barras. Posibles causas:
Mayor apertura económica,
Aumento de la sensibilidad frente a precios internacionales del petróleo,
Mayor liberalización del tipo de cambio.
Múltiples picos altos a partir de 2015, siendo uno de ellos extremadamente agudo (el más alto de toda la serie). Estos picos se pueden asociar con:
Crisis del petróleo (2014–2016),
COVID-19 (2020): el mayor pico visible probablemente corresponde a marzo o abril de 2020,
Choques internacionales: inflación global, guerra Rusia-Ucrania, Cambios políticos internos: elecciones, reformas tributarias, entre otros.
Se visualiza un pico superior a 250 unidades, muy por encima del resto.
Es probable que ese valor corresponda al inicio de la pandemia por COVID-19, un evento global que generó una volatilidad sin precedentes en mercados financieros y tipo de cambio en países emergentes como Colombia.
Luego del máximo pico, la volatilidad no retorna a niveles bajos históricos. Se mantiene relativamente alta y más volátil que en décadas anteriores, lo que indica:
Mayor sensibilidad del tipo de cambio ante eventos económicos, políticos o geopolíticos,
Alta percepción de riesgo país o riesgo cambiario.
La volatilidad mensual de la TRM ha aumentado estructuralmente con el tiempo. Esto refleja una mayor integración financiera de Colombia y una mayor exposición a eventos internacionales. Los picos de volatilidad están claramente asociados a eventos extraordinarios, como crisis financieras o sanitarias. La mayor volatilidad en tiempos recientes sugiere un entorno más incierto para empresas y agentes económicos que dependen del tipo de cambio.
# --- 2. Cargar datos TRM y procesarlos ---
trm_data <- readr::read_csv("https://www.datos.gov.co/api/views/mcec-87by/rows.csv?accessType=DOWNLOAD",
show_col_types = FALSE)
trm_data <- trm_data %>%
mutate(Fecha = lubridate::dmy(VIGENCIADESDE)) %>%
select(Fecha, TRM = VALOR) %>%
arrange(Fecha)
trm_data <- trm_data %>%
group_by(Año = lubridate::year(Fecha), Mes = lubridate::month(Fecha)) %>%
summarise(TRM_promedio = mean(TRM, na.rm = TRUE), .groups = "drop") %>%
mutate(Fecha = as.Date(paste(Año, Mes, "01", sep = "-"))) %>%
arrange(Fecha)
# --- 3. Calcular parámetros históricos ---
trm_data <- trm_data %>%
mutate(Retorno_log = log(TRM_promedio / lag(TRM_promedio)))
mu <- mean(trm_data$Retorno_log, na.rm = TRUE) # Retorno promedio mensual
sigma <- sd(trm_data$Retorno_log, na.rm = TRUE) # Volatilidad mensual
# --- 4. Parámetros para la simulación ---
n_simulaciones <- 5000
n_periodos <- 24 # 24 meses
S0 <- tail(trm_data$TRM_promedio, 1) # Último valor observado
# --- 5. Simulación MGB ---
set.seed(123)
dt <- 1 # mensual
sim_matrix <- matrix(NA, nrow = n_periodos + 1, ncol = n_simulaciones)
sim_matrix[1, ] <- S0
for (t in 2:(n_periodos + 1)) {
Z <- rnorm(n_simulaciones)
sim_matrix[t, ] <- sim_matrix[t - 1, ] * exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * Z)
}
# --- 6. Visualización ---
fechas_simuladas <- seq(from = max(trm_data$Fecha) + months(1), by = "1 month", length.out = n_periodos + 1)
sim_df <- reshape2::melt(data.frame(Fecha = fechas_simuladas, sim_matrix), id.vars = "Fecha")
ggplot(sim_df, aes(x = Fecha, y = value, group = variable)) +
geom_line(alpha = 0.05, color = "purple") +
labs(title = "Simulación de Movimiento Browniano Geométrico - TRM Mensual (24 Meses)",
x = "Fecha",
y = "TRM Simulada") +
scale_y_continuous(labels = scales::dollar_format(prefix = "$")) +
scale_x_date(date_breaks = "1 month", date_labels = "%b %Y") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# --- 7. Reporte de resultados ---
cat("Valor inicial de la TRM:", round(S0, 2), "\n")
## Valor inicial de la TRM: 4225.3
cat("Promedio simulado al mes 24:", round(mean(sim_matrix[n_periodos + 1, ]), 2), "\n")
## Promedio simulado al mes 24: 4742.2
cat("Máximo proyectado:", round(max(sim_matrix[n_periodos + 1, ]), 2), "\n")
## Máximo proyectado: 8049.44
cat("Mínimo proyectado:", round(min(sim_matrix[n_periodos + 1, ]), 2), "\n")
## Mínimo proyectado: 2758.72
Este valor corresponde al último dato histórico disponible de la Tasa Representativa del Mercado (TRM) y sirve como punto de partida (S₀) para las simulaciones. Es el valor de referencia sobre el cual se proyectan las posibles trayectorias futuras.
El valor promedio simulado después de 24 meses sugiere un aumento moderado en la TRM, de aproximadamente 12.27%. Este resultado refleja la expectativa central del modelo basado en las estadísticas históricas del retorno logarítmico (μ y σ). Sin embargo, es importante recordar que se trata de una expectativa bajo un modelo estocástico, por lo tanto no garantiza un crecimiento.
En las 5,000 simulaciones, la trayectoria más alta alcanzó un valor cercano a $8,077, lo cual representa un aumento del 90.5% frente al valor inicial. Este escenario sugiere que, bajo ciertas condiciones extremas pero posibles (como una alta volatilidad acumulada), la TRM podría alcanzar valores cercanos al doble del actual.
Por otro lado, la trayectoria más baja proyectó una caída de la TRM hasta $2,768.49, una reducción del 34.7% respecto al valor actual. Esto implica que en condiciones adversas, también existe una probabilidad no despreciable de devaluación del USD frente al COP.
El modelo predice un crecimiento leve en la TRM promedio en 24 meses, lo cual sugiere una expectativa de devaluación del peso colombiano a mediano plazo, en línea con el comportamiento histórico.
El amplio rango entre el valor mínimo y máximo proyectado evidencia la alta volatilidad e incertidumbre asociada a la TRM. Es decir, aunque la tendencia central muestra un aumento, los resultados pueden variar significativamente. Utilidad práctica: Estos resultados pueden ser útiles para:
Modelar escenarios en planes financieros internacionales.
Calcular riesgos de cobertura cambiaria.
Estimar bandas para proyecciones de costos o ingresos en dólares.
# --- Parámetros del crédito ---
precio_maquinaria_usd <- 70771.4
pago_inicial_pct <- 0.15
tasa_interes_anual <- 0.08
n_meses <- 24
TRM_fija <- 4225.3
# Cálculos previos
pago_inicial_usd <- precio_maquinaria_usd * pago_inicial_pct
saldo_financiar_usd <- precio_maquinaria_usd - pago_inicial_usd
i_mensual <- (1 + tasa_interes_anual)^(1/12) - 1
cuota_mensual_usd <- saldo_financiar_usd * (i_mensual * (1 + i_mensual)^n_meses) / ((1 + i_mensual)^n_meses - 1)
# --- Simulación de TRM (MGB) ---
mu <- 0.011
sigma <- 0.043
set.seed(123)
sim_TRM <- numeric(n_meses + 1)
sim_TRM[1] <- TRM_fija
for (t in 2:(n_meses + 1)) {
Z <- rnorm(1)
sim_TRM[t] <- sim_TRM[t - 1] * exp((mu - 0.5 * sigma^2) + sigma * Z)
}
# --- Crear tabla de amortización con TRM simulada ---
fechas_pago <- seq(today() %m+% months(1), by = "1 month", length.out = n_meses)
saldo_restante <- saldo_financiar_usd
saldo_vector <- numeric(n_meses)
interes_vector <- numeric(n_meses)
abono_vector <- numeric(n_meses)
for (i in 1:n_meses) {
interes_mes <- saldo_restante * i_mensual
abono_capital <- cuota_mensual_usd - interes_mes
saldo_restante <- saldo_restante - abono_capital
interes_vector[i] <- interes_mes
abono_vector[i] <- abono_capital
saldo_vector[i] <- saldo_restante
}
tabla_amortizacion <- tibble(
Fecha = fechas_pago,
TRM = sim_TRM[-1],
Cuota_USD = rep(cuota_mensual_usd, n_meses),
Cuota_COP = cuota_mensual_usd * sim_TRM[-1],
Interés_USD = interes_vector,
Abono_Capital_USD = abono_vector,
Saldo_Pendiente_USD = saldo_vector
)
# --- Visualización de la tabla ---
print(tabla_amortizacion, n = Inf)
## # A tibble: 24 × 7
## Fecha TRM Cuota_USD Cuota_COP Interés_USD Abono_Capital_USD
## <date> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2025-06-21 4166. 2713. 11303699. 387. 2326.
## 2 2025-07-21 4167. 2713. 11305710. 372. 2341.
## 3 2025-08-21 4501. 2713. 12211863. 357. 2356.
## 4 2025-09-21 4561. 2713. 12372982. 342. 2371.
## 5 2025-10-21 4632. 2713. 12567952. 327. 2386.
## 6 2025-11-21 5037. 2713. 13666852. 311. 2402.
## 7 2025-12-21 5190. 2713. 14081590. 296. 2417.
## 8 2026-01-21 4965. 2713. 13471093. 280. 2433.
## 9 2026-02-21 4870. 2713. 13211491. 265. 2448.
## 10 2026-03-21 4826. 2713. 13091969. 249. 2464.
## 11 2026-04-21 5138. 2713. 13939270. 233. 2480.
## 12 2026-05-21 5271. 2713. 14299971. 217. 2496.
## 13 2026-06-21 5417. 2713. 14695865. 201. 2512.
## 14 2026-07-21 5498. 2713. 14915501. 185. 2528.
## 15 2026-08-21 5422. 2713. 14710704. 169. 2544.
## 16 2026-09-21 5915. 2713. 16046458. 152. 2561.
## 17 2026-10-21 6104. 2713. 16559686. 136. 2577.
## 18 2026-11-21 5666. 2713. 15370993. 119. 2594.
## 19 2026-12-21 5898. 2713. 16002036. 102. 2611.
## 20 2027-01-21 5838. 2713. 15838781. 85.6 2627.
## 21 2027-02-21 5633. 2713. 15281157. 68.7 2644.
## 22 2027-03-21 5636. 2713. 15291897. 51.7 2661.
## 23 2027-04-21 5448. 2713. 14780081. 34.6 2678.
## 24 2027-05-21 5333. 2713. 14469074. 17.3 2696.
## # ℹ 1 more variable: Saldo_Pendiente_USD <dbl>
# --- Gráfico del saldo en USD ---
ggplot(tabla_amortizacion, aes(x = Fecha, y = Saldo_Pendiente_USD)) +
geom_line(color = "firebrick", linewidth = 1.2) +
labs(title = "Evolución del Saldo del Crédito en USD",
x = "Fecha",
y = "Saldo pendiente (USD)") +
theme_minimal() +
scale_y_continuous(labels = dollar_format(prefix = "$")) +
scale_x_date(date_breaks = "1 month", date_labels = "%b-%Y") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Monto total financiado: $85,000 USD (tras pago inicial del 15%).
Tasa de interés efectiva mensual: aproximadamente 0.64%.
Cuota mensual constante en dólares: $3,834 USD.
Variabilidad del TRM (Tasa Representativa del Mercado):
Simulación de TRM fluctuante desde 4,180 COP/USD hasta 6,124 COP/USD.
La variabilidad del TRM impacta directamente la cuota en pesos colombianos, que oscila desde $16,024,332 COP hasta $23,475,316 COP.
Si el préstamo es en USD y los ingresos del deudor están en COP, la volatilidad del TRM representa un riesgo importante.
Podría evaluarse la posibilidad de coberturas financieras para mitigar el impacto de la variación cambiaria.
La estabilidad económica y posibles variaciones en la tasa de interés futura podrían influir en la conveniencia de este financiamiento
# --- Parámetros iniciales ---
S0 <- 4225.3 # Valor inicial de la TRM
mu <- log(4758.62 / S0) / 24 # Retorno medio mensual estimado
sigma <- (log(8076.72 / 2768.49)) / (2 * sqrt(24)) # Volatilidad estimada
# --- Configuración de simulación ---
set.seed(123) # Reproducibilidad
n_periodos <- 24 # Número de meses
n_simulaciones <- 5000 # Cantidad de trayectorias
dt <- 1 # Paso de tiempo mensual
# --- Simulación de Movimiento Browniano Geométrico ---
sim_matrix <- matrix(NA, nrow = n_periodos + 1, ncol = n_simulaciones)
sim_matrix[1, ] <- S0
for (t in 2:(n_periodos + 1)) {
Z <- rnorm(n_simulaciones) # Variables aleatorias normales
sim_matrix[t, ] <- sim_matrix[t - 1, ] * exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * Z)
}
# --- Convertir datos para visualización con `tidyverse` ---
fechas_simuladas <- seq(from = Sys.Date() + months(1), by = "1 month", length.out = n_periodos + 1)
sim_df <- data.frame(Fecha = fechas_simuladas, sim_matrix) %>%
pivot_longer(cols = -Fecha, names_to = "Simulación", values_to = "TRM_Simulada")
# --- Gráfico de la simulación ---
ggplot(sim_df, aes(x = Fecha, y = TRM_Simulada, group = Simulación)) +
geom_line(alpha = 0.05, color = "blue") +
labs(title = "Simulación de Movimiento Browniano Geométrico - TRM (24 Meses)",
x = "Fecha",
y = "TRM Simulada") +
scale_y_continuous(labels = scales::dollar_format(prefix = "$")) +
scale_x_date(date_breaks = "1 month", date_labels = "%b %Y") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# --- Reporte de resultados ---
cat("Valor inicial de la TRM:", round(S0, 2), "\n")
## Valor inicial de la TRM: 4225.3
cat("Promedio simulado al mes 24:", round(mean(sim_matrix[n_periodos + 1, ]), 2), "\n")
## Promedio simulado al mes 24: 4780.05
cat("Máximo proyectado:", round(max(sim_matrix[n_periodos + 1, ]), 2), "\n")
## Máximo proyectado: 31650.86
cat("Mínimo proyectado:", round(min(sim_matrix[n_periodos + 1, ]), 2), "\n")
## Mínimo proyectado: 559.01
4225.3 COP/USD es el punto de referencia tomado de los datos históricos.
Representa la tasa de cambio vigente al inicio de la simulación.
Este valor será la base sobre la cual se proyectarán los movimientos futuros.
4780.05 COP/USD indica una tendencia ligeramente alcista en los próximos dos años.
Esta estimación es el promedio de las 5,000 trayectorias generadas.
Aunque sugiere un aumento moderado en la TRM, la dispersión de valores alrededor de este promedio es significativa.
Este resultado es extremadamente alto, lo que indica que en algunos escenarios extremos la TRM podría dispararse de manera drástica.
Altísima volatilidad en la simulación, amplificando variaciones extremas.
Shock económico significativo en algunos caminos simulados.
Errores en la estimación de sigma, generando una dispersión mayor a la esperada.
Si la TRM llegara a esos niveles, implicaría una fuerte devaluación del peso colombiano, impactando importaciones, inflación y tasas de interés.
Un valor tan bajo es altamente improbable en escenarios reales.
Indicaría una super-revaluación del peso colombiano, lo que en la práctica es poco factible sin un contexto económico drástico.
Distribución sesgada en algunas trayectorias que generaron fluctuaciones extremas.
Sobreestimación de la volatilidad sigma, permitiendo escenarios extremadamente improbables.
Efectos acumulativos del modelo, que permiten eventos poco realistas en ciertos caminos.
La volatilidad en la simulación es muy alta
La diferencia entre los valores extremos (559.01 y 31,650.86) indica que la dispersión de los datos es bastante amplia.
Esto sugiere que la estimación de sigma es mayor a la que debería reflejar un comportamiento realista.
El modelo puede requerir ajustes
Se recomienda revisar el cálculo de sigma, ya que puede estar generando extremos poco realistas.
Se podría aplicar un filtro de valores extremos para mejorar la simulación.
Impacto en decisiones financieras
La dispersión en la TRM sugiere gran incertidumbre en los próximos dos años.
Empresas con exposición a dólares deberían evaluar coberturas cambiarias.
Si la TRM sube de manera significativa, el costo de importaciones aumentará y puede afectar la inflación.
Mejoras en el modelo.
En lugar de un modelo puro de Movimiento Browniano Geométrico, se podría evaluar un enfoque GARCH para modelar mejor la volatilidad.
Otra opción sería limitar la volatilidad basada en datos históricos para evitar valores atípicos.
Datos históricos del contrato FUTES hasta la simulación de su comportamiento con Movimiento Browniano Geométrico (GBM) y la visualización de los resultados para los años 6 a 10
# --- 1. Simular datos históricos ficticios para FUTES desde enero 2020 ---
set.seed(123)
fechas <- seq(from = as.Date("2020-01-02"), to = Sys.Date(), by = "day")
fechas <- fechas[weekdays(fechas) %in% c("lunes", "martes", "miércoles", "jueves", "viernes")]
precios <- numeric(length(fechas))
precios[1] <- 4200
for (i in 2:length(fechas)) {
precios[i] <- precios[i - 1] * exp(rnorm(1, mean = 0.0003, sd = 0.01))
}
futes_sintetico <- tibble(Fecha = fechas, Precio_Cierre = precios)
# Guardar archivo .csv
write.csv(futes_sintetico, "FUTES_historico.csv", row.names = FALSE)
# --- 2. Cargar y preparar los datos históricos ---
futes_data <- read.csv("FUTES_historico.csv")
futes_data$Fecha <- as.Date(futes_data$Fecha, format = "%Y-%m-%d")
futes_data <- futes_data %>% arrange(Fecha)
# --- 3. Calcular retornos y volatilidad mensual ---
futes_data <- futes_data %>%
mutate(Retorno_Diario = log(Precio_Cierre / lag(Precio_Cierre)))
futes_data_mensual <- futes_data %>%
mutate(Mes = floor_date(Fecha, "month")) %>%
group_by(Mes) %>%
summarise(Retorno_Mensual = sum(Retorno_Diario, na.rm = TRUE))
mu <- mean(futes_data_mensual$Retorno_Mensual, na.rm = TRUE)
sigma <- sd(futes_data_mensual$Retorno_Mensual, na.rm = TRUE)
cat("Parámetros para simulación GBM:\n")
## Parámetros para simulación GBM:
cat("Media mensual (mu):", round(mu, 4), "\n")
## Media mensual (mu): 0.0093
cat("Desviación estándar mensual (sigma):", round(sigma, 4), "\n\n")
## Desviación estándar mensual (sigma): 0.0427
# --- 4. Simular precios futuros con Movimiento Browniano Geométrico ---
n_meses <- 120 # 10 años
n_simulaciones <- 10
S0 <- tail(futes_data$Precio_Cierre, 1)
set.seed(123)
simulaciones <- matrix(NA, nrow = n_meses + 1, ncol = n_simulaciones)
simulaciones[1, ] <- S0
for (j in 1:n_simulaciones) {
for (i in 2:(n_meses + 1)) {
Z <- rnorm(1)
simulaciones[i, j] <- simulaciones[i - 1, j] * exp((mu - 0.5 * sigma^2) + sigma * Z)
}
}
# --- 5. Preparar DataFrame para graficar ---
fechas_simuladas <- seq(from = today() %m+% months(1), by = "1 month", length.out = n_meses + 1)
# Nombrar columnas como Sim1, Sim2, ..., Sim10
colnames(simulaciones) <- paste0("Sim", 1:n_simulaciones)
simulaciones_df <- as_tibble(simulaciones) %>%
mutate(Fecha = fechas_simuladas) %>%
pivot_longer(cols = -Fecha, names_to = "Simulacion", values_to = "Precio")
# Filtrar años 6 a 10
simulaciones_df <- simulaciones_df %>%
filter(Fecha >= today() %m+% months(60))
# --- 6. Visualizar trayectorias simuladas ---
ggplot(simulaciones_df, aes(x = Fecha, y = Precio, color = Simulacion)) +
geom_line(alpha = 0.8, linewidth = 1.1) +
labs(title = "Simulación GBM del Futuro FUTES (Años 6 a 10)",
subtitle = "Basado en datos simulados y Movimiento Browniano Geométrico",
x = "Fecha",
y = "Precio simulado del Futuro FUTES (COP)",
color = "Trayectoria") +
theme_minimal() +
scale_y_continuous(labels = dollar_format(prefix = "$")) +
scale_x_date(date_labels = "%b-%Y", date_breaks = "6 months") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
Este valor indica que, en promedio, se espera que el precio del futuro FUTES crezca 0.93% cada mes (en términos logarítmicos).
A nivel anual (aproximado), esto se traduce en un retorno compuesto de:
( 1 + 0.0093 ) 12 − 1 ≈ 11.77 % (1+0.0093) 12 −1≈11.77% Interpretación:
Si las condiciones históricas se mantienen, el modelo sugiere que el precio del futuro podría aumentar alrededor de 11.8% anual en promedio, lo que refleja una tendencia creciente moderada.
Esta es una medida de volatilidad, es decir, cuánta variación (incertidumbre) existe respecto al retorno mensual promedio.
En términos de retorno mensual, el intervalo típico esperado es:
𝜇 ± 𝜎 = 0.0093 ± 0.0427 ⇒ [ − 3.34 % , + 5.2 %] μ±σ=0.0093±0.0427⇒[−3.34%,+5.2%] En condiciones normales, alrededor del 68% de los meses tendrían retornos entre -3.34% y +5.2%.
A nivel anual, la volatilidad compuesta es aproximadamente:
𝜎 𝑎 𝑛 𝑢 𝑎 𝑙 ≈ 𝜎 × 12 ≈ 0.0427 × 3.464 ≈ 0.148 ⇒ 14.8 % σ anual ≈σ× 12 ≈0.0427×3.464≈0.148⇒14.8%
El modelo proyecta una volatilidad anual del 14.8%, lo que representa un riesgo razonablemente moderado, comparable a activos financieros tradicionales (como acciones estables o ETF de renta variable).
La fórmula usada para simular la evolución del precio mensual del futuro es:
𝑆 𝑡 + 1 = 𝑆 𝑡 ⋅ exp ( ( 𝜇 − 1 2 𝜎 2 ) + 𝜎 𝑍 𝑡 ) S t+1 =S t ⋅exp((μ− 2 1 σ 2 )+σZ t ) Con:
𝜇= 0.0093
𝜎= 0.0427
El término 𝜇 − 1 2 𝜎 2 ≈ 0.0093 − 0.0009 = 0.0084 μ− 2 1 σ 2 ≈0.0093−0.0009=0.0084 Este es el drift ajustado por riesgo, es decir, la tasa de crecimiento promedio esperada después de considerar la penalización por volatilidad.
Crecimiento esperado: Hay una expectativa de crecimiento sostenido en el precio del futuro FUTES, cercano al 1% mensual. Riesgo moderado: Aunque hay incertidumbre, el rango de fluctuación mensual sugiere que la mayoría de los movimientos no son extremos. Uso estratégico:
Este perfil de crecimiento/volatilidad puede ser atractivo para estrategias de cobertura cambiaria, ya que se espera una apreciación ordenada.
También puede apoyar el análisis de decisiones de inversión de largo plazo, como importaciones o adquisiciones en dólares, protegidas mediante derivados.
Los parámetros estimados (μ = 0.0093 y σ = 0.0427) representan un escenario moderadamente optimista para el futuro FUTES. La simulación con GBM genera trayectorias que reflejan este comportamiento con incertidumbre realista. A pesar de las limitaciones del modelo, estas cifras permiten construir escenarios útiles para análisis financiero, decisiones estratégicas y modelado de riesgo.
Se han simulado 10 trayectorias mensuales de precios del futuro FUTES utilizando un modelo de Movimiento Browniano Geométrico (GBM). La simulación cubre un horizonte de 10 años (120 meses), pero solo se visualizan los últimos 5 años (años 6 a 10). Se parte de un precio inicial simulado (último valor histórico ficticio) cercano a los COP $4,200. Los parámetros del GBM se estimaron a partir de datos ficticios generados para el futuro FUTES desde enero de 2020 hasta la fecha actual, con los siguientes valores:
Media mensual de los retornos logarítmicos: mu
Desviación estándar mensual (volatilidad): sigma
El gráfico presenta trayectorias individuales etiquetadas como Sim1, Sim2, …, Sim10, lo que permite comparar distintos posibles caminos del precio del futuro. Las trayectorias muestran un comportamiento estocástico creciente y decreciente, con variación considerable entre escenarios. A medida que avanza el tiempo, las trayectorias tienden a divergir más, lo cual es característico de la propiedad de dispersión del GBM: Cuanto más largo el horizonte, mayor la incertidumbre acumulada.
Algunas trayectorias muestran una tendencia creciente (efecto de la media positiva de retornos), mientras que otras fluctúan o incluso decrecen, lo cual es natural en un modelo de este tipo. Los valores proyectados a 10 años presentan un rango amplio de posibles precios futuros, desde niveles cercanos al actual hasta valores mucho mayores o menores, dependiendo del camino aleatorio tomado.
El GBM modela la evolución del precio 𝑆 𝑡 S t como:
𝑆 𝑡 + Δ 𝑡 = 𝑆 𝑡 ⋅ exp ( ( 𝜇 − 1 2 𝜎 2 ) Δ 𝑡 + 𝜎 ⋅ 𝑍 ⋅ Δ 𝑡 ) S t+Δt =S t ⋅exp((μ− 2 1 σ 2 )Δt+σ⋅Z⋅ Δt ) Donde:
𝜇= Retorno esperado mensual
𝜎= Volatilidad mensual
𝑍= Variable aleatoria estándar normal
Esto implica que los precios simulados siguen una distribución log-normal, lo que explica:
La asimetría positiva en los precios.
La posibilidad de grandes aumentos pero nunca precios negativos (una propiedad realista).
El GBM asume retornos log-normales e independientes, lo cual puede no capturar completamente:
Cambios estructurales del mercado
Eventos de cola (crisis, intervenciones regulatorias)
Riesgo de base o efectos del vencimiento de futuros
No se incorporan factores fundamentales como tasas de interés, inflación, ni vencimientos explícitos de contratos de futuros, aunque estos pueden impactar de forma significativa la valuación real.
El resultado es útil para:
Visualizar escenarios futuros del precio del FUTES.
Realizar análisis de riesgo y stress testing.
Simular coberturas de riesgo cambiario o de tasa.
Evaluar estrategias de inversión basadas en diferentes trayectorias del activo subyacente.
La simulación GBM del Futuro FUTES para los años 6 a 10 proporciona una herramienta poderosa para explorar posibles comportamientos del precio futuro bajo incertidumbre. Aunque simplificado, este enfoque puede ser el primer paso para análisis más sofisticados, como la incorporación de riesgo de base, vencimientos de contratos, o modelos con saltos y volatilidad estocástica.
Con base en el análisis previo de la simulación del futuro FUTES y la información disponible sobre los requisitos de margen en la Bolsa de Valores de Colombia (BVC), se pueden establecer los siguientes criterios para la exposición total, margen inicial y margen de mantenimiento:
La exposición total representa el valor nominal de la posición en contratos de futuros. En el caso del futuro FUTES sobre la Tasa Representativa del Mercado (TRM), cada contrato estándar tiene un tamaño de USD 50,000.
Si un inversionista adquiere 2 contratos, la exposición total sería:
2 contratos × 50 , 000 USD/contrato = 100 , 000 USD 2 contratos×50,000USD/contrato=100,000USD
Convertido a pesos colombianos (COP) utilizando una TRM de, por ejemplo, $4,200 COP/USD:
100 , 000 USD × 4 , 200 COP/USD = 420 , 000 , 000 COP 100,000USD×4,200COP/USD=420,000,000COP
El margen inicial es el depósito requerido para abrir una posición en contratos de futuros y sirve como garantía para cubrir posibles pérdidas. Según la información disponible, para futuros sobre divisas como el FUTES, el margen inicial suele ser del 6% del valor total del contrato.
Exposicion Total × 6 % Margen Inicial = Exposicion Total × 6 %
420 , 000 , 000 COP × 0.06 = 25 , 200 , 000 COP 420,000,000COP×0.06=25,200,000COP
Este monto debe ser depositado al momento de abrir la posición.
El margen de mantenimiento es el saldo mínimo que debe mantenerse en la cuenta del inversionista mientras la posición esté abierta. Generalmente, este margen es entre el 75% y el 80% del margen inicial.
Margen Inicial × 75 % Margen de Mantenimiento=Margen Inicial×75% Scribd
25 , 200 , 000 COP × 0.75 = 18 , 900 , 000 COP 25,200,000COP×0.75=18,900,000COP
Si el saldo de la cuenta cae por debajo de este nivel debido a pérdidas, se realizará un llamado al margen, solicitando al inversionista que deposite fondos adicionales para restaurar el nivel del margen inicial.
En el análisis previo, se estimó una media mensual de retornos logarítmicos (μ) de 0.0093 y una desviación estándar mensual (σ) de 0.0427. Estos valores indican una volatilidad moderada en el precio del futuro FUTES. La volatilidad estimada justifica un margen inicial del 6%, ya que proporciona una cobertura adecuada contra las fluctuaciones esperadas en el mercado. El margen de mantenimiento establecido al 75% del margen inicial permite gestionar el riesgo de manera eficiente, asegurando que se disponga de fondos suficientes para cubrir pérdidas potenciales sin requerir llamadas al margen frecuentes. Scribd
# --- 1. Simulación de TRM diaria con GBM desde enero 2020 ---
set.seed(123)
start_date <- as.Date("2020-01-02")
end_date <- Sys.Date()
fechas <- seq(from = start_date, to = end_date, by = "day")
fechas_habiles <- fechas[weekdays(fechas) %in% c("lunes", "martes", "miércoles", "jueves", "viernes")]
n <- length(fechas_habiles)
mu <- 0.0093
sigma <- 0.0427
dt <- 1/21
trm <- numeric(n)
trm[1] <- 4200
for (t in 2:n) {
z <- rnorm(1)
trm[t] <- trm[t - 1] * exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * z)
}
trm_series <- tibble(Fecha = fechas_habiles, TRM = trm)
# --- 2. Rebalanceo mensual con rollover y cambio de posición ---
contract_size_usd <- 50000
position <- 1 # 1: long, -1: short
cash_flows <- list()
position_log <- list()
fechas_mensuales <- seq(from = floor_date(start_date, "month"), to = end_date, by = "month")
fechas_mensuales <- fechas_mensuales + months(1) - days(1) # últimos días del mes
fechas_mensuales <- fechas_mensuales[fechas_mensuales %in% trm_series$Fecha]
for (i in 2:length(fechas_mensuales)) {
entry_date <- fechas_mensuales[i - 1]
exit_date <- fechas_mensuales[i]
entry_trm <- trm_series$TRM[trm_series$Fecha == entry_date]
exit_trm <- trm_series$TRM[trm_series$Fecha == exit_date]
position_value_entry <- position * contract_size_usd * entry_trm
position_value_exit <- position * contract_size_usd * exit_trm
pnl <- position_value_exit - position_value_entry
cash_flows[[i - 1]] <- tibble(Fecha = exit_date,
Flujo_Caja_Margen = pnl,
Posicion = position)
position_log[[i - 1]] <- tibble(Fecha_Entrada = entry_date,
Fecha_Salida = exit_date,
TRM_Entrada = entry_trm,
TRM_Salida = exit_trm,
PnL = pnl,
Nueva_Posicion = ifelse(exit_trm > entry_trm, -position, position))
position <- ifelse(exit_trm > entry_trm, -position, position)
}
cash_flow_df <- bind_rows(cash_flows) %>%
mutate(Flujo_Acumulado = cumsum(Flujo_Caja_Margen))
position_log_df <- bind_rows(position_log)
# --- 3. Mostrar resultados finales ---
tail(cash_flow_df)
## # A tibble: 6 × 4
## Fecha Flujo_Caja_Margen Posicion Flujo_Acumulado
## <date> <dbl> <dbl> <dbl>
## 1 2024-10-31 -29662730. -1 -94771835.
## 2 2024-12-31 13574215. 1 -81197620.
## 3 2025-01-31 -17331694. -1 -98529314.
## 4 2025-02-28 -28914039. 1 -127443352.
## 5 2025-03-31 12298748. 1 -115144604.
## 6 2025-04-30 2603659. -1 -112540945.
tail(position_log_df)
## # A tibble: 6 × 6
## Fecha_Entrada Fecha_Salida TRM_Entrada TRM_Salida PnL Nueva_Posicion
## <date> <date> <dbl> <dbl> <dbl> <dbl>
## 1 2024-09-30 2024-10-31 7952. 8546. -29662730. 1
## 2 2024-10-31 2024-12-31 8546. 8817. 13574215. -1
## 3 2024-12-31 2025-01-31 8817. 9164. -17331694. 1
## 4 2025-01-31 2025-02-28 9164. 8585. -28914039. 1
## 5 2025-02-28 2025-03-31 8585. 8831. 12298748. -1
## 6 2025-03-31 2025-04-30 8831. 8779. 2603659. -1
El flujo acumulado muestra una tendencia negativa constante, pasando de -$94.8 millones en octubre 2024 a -$112.5 millones en abril 2025. Esto indica que la estrategia ha tenido un desempeño negativo en este período.
La estrategia parece ser de “momentum” donde se toma una posición larga si la TRM sube y corta si la TRM baja.
La posición cambia cuando la TRM de salida es mayor que la de entrada (Nueva_Posicion = -Posicion_actual).
La estrategia ha tenido un desempeño negativo en el período analizado, con un flujo acumulado de -$112.5 millones. Las pérdidas más significativas ocurrieron en octubre 2024 (-$29.7M) y febrero 2025 (-$28.9M).
La estrategia de momentum no parece estar funcionando bien en este período. En varios casos, la estrategia toma posiciones que resultan en pérdidas:
La estrategia actual cambia la posición cuando la TRM sube, lo que parece contraproducente.
Incorporar indicadores técnicos adicionales para tomar decisiones de posición. Optimizar el tamaño del contrato: Evaluar si el tamaño del contrato de USD 50,000 es adecuado para el nivel de volatilidad de la TRM.
Añadir mecanismos de stop-loss para limitar las pérdidas en posiciones perdedoras.
El análisis muestra que la estrategia actual de trading basada en el movimiento de la TRM no ha sido efectiva en el período analizado, resultando en pérdidas significativas. Se recomienda revisar y ajustar la lógica de la estrategia, posiblemente incorporando más indicadores técnicos y mecanismos de gestión de riesgo para mejorar su desempeño.
Se asume que el valor de la maquinaria amarilla fue pagado mediante un crédito en USD. Pagos mensuales en pesos (COP) durante un periodo (48 meses) usando la TRM simulada al momento de pago. Este flujo en pesos varía dependiendo de la TRM => genera riesgo cambiario.
# --- 1. Simular flujo del crédito en USD pagado en pesos (TRM simulada) ---
valor_maquinaria_usd <- 50000
plazo_meses <- length(cash_flow_df$Fecha) # mismo número de meses que cobertura
tasa_interes_anual <- 0.08
tasa_mensual <- (1 + tasa_interes_anual)^(1/12) - 1
# Cuota mensual fija en USD (sistema francés)
cuota_usd <- valor_maquinaria_usd * tasa_mensual / (1 - (1 + tasa_mensual)^(-plazo_meses))
# Simular pagos mensuales en COP
credito_df <- cash_flow_df %>%
mutate(
Cuota_USD = cuota_usd,
Pago_Pesos = Cuota_USD * trm_series$TRM[match(Fecha, trm_series$Fecha)],
Flujo_Sin_Cobertura = cumsum(Pago_Pesos),
Flujo_Cubierto = Flujo_Sin_Cobertura + cumsum(Flujo_Caja_Margen) # se suma porque los futuros compensan
)
# --- 2. Gráfico comparativo ---
credito_long <- credito_df %>%
select(Fecha, Flujo_Sin_Cobertura, Flujo_Cubierto) %>%
tidyr::pivot_longer(cols = c(Flujo_Sin_Cobertura, Flujo_Cubierto),
names_to = "Tipo",
values_to = "Flujo_Total")
ggplot(credito_long, aes(x = Fecha, y = Flujo_Total, color = Tipo)) +
geom_line(linewidth = 1.2) +
scale_color_manual(values = c("Flujo_Sin_Cobertura" = "firebrick", "Flujo_Cubierto" = "forestgreen"),
labels = c("Flujo sin cobertura", "Flujo con cobertura")) +
labs(title = "Comparación del Flujo Total del Crédito: Con vs Sin Cobertura",
x = "Fecha",
y = "Flujo acumulado en pesos (COP)",
color = "Escenario") +
theme_minimal()
Dependiendo de cómo se comportó la TRM simulada y cómo reaccionó la estrategia de cobertura:
Si el “Flujo con cobertura” termina siendo menor (más bajo) que el “Flujo sin cobertura”, significa que la estrategia de futuros fue exitosa y protegió frente a depreciaciones del peso.
Si el flujo con cobertura es más alto o igual, la estrategia no fue beneficiosa.
En el escenario simulado, el flujo acumulado del crédito sin cobertura se incrementó rápidamente durante los meses en los que la TRM subió, aumentando los pagos en pesos. Al implementar una estrategia de futuros (en largo o en corto), el flujo cubierto mostró una compensación parcial, lo cual ayudó a reducir la exposición al riesgo cambiario. Aunque la estrategia no eliminó por completo el riesgo, sí permitió absorber parte de la volatilidad. Sin embargo, en ciertos meses donde la TRM bajó y se mantuvo la posición long, se generaron pérdidas en los contratos futuros. Esto sugiere que la estrategia basada en reversión puede no ser óptima, y una estrategia basada en tendencia o con cobertura estática (ej. siempre long) podría compararse para validar cuál es más eficaz.
Wilkinson PC. (2025). Análisis del año 2025 - Dólar TRM histórico Colombia. Recuperado de https://dolar.wilkinsonpc.com.co/2025
Banco de la República. (abril, 2025). Informe de Política Monetaria. Recuperado de https://www.banrep.gov.co/es/publicaciones-investigaciones/informe-politica-monetaria/abril-2025
Bancolombia. (2025). Actualización de proyecciones económicas para Colombia 2025. Recuperado de https://www.bancolombia.com/empresas/capital-inteligente/actualidad-economica-sectorial/perspectivas-economicas-2025
BBVA Research. (marzo, 2025). Situación Colombia. Recuperado de https://www.bbvaresearch.com/publicaciones/situacion-colombia-marzo-2025
Corficolombiana. (2025). Proyecciones económicas 2025: El precio de la incertidumbre. Recuperado de https://investigaciones.corficolombiana.com/macroeconomia-y-mercados/informe-semanal/proyecciones-economicas-2025-el-precio-de-la-incertidumbre/informe_1641330
Diario La República. (enero, 2025). Para este primer trimestre de 2025, los analistas proyectan una TRM sobre los $4.400. Recuperado de https://www.larepublica.co/finanzas/para-este-primer-trimestre-de-2025-los-analistas-proyectan-una-trm-sobre-los-4-400-4035771