3 votos

Error en la fijación de precios de los CDS de QuantLib: tiempo negativo dado

Soy nuevo en QuantLib, y lo estoy utilizando para valorar CDS. El siguiente es mi código de python:

from QuantLib import *

calendar = TARGET()

# Set evaluation date
todaysDate = Date(4, 2, 2019)
todaysDate = calendar.adjust(todaysDate)  # business day adjustment
Settings.instance().evaluationDate = todaysDate

# build zero curve
spotRates = [0.02514, 0.026285, 0.027326299999999998,
             0.0279, 0.029616299999999998, 0.026526,
             0.026028, 0.0258695, 0.025958000000000002,
             0.0261375, 0.026355, 0.0266255,
             0.026898, 0.0271745, 0.02741,
             0.027666, 0.028107000000000004, 0.028412000000000003,
             0.028447, 0.0284165]

spotPeriod = [Period(1, Months), Period(2, Months),
              Period(3, Months), Period(6, Months),
              Period(1, Years), Period(2, Years),
              Period(3, Years), Period(4, Years),
              Period(5, Years), Period(6, Years),
              Period(7, Years), Period(8, Years),
              Period(9, Years), Period(10, Years),
              Period(11, Years), Period(12, Years),
              Period(15, Years), Period(20, Years),
              Period(25, Years), Period(30, Years)]
spotDates = [todaysDate + x for x in spotPeriod]

risk_free_rate = YieldTermStructureHandle(
    ZeroCurve(spotDates, spotRates, Actual360())
)

# CDS parameters
recovery_rate = 0.4
hazard_rate = 0.02
maturity = Date(20, 12, 2023)

hazard_curve = FlatHazardRate(todaysDate, QuoteHandle(SimpleQuote(hazard_rate)), Actual360())

# reprice instruments
nominal = 1000000.0
probability = DefaultProbabilityTermStructureHandle(hazard_curve)

schedule = Schedule(todaysDate, maturity, Period(Quarterly),
                    calendar, Following, Following,
                    DateGeneration.TwentiethIMM, False)
cds = CreditDefaultSwap(Protection.Seller, nominal, quoted_spread,
                        schedule, Following, Actual360())
engine = MidPointCdsEngine(probability, recovery_rate, risk_free_rate)
cds.setPricingEngine(engine)

print("   NPV: %g" % cds.NPV())

Tengo el siguiente error en la última línea de código:

RuntimeError: negative time (-0.0166667) given

Supongo que tengo que hacer algunos ajustes de fecha cuando construya la curva de rendimiento. Porque si intento utilizar la curva de rendimiento FlatForward, no hay ningún error.

Pero estoy confundido sobre las ideas de la fecha de evaluación y la fecha de liquidación, así como las fechas al contado cuando se construye la curva de rendimiento. Me pregunto por qué tengo este error negativo aquí? Los días de liquidación deberían ser 3 días.

Gracias.

2voto

Brad Tutterow Puntos 5628

El ZeroCurve La instancia comienza en la primera fecha en que la pasaste, es decir, un mes después de la fecha de hoy. Cualquier fecha anterior estará en el pasado en lo que respecta a la curva.

Para evitarlo, hay que pasar la fecha de hoy (o la fecha de liquidación, si se quiere descontar a ésta) como primera fecha en spotDates . También necesitará una tasa correspondiente en spotRates Si no dispone de un valor para el tipo de interés a muy corto plazo, el tipo de interés a 1 mes puede servir de referencia.

0 votos

¡Gracias, Luigi! Añadir el día actual funciona. Pero también estoy confundido por qué este código de ejemplo se ejecuta sin error: quantlib.10058.n7.nabble.com/file/n18310/CDS.py Parece que no tiene la fecha actual en la curva cero también..

0 votos

Puede ser que, en ese caso, ninguna fecha de CDS caiga entre el día de hoy y el primer nodo, por lo que no se pide la curva de descuentos en ese rango de fechas. (Por cierto, esto significa que el código de ejemplo que has enlazado "funciona", pero descuenta de forma incorrecta).

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