1 votos

Los precios de la curva de swaps en USD no se ajustan a los insumos

Como se menciona en el título, estoy teniendo problemas con el precio de los swaps en USD en quantlib.

Quería tomar algunos datos (precios de los swaps en el mercado) y poder construir una estructura de plazos de rendimiento que me permita fijar el precio de, por ejemplo, un swap a 1 año. Sin embargo, parece que cuando se construye una curva de rendimiento y luego se fija el precio de un swap, mis precios no se alinean con los instrumentos exactos que estoy utilizando y me pregunto cómo puedo reconciliar los dos de manera que los resultados del modelo == entradas para los plazos siguientes

import QuantLib as ql
today = ql.Date().todaysDate()
calendar = ql.UnitedStates()
spot = calendar.advance(today, 2, ql.Days)
helpers = ql.RateHelperVector()

index = ql.IborIndex('MyIndex',
                     ql.Period('3m'),
                     2,
                     ql.USDCurrency(),
                     ql.UnitedStates(),
                     ql.ModifiedFollowing,
                     True,
                     ql.Thirty360())

helpers.append( ql.DepositRateHelper(0.01, index) )

swaps = [
    ('1Y', 0.015),
    ('2Y', 0.02),
    ('3Y', 0.025)
]
for tenor, rate in swaps:
    swapIndex = ql.UsdLiborSwapIsdaFixAm(ql.Period(tenor))
    helpers.append( ql.SwapRateHelper(rate, swapIndex) )

curve = ql.PiecewiseSplineCubicDiscount(spot, helpers, ql.Thirty360())
yts = ql.YieldTermStructureHandle(curve)
engine = ql.DiscountingSwapEngine(yts)

index = ql.IborIndex('MyIndex',
                     ql.Period('3m'),
                     2,
                     ql.USDCurrency(),
                     ql.UnitedStates(),
                     ql.ModifiedFollowing,
                     True,
                     ql.Thirty360(),
                     yts)

print("maturity, market, model")
for tenor, rate in swaps:
    swap = ql.MakeVanillaSwap(ql.Period(tenor), index, 0.01, ql.Period('0D'), pricingEngine=engine)    
    print(f"{tenor}, {rate:.6f}, {swap.fairRate():.6f}")

madurez

mercado

modelo

1Y

0.015000

0.014831

2Y

0.020000

0.019809

3Y

0.025000

0.024755

5voto

Liam Puntos 121

He actualizado tu ejemplo para mostrar lo que hay que cambiar para que los tipos justos de los swaps creados manualmente coincidan con las comillas de entrada. Lo principal es que los swaps creados manualmente tienen que coincidir exactamente con los ayudantes de tarifa que se crean. Algunas cosas en su configuración significaron que esto no estaba sucediendo:

  1. Los ayudantes creados con el ql.SwapRateHelper(rate, swapIndex) llamada en la que el swapIndex es ql.UsdLiborSwapIsdaFixAm utilice ql.USDLibor(ql.Period('3m')) como el índice de la pierna flotante. Puede ver esto aquí en el código C++ subyacente. Esto no coincide con el index que crea manualmente para su canje, por ejemplo, un contador de días diferente y un calendario de fijación. Para ello, sólo he utilizado ql.USDLibor directamente.
  2. He añadido algunos parámetros adicionales a la llamada a ql.MakeVanillaSwap para que coincida con la llamada que se produce en el constructor del ayudante del tipo de cambio bajo el capó del código C++, es decir aquí y luego aquí .

    import QuantLib as Ql ql = Ql

    Dates

    today = ql.Date().todaysDate() ql.Settings.instance().evaluationDate = today

    Helper container

    helpers = ql.RateHelperVector()

    Deposit helper

    index = ql.USDLibor(ql.Period('3m')) helpers.append(ql.DepositRateHelper(0.01, index))

    Swap helpers

    swaps = [ ('1Y', 0.015), ('2Y', 0.02), ('3Y', 0.025) ] for tenor, rate in swaps: swapIndex = ql.UsdLiborSwapIsdaFixAm(ql.Period(tenor)) helpers.append(ql.SwapRateHelper(rate, swapIndex))

    Yield term structure

    curve = ql.PiecewiseSplineCubicDiscount(today, helpers, ql.Thirty360()) yts = ql.YieldTermStructureHandle(curve)

    Link index to discount curve

    index = index.clone(yts)

    Create engine with yield term structure

    engine = ql.DiscountingSwapEngine(yts)

    Check the swaps reprice

    print("maturity | market | model") for tenor, rate in swaps: swap = ql.MakeVanillaSwap(ql.Period(tenor), index, 0.01, ql.Period('0D'), fixedLegTenor=ql.Period('6M'), fixedLegDayCount=ql.Thirty360(), fixedLegCalendar=ql.UnitedStates(), floatingLegCalendar=ql.UnitedStates(), pricingEngine=engine)

    print(f"   {tenor}    | {rate:.6f} | {swap.fairRate():.6f}")

La salida de esto es ahora:

maturity |  market  |   model
   1Y    | 0.015000 | 0.015000
   2Y    | 0.020000 | 0.020000
   3Y    | 0.025000 | 0.025000

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