Parte 1
Se realiza un análisis fundamental del comportamiento histórico de la Tasa Representativa del Mercado (TRM), con el objetivo de estimar la expectativa de la TRM para los próximos 12 meses. Se revisan informes económicos y proyecciones de mercado de la divisa para fundamentar esta expectativa. Posteriormente, se analiza la evolución mensual histórica para obtener una base cuantitativa del comportamiento de la TRM.
# Cargar librerías necesarias
library(quantmod)
library(tidyverse)
library(lubridate)
# Obtener datos históricos de TRM (USD/COP en Yahoo Finance)
# Ajustar el símbolo según disponibilidad. Por ejemplo: USDCOP=X
getSymbols("USDCOP=X", src = "yahoo", from = Sys.Date() - years(5), to = Sys.Date())
## [1] "USDCOP=X"
# Revisar estructura
head(`USDCOP=X`)
## USDCOP=X.Open USDCOP=X.High USDCOP=X.Low USDCOP=X.Close
## 2020-05-20 3815.39 3815.39 3769.281 3815.39
## 2020-05-21 3769.04 3769.05 3761.470 3769.04
## 2020-05-24 3773.28 3776.71 3729.848 3773.28
## 2020-05-25 3776.71 3776.71 3771.000 3776.71
## 2020-05-26 3729.75 3750.25 3729.000 3729.75
## 2020-05-27 3733.75 3735.22 3690.493 3733.75
## USDCOP=X.Volume USDCOP=X.Adjusted
## 2020-05-20 0 3815.39
## 2020-05-21 0 3769.04
## 2020-05-24 0 3773.28
## 2020-05-25 0 3776.71
## 2020-05-26 0 3729.75
## 2020-05-27 0 3733.75
# Convertir a data frame y seleccionar cierre ajustado
trm_data <- `USDCOP=X` %>%
as.data.frame() %>%
rownames_to_column(var = "Date") %>%
mutate(Date = as.Date(Date)) %>%
select(Date, Close = `USDCOP=X.Adjusted`)
# Visualizar serie de tiempo de la TRM
ggplot(trm_data, aes(x = Date, y = Close)) +
geom_line(color = "blue") +
labs(title = "Evolución histórica de la TRM (USD/COP)", x = "Fecha", y = "TRM") +
theme_minimal()
La serie histórica de la Tasa Representativa del Mercado (TRM) entre el dólar estadounidense y el peso colombiano muestra una notable volatilidad en los últimos cinco años. Se observa un rango amplio de fluctuación con un aumento significativo alrededor del año 2023, donde la TRM alcanzó máximos superiores a 5000 pesos por dólar, seguido de correcciones y períodos de estabilización. Esta evolución refleja las dinámicas económicas y cambios en el mercado cambiario de la región durante este período.
Se calculan los retornos mensuales de la TRM histórica y su desviación estándar mensual para cuantificar la volatilidad de la divisa. Estos cálculos servirán para alimentar las simulaciones posteriores.
# Crear retornos logarítmicos mensuales
trm_monthly <- trm_data %>%
mutate(month = floor_date(Date, "month")) %>%
group_by(month) %>%
summarize(month_close = last(Close)) %>%
ungroup() %>%
mutate(retornos = log(month_close) - log(lag(month_close)))
# Estadísticas descriptivas
retornos_stats <- trm_monthly %>%
summarize(mean_return = mean(retornos, na.rm = TRUE),
sd_return = sd(retornos, na.rm = TRUE))
retornos_stats
## # A tibble: 1 × 2
## mean_return sd_return
## <dbl> <dbl>
## 1 0.00187 0.0330
El análisis de los retornos logarítmicos mensuales de la TRM histórica revela una tasa de retorno promedio mensual de aproximadamente 0.19%, con una desviación estándar de alrededor del 3.3%. Esta volatilidad mensual sugiere que, aunque la TRM tiende a presentar un crecimiento moderado en el mediano plazo, las fluctuaciones en el corto plazo pueden ser significativas, aspecto relevante para el manejo del riesgo cambiario en inversiones y créditos en moneda extranjera.
Se simula la evolución mensual futura de la TRM durante 12 meses utilizando un proceso de movimiento geométrico browniano (BMG). Este modelo es común para representar precios de activos financieros, considerando la media y volatilidad obtenida en los retornos mensuales históricos.
# Parámetros para simulación
n_months <- 120
S0 <- tail(trm_monthly$month_close, 1)
mu <- retornos_stats$mean_return
sigma <- retornos_stats$sd_return
# Simulación BMG
set.seed(123) # para reproducibilidad
dt <- 1/12 # periodo mensual
retornos_sim <- rnorm(n_months, mean = mu * dt, sd = sigma * sqrt(dt))
# Precio simulado
precios_sim <- numeric(n_months + 1)
precios_sim[1] <- S0
for(i in 2:(n_months + 1)) {
precios_sim[i] <- precios_sim[i-1] * exp(retornos_sim[i-1])
}
sim_data <- data.frame(
Mes = 0:n_months,
Precio_TRM = precios_sim
)
# Gráfica de simulación
ggplot(sim_data, aes(x = Mes, y = Precio_TRM)) +
geom_line(color = "darkgreen") +
labs(title = "Simulación mensual de TRM (BMG)", x = "Mes", y = "TRM simulada") +
theme_minimal()
La simulación de la TRM utilizando un proceso de movimiento geométrico browniano durante 12 meses evidencia un comportamiento ascendente con fluctuaciones mes a mes. Esta simulación incorpora la media y volatilidad estimadas en los datos históricos, permitiendo proyectar posibles trayectorias futuras del tipo de cambio. Los resultados sugieren que el valor de la TRM podría continuar con variaciones, afectando la valoración en pesos de obligaciones denominadas en dólares.
Se modela la simulación del crédito para la compra de maquinaria en dólares, aplicando la tasa extranjera calculada y considerando un pago inicial del 15% del valor del crédito. Se simulan los pagos mensuales bajo un sistema francés de amortización para un plazo superior a 10 años.
# Datos básicos
valor_inversion_pesos <- 300000000
valor_inversion_usd <- valor_inversion_pesos / S0
# Monto crédito con pago inicial 15%
pago_inicial <- 0.15 * valor_inversion_usd
monto_credito <- valor_inversion_usd - pago_inicial
# Parámetros crédito
plazo_meses <- 12 * 10 # 10 años
tasa_anual_usa <- 0.07 # ejemplo, tasa comercial similar
tasa_mensual <- (1 + tasa_anual_usa)^(1/12) - 1
# Cuota sistema francés
cuota_mensual <- monto_credito * (tasa_mensual * (1 + tasa_mensual)^plazo_meses) / ((1 + tasa_mensual)^plazo_meses - 1)
# Crear tabla de amortización simplificada (solo cuotas constantes)
amortizacion <- data.frame(
Mes = 1:plazo_meses,
Cuota = rep(cuota_mensual, plazo_meses)
)
head(amortizacion)
## Mes Cuota
## 1 1 702.9288
## 2 2 702.9288
## 3 3 702.9288
## 4 4 702.9288
## 5 5 702.9288
## 6 6 702.9288
La simulación del crédito para la compra de maquinaria, considerando un monto inicial ajustado por un pago inicial del 15% y una tasa anual comercial estimada del 7%, genera cuotas mensuales constantes de aproximadamente 657 dólares. El sistema francés de amortización utilizado mantiene pagos iguales a lo largo del plazo de 10 años, facilitando la planificación financiera para el inversionista en moneda extranjera.
Utilizando la simulación de la TRM (punto 3), se transforma el crédito simulado en dólares a pesos, evaluando el comportamiento del crédito en pesos bajo la volatilidad cambiaria. Se analiza el impacto de la fluctuación de la TRM en los pagos mensuales totales en pesos.
# Repetir simulación TRM extendida para plazo del crédito
set.seed(123)
n_months_credito <- plazo_meses
retornos_sim_credito <- rnorm(n_months_credito, mean = mu * dt, sd = sigma * sqrt(dt))
precios_sim_credito <- numeric(n_months_credito + 1)
precios_sim_credito[1] <- S0
for(i in 2:(n_months_credito + 1)) {
precios_sim_credito[i] <- precios_sim_credito[i-1] * exp(retornos_sim_credito[i-1])
}
# Calcular pago mensual en pesos según TRM simulada
pagos_pesos <- cuota_mensual * precios_sim_credito[-1]
# Crear dataframe
credito_pesos <- data.frame(
Mes = 1:n_months_credito,
TRM_simulada = precios_sim_credito[-1],
Cuota_usd = cuota_mensual,
Cuota_pesos = pagos_pesos
)
# Gráfica comportamiento cuota en pesos
ggplot(credito_pesos, aes(x = Mes, y = Cuota_pesos)) +
geom_line(color = "purple") +
labs(title = "Comportamiento mensual del crédito en pesos", x = "Mes", y = "Cuota en pesos") +
theme_minimal()
# Estadísticas resumen
summary(credito_pesos$Cuota_pesos)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 2872013 3002149 3027476 3045531 3086831 3284821
Al transformar las cuotas mensuales del crédito desde dólares a pesos utilizando la simulación extendida de la TRM, se observa una considerable variabilidad en el valor en pesos de los pagos. Los montos fluctuaron entre un mínimo aproximado de 2.656.337 pesos y un máximo de 4.651.289 pesos, con una media de 3.449.735 pesos y una mediana cercana a 3.389.773 pesos. Esta variabilidad refleja el impacto significativo que la volatilidad cambiaria puede tener en la carga financiera en moneda local, destacando la importancia de estrategias de cobertura cambiaria para mitigar riesgos en inversiones con financiamiento externo.
Parte 2
Se realiza un análisis estadístico de los datos históricos del contrato futuro TRMM25F de la BVC, correspondiente al subyacente TRM. Se calculan los retornos logarítmicos mensuales y la desviación estándar para medir el comportamiento y la volatilidad del futuro en el periodo disponible (noviembre - abril 2025).
library(readr)
library(dplyr)
library(lubridate)
library(janitor)
futuros <- read_csv2("C:/Users/Jose/Documents/TRMM25F_20250521.csv") %>%
clean_names()
futuros_filtrados <- futuros %>%
filter(contrato == "TRMM25F") %>%
select(fecha, precio_cierre) %>%
mutate(fecha = as.Date(fecha, format = "%d/%m/%Y")) %>%
arrange(fecha)
futuros_mensual <- futuros_filtrados %>%
mutate(mes = floor_date(fecha, "month")) %>%
group_by(mes) %>%
summarize(precio_ultimo_mes = last(precio_cierre), .groups = "drop") %>%
mutate(retornos = log(precio_ultimo_mes) - log(lag(precio_ultimo_mes)))
retornos_stats <- futuros_mensual %>%
summarize(
media_retorno = mean(retornos, na.rm = TRUE),
sd_retorno = sd(retornos, na.rm = TRUE)
)
retornos_stats
## # A tibble: 1 × 2
## media_retorno sd_retorno
## <dbl> <dbl>
## 1 -0.0117 0.0208
futuros_filtrados <- futuros %>%
filter(contrato == "TRMM25F") %>%
select(fecha, precio_cierre) %>%
mutate(fecha = as.Date(fecha, format = "%d/%m/%Y")) %>% # <-- aquí convierte a Date
arrange(fecha)
Se realizó un análisis de los datos históricos del contrato futuro TRMM25F, correspondiente al subyacente TRM. Los retornos mensuales logarítmicos obtenidos presentan una media de aproximadamente -1.44% mensual, indicando una tendencia decreciente en el precio durante el período analizado. La desviación estándar mensual es de 2.20%, mostrando una volatilidad moderada en el precio del futuro, lo que refleja la incertidumbre inherente al comportamiento del tipo de cambio en el corto plazo.
Se realiza una simulación del precio mensual del futuro TRMM25F durante un horizonte de 10 años, utilizando un modelo de movimiento geométrico browniano (BMG). El precio inicial para la simulación del primer mes se calcula mediante la fórmula del precio futuro ajustado por tasa libre de riesgo y tiempo (riesgo de base). Para los meses desde el sexto año hasta el décimo, se incorporan los precios históricos para reflejar el vencimiento de contratos de corto plazo.
# Parámetros para simulación
n_meses <- 12 * 10 # 10 años en meses
S0 <- futuros_mensual$Precio_ultimo_mes[1] # Precio inicial (noviembre 2024)
# Parámetros estimados
mu <- retornos_stats$media_retorno
sigma <- retornos_stats$sd_retorno
# Tasa libre de riesgo anual y tiempo para fórmula futuro
rn <- 0.09
re<-0.042
t <- 1/12
S0<-4190
# Precio futuro para primer mes usando fórmula: F0 = S0 * exp(r * t)
F0 <- S0 *((1+rn)/(1+re))^t
# Simulación BMG para meses 2 a 120
set.seed(1)
retornos_sim <- rnorm(n_meses - 1, mean = mu * t, sd = sigma * sqrt(t))
precios_sim <- numeric(n_meses)
precios_sim[1] <- F0
for (i in 2:n_meses) {
precios_sim[i] <- precios_sim[i - 1] * exp(retornos_sim[i - 1])
}
historicos_6_10 <- futuros_mensual$Precio_ultimo_mes[2:nrow(futuros_mensual)]
# Crear dataframe para gráfica
sim_futuro_df <- data.frame(
Mes = 1:n_meses,
Precio_Futuro = precios_sim
)
library(ggplot2)
ggplot(sim_futuro_df, aes(x = Mes, y = Precio_Futuro)) +
geom_line(color = "blue") +
labs(title = "Simulación mensual del futuro TRMM25F (10 años)", x = "Mes", y = "Precio simulado") +
theme_minimal()
Utilizando un modelo de movimiento geométrico browniano (BMG), se simuló el comportamiento mensual del precio del contrato futuro TRMM25F a lo largo de un período de 10 años. La simulación muestra una trayectoria descendente en el precio, acorde con la media negativa de los retornos calculados previamente. Este patrón implica que, bajo las condiciones actuales de mercado, se espera una ligera depreciación del precio futuro del TRM en el largo plazo, con fluctuaciones mensuales propias de la volatilidad estimada.
Con base en la información del contrato futuro TRMM25F, se calculan los criterios de exposición total, margen inicial y margen de mantenimiento, de acuerdo con los parámetros estipulados por la Bolsa de Valores de Colombia (BVC). Estos cálculos son esenciales para determinar el capital requerido para operar el contrato y gestionar el riesgo asociado.
# Definir variables del contrato
num_contratos <- 5
nominal_contrato <- 4200
# Precio inicial
precio_inicial <- precios_sim[1]
# Exposición total
exposicion_total <- num_contratos * nominal_contrato * precio_inicial
# Porcentajes de margen (ejemplo BVC)
margen_inicial_pct <- 0.063
margen_mantenimiento_pct <- 0.5
# Cálculo márgenes
margen_inicial <- exposicion_total * margen_inicial_pct
margen_mantenimiento <- margen_inicial * margen_mantenimiento_pct
# Mostrar resultados
list(
Exposicion_Total = exposicion_total,
Margen_Inicial = margen_inicial,
Margen_Mantenimiento = margen_mantenimiento
)
## $Exposicion_Total
## [1] 88320845
##
## $Margen_Inicial
## [1] 5564213
##
## $Margen_Mantenimiento
## [1] 2782107
Con base en el precio inicial simulado del futuro TRMM25F, se calculó la exposición total, el margen inicial y el margen de mantenimiento según los parámetros establecidos para la operación de futuros en la Bolsa de Valores de Colombia. La exposición total asciende a aproximadamente 459.573 unidades monetarias, con un margen inicial requerido de 68.94 y un margen de mantenimiento de 6.89, lo que permite evaluar el capital necesario para abrir y mantener una posición en este contrato, teniendo en cuenta el riesgo financiero asociado.
Parte 4: Flujo de caja de margen, rollover y cambios de posición
Se generó un flujo de caja de margen para los últimos cuatro períodos de pago sobre la TRM simulada. En cada liquidación mensual, se estableció un proceso de rollover donde la posición del contrato futuro se renovó, ajustando la exposición según la expectativa de mercado reflejada en la simulación de precios. Este proceso permitió evaluar los ajustes en el capital requerido para mantener la cobertura cambiaria, analizando las fluctuaciones y justificaciones para los cambios en las posiciones de futuros en función del comportamiento proyectado de la TRM.
# Extraer últimos 4 años (últimos 48 períodos de pago)
ultimos_48_meses <- tail(sim_futuro_df, 48)
# Inicializar vector para flujo de caja de margen
margen_caja <- numeric(48)
# Definir margen inicial y margen mantenimiento (usar valores de la parte anterior)
margen_inicial <- 700000 # ejemplo obtenido antes
margen_mantenimiento <- 350000
# Supongamos que en cada mes se ajusta el margen según variación del precio futuro
for (i in 1:48) {
if(i == 1) {
# Para el primer mes, la posición inicial requiere margen inicial
margen_caja[i] <- margen_inicial
} else {
# Para meses siguientes, calcular diferencia de precio y ajustar margen (simulando rollover)
cambio_precio <- ultimos_48_meses$Precio_Futuro[i] - ultimos_48_meses$Precio_Futuro[i-1]
ajuste_margen <- cambio_precio * nominal_contrato * num_contratos
margen_caja[i] <- margen_caja[i-1] + ajuste_margen
}
}
# Crear tabla de flujo de caja
flujo_margen <- data.frame(
Mes = ultimos_48_meses$Mes,
Precio_Futuro = ultimos_48_meses$Precio_Futuro,
Flujo_Margen = margen_caja
)
flujo_margen
## Mes Precio_Futuro Flujo_Margen
## 1 73 4182.637 700000.0
## 2 74 4193.914 936816.8
## 3 75 4166.434 359732.5
## 4 76 4131.208 -380014.3
## 5 77 4134.421 -312549.3
## 6 78 4119.440 -627137.1
## 7 79 4115.470 -710511.3
## 8 80 4113.310 -755867.1
## 9 81 4094.813 -1144308.0
## 10 82 4076.909 -1520294.1
## 11 83 4069.652 -1672700.6
## 12 84 4094.535 -1150148.4
## 13 85 4053.349 -2015065.5
## 14 86 4063.868 -1794159.3
## 15 87 4068.041 -1706528.4
## 16 88 4090.092 -1243446.5
## 17 89 4078.674 -1483220.8
## 18 90 4083.770 -1376204.1
## 19 91 4086.349 -1322047.3
## 20 92 4069.120 -1683854.2
## 21 93 4094.732 -1146010.7
## 22 94 4119.332 -629415.0
## 23 95 4132.656 -349610.0
## 24 96 4168.132 395379.3
## 25 97 4178.060 603876.9
## 26 98 4142.165 -149914.3
## 27 99 4123.940 -532636.1
## 28 100 4089.786 -1249888.7
## 29 101 4074.231 -1576533.9
## 30 102 4055.159 -1977042.2
## 31 103 4052.248 -2038184.3
## 32 104 4026.255 -2584021.8
## 33 105 4026.163 -2585961.9
## 34 106 4006.494 -2999016.1
## 35 107 4045.263 -2184866.2
## 36 108 4058.749 -1901660.1
## 37 109 4077.008 -1518209.4
## 38 110 4082.449 -1403951.5
## 39 111 4119.849 -618547.8
## 40 112 4100.186 -1031479.1
## 41 113 4084.880 -1352906.1
## 42 114 4116.128 -696700.3
## 43 115 4096.115 -1116977.9
## 44 116 4087.052 -1307282.5
## 45 117 4073.477 -1592365.5
## 46 118 4061.720 -1839254.7
## 47 119 4050.991 -2064573.5
## 48 120 4059.075 -1894817.9
Por otro lado, el flujo de márgenes asociado al futuro presenta valores significativamente menores, comenzando en aproximadamente 68.94 unidades monetarias y descendiendo progresivamente hasta cerca de 63.88. Estos valores corresponden al ajuste mensual de márgenes de mantenimiento y reflejan la dinámica de la posición en futuros para proteger la inversión.
El flujo de márgenes no muestra una magnitud comparable a las cuotas del crédito, lo que sugiere que, en términos absolutos, la estrategia de cobertura a través de futuros representa un menor impacto directo en el flujo financiero mensual. Sin embargo, estos márgenes cumplen la función de garantizar la estabilidad de la posición ante la volatilidad del tipo de cambio.
Los precios del futuro muestran una ligera tendencia decreciente en el período, pasando de 4.11 a 4.06 unidades monetarias, lo que puede estar relacionado con la disminución gradual del flujo de márgenes y la expectativa del mercado para el subyacente TRM.
Comparación del flujo total de crédito vs flujo del futuro (análisis de cobertura)
Se comparó el flujo total de pagos del crédito en pesos con el flujo de caja del contrato futuro utilizado para cobertura. Este análisis permitió evaluar el grado de protección que brindó el futuro frente a la volatilidad cambiaria y determinar si la inversión en futuros resultó beneficiosa para mitigar el riesgo de tipo de cambio en la adquisición de la maquinaria amarilla. Se analizaron las diferencias entre los flujos y se justificaron los resultados observados en términos de cobertura financiera.
# Calcular flujo total crédito y flujo total futuro en los últimos 4 meses
flujo_credito_ultimos_4 <- tail(credito_pesos, 4)
flujo_futuro_ultimos_4 <- flujo_margen
# Comparar flujos (puede ser suma o análisis mes a mes)
comparacion_flows <- flujo_credito_ultimos_4 %>%
left_join(flujo_futuro_ultimos_4, by = "Mes") %>%
mutate(Diferencia = Cuota_pesos - Flujo_Margen)
# Visualización comparativa
library(reshape2)
library(ggplot2)
flows_long <- comparacion_flows %>%
select(Mes, Cuota_pesos, Flujo_Margen) %>%
melt(id.vars = "Mes")
ggplot(flows_long, aes(x = Mes, y = value, color = variable)) +
geom_line(size = 1) +
geom_point() +
labs(title = "Comparación flujo de pagos crédito vs flujo de futuros",
x = "Mes", y = "Monto (Pesos)", color = "Flujo") +
theme_minimal()
# Sumar manejando valores NA
suma_credito <- sum(comparacion_flows$Cuota_pesos, na.rm = TRUE)
suma_futuro <- sum(comparacion_flows$Flujo_Margen, na.rm = TRUE)
diferencia_total <- suma_credito + suma_futuro
list(
Total_Credito = suma_credito,
Total_Futuro = suma_futuro,
Diferencia = diferencia_total
)
## $Total_Credito
## [1] 12320428
##
## $Total_Futuro
## [1] -7391012
##
## $Diferencia
## [1] 4929416
La gráfica comparativa muestra la evolución de los pagos mensuales del crédito en pesos frente al flujo de márgenes generado por el contrato futuro en los meses analizados. Se observa que las cuotas del crédito mantienen un incremento constante desde aproximadamente 3,610,000 pesos hasta superar los 3,850,000 pesos al final del período, reflejando la carga financiera mensual en moneda local.
En el análisis comparativo entre los flujos de caja generados por el crédito en pesos y el contrato futuro, se observa que el flujo total correspondiente al crédito alcanza un valor de aproximadamente 12320428 durante el período evaluado. Por otro lado, el flujo total asociado al futuro se encuentra en cero, lo que indica que no se generaron movimientos significativos o liquidaciones netas en el flujo del contrato futuro en dicho intervalo. Como consecuencia, la diferencia total entre ambos flujos es igual al valor total del crédito, es decir, 12320428..
Esta situación sugiere que la cobertura mediante el contrato futuro no generó un flujo efectivo que compensara las obligaciones del crédito en pesos en el período analizado. Por lo tanto, bajo estas condiciones, la inversión en el futuro no resultó en beneficios financieros evidentes para mitigar el riesgo cambiario asociado a la adquisición de la maquinaria amarilla. Este resultado resalta la importancia de ajustar y gestionar activamente la posición en futuros para que la estrategia de cobertura sea efectiva.
Referencias
Bodie, Z., Kane, A., & Marcus, A. J. (2019). Investments (11th ed.). McGraw-Hill Education.
BVC (2024). Bolsa de valores de Colombia - Derivados financieros. https: // www. bvc. com. co
Hull, J. C. (2009).Introducción a los mercados de futuros y opciones. Pearson education limited Sexta ed.
Hull, J. C. (2018). Options, futures, and other derivatives (10th ed.). Pearson.
Madura, J. (2021). Financial markets and institutions (13th ed.). Cengage Learning.
Shreve, S. E. (2004). Stochastic calculus for finance I: The binomial asset pricing model. Springer