4 votos

Calculando el rollo hacia abajo del swap usando la biblioteca de Python RatesLib

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!

4voto

dotnetcoder Puntos 1262

Su pregunta parece estar restringida solo a las líneas:

swap_rate = float(irs.rate(solver=solver))
print(swap_rate)
rolled_swap_rate = float(irs.rate(ESTR.roll("3m")))

con el comentario de que no está pasando un Solver. Está bien, está pasando una Curve. Python en realidad está interpretando esto (a través de argumentos posicionales) como equivalente a:

rolled_swap_rate = float(irs.rate(curves=ESTR.roll("3m")))

El método roll devuelve una nueva Curve por lo que esto es válido.

La parte de la documentación que explica esto está aquí

Por cierto, deberías agregar el "tgt" calendar a la definición de tu curva ESTR.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X