Paquetes necesarios
paquetes <- c("tidyverse", "lubridate", "tsibble", "timetk", "tseries", "quantmod",
"PerformanceAnalytics", "ggplot2", "dplyr", "scales", "xts",
"zoo", "readxl", "knitr", "kableExtra", "patchwork",
"forecast", "urca", "rugarch", "tibbletime", "roll",
"Quandl", "httr", "jsonlite", "rvest")
instalar <- paquetes[!(paquetes %in% installed.packages()[, "Package"])]
if (length(instalar)) install.packages(instalar)
lapply(paquetes, library, character.only = TRUE)
## [[1]]
## [1] "lubridate" "forcats" "stringr" "dplyr" "purrr" "readr"
## [7] "tidyr" "tibble" "ggplot2" "tidyverse" "stats" "graphics"
## [13] "grDevices" "utils" "datasets" "methods" "base"
##
## [[2]]
## [1] "lubridate" "forcats" "stringr" "dplyr" "purrr" "readr"
## [7] "tidyr" "tibble" "ggplot2" "tidyverse" "stats" "graphics"
## [13] "grDevices" "utils" "datasets" "methods" "base"
##
## [[3]]
## [1] "tsibble" "lubridate" "forcats" "stringr" "dplyr" "purrr"
## [7] "readr" "tidyr" "tibble" "ggplot2" "tidyverse" "stats"
## [13] "graphics" "grDevices" "utils" "datasets" "methods" "base"
##
## [[4]]
## [1] "timetk" "tsibble" "lubridate" "forcats" "stringr" "dplyr"
## [7] "purrr" "readr" "tidyr" "tibble" "ggplot2" "tidyverse"
## [13] "stats" "graphics" "grDevices" "utils" "datasets" "methods"
## [19] "base"
##
## [[5]]
## [1] "tseries" "timetk" "tsibble" "lubridate" "forcats" "stringr"
## [7] "dplyr" "purrr" "readr" "tidyr" "tibble" "ggplot2"
## [13] "tidyverse" "stats" "graphics" "grDevices" "utils" "datasets"
## [19] "methods" "base"
##
## [[6]]
## [1] "quantmod" "TTR" "xts" "zoo" "tseries" "timetk"
## [7] "tsibble" "lubridate" "forcats" "stringr" "dplyr" "purrr"
## [13] "readr" "tidyr" "tibble" "ggplot2" "tidyverse" "stats"
## [19] "graphics" "grDevices" "utils" "datasets" "methods" "base"
##
## [[7]]
## [1] "PerformanceAnalytics" "quantmod" "TTR"
## [4] "xts" "zoo" "tseries"
## [7] "timetk" "tsibble" "lubridate"
## [10] "forcats" "stringr" "dplyr"
## [13] "purrr" "readr" "tidyr"
## [16] "tibble" "ggplot2" "tidyverse"
## [19] "stats" "graphics" "grDevices"
## [22] "utils" "datasets" "methods"
## [25] "base"
##
## [[8]]
## [1] "PerformanceAnalytics" "quantmod" "TTR"
## [4] "xts" "zoo" "tseries"
## [7] "timetk" "tsibble" "lubridate"
## [10] "forcats" "stringr" "dplyr"
## [13] "purrr" "readr" "tidyr"
## [16] "tibble" "ggplot2" "tidyverse"
## [19] "stats" "graphics" "grDevices"
## [22] "utils" "datasets" "methods"
## [25] "base"
##
## [[9]]
## [1] "PerformanceAnalytics" "quantmod" "TTR"
## [4] "xts" "zoo" "tseries"
## [7] "timetk" "tsibble" "lubridate"
## [10] "forcats" "stringr" "dplyr"
## [13] "purrr" "readr" "tidyr"
## [16] "tibble" "ggplot2" "tidyverse"
## [19] "stats" "graphics" "grDevices"
## [22] "utils" "datasets" "methods"
## [25] "base"
##
## [[10]]
## [1] "scales" "PerformanceAnalytics" "quantmod"
## [4] "TTR" "xts" "zoo"
## [7] "tseries" "timetk" "tsibble"
## [10] "lubridate" "forcats" "stringr"
## [13] "dplyr" "purrr" "readr"
## [16] "tidyr" "tibble" "ggplot2"
## [19] "tidyverse" "stats" "graphics"
## [22] "grDevices" "utils" "datasets"
## [25] "methods" "base"
##
## [[11]]
## [1] "scales" "PerformanceAnalytics" "quantmod"
## [4] "TTR" "xts" "zoo"
## [7] "tseries" "timetk" "tsibble"
## [10] "lubridate" "forcats" "stringr"
## [13] "dplyr" "purrr" "readr"
## [16] "tidyr" "tibble" "ggplot2"
## [19] "tidyverse" "stats" "graphics"
## [22] "grDevices" "utils" "datasets"
## [25] "methods" "base"
##
## [[12]]
## [1] "scales" "PerformanceAnalytics" "quantmod"
## [4] "TTR" "xts" "zoo"
## [7] "tseries" "timetk" "tsibble"
## [10] "lubridate" "forcats" "stringr"
## [13] "dplyr" "purrr" "readr"
## [16] "tidyr" "tibble" "ggplot2"
## [19] "tidyverse" "stats" "graphics"
## [22] "grDevices" "utils" "datasets"
## [25] "methods" "base"
##
## [[13]]
## [1] "readxl" "scales" "PerformanceAnalytics"
## [4] "quantmod" "TTR" "xts"
## [7] "zoo" "tseries" "timetk"
## [10] "tsibble" "lubridate" "forcats"
## [13] "stringr" "dplyr" "purrr"
## [16] "readr" "tidyr" "tibble"
## [19] "ggplot2" "tidyverse" "stats"
## [22] "graphics" "grDevices" "utils"
## [25] "datasets" "methods" "base"
##
## [[14]]
## [1] "knitr" "readxl" "scales"
## [4] "PerformanceAnalytics" "quantmod" "TTR"
## [7] "xts" "zoo" "tseries"
## [10] "timetk" "tsibble" "lubridate"
## [13] "forcats" "stringr" "dplyr"
## [16] "purrr" "readr" "tidyr"
## [19] "tibble" "ggplot2" "tidyverse"
## [22] "stats" "graphics" "grDevices"
## [25] "utils" "datasets" "methods"
## [28] "base"
##
## [[15]]
## [1] "kableExtra" "knitr" "readxl"
## [4] "scales" "PerformanceAnalytics" "quantmod"
## [7] "TTR" "xts" "zoo"
## [10] "tseries" "timetk" "tsibble"
## [13] "lubridate" "forcats" "stringr"
## [16] "dplyr" "purrr" "readr"
## [19] "tidyr" "tibble" "ggplot2"
## [22] "tidyverse" "stats" "graphics"
## [25] "grDevices" "utils" "datasets"
## [28] "methods" "base"
##
## [[16]]
## [1] "patchwork" "kableExtra" "knitr"
## [4] "readxl" "scales" "PerformanceAnalytics"
## [7] "quantmod" "TTR" "xts"
## [10] "zoo" "tseries" "timetk"
## [13] "tsibble" "lubridate" "forcats"
## [16] "stringr" "dplyr" "purrr"
## [19] "readr" "tidyr" "tibble"
## [22] "ggplot2" "tidyverse" "stats"
## [25] "graphics" "grDevices" "utils"
## [28] "datasets" "methods" "base"
##
## [[17]]
## [1] "forecast" "patchwork" "kableExtra"
## [4] "knitr" "readxl" "scales"
## [7] "PerformanceAnalytics" "quantmod" "TTR"
## [10] "xts" "zoo" "tseries"
## [13] "timetk" "tsibble" "lubridate"
## [16] "forcats" "stringr" "dplyr"
## [19] "purrr" "readr" "tidyr"
## [22] "tibble" "ggplot2" "tidyverse"
## [25] "stats" "graphics" "grDevices"
## [28] "utils" "datasets" "methods"
## [31] "base"
##
## [[18]]
## [1] "urca" "forecast" "patchwork"
## [4] "kableExtra" "knitr" "readxl"
## [7] "scales" "PerformanceAnalytics" "quantmod"
## [10] "TTR" "xts" "zoo"
## [13] "tseries" "timetk" "tsibble"
## [16] "lubridate" "forcats" "stringr"
## [19] "dplyr" "purrr" "readr"
## [22] "tidyr" "tibble" "ggplot2"
## [25] "tidyverse" "stats" "graphics"
## [28] "grDevices" "utils" "datasets"
## [31] "methods" "base"
##
## [[19]]
## [1] "rugarch" "parallel" "urca"
## [4] "forecast" "patchwork" "kableExtra"
## [7] "knitr" "readxl" "scales"
## [10] "PerformanceAnalytics" "quantmod" "TTR"
## [13] "xts" "zoo" "tseries"
## [16] "timetk" "tsibble" "lubridate"
## [19] "forcats" "stringr" "dplyr"
## [22] "purrr" "readr" "tidyr"
## [25] "tibble" "ggplot2" "tidyverse"
## [28] "stats" "graphics" "grDevices"
## [31] "utils" "datasets" "methods"
## [34] "base"
##
## [[20]]
## [1] "tibbletime" "rugarch" "parallel"
## [4] "urca" "forecast" "patchwork"
## [7] "kableExtra" "knitr" "readxl"
## [10] "scales" "PerformanceAnalytics" "quantmod"
## [13] "TTR" "xts" "zoo"
## [16] "tseries" "timetk" "tsibble"
## [19] "lubridate" "forcats" "stringr"
## [22] "dplyr" "purrr" "readr"
## [25] "tidyr" "tibble" "ggplot2"
## [28] "tidyverse" "stats" "graphics"
## [31] "grDevices" "utils" "datasets"
## [34] "methods" "base"
##
## [[21]]
## [1] "roll" "tibbletime" "rugarch"
## [4] "parallel" "urca" "forecast"
## [7] "patchwork" "kableExtra" "knitr"
## [10] "readxl" "scales" "PerformanceAnalytics"
## [13] "quantmod" "TTR" "xts"
## [16] "zoo" "tseries" "timetk"
## [19] "tsibble" "lubridate" "forcats"
## [22] "stringr" "dplyr" "purrr"
## [25] "readr" "tidyr" "tibble"
## [28] "ggplot2" "tidyverse" "stats"
## [31] "graphics" "grDevices" "utils"
## [34] "datasets" "methods" "base"
##
## [[22]]
## [1] "Quandl" "roll" "tibbletime"
## [4] "rugarch" "parallel" "urca"
## [7] "forecast" "patchwork" "kableExtra"
## [10] "knitr" "readxl" "scales"
## [13] "PerformanceAnalytics" "quantmod" "TTR"
## [16] "xts" "zoo" "tseries"
## [19] "timetk" "tsibble" "lubridate"
## [22] "forcats" "stringr" "dplyr"
## [25] "purrr" "readr" "tidyr"
## [28] "tibble" "ggplot2" "tidyverse"
## [31] "stats" "graphics" "grDevices"
## [34] "utils" "datasets" "methods"
## [37] "base"
##
## [[23]]
## [1] "httr" "Quandl" "roll"
## [4] "tibbletime" "rugarch" "parallel"
## [7] "urca" "forecast" "patchwork"
## [10] "kableExtra" "knitr" "readxl"
## [13] "scales" "PerformanceAnalytics" "quantmod"
## [16] "TTR" "xts" "zoo"
## [19] "tseries" "timetk" "tsibble"
## [22] "lubridate" "forcats" "stringr"
## [25] "dplyr" "purrr" "readr"
## [28] "tidyr" "tibble" "ggplot2"
## [31] "tidyverse" "stats" "graphics"
## [34] "grDevices" "utils" "datasets"
## [37] "methods" "base"
##
## [[24]]
## [1] "jsonlite" "httr" "Quandl"
## [4] "roll" "tibbletime" "rugarch"
## [7] "parallel" "urca" "forecast"
## [10] "patchwork" "kableExtra" "knitr"
## [13] "readxl" "scales" "PerformanceAnalytics"
## [16] "quantmod" "TTR" "xts"
## [19] "zoo" "tseries" "timetk"
## [22] "tsibble" "lubridate" "forcats"
## [25] "stringr" "dplyr" "purrr"
## [28] "readr" "tidyr" "tibble"
## [31] "ggplot2" "tidyverse" "stats"
## [34] "graphics" "grDevices" "utils"
## [37] "datasets" "methods" "base"
##
## [[25]]
## [1] "rvest" "jsonlite" "httr"
## [4] "Quandl" "roll" "tibbletime"
## [7] "rugarch" "parallel" "urca"
## [10] "forecast" "patchwork" "kableExtra"
## [13] "knitr" "readxl" "scales"
## [16] "PerformanceAnalytics" "quantmod" "TTR"
## [19] "xts" "zoo" "tseries"
## [22] "timetk" "tsibble" "lubridate"
## [25] "forcats" "stringr" "dplyr"
## [28] "purrr" "readr" "tidyr"
## [31] "tibble" "ggplot2" "tidyverse"
## [34] "stats" "graphics" "grDevices"
## [37] "utils" "datasets" "methods"
## [40] "base"
Análisis fundamental de la TRM
# Fuente sugerida para análisis: Banco de la República y Fedesarrollo
# Cita APA esperada
# Banco de la República. (2024). Informe de política monetaria. Recuperado de https://www.banrep.gov.co
Descarga de la TRM histórica
# Cargar TRM histórica desde la API de Datos Abiertos del Gobierno de Colombia
library(jsonlite)
library(dplyr)
# URL con límite de 5000 registros
url <- "https://www.datos.gov.co/resource/32sa-8pi3.json?$limit=5000"
trm_data <- fromJSON(url)
# Transformación del dataframe
trm_df <- trm_data %>%
mutate(
fecha = as.Date(substr(vigenciadesde, 1, 10)), # extrae solo la parte "YYYY-MM-DD"
valor = as.numeric(valor)
) %>%
select(fecha, valor) %>%
arrange(fecha)
# Ver los primeros registros
head(trm_df)
## fecha valor
## 1 2004-04-24 2622.74
## 2 2004-04-27 2613.94
## 3 2004-04-28 2620.97
## 4 2004-04-29 2635.96
## 5 2004-04-30 2646.99
## 6 2004-05-01 2655.18
summary(trm_df)
## fecha valor
## Min. :2004-04-24 Min. :1652
## 1st Qu.:2009-07-30 1st Qu.:1966
## Median :2014-10-31 Median :2559
## Mean :2014-11-06 Mean :2790
## 3rd Qu.:2020-02-14 3rd Qu.:3453
## Max. :2025-05-22 Max. :5061
plot(trm_df$fecha, trm_df$valor, type = "l", col = "blue",
main = "TRM Historica (COP/USD)", xlab = "Fecha", ylab = "TRM")
Retornos mensuales y desviación estándar de la TRM
# Convertir a serie mensual
trm_xts <- xts(trm_df$valor, order.by = trm_df$fecha)
trm_mensual <- apply.monthly(trm_xts, mean)
retornos <- diff(log(trm_mensual))
media_mensual <- mean(retornos, na.rm = TRUE)
desviacion_mensual <- sd(retornos, na.rm = TRUE)
paste("Media mensual:", round(media_mensual, 6))
## [1] "Media mensual: 0.001877"
paste("Desviacion estandar mensual:", round(desviacion_mensual, 6))
## [1] "Desviacion estandar mensual: 0.032653"
Simulación BMG mensual para TRM
# Parámetros
S0 <- 100 # Precio inicial
mu <- 0.05 # Rendimiento esperado
sigma <- 0.2 # Volatilidad
T <- 1 # Horizonte de tiempo (1 año)
dt <- 1/252 # Paso de tiempo diario
n <- T / dt # Número de pasos
m <- 100 # Número de trayectorias
# Matriz de precios
set.seed(123)
precios <- matrix(NA, nrow = n + 1, ncol = m)
precios[1, ] <- S0
# Simulación
for (j in 1:m) {
for (i in 1:n) {
precios[i + 1, j] <- precios[i, j] * exp((mu - 0.5 * sigma^2) * dt +
sigma * sqrt(dt) * rnorm(1))
}
}
# Gráfico
matplot(precios, type = "l", lty = 1, col = rainbow(m),
main = "Simulación Monte Carlo – Modelo Black-Gamma",
xlab = "Tiempo (días)", ylab = "Precio del activo")
cat("La simulación representa múltiples trayectorias de la Tasa Representativa del Mercado (TRM) modeladas bajo un proceso geométrico Browniano. Cada línea muestra una posible evolución futura de la TRM, considerando rendimientos log-normales constantes. Este tipo de simulación es útil para evaluar escenarios de riesgo cambiario.")
## La simulación representa múltiples trayectorias de la Tasa Representativa del Mercado (TRM) modeladas bajo un proceso geométrico Browniano. Cada línea muestra una posible evolución futura de la TRM, considerando rendimientos log-normales constantes. Este tipo de simulación es útil para evaluar escenarios de riesgo cambiario.
Simulación de crédito en USD (Sistema francés)
# Parámetros
PV <- 70129.87
r_efectiva <- (1 + 0.065)^(1/12) - 1
n <- 120
cuota_usd <- PV * (r_efectiva * (1 + r_efectiva)^n) / ((1 + r_efectiva)^n - 1)
cuotas_usd <- rep(cuota_usd, n)
Crédito transformado a pesos con TRM simulada
# Simulación única de TRM (una sola trayectoria)
set.seed(123)
n <- 120
mu <- 0.01 # rendimiento mensual esperado
sigma <- 0.03 # volatilidad mensual
S0 <- 4000 # TRM inicial
dt <- 1
Z <- rnorm(n)
TRM_sim <- numeric(n)
TRM_sim[1] <- S0
for (i in 2:n) {
TRM_sim[i] <- TRM_sim[i - 1] * exp((mu - 0.5 * sigma^2) * dt + sigma * sqrt(dt) * Z[i])
}
# Datos de cuotas (simuladas o constantes)
cuotas_usd <- rep(300, n) # por ejemplo, cuota mensual fija en USD
# Calcular cuotas en COP
cuotas_cop <- cuotas_usd * TRM_sim
# Crear dataframe para graficar
credito_df <- data.frame(
Mes = 1:n,
CuotaUSD = cuotas_usd,
TRM = TRM_sim,
CuotaCOP = cuotas_cop
)
# Graficar
library(ggplot2)
ggplot(credito_df, aes(x = Mes, y = CuotaCOP)) +
geom_line(color = "darkgreen") +
labs(title = "Valor de cuotas en COP según TRM simulada", y = "COP", x = "Mes")
Parte 2: Cobertura con Futuros de Divisas
Datos históricos del futuro TRM – BVC
# Cargar futuros TRM desde archivo CSV (BVC)
library(readr)
library(dplyr)
# Cargar el archivo correctamente usando punto y coma como delimitador
archivo_csv <- file.choose("C:/Users/USER/Downloads/futuros_trm_bvc.csv")
futuros_trm <- read_delim(archivo_csv, delim = ";", locale = locale(decimal_mark = ","))
names(futuros_trm)
## [1] "Fecha" "Contrato" "Precio cierre"
## [4] "Precio máximo" "Precio minimo" "Variación absoluta"
## [7] "Variación porcentual" "No. contratos" "Volumen"
## [10] "Open interest"
head(futuros_trm)
## # A tibble: 6 × 10
## Fecha Contrato `Precio cierre` `Precio máximo` `Precio minimo`
## <date> <chr> <dbl> <dbl> <dbl>
## 1 2024-12-02 TRMM25F 4.57 4.57 4.57
## 2 2024-12-10 TRMM25F 4.48 4.49 4.48
## 3 2024-12-11 TRMM25F 4.47 4.47 4.47
## 4 2024-12-12 TRMM25F 4.45 4.45 4.44
## 5 2025-01-22 TRMM25F 4.35 4.35 4.35
## 6 2025-01-23 TRMM25F 4.32 4.34 4.32
## # ℹ 5 more variables: `Variación absoluta` <chr>, `Variación porcentual` <chr>,
## # `No. contratos` <dbl>, Volumen <chr>, `Open interest` <chr>
archivo_csv <- "C:/Users/USER/Downloads/futuros_trm_bvc.csv"
# Cargar el archivo
futuros_trm <- read_csv(archivo_csv)
# Revisar nombres de columnas
names(futuros_trm)
## [1] "Fecha;Contrato;Precio cierre;Precio máximo;Precio minimo;Variación absoluta;Variación porcentual;No. contratos;Volumen;Open interest"
Para iniciar la simulación de un contrato futuro sobre la TRM, se utiliza la fórmula teórica de valoración basada en el diferencial de tasas de interés (modelo de no arbitraje):
\[ F = S \cdot \left(\frac{1 + r_{usd}}{1 + r_{cop}}\right)^t \]
Donde:
Este cálculo entrega el precio base para proyectar la evolución del contrato a través de simulaciones.
De acuerdo con la BVC (2024), el contrato estándar sobre TRM tiene las siguientes características:
Dado que la cobertura es sobre el 70% de COP 300 millones (~USD 76.923), se necesitan 77 contratos, con un margen inicial estimado de COP 11,5 millones al inicio. Esta exposición se ajustará mes a mes según la TRM simulada.
Durante los años 6 al 10, se realiza un proceso de rollover mensual para mantener abierta la cobertura con futuros. En cada vencimiento:
Esto genera un flujo mensual por margen, que puede ser positivo o negativo según la evolución de la TRM. La suma neta de estos flujos se considera como ahorro o costo adicional de la cobertura.
Nota: el análisis de estos flujos se encuentra en la siguiente sección comparativa.
Simulación BMG del futuro (desde año 6 a 10)
# Cargar correctamente el archivo CSV con punto y coma
archivo_csv <- file.choose() # Selecciona el archivo correcto manualmente
futuros_trm <- read_delim(archivo_csv, delim = ";", locale = locale(decimal_mark = ","))
# Validar nombres de columnas
names(futuros_trm)
## [1] "Fecha" "Contrato" "Precio cierre"
## [4] "Precio máximo" "Precio minimo" "Variación absoluta"
## [7] "Variación porcentual" "No. contratos" "Volumen"
## [10] "Open interest"
# Limpieza y preparación
futuros_trm <- futuros_trm %>%
rename(
Fecha = `Fecha`,
Precio = `Precio cierre`
) %>%
mutate(
Fecha = as.Date(Fecha, format = "%d/%m/%Y"),
Precio = as.numeric(gsub(",", ".", Precio))
) %>%
arrange(Fecha) %>%
filter(!is.na(Precio)) # Filtrar cualquier NA
futuros_trm <- futuros_trm %>%
mutate(
Retorno = c(NA, diff(log(Precio)))
)
set.seed(123)
mu_futuro <- mean(futuros_trm$Retorno, na.rm = TRUE)
sigma_futuro <- sd(futuros_trm$Retorno, na.rm = TRUE)
n_sim <- 49 # Meses 72 a 120
dt <- 1
S0 <- tail(futuros_trm$Precio, 1)
Z <- rnorm(n_sim)
m <- 100
futuro_sim <- matrix(NA, nrow = n_sim, ncol = m)
futuro_sim[1, ] <- S0
for (j in 1:m) {
Z <- rnorm(n_sim)
for (i in 2:n_sim) {
futuro_sim[i, j] <- futuro_sim[i - 1, j] * exp((mu_futuro - 0.5 * sigma_futuro^2) * dt + sigma_futuro * sqrt(dt) * Z[i])
}
}
matplot(futuro_sim, type = "l", lty = 1, col = rainbow(m),
main = "Simulación Monte Carlo – Futuro TRM (Años 6 a 10)",
xlab = "Mes", ylab = "Precio Futuro (COP/USD)")
cat("El gráfico muestra la proyección de la TRM para los años 6 a 10 bajo un enfoque de simulación Monte Carlo. Se utiliza un modelo de difusión estocástico con parámetros estimados de volatilidad y rendimiento ajustados. Esta proyección permite evaluar contratos a más largo plazo y riesgos de cobertura.")
## El gráfico muestra la proyección de la TRM para los años 6 a 10 bajo un enfoque de simulación Monte Carlo. Se utiliza un modelo de difusión estocástico con parámetros estimados de volatilidad y rendimiento ajustados. Esta proyección permite evaluar contratos a más largo plazo y riesgos de cobertura.
De acuerdo con el Banco de la República (2024) y proyecciones de entidades como BBVA Research y JPMorgan, se espera que la tasa de cambio COP/USD cierre el año 2024 en un rango entre 3.900 y 4.200 pesos, dependiendo de factores como la política monetaria de la FED, el precio internacional del petróleo, y la dinámica fiscal colombiana.
Referencias: - Banco de la República. (2024). Informe de política monetaria. Abril 2024. - BBVA Research. (2024). Situación Colombia Primer trimestre 2024. - JPMorgan. (2024). LatAm FX Strategy Report. Abril 2024.
# Valor total de la maquinaria en COP
valor_maquinaria_cop <- 300000000
# Tasa representativa del mercado (TRM)
trm_base <- 3850
# Valor total en USD
valor_maquinaria_usd <- valor_maquinaria_cop / trm_base
# Pago inicial 10%
pago_inicial_usd <- 0.10 * valor_maquinaria_usd
# Valor del crédito en USD (valor presente PV)
PV <- valor_maquinaria_usd - pago_inicial_usd
# Porcentaje a cubrir con futuros
porcentaje_cobertura <- 0.70
posicion_usd <- porcentaje_cobertura * PV
# Tamaño estándar del contrato de futuros sobre TRM (1 contrato = USD 1,000)
contrato_usd <- 1000
# Número de contratos necesarios
num_contratos <- round(posicion_usd / contrato_usd)
# Márgenes exigidos por la BVC (5% inicial, 3% mantenimiento)
margen_inicial <- 0.05 * contrato_usd * num_contratos
margen_mantenimiento <- 0.03 * contrato_usd * num_contratos
# Mostrar tabla de márgenes
library(knitr)
kable(data.frame(
Tipo = c("Margen Inicial", "Margen de Mantenimiento"),
Valor_COP = round(c(margen_inicial, margen_mantenimiento), 2)
), caption = "Valores de Márgenes en Contratos de Futuros")
| Tipo | Valor_COP |
|---|---|
| Margen Inicial | 2450 |
| Margen de Mantenimiento | 1470 |
# Mostrar detalles adicionales
cat("Número de contratos:", num_contratos, "\n")
## Número de contratos: 49
cat("Margen inicial estimado (COP):", round(margen_inicial, 2), "\n")
## Margen inicial estimado (COP): 2450
cat("Margen de mantenimiento estimado (COP):", round(margen_mantenimiento, 2), "\n")
## Margen de mantenimiento estimado (COP): 1470
Margen y exposición
contrato_usd <- 1000
posicion_usd <- 0.70 * PV
num_contratos <- round(posicion_usd / contrato_usd)
margen_inicial <- 0.05 * contrato_usd * num_contratos
margen_mantenimiento <- 0.03 * contrato_usd * num_contratos
Flujo de caja de margen y rollover
# Simula resultados de contratos futuros mes a mes
resultados <- diff(futuro_sim) * contrato_usd * num_contratos
flujo_margen <- cumsum(c(0, resultados))
# Gráfico
plot.ts(flujo_margen, col = "red", main = "Flujo de Caja por Margen de Futuros")
cat("Este gráfico representa el flujo de caja acumulado asociado al margen diario requerido por la Cámara de Riesgo en un contrato de futuros sobre la TRM. Se utiliza la diferencia entre el precio diario y el precio inicial como base para calcular las llamadas de margen. Refleja la variabilidad financiera que enfrenta una posición larga/corta en el tiempo.")
## Este gráfico representa el flujo de caja acumulado asociado al margen diario requerido por la Cámara de Riesgo en un contrato de futuros sobre la TRM. Se utiliza la diferencia entre el precio diario y el precio inicial como base para calcular las llamadas de margen. Refleja la variabilidad financiera que enfrenta una posición larga/corta en el tiempo.
Durante los años 6 al 10, se realiza un proceso de rollover mensual para mantener abierta la cobertura con futuros. En cada vencimiento:
Esto genera un flujo mensual por margen, que puede ser positivo o negativo según la evolución de la TRM. La suma neta de estos flujos se considera como ahorro o costo adicional de la cobertura.
Nota: el análisis de estos flujos se encuentra en la siguiente sección comparativa.
Visualización de opciones call y put
# Fórmulas Black-Scholes para Call y Put
BS_Call <- function(S, K, r, sigma, T) {
d1 <- (log(S/K) + (r + 0.5*sigma^2)*T) / (sigma*sqrt(T))
d2 <- d1 - sigma*sqrt(T)
C <- S * pnorm(d1) - K * exp(-r*T) * pnorm(d2)
return(C)
}
BS_Put <- function(S, K, r, sigma, T) {
d1 <- (log(S/K) + (r + 0.5*sigma^2)*T) / (sigma*sqrt(T))
d2 <- d1 - sigma*sqrt(T)
P <- K * exp(-r*T) * pnorm(-d2) - S * pnorm(-d1)
return(P)
}
# Graficar el valor de la opción call
S_vals <- seq(3000, 5000, by = 10)
call_vals <- sapply(S_vals, BS_Call, K = 4000, r = 0.05, sigma = 0.25, T = 0.5)
plot(S_vals, call_vals, type = "l", lwd = 2, col = "blue",
main = "Valor de la Opción Call según el Precio del Subyacente",
xlab = "Precio Subyacente (COP)", ylab = "Valor Call (COP)")
grid()
cat("Este gráfico muestra la relación entre el precio del activo subyacente y el valor teórico de una opción tipo Call europea, según el modelo de Black-Scholes. La curva refleja la convexidad propia del instrumento derivado, aumentando a medida que el subyacente supera el precio de ejercicio.")
## Este gráfico muestra la relación entre el precio del activo subyacente y el valor teórico de una opción tipo Call europea, según el modelo de Black-Scholes. La curva refleja la convexidad propia del instrumento derivado, aumentando a medida que el subyacente supera el precio de ejercicio.
# Función Black-Scholes para opción Put europea
BS_Put <- function(S, K, r, sigma, T) {
d1 <- (log(S/K) + (r + 0.5*sigma^2)*T) / (sigma*sqrt(T))
d2 <- d1 - sigma * sqrt(T)
P <- K * exp(-r*T) * pnorm(-d2) - S * pnorm(-d1)
return(P)
}
# Parámetros
K <- 4000 # Precio de ejercicio
r <- 0.05 # Tasa libre de riesgo
sigma <- 0.25 # Volatilidad
T <- 0.5 # Tiempo hasta vencimiento (en años)
S_vals <- seq(3000, 5000, by = 10) # Rango de precios del subyacente
# Cálculo del valor de la Put
put_vals <- sapply(S_vals, BS_Put, K = K, r = r, sigma = sigma, T = T)
# Gráfico
plot(S_vals, put_vals, type = "l", lwd = 2, col = "red",
main = "Valor de la Opción Put vs Precio del Subyacente",
xlab = "Precio del Activo Subyacente (COP)",
ylab = "Valor de la Opción Put (COP)")
grid()
cat("Nota: El gráfico muestra cómo varía el valor teórico de una opción Put europea según el modelo de Black-Scholes, a medida que cambia el precio del activo subyacente. A menor precio del activo, mayor es el valor de la opción Put.")
## Nota: El gráfico muestra cómo varía el valor teórico de una opción Put europea según el modelo de Black-Scholes, a medida que cambia el precio del activo subyacente. A menor precio del activo, mayor es el valor de la opción Put.
Análisis final de cobertura vs crédito
flujo_cobertura <- cuotas_cop[72:120] + resultados[72:120]
comparativo <- data.frame(
Mes = 72:120,
SinCobertura = cuotas_cop[72:120],
ConCobertura = flujo_cobertura
)
# Comparación gráfica (el resto de tu código, que está bien)
comparativo %>%
pivot_longer(cols = c(SinCobertura, ConCobertura), names_to = "Escenario", values_to = "Valor") %>%
ggplot(aes(x = Mes, y = Valor, color = Escenario)) +
geom_line() +
labs(title = "Comparativo: Cuotas con y sin cobertura", y = "Valor en COP")
cat("el gráfico demuestra que la estrategia de cobertura es exitosa en su objetivo de anclar el valor efectivo de la cuota de crédito, neutralizando casi por completo el impacto de las variables subyacentes (como las del mercado de divisas) en los meses observados")
## el gráfico demuestra que la estrategia de cobertura es exitosa en su objetivo de anclar el valor efectivo de la cuota de crédito, neutralizando casi por completo el impacto de las variables subyacentes (como las del mercado de divisas) en los meses observados
Conclusiones
#Importancia del modelo: La simulación mediante el modelo de Black-Gamma nos permite modelar trayectorias de precios con componentes estocásticos realistas, capturando la aleatoriedad presente en los mercados financieros.
#Aplicación práctica: La técnica de simulación Monte Carlo es clave para valorar derivados financieros, medir riesgo (VaR, CVaR), y optimizar portafolios bajo incertidumbre.
#Limitaciones: Aunque poderosa, la simulación depende de los supuestos sobre la distribución de rendimientos y volatilidad. En escenarios reales, podría ser necesario ajustar el modelo con volatilidad estocástica o saltos.
#Importancia computacional: La correcta implementación vectorizada de simulaciones múltiples es fundamental para obtener resultados robustos y representativos del comportamiento real del mercado.
#Recomendaciones futuras: Para mejorar el realismo del modelo, se recomienda explorar extensiones como el modelo de Black-Scholes con saltos (Merton) o modelos con volatilidad local o estocástica.
Referencias
# @misc{banrep2024,
# author = {Banco de la República},
# title = {Informe de política monetaria},
# year = {2024},
# url = {https://www.banrep.gov.co},
#}
#@misc{bcv2025,
# author = {Bolsa de valores de Colombia},
# title = {Historico de futuros trm},
# year = {2025},
# url = {https://www.bvc.com.co/derivados/trmm25f?tab=resumen}
#}