3 votos

Calcular la DV01 de un Swap por plazo en Quantlib Python, es decir, la Duración de la Tasa Clave

¿Hay alguna forma de obtener la descomposición DV01 de un Swap a lo largo de diferentes vencimientos del contrato en Quantlib-Python? La pregunta formulada aquí, sigue el método básico de reevaluar el swap desplazando la curva en 1 punto básico y sumando los impactos positivos y negativos.

Con el método anterior podemos obtener el DV01 neto, para cada pata (fija/variable) de un instrumento derivado. Pero si profundizamos, veremos que el DV01 neto de una pata es una agregación de DV01 diferenciales acumulados en puntos de vencimiento donde ocurren los flujos de efectivo (cada punto de vencimiento de flujo de efectivo puede no tener contribución de DV). En resumen, generalmente calculamos la Duración Modificada, pero estoy buscando la Duración de Tasas Clave.

Tengo que crear una cesta de cobertura, donde obtengo DV01 diferenciales para cada punto de vencimiento. De manera que pueda comprar/vender instrumentos para compensar el impacto de PV para los vencimientos individuales.

Como ilustración, así es como mi Pricer proporciona DV01 por vencimiento. Muestra de DV01 por vencimiento

¿Existe una función/módulo que haga esto, o tiene que crearse desde cero? He seguido los pasos explicados en esta publicación, pero ilustra para una curva de tasas plana. Necesito evaluar para un swap con tasas variables. No estoy seguro de cómo manejará la interpolación de tasas variables.

2voto

Chris Mc Puntos 31

Tendrías que "crearlo desde cero" aunque no es demasiado complicado. Lo que quieres hacer es valorar tu permuta con tu curva de mercado y luego reevaluarla después de desplazar cada plazo. La diferencia entre el valor de mercado y el valor que obtienes después de desplazar un plazo particular será el riesgo clave para ese plazo.

Hay diferentes maneras de hacer esto. Podrías desplazar las tasas cero, las tasas par o las tasas forward.

En este ejemplo estoy desplazando las tasas par.

import QuantLib as ql

today = ql.Date().todaysDate()
tenors = (1,2,3,4,5,6,7)
quotes = [ql.SimpleQuote(0.01) for n in tenors]
handles = [ql.QuoteHandle(quote) for quote in quotes]
dates = [today + ql.Period(y, ql.Years) for y in tenors]

helpers = []
yts = ql.RelinkableYieldTermStructureHandle()
euribor6m = ql.Euribor6M(yts)
for quote, tenor in zip(handles, tenors):
    helpers.append( ql.SwapRateHelper(quote,
                        ql.Period(tenor, ql.Years), ql.TARGET(),
                        ql.Annual, ql.Unadjusted,
                        ql.Thirty360(ql.Thirty360.BondBasis),
                        euribor6m)
                  )
curve = ql.PiecewiseLogCubicDiscount(0, ql.TARGET(), helpers, ql.Actual365Fixed())
yts.linkTo(curve)
engine = ql.DiscountingSwapEngine(yts)

swap = ql.MakeVanillaSwap(ql.Period('5y'), euribor6m, 0.01, ql.Period('0d'), Nominal=5e6)
swap.setPricingEngine(engine)

npv = swap.NPV()
key_risk = []
for quote in quotes:
    value = quote.value()
    quote.setValue(value + 0.0001)
    key_risk.append( npv - swap.NPV() )
    quote.setValue(value)

for tenor, risk in zip(tenors, key_risk):
    print("{}a: {:>12,.2f}".format(tenor, risk))

La salida sería:

1a:         -0.00
2a:          0.00
3a:         -0.08
4a:          0.05
5a:     -2,426.15
6a:         -0.00
7a:         -0.00

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