El código que estoy usando está abajo, trayendo curvas swap de BBG y luego usando RatesLib para valorar los swaps.
from rateslib import *
import pandas as pd
from tia.bbg import LocalTerminal
today = dt.today()
start = add_tenor(today,"1Y","F",get_calendar("tgt"))
mat = add_tenor(start,"1Y","F",get_calendar("tgt"))
curves = {
'EUR':'514',
}
curve_ids = []
for ccy, curve in curves.items():
curve_id = 'YCSW' + curve.zfill(4) + ' Index'
curve_ids.append(curve_id)
resp = LocalTerminal.get_reference_data(curve_ids, 'CURVE_TENOR_RATES')
df = resp.as_frame()
tenors = df['CURVE_TENOR_RATES'].iloc[0]['Tenor'].to_list()
rates = df['CURVE_TENOR_RATES'].iloc[0]['Mid Yield'].to_list()
data = pd.DataFrame({"Plazo": tenors,
"Tasa":rates})
data["Terminación"] = [add_tenor(today, _, "F", "tgt") for _ in data["Plazo"]]
ESTR = Curve(
id="ESTR",
convention = defaults.spec["eur_irs"]['convention'],
modifier = defaults.spec["eur_irs"]['modifier'],
interpolation="log_linear",
nodes={
**{today: 1.0},
**{_: 1.0 for _ in data["Terminación"]},
}
)
estr_args = dict(spec="eur_irs", curves="ESTR")
solver = Solver(
curves=[ESTR],
instruments=[IRS(terminación=_,efectiva=hoy, **estr_args) for _ in data["Terminación"]],
s=data["Tasa"],
etiquetas_instrumento=data["Plazo"],
id="eur_rates",
)
data["DF"] = [float(ESTR[_]) for _ in data["Terminación"]]
irs = IRS(
efectiva= start ,
terminación=mat,
nominal=-10e6,
**estr_args
)
swap_rate = float(irs.rate(solver=solver))
print(swap_rate)
rolled_swap_rate = float(irs.rate(ESTR.roll("3m")))
print(rolled_swap_rate)
Esto no se siente correcto, ya que no estoy pasando un solver al calcular la tasa del 'rolled_swap_rate', que es lo que está escrito en las mejores prácticas en la documentación, sin embargo el resultado es bastante cercano a lo que esperaría.
¿Alguien ve algún error en este código que puedan señalar? ¡Sería de gran ayuda!