Hay una manera, aunque tendrás que codificar la lógica. Supongo que quieres el DV01 del tenor (cambio del valor de mercado para un cambio de 1 pb en el tipo de mercado para un tenor determinado) y no el PV01 (valor actual de 1 pb).
Además, ten en cuenta la advertencia de Luigi sobre la interpolación entre los puntos del tenor de la curva en uno de los posts que has mencionado.
import QuantLib as ql
import matplotlib.pyplot as plt
today = ql.Date().todaysDate()
ql.Settings.instance().evaluationDate = today
yts = ql.YieldTermStructureHandle(
ql.FlatForward(today, 0.01, ql.Actual365Fixed())
)
tenors = (1,2,3,4,5,6,7)
quotes = [ql.SimpleQuote(0.00) for n in tenors]
spreads = [ql.QuoteHandle(quote) for quote in quotes]
dates = [today + ql.Period(y, ql.Years) for y in tenors]
spreadedYts = ql.YieldTermStructureHandle(
ql.SpreadedLinearZeroInterpolatedTermStructure(yts, spreads, dates)
)
engine = ql.DiscountingBondEngine(spreadedYts)
bond = ql.FixedRateBond(2, ql.TARGET(), 1e6, today, today + ql.Period(5, ql.Years), ql.Period('1Y'), [0.01], ql.ActualActual())
bond.setPricingEngine(engine)
npv = bond.NPV()
key_risk = []
for quote in quotes:
quote.setValue(0.0001)
key_risk.append( npv - bond.NPV() )
quote.setValue(0.0)
plt.bar(tenors, key_risk)
Lo que daría como resultado:
También se puede calcular como la media de la variación del valor de mercado para un cambio al alza y otro a la baja