Estoy intentando calcular una curva de rendimiento de GBP utilizando una curva de tasas OIS en USD y las tasas de cambio forward utilizando Quantlib. Estoy tratando de replicar la salida de una biblioteca diferente, y estoy cerca pero parece que no logro hacerlo bien.
En primer lugar, ajustando la curva de rendimiento de USD a partir de las tasas de swap OIS:
# Establecer la fecha de cálculo
fecha_inicio = ql.Date(1, 2, 2024)
ql.Settings.instance().evaluationDate = fecha_inicio
# Definir calendario
calendario = ql.UnitedStates(0)
convencion = ql.Following
finDeMes = False
fecha_spot = calendario.advance(fecha_inicio, 2, ql.Days)
# Frecuencia de pago y convenciones de pago de la pata fija
frecuencia_fija = ql.Annual
diaCuenta_fija = ql.Actual360()
convencion_fija = convencion
convencion_pago_fija = convencion
# Regla para generar el calendario
regla = ql.DateGeneration.Backward
# Definir el índice overnight como Fed Funds
indice_overnight = ql.FedFunds()
# Datos de mercado para tasas OIS y sus fechas de madurez específicas
fechas_madurez = ois_data["end_date"].to_list() # Fechas de madurez específicas
tasas_ois = ois_data["Value"].to_list() # Tasas OIS correspondientes
# Crear ayudantes de tasa OIS con fechas de vencimiento específicas para la tasa Fed Funds
helpers_ois = [
ql.OISRateHelper(
2,
ql.Period(fecha_madurez - fecha_spot, ql.Days),
ql.QuoteHandle(ql.SimpleQuote(tasa)),
indice_overnight,
paymentLag=0,
paymentFrequency=frecuencia_fija,
paymentConvention=convencion_pago_fija,
paymentCalendar=calendario,
endOfMonth=finDeMes,
)
for tasa, fecha_madurez in zip(tasas_ois, fechas_madurez)
]
# Ajustar la curva OIS
dias_cuenta = ql.Actual365Fixed()
curva_ois = ql.PiecewiseLogLinearDiscount(fecha_inicio, helpers_ois, dias_cuenta)
curva_rendimiento_usd = ql.YieldTermStructureHandle(curva_ois)
Cuando comparo los factores de descuento, obtengo las cifras correctas.
Luego, intento ajustar la curva de rendimiento de GBP:
precios_fx = fx_fwd["Value"].tolist()
fechas_liquidacion = fx_fwd["Settlement Date"].dt.date.tolist()
calendario_conjunto = ql.JointCalendar(
ql.UnitedKingdom(), calendario, ql.JoinHolidays
)
ayudantes_tasa = [
ql.FxSwapRateHelper(
ql.QuoteHandle(ql.SimpleQuote(precio - precio_spot)),
ql.QuoteHandle(ql.SimpleQuote(precio_spot)),
ql.Period(ql.Date.from_date(fecha_liquidacion) - fecha_inicio, ql.Days),
0,
calendario_conjunto,
ql.ModifiedFollowing,
True,
False,
curva_rendimiento_usd,
)
for precio, fecha_liquidacion in zip(precios_fx, fechas_liquidacion)
]
# Ajustar la curva OIS
dias_cuenta = ql.Actual365Fixed()
# dias_cuenta = ql.Actual360()
curva_gbp = ql.PiecewiseFlatForward(fecha_inicio, ayudantes_tasa, dias_cuenta)
curva_rendimiento_gbp = ql.YieldTermStructureHandle(curva_gbp)
Esta vez, al graficar los factores de descuento, comparados con la otra biblioteca, son diferentes. Solo entre 1 y 50 puntos base, pero es suficiente para alterar la valoración de instrumentos más adelante cuando se utilizan estas curvas de rendimiento.
He intentado algunas iteraciones diferentes de los argumentos para los ayudantes pero no puedo hacer que funcione. Cualquier ayuda sería muy apreciada.