Contexto

Cada uno de los cuatro forwards de la estrategia de cobertura dura un año, así que esta sección cotiza y valora un contrato a 12 meses (plazo superior al mínimo de seis meses que pide la guía), con fecha de valoración el 2 de septiembre de 2026 y año comercial de 252 días (t/T = 252/252 = 1, por lo que la base de días no afecta el resultado a este plazo).

Datos de mercado

S      <- 3184.00   # TRM del 2-sep-2026, Banco de la República (Datos Abiertos Colombia)
r_COP  <- 0.12       # tasa de política del Banco de la República, consulta 2-9 sep 2026 (aproxima el IBR a 12 meses; supuesto)
r_USD  <- 0.0418     # U.S. Treasury, T-bill a 12 meses, vía Forbes Advisor (1-sep-2026)
t_T    <- 252/252    # año comercial de 252 días -> 1 año completo

datos <- data.frame(
  Dato = c("TRM del 2-sep-2026 (S)", "Tasa en pesos (r_COP)", "Tasa en dólares (r_USD)",
           "Plazo (t/T)", "Forward observado en SET-FX"),
  Valor = c(sprintf("%.2f COP/USD", S), sprintf("%.2f %%", r_COP*100),
            sprintf("%.2f %%", r_USD*100), "252/252 = 1", "[pendiente de consultar]"),
  `Fuente y fecha` = c("Banco de la República (Datos Abiertos Colombia)",
                        "Banco de la República, tasa de política (supuesto: aproxima el IBR a 12 meses)",
                        "U.S. Treasury, T-bill a 12 meses, vía Forbes Advisor",
                        "Supuesto del trabajo: año comercial de 252 días",
                        "SET-FX, mesa NDF (o Bloomberg, COP forward a 1 año)")
)
kable(datos, align = "lll") %>% kable_styling(bootstrap_options = c("striped","hover"), full_width = TRUE)
Dato Valor Fuente.y.fecha
TRM del 2-sep-2026 (S) 3184.00 COP/USD Banco de la República (Datos Abiertos Colombia)
Tasa en pesos (r_COP) 12.00 % Banco de la República, tasa de política (supuesto: aproxima el IBR a 12 meses)
Tasa en dólares (r_USD) 4.18 % U.S. Treasury, T-bill a 12 meses, vía Forbes Advisor
Plazo (t/T) 252/252 = 1 Supuesto del trabajo: año comercial de 252 días
Forward observado en SET-FX [pendiente de consultar] SET-FX, mesa NDF (o Bloomberg, COP forward a 1 año)

El forward observado en SET-FX queda marcado como pendiente porque no se encontró una cotización confiable, fechada y de plazo comparable (≈12 meses) en las fuentes públicas disponibles. La sección de comparación más abajo queda lista para completarse en cuanto se tenga el dato.

Forward teórico por paridad cubierta de tasas

Con S en COP por USD (peso doméstico, dólar extranjero), la paridad cubierta de tasas vista en clase es

\[F = S \times \left(\frac{1+r_{COP}}{1+r_{USD}}\right)^{t/T}\]

que es la versión discreta de la ecuación (5.9) de Hull, \(F_0 = S_0\, e^{(r-r_f)T}\) (Hull, 11.ª ed., sección 5.10, p. 138, con \(r_c=\ln(1+r)\)); la lógica es de no arbitraje.

factor_paridad <- (1 + r_COP) / (1 + r_USD)
F_teorico       <- S * factor_paridad^t_T

puntos_forward  <- F_teorico - S
prima_anual     <- puntos_forward / S

# verificación con la fórmula continua de Hull (5.9)
r_COP_cont <- log(1 + r_COP)
r_USD_cont <- log(1 + r_USD)
F_hull     <- S * exp((r_COP_cont - r_USD_cont) * t_T)

tabla_forward <- data.frame(
  Concepto = c("Factor de paridad", "Forward teórico a 12 meses (F)",
               "Puntos forward", "Prima anual",
               "Verificación con Hull (ec. 5.9, forma continua)"),
  Resultado = c(sprintf("%.6f", factor_paridad),
                sprintf("%.2f COP/USD", F_teorico),
                sprintf("+%.2f COP", puntos_forward),
                sprintf("%.2f %%", prima_anual*100),
                sprintf("%.2f COP/USD", F_hull))
)
kable(tabla_forward) %>% kable_styling(bootstrap_options = c("striped","hover"), full_width = TRUE)
Concepto Resultado
Factor de paridad 1.075062
Forward teórico a 12 meses (F) 3423.00 COP/USD
Puntos forward +239.00 COP
Prima anual 7.51 %
Verificación con Hull (ec. 5.9, forma continua) 3423.00 COP/USD

Las dos formas de la paridad (discreta y continua de Hull) coinciden en 3423.00 COP/USD, con una prima de 7.51 % — exactamente el diferencial de tasas compuesto. El forward no pronostica el dólar: es el costo de financiarse en pesos en lugar de dólares.

Banda por spread y sensibilidad a las tasas

La empresa compra dólares a plazo, es decir, el banco los vende, y cotiza con las tasas menos favorables para el cliente. Suponemos 50 pb sobre la tasa en pesos y 25 pb bajo la tasa en dólares (supuesto propio, señalado).

spread_cop <- 0.005
spread_usd <- 0.0025

calc_forward <- function(rc, ru) S * ((1+rc)/(1+ru))^t_T

banda <- data.frame(
  `Posición del banco` = c("Venta de USD (la empresa compra)", "Punto medio", "Compra de USD"),
  r_COP = sprintf("%.2f %%", c(r_COP+spread_cop, r_COP, r_COP-spread_cop)*100),
  r_USD = sprintf("%.2f %%", c(r_USD-spread_usd, r_USD, r_USD+spread_usd)*100),
  Forward = sprintf("%.2f", c(calc_forward(r_COP+spread_cop, r_USD-spread_usd),
                               calc_forward(r_COP, r_USD),
                               calc_forward(r_COP-spread_cop, r_USD+spread_usd))),
  check.names = FALSE
)
kable(banda) %>% kable_styling(bootstrap_options = c("striped","hover"), full_width = TRUE)
Posición del banco r_COP r_USD Forward
Venta de USD (la empresa compra) 12.50 % 3.93 % 3446.55
Punto medio 12.00 % 4.18 % 3423.00
Compra de USD 11.50 % 4.43 % 3399.56
F_venta  <- calc_forward(r_COP+spread_cop, r_USD-spread_usd)
F_compra <- calc_forward(r_COP-spread_cop, r_USD+spread_usd)

# sensibilidad: +100 pb en cada tasa, manteniendo la otra fija
sens_rCOP <- calc_forward(r_COP+0.01, r_USD) - F_teorico
sens_rUSD <- calc_forward(r_COP, r_USD+0.01) - F_teorico

La banda va de 3399.56 a 3446.55 COP/USD (±0.7 %). 100 pb más en la tasa en pesos suben el forward en 30.56 pesos; 100 pb más en la tasa en dólares lo bajan en 32.54 pesos: el supuesto de usar la tasa de política en vez del IBR mueve el resultado tanto como el spread del banco.

Sensibilidad del forward a la tasa en pesos (gráfico dinámico)

r_COP_seq <- seq(0.09, 0.15, by = 0.0025)
F_seq     <- sapply(r_COP_seq, function(rc) calc_forward(rc, r_USD))

df_plot <- data.frame(r_COP = r_COP_seq*100, Forward = F_seq)

if (has_plotly) {
  plot_ly(df_plot, x = ~r_COP, y = ~Forward, type = "scatter", mode = "lines+markers",
          line = list(color = "#2C3E50"), marker = list(color = "#18BC9C")) %>%
    layout(title = "Forward teórico COP/USD vs. tasa en pesos (r_USD fija en 4,18 %)",
           xaxis = list(title = "Tasa en pesos, r_COP (%)"),
           yaxis = list(title = "Forward teórico (COP/USD)"),
           shapes = list(list(type = "line", x0 = r_COP*100, x1 = r_COP*100,
                               y0 = min(F_seq), y1 = max(F_seq),
                               line = list(dash = "dot", color = "#E74C3C"))))
} else {
  plot(df_plot$r_COP, df_plot$Forward, type = "l", col = "#2C3E50", lwd = 2,
       xlab = "Tasa en pesos, r_COP (%)", ylab = "Forward teórico (COP/USD)",
       main = "Forward teórico COP/USD vs. tasa en pesos")
}

Comparación con SET-FX

comparacion <- data.frame(
  Concepto = c("Fecha/hora, spot SET-FX, forward 12m (compra/venta), puntos y devaluación implícita",
               "Diferencia frente al teórico (COP y %) y ¿dentro de la banda?"),
  `Valor observado` = c("[pendiente]", "[pendiente]"),
  check.names = FALSE
)
kable(comparacion) %>% kable_styling(bootstrap_options = c("striped","hover"), full_width = TRUE)
Concepto Valor observado
Fecha/hora, spot SET-FX, forward 12m (compra/venta), puntos y devaluación implícita [pendiente]
Diferencia frente al teórico (COP y %) y ¿dentro de la banda? [pendiente]

Si el observado cae dentro de la banda (3399.56–3446.55), la diferencia es spread de negociación y el mercado es coherente con la paridad; fuera de ella, las causas habituales son liquidez (menor a plazos largos), riesgo de crédito (contraparte en el OTC), convenciones de mercado (días hábiles/calendario, base 360/365/252, TRM vs. spot de cierre) y desalineación entre tasas (política vs. IBR, T-bill vs. SOFR/OIS, horas distintas, flujos de pensiones y no residentes).

Lectura para la estrategia de cobertura

mediana_A3   <- 3326
dif_vs_A3    <- F_teorico - mediana_A3
dif_vs_A3_pc <- dif_vs_A3 / mediana_A3

El forward teórico (3423.00) queda 97 pesos (2.9 %) por encima del valor más probable del modelo A.3 a 12 meses (3.326): la cobertura solo paga si el peso se deprecia más de 7.5 %, fuera del escenario central pero dentro del rango simulado (2.795 a 3.953).

También queda por encima de la mediana de las proyecciones de bancos citadas en A.1 (3.300) y en el extremo bajo del rango de Cibest (3.400–3.650), aunque esas proyecciones son a cierre de 2026 y el forward es a 12 meses. Durante 2026 el forward habría pronosticado ≈7,5 % de devaluación mientras el peso se fortaleció ≈19 %: quien se hubiera cubierto habría pagado la prima sin recibir protección, lo que confirma que la utilidad de la cobertura está en la estabilidad del flujo, no en acertar el rumbo del dólar (se evalúa en B.2 y B.3).

Este cálculo es válido solo para un forward a 12 meses con las tasas de hoy; no se puede extrapolar a los años 7 a 10 (si el 7.5 % se mantuviera constante siete años, el forward rondaría 5285, nivel que el mercado no suele cotizar porque las curvas convergen a plazos largos). El precio de esos vencimientos depende de las curvas de TES y de Tesoros.


Fuentes: Banco de la República (Datos Abiertos Colombia); U.S. Treasury vía Forbes Advisor; Hull, J. C. (11.ª ed.), Options, Futures, and Other Derivatives, sección 5.10; diapositivas de clase “Forwards”.