3 votos

Calcular el DV01 por plazo de un swap en Quantlib Python, es decir, Duración de tasas clave

¿Hay alguna manera de obtener la descomposición DV01 de un Swap en diferentes plazos del trato en Quantlib-Python? La pregunta realizada aquí, sigue el método básico de reevaluar el swap desplazando la curva a través de 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, podríamos ver que el DV01 neto de una pata es una agregación de DV01 diferenciales acumulados en el punto del plazo en el que ocurre el flujo de efectivo (cada punto del plazo de flujo de efectivo podría no tener una contribución DV). En resumen, generalmente calculamos la Duración Modificada, pero estoy buscando la Duración de las Tasas Clave.

Tengo que crear una cesta de cobertura, donde obtenga DV01 diferenciales para cada punto del plazo. De manera que pueda comprar/vender instrumentos para compensar el impacto del valor presente para los plazos individuales.

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

¿Existe alguna función/módulo que haga esto, o debe crearse desde cero? He realizado los pasos explicados en este post, 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ía que "crear desde cero" aunque no es demasiado complicado. Lo que quieres hacer es valorar tu intercambio con tu curva de mercado y luego reevaluarlo después de desplazar cada plazo. La diferencia entre el valor de mercado y el valor que obtienes después de aumentar un plazo particular será el riesgo clave para ese plazo.

Existen diferentes formas de hacer esto. Podrías aumentar las tasas de interés cero, las tasas par o las tasas forward.

En este ejemplo, estoy aumentando 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