2 votos

Emisión de bonos a tipo fijo en Quantlib

No puedo obtener el mismo precio para un bono fijo utilizando quantlib.

faceValue = 100.
couponType = ql.Semiannual
issueDate = ql.Date(19, 4, 2019)
EvalDate = ql.Date(24, 5, 2019)
Maturity = ql.Date(19, 4, 2022)
quotedYield = 3.69
couponRate = 3.84
calendar = ql.NullCalendar()
settlementDays = 0
businessConventions = ql.Following
Datesgeneration = ql.DateGeneration.Forward
period= ql.Period(ql.Semiannual)
monthEnd = False

B1 = Bond(faceValue, couponType, EvalDate, issueDate, Maturity, quotedYield, couponRate, calendar)

ql.Settings.instance().evaluationDate = EvalDate

schedule = ql.Schedule(issueDate, Maturity, period, calendar, businessConventions, businessConventions, Datesgeneration, monthEnd)

bond = ql.FixedRateBond(settlementDays, faceValue, schedule, [couponRate/100.], ql.ActualActual(ql.ActualActual.ISMA))

print("QuantLib: ", bond.dirtyPrice(quotedYield/100., ql.ActualActual(ql.ActualActual.ISMA), ql.Simple, ql.Semiannual))

Debería haber obtenido 100,774 al redondear a 3 decimales, pero obtuve 100,771. 100,774 es similar a Bloomberg pricer o Excel utilizando el método clásico de flujo de caja descontado para calcular el precio.

¿Puede ayudarme?

Gracias ¿Hay algún problema?

1voto

Chris Mc Puntos 31

Pues bien, se está cobrando el precio sucio descontando los flujos de caja con una tasa simple en lugar de una tasa compuesta, que no es realmente la forma más común. No estoy seguro de si esto es lo que quieres.

Esencialmente está utilizando los factores de descuento como:

$$DF_i = \frac{1}{(1+r_i * n)}$$

en lugar de

$$DF_i = \frac{1}{(1+r_i)^n}$$

Si cambias la última línea por:

print("QuantLib: ", bond.dirtyPrice(quotedYield/100., ql.ActualActual(ql.ActualActual.ISMA), ql.Compounded, ql.Semiannual))

El precio de salida será de 100,774

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