Estoy tratando de implementar un modelo de precios para bonos con tasa fija con el código a continuación.
import QuantLib as ql
import pandas as pd
todaysDate = ql.Date(31, 8, 2017)
ql.Settings.instance().evaluationDate = todaysDate
spotDates = [ql.Date(1,9,2017), ql.Date(5,9,2017), ql.Date(7,9,2017), ql.Date(14,9,2017), ql.Date(21,9,2017), ql.Date(2,10,2017), ql.Date(31,10,2017), ql.Date(30,11,2017), ql.Date(2,1,2018), ql.Date(31,1,2018), ql.Date(28,2,2018), ql.Date(3,4,2018), ql.Date(30,4,2018)]
spotRates = [0.066682, 0.067199, 0.067502, 0.068526, 0.069462, 0.070742, 0.072984, 0.073566, 0.073174, 0.072844, 0.072610, 0.072467, 0.072366]
dayCount = ql.Actual365Fixed()
calendar = ql.SouthAfrica()
interpolation = ql.Linear()
compounding = ql.Compounded
compoundingFrequency = ql.Semiannual
spotCurve = ql.ZeroCurve(spotDates, spotRates, dayCount, calendar,
interpolation, compounding, compoundingFrequency)
spotCurveHandle = ql.YieldTermStructureHandle(spotCurve)
issueDate = ql.Date(20, 4, 2009)
maturityDate = ql.Date(20, 4, 2018)
tenor = ql.Period(ql.Semiannual)
calendar = ql.SouthAfrica()
bussinessConvention = ql.Following
dateGeneration = ql.DateGeneration.Backward
monthEnd = False
schedule = ql.Schedule (issueDate, maturityDate, tenor, calendar, bussinessConvention, bussinessConvention, dateGeneration, monthEnd)
dayCount = ql.Actual365Fixed()
couponRate = 0.0925
coupons = [couponRate]
settlementDays = 3
faceValue = 100
fixedRateBond = ql.FixedRateBond(settlementDays, faceValue, schedule, coupons, dayCount)
bondEngine = ql.DiscountingBondEngine(spotCurveHandle)
fixedRateBond.setPricingEngine(bondEngine)
fixedRateBond.NPV()
print(fixedRateBond.NPV())
print(fixedRateBond.dirtyPrice())
print(fixedRateBond.cleanPrice())
print(fixedRateBond.accruedAmount())
print(fixedRateBond.dayCounter())
print(fixedRateBond.settlementDate())
for c in fixedRateBond.cashflows():
print('%20s %12f' % (c.date(), c.amount()))
Mi cronograma de flujo de efectivo parece un poco extraño, esperaba valores de 4.625.
October 20th, 2009 4.637671
April 20th, 2010 4.612329
October 20th, 2010 4.637671
April 20th, 2011 4.612329
October 20th, 2011 4.637671
April 20th, 2012 4.637671
October 22nd, 2012 4.688356
April 22nd, 2013 4.612329
October 21st, 2013 4.612329
April 22nd, 2014 4.637671
October 20th, 2014 4.586986
April 20th, 2015 4.612329
October 20th, 2015 4.637671
April 20th, 2016 4.637671
October 20th, 2016 4.637671
April 20th, 2017 4.612329
October 20th, 2017 4.637671
April 20th, 2018 4.612329
April 20th, 2018 100.000000
Los valores del modelo producidos son:
104.60163528858176
104.6774279539175
101.18016767994489
3.497260273972613
Actual/365 (Fixed) day counter
September 5th, 2017
El valor que obtengo por intereses devengados es correcto con los valores proporcionados por nuestro sistema interno, pero los precios están un poco desfasados. La expectativa de precio limpio es 100.81517 y la expectativa de precio sucio es 104.31243
0 votos
QuantLib no puede estar equivocado aquí. Es 100% correcto. O tu sistema interno está equivocado o tus entradas no son consistentes. ¿Puedes mostrar un cálculo manual de por qué crees que deberías tener 4.625?
2 votos
Es correcto, dados los inputs. Por ejemplo, el cálculo de los cupones es correcto basado en la convención de conteo de días Act/365 utilizada durante la construcción. Si tus cupones pagan 4.625 en la vida real, significa que probablemente están utilizando una convención Act/Act y debes pasar esta última al constructor
FixedRateBond
.0 votos
Está bien, el valor del cupón siendo exacto aquí no es la mayor preocupación, ya que mis montos de interés acumulados están exactamente en línea, por lo tanto mi convención de conteo de días debe ser correcta. Mi principal preocupación sería por qué el precio limpio y el precio total no están en línea con mis expectativas. ¿Es correcto mi uso de la curva de tasas de interés cero en las fechas que he especificado?
0 votos
Si los montos finales del cupón son diferentes de lo que esperas, los montos acumulados eventualmente también serán incorrectos; las convenciones podrían dar casualmente el mismo resultado en la fecha de hoy. Es posible que desees intentar inicializar el bono con un contador de días diferente y ver qué sucede con el precio.
0 votos
En cuanto a la curva de tasa cero: la inicialización y el uso son correctos, en lo que respecta a la sintaxis y la semántica. Tendrás que verificar si tu sistema realmente utiliza interpolación lineal y tasas compuestas semestralmente, en cuanto a las entradas. Sería útil si pudieras recuperar los descuentos correspondientes a cada cupón.