1 votos

Cero tasas a tasas forward lineales por tramos en Py QuantLib

¿Cómo puedo extraer las tasas forward lineales por tramos dado una estructura temporal de tasas cero para una fecha de operación en Py QuantLib? Esto se utiliza para valorar un intercambio de tasas de interés (IRS).

Mi intento es crear un objeto ZeroCurve con las fechas, tasas y convención de días de conteo, pasar esto a un YieldTermStructureHandle, pasarlo a un objeto USDLibor y finalmente pasarlo a un objeto NonstandardSwap.

Esto es lo que hice para las tasas cero.

import QuantLib as ql

calendar = ql.UnitedKingdom()    
curve_date = ql.Date(5, 12, 2019)
zcr = [ (calendar.advance(curve_date, 365, ql.Days), 0.02),
        (calendar.advance(curve_date, 730, ql.Days), 0.03),
        (calendar.advance(curve_date, 365, ql.Days), 0.05) ]
dates, rates = zip(*zcr)
forward_term_structure = ql.YieldTermStructureHandle(ql.ZeroCurve(dates, rates, ql.Actual360()))
libor_index = ql.USDLibor(ql.Period(1, ql.Months), forward_term_structure)

¿Es esta la forma correcta de hacerlo? Tenga en cuenta que hay más nodos en el zcr, pero para ilustración he inventado tres coordenadas. Gracias.

1voto

Chris Mc Puntos 31

Probablemente hay un error tipográfico en tu código porque tienes dos nodos para 365 días, pero al resolver eso (y también darle al tramo de la curva un nodo de menor vencimiento):

calendar = ql.UnitedKingdom()    
curve_date = ql.Date(5, 12, 2019)
dates = [calendar.advance(curve_date, ql.Period(n, ql.Years)) for n in range(0,4)]
rates = [0.01, 0.02, 0.03, 0.05]
forward_term_structure = ql.YieldTermStructureHandle(ql.ZeroCurve(dates, rates, ql.Actual360()))
forward_term_structure.enableExtrapolation()

hay varias formas en las que puedes hacer lo que deseas.

1. Obtener las tasas forward directamente de la YieldTermStructure

    import matplotlib.pyplot as plt
    fwds = [forward_term_structure.forwardRate(date, date + ql.Period('1M'), ql.Actual360(), ql.Simple).rate() for date in dates]     
    plt.plot(rates, 'o-', label="Spot")
    plt.plot(fwds, 'o-', label="1M Forward")
    plt.legend()

Aquí estás extrayendo la tasa forward simple a 1M Actual360:

Descripción de la imagen

2. Construir una pierna de tasa flotante y obtener la tasa del índice:

    ql.Settings.instance().evaluationDate = curve_date
    start = calendar.advance(curve_date, 2, ql.Days)
    end = calendar.advance(start, 3, ql.Years)
    schedule = ql.MakeSchedule(start, end, ql.Period('1M'))
    index = ql.USDLibor(ql.Period('1M'), forward_term_structure)
    leg = ql.IborLeg([100], schedule, index)
    fwds = [cf.rate() for cf in map(ql.as_coupon, leg)]
    plt.plot(rates, 'o-', label="Spot")
    times = [ql.Actual360().yearFraction(curve_date, cf.date()) for cf in leg]
    plt.plot(times, fwds, 'o-', label="1M Forward")
    plt.legend()

Esto te daría:

Descripción de la imagen

Observa que en el caso de ql.ZeroCurve estás aplicando interpolación lineal a la tasa spot, lo cual tiene la desventaja conocida de presentar discontinuidades en los forwards

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