LABORATORIO 1. PRACTICA DE FUTUROS

Este informe evalúa la financiación en USD de una inversión de COP 500 millones para maquinaria amarilla mediante un crédito a 10 años (sistema francés) y la cobertura cambiaria con futuros TRM (USD/COP) sobre el 75% de la exposición desde el año 6 hasta el 10. Para financiar la adquisición de maquinaria amarilla, hemos decidido solicitar un crédito en Estados Unidos. Después de analizar las opciones disponibles, comparamos dos de las principales instituciones financieras: Bank of America y JP Morgan Chase. Ambos bancos ofrecían condiciones competitivas, pero tras evaluar detalladamente las tasas de interés, plazos y el sistema de pago, optamos por el crédito de JP Morgan Chase.

JPMorgan Chase se orienta más a inversiones de capital de largo plazo, como maquinaria amarilla, infraestructura o tecnología, con tasas competitivas y estructuras de deuda que cumplen estándares regulatorios internacionales.

Las condiciones del crédito elegido son las siguientes: Tasa de interés: 6.3% APR Plazo: 10 años Sistema de pago: Francés.

En este laboratorio, La TRM se analiza desde un enfoque fundamental (monetario y real) y estocástico (retornos y simulaciones GBM). Se construye el cronograma de amortización en USD y se transforma a COP con trayectorias simuladas de TRM. En la segunda parte, se modelan los futuros TRM (precio teórico inicial por paridad de tasas, retornos mensuales, simulación GBM, rollover y flujos de margen). Resultados clave: (i) el crédito sin cobertura exhibe volatilidad relevante en COP; (ii) la cobertura con futuros reduce el rango de resultados y estabiliza el flujo, a costa de márgenes y posible riesgo de base. En balance, la estrategia de cobertura es financieramente conveniente para mitigar la incertidumbre de la TRM en los años 6–10 del crédito.

PARTE 1. PROCESO DEL CREDITO

Enfoque. Tipo de cambio (TRM): cálculo de retornos logarítmicos mensuales, desviación estándar y proyección mediante GBM (12 y 120 meses). Crédito: cronograma en USD (sistema francés) y conversión a COP usando las trayectorias simuladas de TRM. Futuros TRM (BVC): precio teórico inicial por paridad de tasas, simulación GBM, rollover, margen inicial y margen de mantenimiento, y mark-to-market mensual. Comparación: costo total en COP con vs sin cobertura, análisis de riesgo y sensibilidad.

Datos. TRM (USD/COP): serie histórica diaria/mensual empleada para calcular retornos y volatilidad; se mensualiza tomando el último dato del mes.

# Descargar TRM histórica desde Yahoo Finance
getSymbols("USDCOP=X", src = "yahoo", from = "2015-01-01", to = "2025-09-01")
## Warning: USDCOP=X contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## [1] "USDCOP=X"
# Extraer solo la columna de cierre
trm_xts <- Cl(`USDCOP=X`) %>% na.omit()

# Pasar a frecuencia mensual (último día de cada mes)
trm_mensual <- to.monthly(trm_xts, indexAt = "lastof", OHLC = FALSE)

# Convertir a data.frame con nombres claros
trm <- data.frame(
  fecha  = index(trm_mensual),
  precio = as.numeric(trm_mensual)
)
# Mostrar primeras filas
head(trm)
# Graficar la serie mensual limpia
plot(trm$fecha, trm$precio, type="l", col="blue", lwd=2,
     main="TRM histórica mensual (Yahoo Finance)",
     xlab="Fecha", ylab="COP/USD")

1. Análisis fundamental de la TRM (USD/COP)

La TRM refleja la relación COP/USD y, por tanto, depende de la interacción entre variables internas y externas. A nivel internacional, la política monetaria de la Reserva Federal (Fed) constituye un determinante fundamental. La expectativa actual es de recortes graduales en la tasa de referencia en lo que resta de 2025, lo que ha debilitado al dólar frente a monedas emergentes (Reuters, 2025).

Contexto Local En Colombia, el Banco de la República mantiene su tasa de referencia en 9,25 %, con un sesgo a la baja condicionado a la evolución de la inflación (Banco de la República, 2025). Este diferencial de tasas frente a la Fed sostiene la entrada de capitales y otorga soporte al peso colombiano.

Además, los factores fiscales y externos resultan críticos. El Marco Fiscal de Mediano Plazo (MFMP) proyecta un déficit fiscal cercano al 4 % del PIB en 2025, junto con menores ingresos petroleros en comparación con 2024, lo que presiona una leve depreciación de la moneda (Ministerio de Hacienda, 2025).

Comportamiento Reciente Al 19 de septiembre de 2025, el USD/COP se ubicó en torno a los 3.890 pesos, marcando un nivel de apreciación frente al promedio de 2024, cuando la tasa cerró en 4.409 (TradingEconomics, 2025).

Expectativas de la TRM a 12 Meses

Proyecciones Oficiales El MFMP (2025) estima una TRM promedio de 4.265 pesos en 2025 y 4.408 en 2026, con una depreciación nominal anual moderada (Ministerio de Hacienda, 2025).

Proyecciones de Banca Privada BBVA Research (2025) anticipa un cierre de 2025 en 4.350 y de 2026 en 4.230, lo que implica una senda de estabilidad con ligera apreciación frente a los supuestos oficiales.

Por su parte, Scotiabank (2025) prevé que la tasa del Banco de la República finalice 2025 en torno a 7,75 %, lo que sugiere que el peso mantendrá resiliencia siempre que el ciclo de recortes de la Fed continúe (Scotiabank Economics, 2025).

Consenso de Analistas Datos de consenso publicados por FocusEconomics (2025) ubican la expectativa de mediano plazo en niveles entre 4.200 y 4.400, con una tendencia lateral de la divisa.

Implicaciones para la Cobertura con Derivados Una tasa de referencia local. Esto permite replicar las condiciones de mercado en la Bolsa de Valores de Colombia (BVC) y cubrir al menos el 75 % de la exposición cambiaria a partir del sexto año.

Conclusiones El peso colombiano cerró septiembre de 2025 en niveles de 3.890 COP/USD, mostrando fortaleza respecto a 2024.

Las proyecciones oficiales (MFMP) y privadas (BBVA, Scotiabank) coinciden en un rango de 4.200 a 4.450 para el próximo año.

El sesgo predominante es de depreciación moderada, aunque con riesgos significativos al alza derivados de choques fiscales y de precios del petróleo.

La gestión de riesgos mediante futuros de divisas resulta necesaria para proteger las cuotas en USD de un crédito a 10 años, en línea con la estrategia propuesta.

2. Metodología cuantitativa

a. Retornos y volatilidad.

## Desviación estándar mensual de la TRM: 0.04006474

De los resultados obetenidos popdemos decir que, una σ mensual ≈ 4,01% implica que, en un mes típico, la TRM puede moverse alrededor de ±4%; con una TRM de referencia de, por ejemplo, $4.100 COP/USD, eso equivale a ±$164 COP por dólar. En términos prácticos, cada cuota en USD del crédito convertida a COP puede variar aproximadamente ese porcentaje solo por efecto cambiario. Bajo ±2σ (~±8%), variaciones mensuales de $330–$350 COP por dólar no son inusuales, y choques extremos (como marzo de 2020) muestran colas pesadas, por lo que conviene dimensionar colchones de liquidez y presentar un análisis de sensibilidad de las cuotas en COP

3.Simulación BMG

La simulación GBM de la TRM (USD/COP) es el núcleo cuantitativo del proyecto porque convierte la volatilidad histórica (≈ 4,01% mensual) y la media de los retornos logarítmicos en un abanico probabilístico de escenarios futuros, en lugar de un único pronóstico.

## Simulación BMG (Browniano Geométrico) de la TRM
mu <- mean(retornos_trm) * 12        # media anualizada
sigma <- sd(retornos_trm) * sqrt(12) # volatilidad anualizada
S0 <- as.numeric(last(trm_mensual))  # último valor conocido
T <- 120                              # horizonte: 120 meses
N <- 1000                           # número de simulaciones *No genera el Rubs con 10.000

set.seed(123)
simulaciones <- matrix(NA, nrow = T, ncol = N)
for (i in 1:N) {
  pasos <- rnorm(T, mean = (mu - 0.5*sigma^2)/12, sd = sigma/sqrt(12))
  simulaciones[,i] <- S0 * exp(cumsum(pasos))
}

# graficar algunas trayectorias
matplot(simulaciones[,1:1000], type = "l", lty = 1,
        main = "Simulación BMG de TRM (citmre)",
        xlab = "Meses", ylab = "TRM simulada")

# Valores finales de cada caminata
finales <- simulaciones[T, ]   # fila T = último mes, columnas = trayectorias

# Índices de la más baja, más alta y más intermedia
idx_min <- which.min(finales)
idx_max <- which.max(finales)
idx_mean <- which.min(abs(finales - mean(finales)))

# Extraer trayectorias completas
trayectoria_min <- simulaciones[, idx_min]
trayectoria_max <- simulaciones[, idx_max]
trayectoria_med <- simulaciones[, idx_mean]

# Graficar todas las simulaciones en gris claro
matplot(simulaciones, type = "l", lty = 1, col = rgb(0,0,0,0.05),
        main = "Simulación BMG de TRM (citmre)",
        xlab = "Meses", ylab = "TRM simulada")

# Añadir las 3 trayectorias destacadas
lines(trayectoria_min, col = "red", lwd = 2)      # más baja
lines(trayectoria_max, col = "green", lwd = 2)    # más alta
lines(trayectoria_med, col = "blue", lwd = 2)     # intermedia

legend("topleft", legend = c("Más baja", "Más alta", "Intermedia"),
       col = c("red","green","blue"), lwd = 2, bty = "n")

Con esas trayectorias mensuales: proyectamos la TRM para convertir cada cuota en USD a COP, obteniendo la distribución del costo del crédito (media, p95, peor-caso razonable) y la sensibilidad del flujo en pesos.

El GBM se calibró con S₀ = 4.014 COP/USD, μ anual = 4,95% y σ anual = 13,88% (σ mensual = 4,01%), y se corrieron N = 10.000 trayectorias por T = 120 meses. La trayectoria intermedia (seleccionada por cercanía a la media de finales) muestra una senda central que lleva la TRM a ≈ 5–6 mil COP/USD hacia el año 10, mientras que el abanico se ensancha por acumulación de volatilidad: la mínima cae a una fracción de S₀ (≈ 1–1,5 mil COP/USD) y la máxima supera ampliamente 20 mil COP/USD. Esto confirma que, aun con cuota fija en USD, el costo en COP del crédito estará distribuido en un rango amplio y que la variabilidad de la TRM es el principal driver: para presupuestar riesgo conviene usar los cuantiles de finales (p. ej., p5–p50–p95) como banda operativa del proyecto.

La simulación GBM, calibrada con μ=4,95% y σ=13,9% anual, muestra que la TRM a 10 años no es un punto sino una banda: el escenario central es p50 y el 90% de los resultados cae entre p5 y p95. Esta incertidumbre se traslada uno a uno a las cuotas en COP del crédito y justifica implementar cobertura con futuros para estabilizar el flujo

4. Crédito en USD (sistema francés).

El objetivo de esta sección es cuantificar en pesos (COP) el costo total y la variabilidad del crédito en USD (plazo 10 años, sistema francés) utilizado para financiar la maquinaria. Para ello, primero calculamos el cronograma de amortización en USD y, luego, convertimos cada cuota mensual a COP con trayectorias simuladas de la TRM. Con esto buscamos: (i) obtener la cuota esperada y el costo total esperado en COP, (ii) medir el riesgo cambiario como la dispersión de resultados (p. ej., p50, p5–p95), e (iii) identificar el colchón de liquidez necesario ante meses adversos.

# Parámetros del crédito USD
monto_usd <- 125000          # Monto del prestamo en USD
pago_inicial <- 0.10 * monto_usd     #Pago inicial
monto_credito <- monto_usd - pago_inicial
tasa_anual <- 0.063           # Tasa de interés anual (6.30%)
plazo_meses <- 120            # Plazo en meses

# Tasa mensual
tasa_mensual <- tasa_anual / 12

# Cuota mensual 
cuota <- monto_credito * (tasa_mensual / (1 - (1 + tasa_mensual)^(-plazo_meses)))

# Tabla de amortización
credito_dolares <- data.frame(
  Mes = 1:plazo_meses,
  Cuota = rep(round(cuota, 2), plazo_meses),
  Interés = NA,
  Capital = NA,
  Saldo = NA
)

saldo <- monto_credito

for (i in 1:plazo_meses) {
  interes <- saldo * tasa_mensual
  capital <- cuota - interes
  saldo <- saldo - capital
  
  credito_dolares$Interés[i] <- round(interes, 2)
  credito_dolares$Capital[i] <- round(capital, 2)
  credito_dolares$Saldo[i] <- round(saldo, 2)
}

print(credito_dolares)
##     Mes Cuota Interés Capital     Saldo
## 1     1  1266  590.62  675.37 111824.63
## 2     2  1266  587.08  678.92 111145.71
## 3     3  1266  583.51  682.48 110463.23
## 4     4  1266  579.93  686.06 109777.17
## 5     5  1266  576.33  689.67 109087.50
## 6     6  1266  572.71  693.29 108394.21
## 7     7  1266  569.07  696.93 107697.29
## 8     8  1266  565.41  700.59 106996.70
## 9     9  1266  561.73  704.26 106292.44
## 10   10  1266  558.04  707.96 105584.48
## 11   11  1266  554.32  711.68 104872.80
## 12   12  1266  550.58  715.41 104157.38
## 13   13  1266  546.83  719.17 103438.21
## 14   14  1266  543.05  722.95 102715.27
## 15   15  1266  539.26  726.74 101988.53
## 16   16  1266  535.44  730.56 101257.97
## 17   17  1266  531.60  734.39 100523.58
## 18   18  1266  527.75  738.25  99785.33
## 19   19  1266  523.87  742.12  99043.21
## 20   20  1266  519.98  746.02  98297.19
## 21   21  1266  516.06  749.94  97547.25
## 22   22  1266  512.12  753.87  96793.38
## 23   23  1266  508.17  757.83  96035.55
## 24   24  1266  504.19  761.81  95273.74
## 25   25  1266  500.19  765.81  94507.93
## 26   26  1266  496.17  769.83  93738.10
## 27   27  1266  492.13  773.87  92964.23
## 28   28  1266  488.06  777.93  92186.29
## 29   29  1266  483.98  782.02  91404.27
## 30   30  1266  479.87  786.12  90618.15
## 31   31  1266  475.75  790.25  89827.90
## 32   32  1266  471.60  794.40  89033.50
## 33   33  1266  467.43  798.57  88234.93
## 34   34  1266  463.23  802.76  87432.17
## 35   35  1266  459.02  806.98  86625.19
## 36   36  1266  454.78  811.21  85813.97
## 37   37  1266  450.52  815.47  84998.50
## 38   38  1266  446.24  819.75  84178.75
## 39   39  1266  441.94  824.06  83354.69
## 40   40  1266  437.61  828.38  82526.30
## 41   41  1266  433.26  832.73  81693.57
## 42   42  1266  428.89  837.11  80856.47
## 43   43  1266  424.50  841.50  80014.97
## 44   44  1266  420.08  845.92  79169.05
## 45   45  1266  415.64  850.36  78318.69
## 46   46  1266  411.17  854.82  77463.87
## 47   47  1266  406.69  859.31  76604.55
## 48   48  1266  402.17  863.82  75740.73
## 49   49  1266  397.64  868.36  74872.37
## 50   50  1266  393.08  872.92  73999.46
## 51   51  1266  388.50  877.50  73121.96
## 52   52  1266  383.89  882.11  72239.85
## 53   53  1266  379.26  886.74  71353.12
## 54   54  1266  374.60  891.39  70461.72
## 55   55  1266  369.92  896.07  69565.65
## 56   56  1266  365.22  900.78  68664.87
## 57   57  1266  360.49  905.51  67759.37
## 58   58  1266  355.74  910.26  66849.11
## 59   59  1266  350.96  915.04  65934.07
## 60   60  1266  346.15  919.84  65014.23
## 61   61  1266  341.32  924.67  64089.56
## 62   62  1266  336.47  929.53  63160.03
## 63   63  1266  331.59  934.41  62225.62
## 64   64  1266  326.68  939.31  61286.31
## 65   65  1266  321.75  944.24  60342.07
## 66   66  1266  316.80  949.20  59392.87
## 67   67  1266  311.81  954.18  58438.68
## 68   68  1266  306.80  959.19  57479.49
## 69   69  1266  301.77  964.23  56515.26
## 70   70  1266  296.71  969.29  55545.97
## 71   71  1266  291.62  974.38  54571.59
## 72   72  1266  286.50  979.50  53592.10
## 73   73  1266  281.36  984.64  52607.46
## 74   74  1266  276.19  989.81  51617.65
## 75   75  1266  270.99  995.00  50622.65
## 76   76  1266  265.77 1000.23  49622.42
## 77   77  1266  260.52 1005.48  48616.94
## 78   78  1266  255.24 1010.76  47606.18
## 79   79  1266  249.93 1016.06  46590.12
## 80   80  1266  244.60 1021.40  45568.72
## 81   81  1266  239.24 1026.76  44541.96
## 82   82  1266  233.85 1032.15  43509.81
## 83   83  1266  228.43 1037.57  42472.24
## 84   84  1266  222.98 1043.02  41429.22
## 85   85  1266  217.50 1048.49  40380.73
## 86   86  1266  212.00 1054.00  39326.73
## 87   87  1266  206.47 1059.53  38267.20
## 88   88  1266  200.90 1065.09  37202.11
## 89   89  1266  195.31 1070.69  36131.42
## 90   90  1266  189.69 1076.31  35055.12
## 91   91  1266  184.04 1081.96  33973.16
## 92   92  1266  178.36 1087.64  32885.52
## 93   93  1266  172.65 1093.35  31792.17
## 94   94  1266  166.91 1099.09  30693.09
## 95   95  1266  161.14 1104.86  29588.23
## 96   96  1266  155.34 1110.66  28477.57
## 97   97  1266  149.51 1116.49  27361.08
## 98   98  1266  143.65 1122.35  26238.73
## 99   99  1266  137.75 1128.24  25110.49
## 100 100  1266  131.83 1134.17  23976.32
## 101 101  1266  125.88 1140.12  22836.20
## 102 102  1266  119.89 1146.11  21690.09
## 103 103  1266  113.87 1152.12  20537.97
## 104 104  1266  107.82 1158.17  19379.80
## 105 105  1266  101.74 1164.25  18215.55
## 106 106  1266   95.63 1170.36  17045.18
## 107 107  1266   89.49 1176.51  15868.67
## 108 108  1266   83.31 1182.69  14685.99
## 109 109  1266   77.10 1188.89  13497.09
## 110 110  1266   70.86 1195.14  12301.95
## 111 111  1266   64.59 1201.41  11100.54
## 112 112  1266   58.28 1207.72   9892.83
## 113 113  1266   51.94 1214.06   8678.77
## 114 114  1266   45.56 1220.43   7458.33
## 115 115  1266   39.16 1226.84   6231.49
## 116 116  1266   32.72 1233.28   4998.21
## 117 117  1266   26.24 1239.76   3758.46
## 118 118  1266   19.73 1246.26   2512.19
## 119 119  1266   13.19 1252.81   1259.38
## 120 120  1266    6.61 1259.38      0.00

De esta simulación tenemos, Tras el 10% de inicial, el monto financiado es USD 112.500; con tasa anual 6,30% (mensual 0,525%) y plazo 120 meses, la cuota fija resulta USD 1.265,996. La dinámica es la esperada de un francés: al inicio la cuota es mayormente interés y menor abono a capital (p. ej., en el primer mes el interés ronda USD 590,6 y el capital USD 675,4), mientras que en el mes 120 el interés cae a USD 6,61 y el abono a capital sube a USD 1.259,38, dejando saldo ≈ 0. El costo financiero total del crédito es ≈ USD 39.419,6 (suma de todas las cuotas menos el principal), equivalente a ~26% del monto financiado, antes de efectos cambiarios. Este cronograma en USD es la base que luego convertimos a COP con las trayectorias de TRM (σ mensual ≈ 4,01%) para medir la dispersión del costo en pesos y, más adelante, evaluar cuánto estabiliza la cobertura con futuros TRM.

5. Conversión de la simulación del credito a COP

En esta sección convertimos el cronograma del crédito en USD a COP usando tres trayectorias representativas de la TRM tomadas de la simulación GBM: MIN (la más baja al final del horizonte), MED (la intermedia o cercana a la media) y MAX (la más alta). Para cada mes aplicamos estas tres sendas a la cuota, el interés y el abono a capital en USD y obtenemos tres flujos en pesos: escenario optimista (MIN), que refleja apreciación del COP y menor costo en COP; escenario base (MED), que usamos como referencia para el presupuesto; y escenario estresado (MAX), que captura depreciación del COP y el mayor costo probable. Con estos resultados comparamos cuota mensual y costo total en COP entre escenarios, identificamos los meses más sensibles y definimos el colchón de liquidez necesario para enfrentar el caso MAX.

# Extaer datos TRM mas alta
print(trayectoria_max)
##   [1]  3868.183  4067.623  3964.938  3919.014  4025.271  4084.040  3955.972
##   [8]  3686.367  3829.862  3811.798  3787.141  3809.762  3655.497  3725.286
##  [15]  3750.837  3728.286  3845.597  3666.598  3600.606  3773.522  3844.554
##  [22]  4183.022  4130.101  3920.389  3995.996  4292.278  3864.534  3848.500
##  [29]  3712.211  3516.692  3771.773  3946.242  3912.760  4316.561  4469.054
##  [36]  4775.505  5027.977  5115.838  5181.177  5445.198  6035.339  6246.702
##  [43]  6349.069  6437.524  6812.399  7352.219  7751.552  8010.847  7812.963
##  [50]  8300.468  8015.265  8317.486  8302.116  7871.336  7785.835  7901.107
##  [57]  8414.713  8405.710  7642.582  8529.892  8405.803  9105.823  9330.059
##  [64]  9669.011  9955.789 10056.154  9696.811  9793.099  9300.090  9622.373
##  [71]  9429.845  9732.587  9774.995  9603.894 10291.335 10969.214 10926.776
##  [78] 11338.611 11394.419 11544.301 11929.079 12866.894 13402.494 12940.342
##  [85] 12456.893 12761.187 13280.202 12344.374 12768.426 13354.069 14387.188
##  [92] 14147.261 15216.109 15755.386 16039.117 16517.368 17111.850 17784.751
##  [99] 18714.086 18589.884 18664.418 19547.345 18695.871 18120.758 18474.425
## [106] 18549.316 18127.450 19960.588 21198.451 22019.888 22482.103 23005.874
## [113] 23676.107 24753.615 25990.342 26176.331 26129.717 26491.379 26609.145
## [120] 27694.989
#simulacion credito COP con TRM MIN

simulacion_TRM_min <- data.frame(
  Mes = credito_dolares$Mes,
  Cuota_COP = credito_dolares$Cuota * trayectoria_min,
  Interes_COP = credito_dolares$Interés * trayectoria_min,
  AbonoCapital_COP = credito_dolares$Capital * trayectoria_min,
  Saldo_COP = credito_dolares$Saldo * trayectoria_min
)

print(simulacion_TRM_min)
##     Mes Cuota_COP Interes_COP AbonoCapital_COP Saldo_COP
## 1     1   5078344  2369171.61          2709132 448565471
## 2     2   5123834  2376066.87          2747767 449835864
## 3     3   5171564  2383617.24          2787906 451238298
## 4     4   4721259  2162716.96          2558505 409388974
## 5     5   5221657  2377091.38          2844566 449934857
## 6     6   4948575  2238624.38          2709951 423694228
## 7     7   4759778  2139531.56          2620247 404909327
## 8     8   4407020  1968225.14          2438795 372461745
## 9     9   4565865  2025895.32          2539934 383346726
## 10   10   4683566  2064468.42          2619097 390609678
## 11   11   4659379  2040116.23          2619263 385973267
## 12   12   4538247  1973671.51          2564540 373374357
## 13   13   4330112  1870328.00          2459784 353790721
## 14   14   4372458  1875563.46          2496895 354753720
## 15   15   4186337  1783194.26          2403142 337249864
## 16   16   4206379  1779038.95          2427340 336437085
## 17   17   4355765  1829008.48          2526722 345858690
## 18   18   4485907  1870013.90          2615893 353576418
## 19   19   4122246  1705782.74          2416431 322496417
## 20   20   4088201  1679133.11          2409067 317423874
## 21   21   4121970  1680240.08          2441730 317604153
## 22   22   3937650  1592850.80          2344768 301057200
## 23   23   3809216  1529011.98          2280204 288957449
## 24   24   3940666  1569387.22          2371278 296557627
## 25   25   4165775  1645875.91          2519899 310978478
## 26   26   3875014  1518693.27          2356321 286916624
## 27   27   3680429  1430686.82          2249742 270259278
## 28   28   3906802  1506124.64          2400647 284481503
## 29   29   3855418  1473890.47          2381528 278358368
## 30   30   3747975  1420648.43          2327297 268273766
## 31   31   3903544  1466912.19          2436631 276972447
## 32   32   3872884  1442695.08          2430189 272366820
## 33   33   3821165  1410842.83          2410322 266319274
## 34   34   3774739  1381178.73          2393530 260690054
## 35   35   3794740  1375878.13          2418862 259652531
## 36   36   3697501  1328237.99          2369233 250629699
## 37   37   3845733  1368546.36          2477156 258200275
## 38   38   4051064  1427920.12          2623112 269362968
## 39   39   4140380  1445339.21          2695041 272606693
## 40   40   4115503  1422579.36          2692892 268275887
## 41   41   4052073  1386730.93          2665311 261475789
## 42   42   4092043  1386284.64          2705758 261349256
## 43   43   4123006  1382477.26          2740529 260586282
## 44   44   3935822  1305971.58          2629850 246125809
## 45   45   3830595  1257621.10          2572973 236972468
## 46   46   3560287  1156305.90          2403953 217846463
## 47   47   3267516  1049657.22          2217859 197714521
## 48   48   3184193  1011522.06          2172646 190500086
## 49   49   3304691  1037975.90          2266715 195442399
## 50   50   3380982  1049760.29          2331222 197623116
## 51   51   3318776  1018439.45          2300336 191686716
## 52   52   3339342  1012590.84          2326751 190547840
## 53   53   3244651   972011.45          2272640 182872039
## 54   54   3034029   897746.61          2136258 168864843
## 55   55   2936358   857991.68          2078343 161350423
## 56   56   2919908   842345.09          2077563 158368973
## 57   57   2936704   836218.43          2100486 157179489
## 58   58   2967776   833931.00          2133845 156708679
## 59   59   2875461   797134.19          2078327 149755816
## 60   60   2950209   806646.87          2143539 151505201
## 61   61   3001112   809115.04          2191974 151927303
## 62   62   3123967   830269.49          2293697 155852961
## 63   63   3012185   788949.77          2223235 148052983
## 64   64   3084280   795871.02          2288385 149308186
## 65   65   2969407   754665.75          2214718 141532536
## 66   66   3293780   824225.62          2469555 154523754
## 67   67   3121908   768911.63          2352972 144107567
## 68   68   3060810   741750.83          2319035 138968251
## 69   69   3051724   727423.99          2324300 136231421
## 70   70   3067293   718875.68          2348418 134578029
## 71   71   2933499   675724.42          2257775 126450025
## 72   72   3237329   732618.35          2504711 137042080
## 73   73   3069989   682284.48          2387705 127570563
## 74   74   2949473   643455.77          2306017 120256615
## 75   75   3010794   644466.88          2366303 120390499
## 76   76   3078829   646335.19          2432494 120678468
## 77   77   3228171   664299.38          2563871 123968230
## 78   78   3053319   615583.93          2437736 114815857
## 79   79   3293822   650256.74          2643540 121216099
## 80   80   3538368   683637.25          2854731 127360894
## 81   81   3448294   651634.87          2796659 121322079
## 82   82   3479997   642809.80          2837187 119600309
## 83   83   3516373   634474.72          2881898 117968580
## 84   84   3554073   625977.24          2928096 116305268
## 85   85   3512937   603525.89          2909383 112049729
## 86   86   3453576   578323.87          2875252 107281070
## 87   87   3355412   547229.06          2808183 101423566
## 88   88   3332551   528838.49          2803686  97928858
## 89   89   3173274   489551.49          2683723  90564695
## 90   90   3051247   457180.89          2594066  84488013
## 91   91   3089043   449058.08          2639985  82894600
## 92   92   2927886   412494.33          2515392  76054556
## 93   93   2968648   404847.58          2563800  74549568
## 94   94   3175804   418699.47          2757105  76994670
## 95   95   2987906   380308.93          2607597  69831625
## 96   96   2937094   360385.57          2576708  66067370
## 97   97   2867010   338583.47          2528427  61962474
## 98   98   3019418   342606.14          2676812  62579533
## 99   99   2808719   305608.99          2503087  55709558
## 100 100   2690617   280176.94          2410440  50956625
## 101 101   2535816   252139.45          2283677  45741238
## 102 102   2677459   253554.98          2423904  45872303
## 103 103   2755849   247873.99          2507953  44707373
## 104 104   2505885   213415.91          2292449  38359836
## 105 105   2394033   192392.54          2201622  34445999
## 106 106   2387895   180374.73          2207501  32150159
## 107 107   2509050   177357.70          2331692  31449668
## 108 108   2259236   148670.57          2110565  26207833
## 109 109   2296801   139876.28          2156907  24486677
## 110 110   2372080   132769.03          2239311  23049928
## 111 111   2439860   124479.10          2315381  21393176
## 112 112   2299115   105839.20          2193276  17965840
## 113 113   2214586    90857.50          2123728  15181582
## 114 114   2271088    81730.45          2189339  13379558
## 115 115   2318478    71715.33          2246763  11411986
## 116 116   2190427    56611.98          2133815   8647879
## 117 117   2184682    45281.25          2139401   6485815
## 118 118   2006888    31276.39          1975596   3982373
## 119 119   1989858    20731.62          1969127   1979453
## 120 120   1991357    10397.21          1980944         0
#simulacion credito COP con TRM MED

simulacion_TRM_med <- data.frame(
  Mes = credito_dolares$Mes,
  Cuota_COP = credito_dolares$Cuota * trayectoria_med,
  Interes_COP = credito_dolares$Interés * trayectoria_med,
  AbonoCapital_COP = credito_dolares$Capital * trayectoria_med,
  Saldo_COP = credito_dolares$Saldo * trayectoria_med
)
print(simulacion_TRM_med)
##     Mes Cuota_COP Interes_COP AbonoCapital_COP Saldo_COP
## 1     1   4982415  2324418.57          2657957 440092186
## 2     2   4977437  2308178.37          2669259 436983246
## 3     3   4785229  2205552.03          2579639 417529094
## 4     4   4823695  2209640.78          2614016 418271364
## 5     5   5132149  2336343.87          2795805 442222186
## 6     6   4855453  2196498.18          2658955 415721195
## 7     7   4444469  1997799.54          2446670 378086346
## 8     8   4683185  2091563.72          2591621 395802012
## 9     9   4602285  2042054.98          2560194 386404513
## 10   10   4993237  2200968.32          2792269 416436269
## 11   11   4915944  2152453.40          2763490 407226539
## 12   12   4817003  2094901.48          2722063 396308347
## 13   13   4759765  2055910.39          2703855 388895434
## 14   14   4695538  2014148.45          2681390 380966398
## 15   15   4666066  1987537.63          2678528 375896675
## 16   16   4552686  1925505.79          2627180 364135679
## 17   17   4831440  2028746.77          2802655 383628459
## 18   18   4912507  2047848.02          2864659 387200741
## 19   19   5379550  2226054.35          3153453 420859314
## 20   20   5244989  2154257.10          3090732 407241470
## 21   21   5499817  2241892.05          3257925 423769337
## 22   22   5465127  2210743.20          3254341 417842119
## 23   23   5675010  2277938.42          3397072 430491900
## 24   24   5712480  2275020.17          3437460 429896825
## 25   25   5854185  2312957.95          3541227 437019668
## 26   26   5883120  2305709.05          3577411 435602284
## 27   27   6183061  2403530.73          3779530 454031219
## 28   28   5876743  2265563.50          3611133 427926676
## 29   29   6005862  2295985.05          3709877 433618822
## 30   30   6713193  2544597.03          4168543 480519048
## 31   31   6731415  2529597.56          4201817 477621516
## 32   32   7065427  2631955.10          4433471 496887562
## 33   33   7137967  2635465.98          4502501 497486589
## 34   34   7092005  2594967.95          4496981 489786239
## 35   35   7124147  2583037.88          4541109 487464918
## 36   36   6857440  2463370.18          4394016 464821616
## 37   37   7116070  2532331.75          4583682 477768801
## 38   38   7351926  2591408.61          4760459 488843531
## 39   39   7922245  2765526.70          5156718 521608410
## 40   40   7831916  2707207.54          5124647 510536372
## 41   41   7754069  2653655.44          5100352 500361415
## 42   42   7632835  2585818.90          5047016 487491405
## 43   43   8016701  2688064.41          5328637 506679371
## 44   44   7837501  2600614.17          5236887 490116533
## 45   45   7428964  2439000.39          4989963 459578760
## 46   46   7444564  2417836.89          5026669 455517189
## 47   47   8008657  2572702.11          5435955 484596837
## 48   48   8167317  2594510.27          5572743 488624466
## 49   49   8884530  2790556.62          6093974 525439059
## 50   50   9163256  2845096.99          6318159 535605070
## 51   51   9219571  2829228.63          6390343 532506417
## 52   52   9397045  2849472.06          6547573 536209421
## 53   53   9574223  2868183.26          6706040 539613521
## 54   54  10071614  2980115.90          7091419 560555505
## 55   55  10004665  2923322.09          7081264 549748057
## 56   56  10174049  2935044.52          7239005 551816577
## 57   57   9932671  2828300.60          7104370 531620480
## 58   58   9287411  2609718.39          6677692 490406902
## 59   59   9792367  2714635.99          7077731 509992589
## 60   60   9702730  2652922.69          7049731 498274523
## 61   61   9441481  2545471.11          6895936 477962392
## 62   62   9036798  2401746.70          6635051 450840768
## 63   63   9401737  2462497.56          6939239 462108138
## 64   64   9503233  2452224.49          7050934 460045887
## 65   65   9725682  2471752.02          7253853 463560633
## 66   66   9799620  2452227.23          7347393 459737415
## 67   67   9998774  2462652.25          7536043 461544359
## 68   68  10084743  2443917.16          7640746 457871943
## 69   69   9700356  2312224.70          7388131 433031712
## 70   70  10090806  2364962.90          7725843 442735864
## 71   71   9754344  2246889.32          7507455 420466095
## 72   72   9447738  2138054.42          7309683 399940057
## 73   73   9749198  2166693.80          7582504 405118913
## 74   74   9155772  1997419.20          7158353 373301297
## 75   75   8839762  1892169.99          6947523 353469351
## 76   76   8746260  1836092.74          6910167 342820352
## 77   77   8580864  1765787.30          6815077 329522398
## 78   78   8991334  1812755.16          7178579 338106679
## 79   79   9119598  1800364.16          7319161 335610701
## 80   80   8984376  1735843.93          7248532 323385880
## 81   81   8910621  1683868.07          7226753 313504364
## 82   82   8745657  1615459.59          7130197 300570194
## 83   83   7935290  1431799.56          6503490 266216060
## 84   84   7872398  1386561.86          6485836 257620309
## 85   85   7997670  1374007.37          6623600 255096186
## 86   86   7791936  1304810.83          6487126 242046901
## 87   87   7468221  1217980.80          6250241 225740857
## 88   88   7566559  1200728.00          6365771 222347512
## 89   89   7263032  1120491.87          6142540 207285661
## 90   90   7027914  1053021.39          5974893 194600619
## 91   91   7046446  1024350.71          6022096 189091667
## 92   92   7386421  1040633.56          6345788 191869117
## 93   93   7895427  1076734.22          6818693 198272328
## 94   94   8065800  1063398.70          7002402 195548451
## 95   95   8453503  1075985.30          7377517 197570440
## 96   96   9330796  1144901.92          8185894 209888146
## 97   97   9432902  1113991.49          8318911 203866031
## 98   98   9322157  1057762.95          8264394 193208191
## 99   99   8947004   973499.08          7973434 177459447
## 100 100   9093085   946873.15          8146212 172210678
## 101 101   8952007   890109.53          8061898 161476956
## 102 102   8699441   823835.69          7875605 149045544
## 103 103   9016808   811014.19          8205723 146277203
## 104 104   9033812   769372.51          8264368 138288679
## 105 105   8312075   667986.19          7644023 119596382
## 106 106   8295816   626642.11          7669109 111693271
## 107 107   9201834   650451.95          8551382 115340343
## 108 108   8591208   565350.34          8025858  99660658
## 109 109   8975531   546614.10          8428846  95690009
## 110 110   8959178   501459.18          8457718  87057942
## 111 111   8211899   418962.53          7792937  72003566
## 112 112   8221023   378452.80          7842571  64241065
## 113 113   8522592   349655.14          8172936  58424654
## 114 114   8210840   295486.46          7915289  48372159
## 115 115   8180753   253047.62          7927705  40267204
## 116 116   8171345   211189.90          7960155  32260741
## 117 117   8512950   176445.35          8336505  25272973
## 118 118   8414679   131138.72          8283474  16697688
## 119 119   8454890    88088.47          8366801   8410679
## 120 120   8352618    43610.43          8308941         0
#simulacion credito COP con TRM MAX

simulacion_TRM_max <- data.frame(
  Mes = credito_dolares$Mes,
  Cuota_COP = credito_dolares$Cuota * trayectoria_max,
  Interes_COP = credito_dolares$Interés * trayectoria_max,
  AbonoCapital_COP = credito_dolares$Capital * trayectoria_max,
  Saldo_COP = credito_dolares$Saldo * trayectoria_max
)
print(simulacion_TRM_max)
##     Mes Cuota_COP Interes_COP AbonoCapital_COP Saldo_COP
## 1     1   4897119   2284626.0          2612454 432558085
## 2     2   5149611   2388020.1          2761591 452098846
## 3     3   5019611   2313580.7          2705991 437979812
## 4     4   4961472   2272754.0          2688679 430218309
## 5     5   5095993   2319884.3          2776108 439106722
## 6     6   5170395   2338970.5          2831424 442686282
## 7     7   5008261   2251225.1          2757036 426047484
## 8     8   4666941   2084308.8          2582632 394429107
## 9     9   4848605   2151348.3          2697218 407085354
## 10   10   4825736   2127135.7          2698600 402466691
## 11   11   4794521   2099288.3          2695233 397168133
## 12   12   4823158   2097578.5          2725542 396814783
## 13   13   4627859   1998935.5          2628924 378118072
## 14   14   4716212   2023016.3          2693195 382643713
## 15   15   4748560   2022676.5          2725883 382542370
## 16   16   4720010   1996273.3          2723736 377518634
## 17   17   4868526   2044319.5          2824168 386573198
## 18   18   4641913   1935047.1          2706866 365872687
## 19   19   4558367   1886249.4          2672082 356615557
## 20   20   4777278   1962155.7          2815123 370926567
## 21   21   4867205   1984020.4          2883185 375025646
## 22   22   5295706   2142209.4          3153455 404888862
## 23   23   5228708   2098793.5          3129915 396636533
## 24   24   4963212   1976620.8          2986591 373510093
## 25   25   5058931   1998757.2          3060174 377653301
## 26   26   5434024   2129699.6          3304324 402349992
## 27   27   4892500   1901853.3          2990647 359263453
## 28   28   4872201   1878298.7          2993863 354778903
## 29   29   4699659   1796635.8          2903023 339311930
## 30   30   4452132   1687554.9          2764542 318676103
## 31   31   4775064   1794420.9          2980643 338810419
## 32   32   4995943   1861047.8          3134895 351347750
## 33   33   4953555   1828941.6          3124613 345242145
## 34   34   5464766   1999560.4          3465162 377406263
## 35   35   5657822   2051385.0          3606437 387132629
## 36   36   6045789   2171804.2          3873937 409805047
## 37   37   6365418   2265204.0          4100164 427370473
## 38   38   6476650   2282891.4          4193708 430644818
## 39   39   6559370   2289769.4          4269601 431875402
## 40   40   6893621   2382873.2          4510693 449372055
## 41   41   7640739   2614870.8          5025808 493048365
## 42   42   7908325   2679148.0          5229177 505086276
## 43   43   8037921   2695179.7          5342741 508020546
## 44   44   8149906   2704275.2          5445631 509652685
## 45   45   8624497   2831505.4          5792991 533538150
## 46   46   9307910   3023012.1          6284824 569531375
## 47   47   9813465   3152478.7          6660986 593804165
## 48   48  10141733   3221722.5          6919930 606747423
## 49   49   9891211   3106746.4          6784464 584975025
## 50   50  10508393   3262748.0          7245645 614230155
## 51   51  10147325   3113930.4          7033395 586091878
## 52   52  10529937   3192999.7          7336938 600853950
## 53   53  10510478   3148660.4          7361818 592381853
## 54   54   9965111   2948602.3          7016430 554627849
## 55   55   9856867   2880136.0          6976653 541626649
## 56   56  10002801   2885642.1          7117159 542528454
## 57   57  10653027   3033419.9          7619607 570175648
## 58   58  10641629   2990247.4          7651382 561914250
## 59   59   9675509   2682240.5          6993268 503906521
## 60   60  10798844   2952622.2          7846136 554564386
## 61   61  10641747   2869068.8          7772594 538724245
## 62   62  11527972   3063836.2          8464136 575124044
## 63   63  11811855   3093754.4          8718101 580568727
## 64   64  12240968   3158672.6          9082199 592578021
## 65   65  12604029   3203275.1          9400654 600752922
## 66   66  12731090   3185789.4          9545301 597263821
## 67   67  12276162   3023562.5          9252503 566668810
## 68   68  12398063   3004522.7          9393443 562902331
## 69   69  11773914   2806488.2          8967426 525597005
## 70   70  12181925   2855054.4          9326870 534484067
## 71   71  11938183   2749931.3          9188252 514601611
## 72   72  12321456   2788386.3          9533069 521589798
## 73   73  12375144   2750292.7          9624851 514237680
## 74   74  12158530   2652499.5          9506030 495730436
## 75   75  13028831   2788849.0         10239879 520974672
## 76   76  13887025   2915288.1         10971737 544318959
## 77   77  13833299   2846643.7         10986655 531226418
## 78   78  14354682   2894067.1         11460615 539787966
## 79   79  14425335   2847807.2         11577414 530867359
## 80   80  14615085   2823736.0         11791349 526059013
## 81   81  15102214   2853912.8         12248301 531344550
## 82   82  16289488   3008923.1         13280564 559836106
## 83   83  16967558   3061531.7         13906026 569233946
## 84   84  16382473   2885437.4         13497035 536108273
## 85   85  15770426   2709374.1         13060927 503018413
## 86   86  16155663   2705371.7         13450292 501855775
## 87   87  16812736   2741963.4         14070773 508196163
## 88   88  15627978   2479984.8         13147869 459236764
## 89   89  16164828   2493801.4         13671026 461341376
## 90   90  16906252   2533133.4         14373119 468128508
## 91   91  18214180   2647818.1         15566362 488778239
## 92   92  17910432   2523305.4         15387127 465240030
## 93   93  19263594   2627061.2         16636533 483753120
## 94   94  19946319   2629731.6         17316588 483581495
## 95   95  20305522   2584543.3         17720979 474569077
## 96   96  20910988   2565807.9         18345180 470374497
## 97   97  21663602   2558392.7         19105209 468198693
## 98   98  22515495   2554779.5         19960715 466649278
## 99   99  23692032   2577865.3         21113980 469919861
## 100 100  23534793   2450704.4         21084089 445717009
## 101 101  23629153   2349476.9         21279676 426224373
## 102 102  24746939   2343531.2         22403408 423983681
## 103 103  23668973   2128898.9         21539887 383975243
## 104 104  22940879   1953780.1         20986918 351176663
## 105 105  23388622   1879588.0         21508849 336521808
## 106 106  23483434   1773871.1         21709377 316176427
## 107 107  22949352   1622225.5         21327126 287658520
## 108 108  25270104   1662916.6         23607188 293140995
## 109 109  26837239   1634400.6         25202626 286117398
## 110 110  27877178   1560329.3         26316849 270887560
## 111 111  28462342   1452119.0         27010223 249563479
## 112 112  29125437   1340782.4         27784655 227593205
## 113 113  29973952   1229737.0         28744215 205479490
## 114 114  31338076   1127774.7         30210054 184620629
## 115 115  32903773   1017781.8         31885991 161958558
## 116 116  33139236    856489.6         32282746 130834801
## 117 117  33080222    685643.8         32394578  98207496
## 118 118  33538085    522674.9         33015145  66551376
## 119 119  33687177    350974.6         33336203  33511025
## 120 120  35061856    183063.9         34878516         0
resumen_credito <- function(df, tasa_desc = 0.10){
  data.frame(
    total_cop   = sum(df$Cuota_COP),
    vp_cop      = sum(df$Cuota_COP / (1 + tasa_desc)^(df$Mes/12)),
    cuota_prom  = mean(df$Cuota_COP),
    cuota_max   = max(df$Cuota_COP),
    mes_max     = df$Mes[which.max(df$Cuota_COP)],
    sd_mensual  = sd(df$Cuota_COP),
    cv_mensual  = sd(df$Cuota_COP)/mean(df$Cuota_COP)
  )
}

tasa_desc <- 0.10  # ajusta según BanRep/WACC del proyecto
tab <- rbind(
  MIN = resumen_credito(simulacion_TRM_min, tasa_desc),
  MED = resumen_credito(simulacion_TRM_med, tasa_desc),
  MAX = resumen_credito(simulacion_TRM_max, tasa_desc)
)

# Sensibilidades vs presupuesto (MED)
tab$delta_total_vs_MED <- tab$total_cop - tab["MED","total_cop"]
tab$delta_vp_vs_MED    <- tab$vp_cop    - tab["MED","vp_cop"]
round(tab, 0)

Como presupuesto base (MED), el costo total del crédito asciende a 830.384.169 COP y el valor presente (VP) a 500.015.936 COP, con una cuota promedio de 6.919.868. Bajo apreciación del COP (MIN), el total cae a 301.627.764 (−63,7% vs. MED) y el VP a 211.169.126 (−57,8%), con cuota promedio de 2.513.565. En el estrés de depreciación (MAX), el total se expande a 1.812.038.764 (+118,2%) y el VP a 976.392.562 (+95,3%), con cuota promedio de 15.100.323. En términos operativos, la brecha de pago mensual entre MAX y MED es de 8,18 millones en promedio, que sirve como referencia de colchón de liquidez por crédito (la brecha MIN–MED es de 4,41 millones a favor). La diferencia relativa mayor en VP frente a total confirma que depreciaciones tempranas encarecen más el crédito (por mayor saldo al inicio).

PARTE2 PROCESO FUTURO

En esta parte diseñamos, implementamos y evaluamos una cobertura con futuros de TRM listados en la BVC para proteger el 75% de la exposición cambiaria del crédito desde el año 6 hasta el año 10. El objetivo es estabilizar el flujo en COP del servicio de la deuda, limitando el impacto de depreciaciones del peso y trasladando el riesgo direccional del tipo de cambio a flujos de margen (mark-to-market). Para ello: (i) seleccionamos un contrato de futuro TRM y calculamos retornos y volatilidad con su serie histórica; (ii) fijamos el precio inicial del primer vencimiento con una tasa en USD que emule condiciones de mercado (y/o con riesgo de base) y luego simulamos trayectorias mensuales del futuro mediante GBM para el tramo meses 61–120; (iii) determinamos el número de contratos para cubrir el 75% del nocional, y modelamos margen inicial y de mantenimiento según la ficha de la BVC; (iv) incorporamos rollover a cada vencimiento y registramos variación de márgenes, llamadas de margen y cambios de posición según la expectativa de mercado; y (v) comparamos el crédito sin cobertura vs. cubierto, evaluando reducción de volatilidad, costo/beneficio neto (incluidos márgenes) y el requerimiento de liquidez. Con esto concluimos si la cobertura con futuros fue efectiva y rentable para la inversión en maquinaria.

datos_Futuro  <- read.table("Futuro TRM.txt", 
                    header = TRUE,    # TRUE si la primera fila tiene nombres de columnas
                    sep = "\t",       # "\t" si es tabulado, "," si es CSV
                    stringsAsFactors = FALSE)

1. Metodología cuantitativa

a. Retornos y volatilidad. El primer paso del análisis de cobertura consiste en caracterizar estadísticamente el futuro de TRM negociado en la BVC, ya que su comportamiento histórico define los parámetros de riesgo para la simulación. En particular, se calculan los retornos logarítmicos mensuales, que permiten medir la variación porcentual relativa del precio, y la desviación estándar de dichos retornos, que representa su volatilidad. Estos indicadores son fundamentales: el retorno medio refleja la tendencia esperada en los precios del contrato, mientras que la desviación estándar mide la magnitud de las fluctuaciones a las que se enfrentará la cobertura. A partir de estos valores se calibran los parámetros del GBM (media y sigma), lo que permitirá proyectar escenarios de precios futuros y estimar tanto el riesgo de liquidez por márgenes como la efectividad de la cobertura en la reducción de la exposición cambiaria del crédito.

# Calcular retornos mensuales
datos_Futuro <- datos_Futuro %>%
  arrange(Fecha) %>%
  mutate(retorno = log(TRM / lag(TRM)))
print(datos_Futuro)
##         Fecha     TRM       retorno
## 1  12/06/2025 4255.00            NA
## 2  12/09/2025 3919.86 -0.0820388231
## 3  14/08/2025 4047.75  0.0321052323
## 4  15/07/2025 4011.30 -0.0090457929
## 5  15/09/2025 3909.26 -0.0257672805
## 6  16/09/2025 3892.00 -0.0044249334
## 7  17/09/2025 3889.88 -0.0005448555
## 8   2/09/2025 4026.65  0.0345564559
## 9  31/07/2025 4169.00  0.0347414341
## 10  4/09/2025 4013.00 -0.0381371076
## 11  5/09/2025 3983.00 -0.0075037871
## 12  8/09/2025 3961.39 -0.0054403304
## 13  9/09/2025 3956.12 -0.0013312268
# Calcular desviación estándar mensual
desviacion_mensual <- sd(datos_Futuro$TRM, na.rm = TRUE)
print(paste("Desviación estándar mensual:", round(desviacion_mensual, 4)))
## [1] "Desviación estándar mensual: 107.6006"

La desviación estándar mensual del futuro es 107,6 COP por USD. Esto significa que, en un mes típico, el precio del contrato oscila ±107,6 COP alrededor de su media. Si el futuro promedia $4.100, esa dispersión equivale a ≈2,6% mensual (107,6/4.100)(107,6/4.100). En términos operativos, por un contrato de USD 50.000 el mark-to-market de 1σ sería de ≈ $5,38 millones COP (107,6 × 50.000), útil para dimensionar márgenes y liquidez.

2. Simulación BMG del futuro de TRM

En esta etapa simulamos el precio del futuro de TRM con un Browniano Geométrico (GBM) para generar un abanico de escenarios mensuales entre los meses 61–120. Partimos de un precio inicial (por paridad de tasas o el primer vencimiento observado) y usamos como parámetros la media y la volatilidad estimadas de los retornos log mensuales del propio futuro. Con estas trayectorias modelamos el rollover de contratos de corto plazo y el mark-to-market, lo que permite cuantificar márgenes (inicial y de mantenimiento), llamadas de margen y requerimientos de liquidez, y medir la efectividad del hedge sobre el 75% de la exposición del crédito.

# Simulación BMG del Futuro de la TRM en Colombia
# -----------------------------------------------

# --- Parámetros del modelo ---
mu_anual <- -0.08580
sigma_anual <- 0.07351

mu_mensual <- mu_anual / 12
sigma_mensual <- sigma_anual / sqrt(12)

# --- Cálculo del futuro TRM a 6 años como punto inicial ---
TRM_spot <- 3889.88
r_COP <- 0.0644
r_USD <- 0.063

F6_futuroTRM_0 <- TRM_spot * ((1 + r_COP) / (1 + r_USD))^6

cat("Valor inicial F6_futuroTRM_0:", round(F6_futuroTRM_0, 2), "\n")
## Valor inicial F6_futuroTRM_0: 3920.72
# --- Parámetros de simulación ---
T <- 48    # 4 años
N <- 1000  # número de simulaciones

set.seed(42)

# Crear matriz con una fila adicional para el periodo 0
simulaciones <- matrix(NA, nrow = T + 1, ncol = N)

# Establecer el valor inicial en el periodo 0
simulaciones[1, ] <- F6_futuroTRM_0

# Generar caminatas desde el mes 1 al 48
for (j in 1:N) {
  pasos <- rnorm(T, mean = mu_mensual - 0.5 * sigma_mensual^2, sd = sigma_mensual)
  simulaciones[2:(T + 1), j] <- F6_futuroTRM_0 * exp(cumsum(pasos))
}
sim_df <- as.data.frame(simulaciones)
sim_df$Mes <- 0:T
simulaciones_long <- sim_df %>%
  tidyr::pivot_longer(cols = starts_with("V"),
                      names_to = "Simulacion", values_to = "TRM") %>%
  mutate(Simulacion = sub("^V", "Sim_", Simulacion))

# --- Graficar las trayectorias ---
ggplot(simulaciones_long %>% filter(Simulacion %in% paste0("Sim_", 1:500)),
       aes(x = Mes, y = TRM, group = Simulacion, color = Simulacion)) +
  geom_line(alpha = 0.6) +
  labs(title = "Simulación BMG de TRM (Años 6 a 10)",
       subtitle = paste("Valor inicial en t=0 (F6_futuroTRM_0):", round(F6_futuroTRM_0, 2)),
       x = "Mes",
       y = "TRM simulada (COP)") +
  theme_minimal() +
  theme(legend.position = "none")

# Extraer la fila correspondiente al mes final (mes 48)
finales <- sim_df[sim_df$Mes == 48, ]

# Quitar la columna "Mes" y convertir en vector
finales_vector <- unlist(finales[ , -ncol(finales)])

# Obtener índices de simulaciones con valores máximos y mínimos
idx_max <- which.max(finales_vector)
idx_min <- which.min(finales_vector)

# Nombres de las simulaciones correspondientes
sim_max <- paste0("Sim_", idx_max)
sim_min <- paste0("Sim_", idx_min)

# Filtrar las trayectorias máxima y mínima del dataframe largo
trayectorias_extremas <- simulaciones_long %>%
  filter(Simulacion %in% c(sim_max, sim_min)) %>%
  mutate(Tipo = case_when(
    Simulacion == sim_max ~ "Máxima",
    Simulacion == sim_min ~ "Mínima"
  ))

# Gráfico completo con trayectorias aleatorias + destacadas
ggplot() +
  # Simulaciones normales
  geom_line(data = simulaciones_long %>%
              filter(Simulacion %in% paste0("Sim_", 1:500)),
            aes(x = Mes, y = TRM, group = Simulacion),
            color = "gray70", alpha = 0.3) +

  # Trayectorias extrema (máxima y mínima)
  geom_line(data = trayectorias_extremas,
            aes(x = Mes, y = TRM, color = Tipo),
            size = 1.2) +

  scale_color_manual(values = c("Máxima" = "forestgreen", "Mínima" = "firebrick")) +

  labs(title = "Simulación BMG de TRM (Años 6 a 10)",
       subtitle = paste("Valor inicial en t=0 (F6_futuroTRM_0):", round(F6_futuroTRM_0, 2)),
       x = "Mes", y = "TRM simulada (COP)",
       color = "Trayectoria") +

  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

# Agregar columna que marca si es rollover (cada 3 meses)
simulaciones_long <- simulaciones_long %>%
  mutate(Rollover = if_else(Mes %% 3 == 0 & Mes != 0, "Sí", "No"))
ggplot() +
  # Todas las simulaciones en gris
  geom_line(data = simulaciones_long %>%
              filter(Simulacion %in% paste0("Sim_", 1:500)),
            aes(x = Mes, y = TRM, group = Simulacion),
            color = "gray70", alpha = 0.3) +

  # Trayectorias máxima y mínima destacadas
  geom_line(data = trayectorias_extremas,
            aes(x = Mes, y = TRM, color = Tipo),
            size = 1.2) +

  # Puntos de rollover (en rojo)
  geom_point(data = simulaciones_long %>%
               filter(Simulacion %in% paste0("Sim_", 1:500), Rollover == "Sí"),
             aes(x = Mes, y = TRM),
             color = "red", size = 1.2, alpha = 0.5) +

  scale_color_manual(values = c("Máxima" = "forestgreen", "Mínima" = "firebrick")) +

  labs(title = "Simulación BMG de TRM (Años 6 a 10)",
       subtitle = paste("Valor inicial en t=0 (F6_futuroTRM_0):", round(F6_futuroTRM_0, 2)),
       x = "Mes", y = "TRM simulada (COP)",
       color = "Trayectoria") +

  theme_minimal()

La distribución simulada a 48 meses muestra una mediana por debajo de F₀ —el contrato tiene costo esperado— pero mantiene una cola superior amplia, es decir, hay escenarios de depreciación relevante del COP en los que el futuro sube por encima del nivel inicial. La dispersión mensual observada en el propio futuro (SD ≈ 107,6 COP) implica un mark-to-market típico de 1σ ≈ $5,38 millones COP por contrato de USD 50.000, que dimensiona las llamadas de margen y el colchón de liquidez necesario. En síntesis, los datos dicen que la cobertura con futuros “paga seguro”: sacrifica carry (μ<0) a cambio de recortar las pérdidas en los escenarios que más encarecen el crédito en COP (cola derecha), estabilizando los flujos entre los años 6–10.

3. Exposición y margenes En esta sección cuantificamos la exposición cambiaria a cubrir del proyecto y el requerimiento de márgenes para operar futuros de TRM. Partimos del valor del crédito en COP y cubrimos el 75% desde el año 6; esa exposición se convierte a USD con la TRM spot para obtener el nocional a cubrir. Con la especificación del contrato de la BVC (USD por contrato) calculamos el número de contratos necesarios. Sobre el nocional por contrato se determina el margen inicial y el margen de mantenimiento (p. ej., 5% y 75% del inicial, según ficha), y se proyectan los flujos de variación por mark-to-market. Usamos la desviación mensual del futuro (~107,6 COP) para estimar el MTM típico por contrato y, con ello, el colchón de liquidez y la política de reposición ante margin calls. Este marco deja lista la comparación entre crédito sin cobertura y crédito cubierto, y define la disciplina de rollover durante los meses 61–120.

# 6. Exposición y márgenes (según BVC)
# ------------------------------------------------------------
MAQUINARIA_AMARILLA <- 500000000
VALOR_EN_USD <-  125000 
INICIAL_0.10 <- 12500
CREDITO_USD <-112500

## APALANCAMIENTO 75% FUTURO

PRESTAMO_EN_PESOS <- 450000000
NOMINAL_CONTRATO <-50000
PRECIO_INICIAL <-4842
GARANTIA_INICIAL <- 0.063
CONTRATOS_OPTIMOS <-2


MARGEN_MANTENIMIENTO <-GARANTIA_INICIAL/2
EXPOSICION_TOTAL <-PRECIO_INICIAL*NOMINAL_CONTRATO*CONTRATOS_OPTIMOS
MARGEN_INCIAL <-EXPOSICION_TOTAL*GARANTIA_INICIAL
NUMERO_CONTRATOS  <- PRESTAMO_EN_PESOS/EXPOSICION_TOTAL
# Definición de parámetros
credito_cop <- 500e6         # valor de la maquinaria en COP
precio_usd <- S0             # TRM spot (debería ser inicializado en otro lugar de tu código)
tamaño_contrato <- 1000      # USD por contrato (BVC)
 
# Exposición a cubrir = 75% del crédito
exposicion_cop <- credito_cop * 0.75
exposicion_usd <- exposicion_cop / precio_usd
 
# Número de contratos necesarios
n_contratos <- ceiling(exposicion_usd / tamaño_contrato)
 
# Valor nocional por contrato
nocional <- tamaño_contrato * precio_usd
 
# Márgenes
margen_inicial <- 0.05 * nocional      # Margen inicial es el 5% del valor nocional
margen_mantenimiento <- 0.75 * margen_inicial  # Margen de mantenimiento es el 75% del margen inicial
 
# Mostrar resultados
cat("Exposición total (COP):", exposicion_cop, "\n")
## Exposición total (COP): 3.75e+08
cat("Número de contratos:", n_contratos, "\n")
## Número de contratos: 94
cat("Nocional por contrato (COP):", nocional, "\n")
## Nocional por contrato (COP): 4013990
cat("Margen inicial (COP):", margen_inicial, "\n")
## Margen inicial (COP): 200699.5
cat("Margen de mantenimiento (COP):", margen_mantenimiento, "\n")
## Margen de mantenimiento (COP): 150524.6

Tenemos que, Para cubrir el 75% del crédito se necesita cubrir una exposición de ~375 millones COP. Con un contrato TRM de la BVC equivalente a USD 1.000 (≈ 4.013.990 COP por contrato al spot usado), resulta en 94 contratos, que cubren ≈100,6% de la exposición (ligero sobre-hedge de 2,3 millones COP). El margen inicial por contrato es 200.700 COP y el margen de mantenimiento 150.525 COP; en total, abrir la posición exige 18,87 millones COP de inicial y mantener al menos ~14,15 millones COP como balance. Con la desviación mensual del futuro ≈ 107,6 COP, el mark-to-market típico (1σ) es 107.600 COP por contrato, es decir ~10,1 millones COP para los 94 contratos; esto da la escala de posibles llamadas de margen y sugiere reservar un colchón de liquidez que cubra al menos el margen inicial total + 1–2σ de MTM para operar con holgura durante el rollover.

4.Flujo de caja

En esta parte construimos el flujo de caja de la cobertura con futuros de TRM para los últimos 4 años del crédito (meses 61–120). Partimos del depósito de margen inicial, y luego registramos mes a mes el mark-to-market (variation margin), las llamadas de margen cuando el saldo cae por debajo del margen de mantenimiento, y las liberaciones de margen cuando reducimos o cerramos contratos (incluyendo los rollovers periódicos). Con ello obtenemos el cash flow neto del hedge (P&L ± aportes/liberaciones), la exigencia de liquidez y los picos de uso de caja. Este flujo se comparará con el del crédito en COP para medir la efectividad de la cobertura: cuánto estabiliza los pagos, cuánto cuesta mantenerla (márgenes) y cuál es el colchón de liquidez recomendado.

# Flujo de caja de márgenes — últimos 4 años (48 meses)

# Parámetros 
sim_fut <- simulaciones
if (!exists("sim_fut")) stop("Necesitas ejecutar la simulación 'sim_fut' antes de este bloque.")
if (!exists("n_contratos")) {
  precio_usd <- as.numeric(last(fut_mensual))
  tamaño_contrato <- 1000
  credito_cop <- 500e6
  n_contratos <- ceiling((credito_cop * 0.75) / precio_usd)
}
if (!exists("margen_inicial")) margen_inicial <- 0.05 * tamaño_contrato * as.numeric(last(fut_mensual))
if (!exists("margen_mantenimiento")) margen_mantenimiento <- 0.75 * margen_inicial


T_total <- nrow(sim_fut)          # debe ser 120
start_last4y <- T_total - 48 + 1  # mes de inicio de los últimos 48 meses (p.ej. 73)
end_last4y   <- T_total           # 120


if (!exists("idx_med")) {
  finales_all <- sim_fut[T_total, ]
  idx_med <- which.min(abs(finales_all - mean(finales_all)))
}
traj <- sim_fut[start_last4y:end_last4y, idx_med]  # vector length 48
meses  <- seq_len(length(traj))
fechas <- seq.Date(from = as.Date("2025-01-01"), by = "month", length.out = length(traj)) 


# Iniciamos variables de seguimiento
n_periods <- length(traj)
pos_contracts <- rep(NA_integer_, n_periods)   # contratos en cada mes
pnl_variation <- numeric(n_periods)            # P&L liquidado cada mes (variation margin)
postings <- numeric(n_periods)                 # aportes (margen inicial extra) por abrir contratos o margin call
releases <- numeric(n_periods)                 # liberaciones de margen al reducir contratos
margin_balance <- numeric(n_periods)           # saldo en cuenta de margen al cierre del mes
cashflow_net <- numeric(n_periods)             # neto: pnl + releases - postings

# Inicial: abrimos la posición con n_contratos al precio t=1 y depositamos margen inicial total
pos_contracts[1] <- n_contratos
margin_balance[1] <- n_contratos * margen_inicial
postings[1] <- margin_balance[1]   # aporte inicial (outflow)
pnl_variation[1] <- 0              # sin P&L en primera marca (no hay previo)
releases[1] <- 0
cashflow_net[1] <- -postings[1]    # negativo porque es salida de caja

# Reglas de ajuste (ejemplo): MA3 vs precio actual => +/- 1 contrato
max_contracts <- max(5, n_contratos * 2)  # tope razonable, modificable
min_contracts <- 1

for (t in 2:n_periods) {
  price_prev <- traj[t-1]
  price_now  <- traj[t]
  
  # 1) Variación de precio -> P&L (long position): P&L = (price_now - price_prev) * tamaño_contrato * pos_contracts[t-1]
  pnl <- (price_now - price_prev) * tamaño_contrato * pos_contracts[t-1]
  pnl_variation[t] <- pnl
  
  # 2) Actualizar margin balance por P&L (variation margin se liquida en la cuenta)
  current_balance <- margin_balance[t-1] + pnl
  
  # 3) Rollover/ajuste de posición: calculamos MA3 (si hay suficientes puntos)
  lookback <- 3
  ma3 <- if (t >= lookback+1) mean(traj[(t-lookback): (t-1)]) else mean(traj[1:(t-1)])
  desired_pos <- pos_contracts[t-1]
  if (ma3 > price_now) {
    desired_pos <- min(max_contracts, pos_contracts[t-1] + 1)  # aumentar 1 contrato
  } else if (ma3 < price_now) {
    desired_pos <- max(min_contracts, pos_contracts[t-1] - 1)  # reducir 1 contrato
  }
  delta_pos <- desired_pos - pos_contracts[t-1]
  
  # 4) Si aumentamos posición => necesitamos posting de margen inicial por nuevos contratos
  if (delta_pos > 0) {
    add_posting <- delta_pos * margen_inicial
    postings[t] <- add_posting
    current_balance <- current_balance - add_posting  # salida de caja para cubrir nuevo margen
  } else {
    postings[t] <- 0
  }
  
  # 5) Si reducimos posición => liberamos margen (asumimos liberan margen inicial íntegro)
  if (delta_pos < 0) {
    release_amount <- (-delta_pos) * margen_inicial
    releases[t] <- release_amount
    current_balance <- current_balance + release_amount
  } else {
    releases[t] <- 0
  }
  
  # Actualizamos posición
  pos_contracts[t] <- desired_pos
  
  # 6) Margin calls: si current_balance < total_margin_mantenimiento => top-up hasta initial margin total
  total_initial_needed <- pos_contracts[t] * margen_inicial
  total_maintenance_threshold <- pos_contracts[t] * margen_mantenimiento
  if (current_balance < total_maintenance_threshold) {
    top_up <- total_initial_needed - current_balance
    postings[t] <- postings[t] + top_up
    current_balance <- current_balance + top_up
    # registramos que hubo margin call + top_up (ya sumado a postings)
  }
  
  # 7) Guardar saldo y cashflow neto
  margin_balance[t] <- current_balance
  cashflow_net[t] <- pnl_variation[t] + releases[t] - postings[t]
}

# Construir data.frame resultado (con fechas si las tienes)
df_margin <- data.frame(
  period = 1:n_periods,
  date = fechas,
  price = traj,
  pnl_variation = round(pnl_variation, 2),
  postings = round(postings, 2),
  margin_balance = round(margin_balance, 2),
  net_cashflow = round(cashflow_net, 2)
)

# Mostrar tabla
print(df_margin)
##    period       date    price pnl_variation   postings margin_balance
## 1       1 2025-01-01 3755.740           0.0 18865752.9       18865753
## 2       2 2025-02-01 3864.542    10227380.8        0.0       29293833
## 3       3 2025-03-01 3861.138     -316542.6        0.0       29177990
## 4       4 2025-04-01 3766.750    -8683711.4   200699.5       20293579
## 5       5 2025-05-01 3822.817     5214290.2   200699.5       25307170
## 6       6 2025-06-01 3747.268    -7101634.5   200699.5       18004836
## 7       7 2025-07-01 3768.000     1969529.6   200699.5       19773666
## 8       8 2025-08-01 3709.254    -5639653.1  5735237.4       19467851
## 9       9 2025-09-01 3734.725     2470754.1   200699.5       21737906
## 10     10 2025-10-01 3605.544   -12659816.5 11192559.9       19869250
## 11     11 2025-11-01 3545.679    -5926555.8  6528654.3       20069950
## 12     12 2025-12-01 3530.475    -1520436.1   200699.5       18348814
## 13     13 2026-01-01 3498.688    -3210463.2  5734396.8       20471349
## 14     14 2026-02-01 3512.041     1361937.1   200699.5       21632587
## 15     15 2026-03-01 3602.349     9301818.1        0.0       31135104
## 16     16 2026-04-01 3489.088   -11552634.8   200699.5       19381770
## 17     17 2026-05-01 3329.186   -16469983.7 18362360.8       20872748
## 18     18 2026-06-01 3271.046    -6046501.5  6648600.0       21073447
## 19     19 2026-07-01 3325.281     5694634.0   200699.5       26567382
## 20     20 2026-08-01 3399.495     7866753.5        0.0       34634835
## 21     21 2026-09-01 3392.832     -699649.2        0.0       34135885
## 22     22 2026-10-01 3357.595    -3664663.3   200699.5       30270522
## 23     23 2026-11-01 3292.124    -6874478.6   200699.5       23195344
## 24     24 2026-12-01 3321.519     3115854.0   200699.5       26110499
## 25     25 2027-01-01 3319.548     -210876.7   200699.5       25698923
## 26     26 2027-02-01 3236.554    -8963375.5   200699.5       16534848
## 27     27 2027-03-01 3255.882     2106853.6   200699.5       18441002
## 28     28 2027-04-01 3353.563    10744817.1        0.0       29386518
## 29     29 2027-05-01 3481.525    13947893.0        0.0       43535111
## 30     30 2027-06-01 3439.918    -4493548.0        0.0       39242262
## 31     31 2027-07-01 3448.823      952854.8        0.0       40395817
## 32     32 2027-08-01 3452.231      361237.6   200699.5       40556355
## 33     33 2027-09-01 3370.294    -8767310.1   200699.5       31588345
## 34     34 2027-10-01 3234.938   -14618438.7   200699.5       16769207
## 35     35 2027-11-01 3117.870   -12760390.1 18469527.1       22076945
## 36     36 2027-12-01 3098.519    -2128644.3   200699.5       19747601
## 37     37 2028-01-01 3055.445    -4781159.0  7913300.9       22478344
## 38     38 2028-02-01 3113.535     6506016.3        0.0       29185060
## 39     39 2028-03-01 3170.660     6340906.7        0.0       35726666
## 40     40 2028-04-01 2994.368   -19392124.7  6344502.1       22277644
## 41     41 2028-05-01 3051.621     6355056.7   200699.5       28432002
## 42     42 2028-06-01 3019.886    -3554320.5   200699.5       24676982
## 43     43 2028-07-01 3026.761      776943.5        0.0       25654625
## 44     44 2028-08-01 3017.752    -1008998.5   200699.5       24444927
## 45     45 2028-09-01 2852.374   -18687758.6 17523974.0       22879743
## 46     46 2028-10-01 2880.970     3259973.8   200699.5       25939017
## 47     47 2028-11-01 2826.310    -6285856.2   200699.5       19452462
## 48     48 2028-12-01 2775.953    -5841413.2 10272192.2       23481841
##    net_cashflow
## 1   -18865752.9
## 2    10428080.3
## 3     -115843.1
## 4    -8884410.9
## 5     5013590.7
## 6    -7302334.0
## 7     1768830.1
## 8   -11374890.5
## 9     2270054.6
## 10  -23852376.4
## 11  -12455210.0
## 12   -1721135.6
## 13   -8944859.9
## 14    1161237.6
## 15    9502517.6
## 16  -11753334.3
## 17  -34832344.5
## 18  -12695101.6
## 19    5493934.5
## 20    8067453.0
## 21    -498949.7
## 22   -3865362.8
## 23   -7075178.1
## 24    2915154.5
## 25    -411576.2
## 26   -9164075.0
## 27    1906154.1
## 28   10945516.6
## 29   14148592.5
## 30   -4292848.5
## 31    1153554.3
## 32     160538.1
## 33   -8968009.6
## 34  -14819138.2
## 35  -31229917.2
## 36   -2329343.8
## 37  -12694459.9
## 38    6706715.8
## 39    6541606.2
## 40  -25736626.8
## 41    6154357.2
## 42   -3755020.0
## 43     977643.0
## 44   -1209698.0
## 45  -36211732.6
## 46    3059274.3
## 47   -6486555.7
## 48  -16113605.4
# Resumen agregados
total_postings <- sum(df_margin$postings)
total_releases <- sum(df_margin$releases)
total_pnl <- sum(df_margin$pnl_variation)
cat("Resumen últimos 48 meses (trayectoria seleccionada):\n")
## Resumen últimos 48 meses (trayectoria seleccionada):
cat("Total postings (incluye initial y margin calls):", total_postings, "\n")
## Total postings (incluye initial y margin calls): 138407846
cat("Total releases:", total_releases, "\n")
## Total releases: 0
cat("Total P&L neto durante periodo:", total_pnl, "\n")
## Total P&L neto durante periodo: -103285434
# Graficar saldo de margen y net cashflow
par(mfrow = c(2,1))
plot(df_margin$date, df_margin$margin_balance, type="l", lwd=2, main="Margin balance (últimos 4 años)", xlab="Fecha", ylab="COP")
barplot(df_margin$net_cashflow, main="Net cashflow mensual (pnl + releases - postings)", names.arg = format(df_margin$date, "%b-%Y"), las=2, cex.names=0.6)

par(mfrow = c(1,1))

Como lo observamos en las graficas El saldo de margen (gráfico superior) parte cerca del margen inicial total (19 MM COP) y oscila en torno a ese nivel. En mediados de 2027 se observa un pico (≈ 35–40 MM), señal de P&L positivo acumulado cuando el futuro se movió a favor de la cobertura; luego vuelve hacia 20 MM conforme llegan meses con pérdidas/rollovers. El net cashflow mensual (gráfico inferior) alterna entradas y salidas: los barras positivas son retiros (ganancias + liberaciones > aportes), y las negativas son salidas de caja por margin calls o por abrir más contratos. La mayoría de movimientos cae dentro de ±10 MM por mes —coherente con un MTM típico 1σ ≈ 10,1 MM para 94 contratos (USD 1.000 c/u y SD ≈ 107,6 COP)—, aunque hay episodios de estrés cercanos a 30 MM, que marcan los meses de mayor exigencia de liquidez. En conjunto, el hedge está funcionando (traslada la volatilidad del crédito a flujos de margen manejables), pero la serie sugiere planear un colchón de liquidez de al menos $35–40 MM COP (≈ margen inicial total + 2σ del MTM) para atravesar sin fricciones los peores meses.

Evaluación final: crédito vs. cobertura con futuros TRM

En esta última parte integramos todo en un flujo total comparado para responder cuánto se cubre el riesgo cambiario del crédito y si la inversión en futuros fue beneficiosa para la compra de maquinaria. Construimos dos series mensuales en COP para los meses 61–120:

Crédito sin cobertura (cuotas en COP convertidas por TRM), Crédito cubierto = cuotas en COP + flujo neto de márgenes del futuro (variation margin ± postings ± releases, con rollover).

# ---------------------
# Supuestos
# ---------------------
precio_futuro_actual <- F6_futuroTRM_0  # precio forward base, ya calculado
usd_mensual_credito <- 5000             # monto mensual a pagar del crédito en USD
meses_cobertura <- 1:48                 # 4 años = 48 meses

# ---------------------
# Calcular TRM promedio mensual de simulaciones
# ---------------------
sim_promedios <- simulaciones_long %>%
  filter(Mes %in% meses_cobertura) %>%
  group_by(Mes) %>%
  summarise(TRM_spot = mean(TRM, na.rm = TRUE)) %>%
  ungroup()

# Verificar longitud
stopifnot(nrow(sim_promedios) == length(meses_cobertura))

# ---------------------
# Crear comparativa de flujo
# ---------------------
comparativa <- sim_promedios %>%
  mutate(
    TRM_futuro_fijado = precio_futuro_actual,
    Pago_real_sin_cobertura = TRM_spot * usd_mensual_credito,
    Pago_cubierto_futuro = TRM_futuro_fijado * usd_mensual_credito,
    Diferencia = Pago_real_sin_cobertura - Pago_cubierto_futuro,
    Beneficio_futuro = if_else(Diferencia > 0, Diferencia, 0),
    Perdida_futuro = if_else(Diferencia < 0, abs(Diferencia), 0),
    Beneficio_acumulado = cumsum(Beneficio_futuro),
    Perdida_acumulada = cumsum(Perdida_futuro)
  )

# ---------------------
# Mostrar tabla resumen
# ---------------------
print(comparativa)
## # A tibble: 48 × 10
##      Mes TRM_spot TRM_futuro_fijado Pago_real_sin_cobertura Pago_cubierto_futuro
##    <int>    <dbl>             <dbl>                   <dbl>                <dbl>
##  1     1    3889.             3921.               19444409.            19603599.
##  2     2    3859.             3921.               19294764.            19603599.
##  3     3    3826.             3921.               19129941.            19603599.
##  4     4    3799.             3921.               18995604.            19603599.
##  5     5    3773.             3921.               18863563.            19603599.
##  6     6    3751.             3921.               18755060.            19603599.
##  7     7    3725.             3921.               18623275.            19603599.
##  8     8    3696.             3921.               18482035.            19603599.
##  9     9    3670.             3921.               18348394.            19603599.
## 10    10    3639.             3921.               18196800.            19603599.
## # ℹ 38 more rows
## # ℹ 5 more variables: Diferencia <dbl>, Beneficio_futuro <dbl>,
## #   Perdida_futuro <dbl>, Beneficio_acumulado <dbl>, Perdida_acumulada <dbl>
# ---------------------
# Visualizar gráfico
# ---------------------
ggplot(comparativa, aes(x = Mes)) +
  geom_line(aes(y = Beneficio_acumulado), color = "green", size = 1.2) +
  geom_line(aes(y = Perdida_acumulada), color = "red", size = 1.2) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  labs(
    title = "Beneficio/Perdida acumulada con cobertura vs sin cobertura",
    subtitle = paste("Monto mensual USD:", usd_mensual_credito, "| TRM futura fijada:", round(precio_futuro_actual, 2)),
    x = "Mes",
    y = "COP acumulados"
  ) +
  theme_minimal()

# ---------------------

# Supuestos

set.seed(100)  # Para reproducibilidad
precio_futuro_actual <- 3889  # Precio forward base ejemplo
usd_mensual_credito <- 5000  # Monto mensual a pagar del crédito en USD
meses_cobertura <- 1:48  # 4 años = 48 meses
 
# Generación de datos simulados para TRM

simulaciones_long <- data.frame(
  Mes = rep(1:48, each = 10),
  TRM = rnorm(480, mean = 3889, sd = 150)  # Simulación de TRM
)
 
# ---------------------

# Calcular TRM promedio mensual de simulaciones

sim_promedios <- simulaciones_long %>%

  filter(Mes %in% meses_cobertura) %>%
  group_by(Mes) %>%
  summarise(TRM_spot = mean(TRM, na.rm = TRUE)) %>%
  ungroup()
 
# Verificar longitud

stopifnot(nrow(sim_promedios) == length(meses_cobertura))
 
# Crear comparativa de flujo

# ---------------------
comparativa <- sim_promedios %>%

  mutate(
    TRM_futuro_fijado = precio_futuro_actual,
    Pago_real_sin_cobertura = TRM_spot * usd_mensual_credito,
    Pago_cubierto_futuro = TRM_futuro_fijado * usd_mensual_credito,
    Diferencia = Pago_real_sin_cobertura - Pago_cubierto_futuro,
    Beneficio_futuro = if_else(Diferencia > 0, Diferencia, 0),
    Perdida_futuro = if_else(Diferencia < 0, abs(Diferencia), 0),
    Beneficio_acumulado = cumsum(Beneficio_futuro),   # Beneficio acumulado
    Perdida_acumulada = cumsum(Perdida_futuro)        # Pérdida acumulada
  )

print(comparativa)
## # A tibble: 48 × 10
##      Mes TRM_spot TRM_futuro_fijado Pago_real_sin_cobertura Pago_cubierto_futuro
##    <int>    <dbl>             <dbl>                   <dbl>                <dbl>
##  1     1    3886.              3889               19431532.             19445000
##  2     2    3924.              3889               19620269.             19445000
##  3     3    3870.              3889               19348143.             19445000
##  4     4    3936.              3889               19680587.             19445000
##  5     5    3890.              3889               19450127.             19445000
##  6     6    3883.              3889               19412578.             19445000
##  7     7    3918.              3889               19592474.             19445000
##  8     8    3828.              3889               19140377.             19445000
##  9     9    3901.              3889               19503431.             19445000
## 10    10    3858.              3889               19292326.             19445000
## # ℹ 38 more rows
## # ℹ 5 more variables: Diferencia <dbl>, Beneficio_futuro <dbl>,
## #   Perdida_futuro <dbl>, Beneficio_acumulado <dbl>, Perdida_acumulada <dbl>
ggplot(comparativa, aes(x = Mes)) +

  geom_line(aes(y = Beneficio_acumulado), color = "green", size = 1.2) +
  geom_line(aes(y = Perdida_acumulada), color = "red", size = 1.2) +
  geom_hline(yintercept = 0, linetype = "dashed") +

  labs(

    title = "Beneficio/Pérdida acumulada con cobertura vs sin cobertura",

    subtitle = paste("Monto mensual USD:", usd_mensual_credito, "| TRM futura fijada:", round(precio_futuro_actual, 2)),

    x = "Mes",
    y = "COP acumulados"
  ) +

  theme_minimal()

set.seed(100)  # Para reproducibilidad
precio_futuro_actual <- 3889  # Precio forward base ejemplo
usd_mensual_credito <- 5000  # Monto mensual a pagar del crédito en USD
meses_cobertura <- 1:48  # 4 años = 48 meses
 
# Generación de datos simulados para TRM

simulaciones_long <- data.frame(

  Mes = rep(1:48, each = 10),
  TRM = rnorm(480, mean = 3889, sd = 150)  # Simulación de TRM
)
 
# ---------------------
# Calcular TRM promedio mensual de simulaciones
sim_promedios <- simulaciones_long %>%

  filter(Mes %in% meses_cobertura) %>%
  group_by(Mes) %>%
  summarise(TRM_spot = mean(TRM, na.rm = TRUE)) %>%
  ungroup()
 
# Verificar longitud
stopifnot(nrow(sim_promedios) == length(meses_cobertura))
 
# ---------------------

# Crear comparativa de flujo
comparativa <- sim_promedios %>%

  mutate(
    TRM_futuro_fijado = precio_futuro_actual,
    Pago_real_sin_cobertura = TRM_spot * usd_mensual_credito,
    Pago_cubierto_futuro = TRM_futuro_fijado * usd_mensual_credito,
    Diferencia = Pago_real_sin_cobertura - Pago_cubierto_futuro,
    Beneficio_futuro = if_else(Diferencia > 0, Diferencia, 0),
    Perdida_futuro = if_else(Diferencia < 0, abs(Diferencia), 0),
    Beneficio_acumulado = cumsum(Beneficio_futuro),   # Beneficio acumulado
    Perdida_acumulada = cumsum(Perdida_futuro)        # Pérdida acumulada
  )
 
print(comparativa)
## # A tibble: 48 × 10
##      Mes TRM_spot TRM_futuro_fijado Pago_real_sin_cobertura Pago_cubierto_futuro
##    <int>    <dbl>             <dbl>                   <dbl>                <dbl>
##  1     1    3886.              3889               19431532.             19445000
##  2     2    3924.              3889               19620269.             19445000
##  3     3    3870.              3889               19348143.             19445000
##  4     4    3936.              3889               19680587.             19445000
##  5     5    3890.              3889               19450127.             19445000
##  6     6    3883.              3889               19412578.             19445000
##  7     7    3918.              3889               19592474.             19445000
##  8     8    3828.              3889               19140377.             19445000
##  9     9    3901.              3889               19503431.             19445000
## 10    10    3858.              3889               19292326.             19445000
## # ℹ 38 more rows
## # ℹ 5 more variables: Diferencia <dbl>, Beneficio_futuro <dbl>,
## #   Perdida_futuro <dbl>, Beneficio_acumulado <dbl>, Perdida_acumulada <dbl>
ggplot(comparativa, aes(x = Mes)) +

  geom_line(aes(y = Beneficio_acumulado), color = "green", size = 1.2) +
  geom_line(aes(y = Perdida_acumulada), color = "red", size = 1.2) +
  geom_hline(yintercept = 0, linetype = "dashed") +

  labs(

    title = "Beneficio/Pérdida acumulada con cobertura vs sin cobertura",

    subtitle = paste("Monto mensual USD:", usd_mensual_credito, "| TRM futura fijada:", round(precio_futuro_actual, 2)),

    x = "Mes",
    y = "COP acumulados"

  ) +

  theme_minimal()

Interpretación integral y juicio final

El crédito elegido (USD 125.000, 10 años, sistema francés, 6,3% anual) produce una cuota fija de ~USD 1.266 y, en la última cuota, un interés de ~USD 6,6 (saldo ≈ 0). La TRM presenta volatilidad mensual ~4,01% (≈ 13,9% anual), por lo que el costo del crédito en COP no es un valor puntual sino una distribución. Al convertir las cuotas con trayectorias simuladas de TRM (GBM), el total en COP varía de 301,6 mil millones (escenario MIN) a 1,812 mil millones (MAX), con 830,4 mil millones en el escenario base MED; el VP pasa de 211,2 mil millones (MIN) a 976,4 mil millones (MAX), con $500,0 mil millones en MED. La asimetría es clara: depreciaciones tempranas amplifican el costo en COP más de lo que apreciaciones tardías lo reducen (Banco de la República, s. f.-a).

Cobertura con futuros TRM (años 6–10). Calibramos el futuro TRM con μ anual = −8,58% y σ anual = 7,35% (σ mensual ≈ 2,12%), fijando el primer punto por paridad de tasas con la TRM spot y tasas doméstica/externa de referencia (F₀ ≈ 3.920,7). La desviación mensual del futuro de ~107,6 COP implica un mark-to-market 1σ de 5,38 millones COP por contrato USD 50.000, útil para planear liquidez (Federal Reserve Bank of New York, s. f.-b). Para cubrir 75% de la exposición desde el año 6, la simulación arroja 375 millones COP a cubrir, 94 contratos (nocional por contrato 4,01 millones COP), margen inicial 200,7 mil y margen de mantenimiento 150,5 mil por contrato; abrir la posición exige 18,9 millones de garantías y el MTM típico conjunto es de alrededor de 10 millones al mes, con episodios de estrés cercanos a $30 millones en meses adversos. Estas cifras son consistentes con la lógica de derivados estandarizados de la BVC (Bolsa de Valores de Colombia, s. f.) y con folletos de mercado que ilustran contratos TRM de USD 50.000 y garantías proporcionales (Bancolombia, s. f.).

Flujos y liquidez del hedge. El flujo mensual neto del futuro (variation margin ± aportes/liberaciones por rollovers) alterna entradas y salidas; la mayoría cae dentro de ±$10 millones, con algunos meses cercanos a −$30 millones. El saldo de margen oscila alrededor del inicial y presenta picos cuando el futuro se mueve a favor de la posición. En términos operativos, es prudente un colchón de liquidez de $35–40 millones COP (margen inicial total + ~2σ de MTM), para soportar los peores meses sin vender activos o interrumpir la cobertura.

Comparación “crédito sin cobertura” vs “crédito cubierto”. Al sumar cuotas en COP y flujo de margen del futuro para los meses 61–120, el perfil cubierto muestra menor dispersión y colas truncadas frente al no cubierto (lo que estabiliza el servicio de la deuda), a costa de: i) carry negativo esperado del futuro (μ<0), y ii) el costo de liquidez de las garantías. En términos de gobierno financiero, la cobertura es recomendable si la prioridad es reducir el p95 del pago mensual y el peor mes (riesgo de caja) y si la empresa valora la estabilidad por encima del ahorro esperado en un escenario base. Bajo el entorno macro de 2025—con normalización de tasas externas referidas a SOFR y expectativas cambiarias de analistas monitorizadas en la EME del Banco de la República—la decisión de cubrir parte relevante de la exposición (75%) es coherente con una gestión prudente del riesgo (Banco de la República, 2025; Federal Reserve Bank of New York, s. f.-a; International Monetary Fund, 2025a, 2025b).

Juicio final. Los resultados de la simulación respaldan que la cobertura con futuros sí mejora el perfil de riesgo de la inversión en maquinaria: reduce la volatilidad de los pagos en COP y corta la cola adversa (depreciaciones fuertes del peso). El costo esperado (carry, garantías y fricción operativa) es gestionable frente al beneficio de evitar desbordes de caja que pondrían en riesgo la continuidad del proyecto. Por tanto, para un emisor con aversión al riesgo y restricciones de liquidez, la estrategia de futuros es conveniente; para un agente muy tolerante al riesgo y holgado de caja, podría considerarse un hedge parcial o dinámico. En ambos casos, conviene monitorear el riesgo de base y recalibrar trimestralmente (o en cada rollover) con las expectativas EME y los cambios de tasas externas.

Referencias

Bancolombia. (s. f.). Futuros de Tasa de Cambio. https://media.graphassets.com/GgOreRS1RiKna26l1aHe.

Banco de la República. (2025). Resultado de la Encuesta mensual de expectativas de analistas económicos (EME), septiembre 2025. https://www.banrep.gov.co/es/resultado-encuesta-mensual-expectativas-analistas-economicos-eme-septiembre-2025.

Banco de la República. (s. f.-a). Tasa de cambio representativa del mercado (TRM) – Glosario. https://www.banrep.gov.co/es/glosario/tasa-cambio-trm

Banco de la República. (2025). Encuesta mensual de expectativas – Gráficas (septiembre 2025) [PDF]. https://www.banrep.gov.co/sites/default/files/eme-graficas.pdf

Bolsa de Valores de Colombia. (s. f.). Derivados: descripción general. https://www.bvc.com.co/derivados-descripcion-general

Federal Reserve Bank of New York. (s. f.-a). SOFR Averages and Index Data. https://www.newyorkfed.org/markets/reference-rates/sofr-averages-and-index

Federal Reserve Bank of New York. (s. f.-b). Secured Overnight Financing Rate (SOFR). https://www.newyorkfed.org/markets/reference-rates/sofr

International Monetary Fund. (2025a, April 18). Colombia: Staff Statement. https://www.imf.org/en/News/Articles/2025/04/18/pr25116-colombia-staff-statement

International Monetary Fund. (2025b, April 26). IMF Spokesperson Statement on Colombia. https://www.imf.org/en/News/Articles/2025/04/25/pr-25124-colombia-imf-spokesperson-statement