Estoy fijando el precio de un bono corporativo canadiense fijo no callable con los siguientes parámetros:
Nombre
Valor
CUSIP
12657ZAT0
Fecha de Evaluación
2/14/2024
Fecha de Liquidación
2/16/2024
Fecha de Emisión del Bono
3/6/2009
Fecha de Vencimiento
3/6/2024
Tasa de Cupón
6.215%
Frecuencia del Cupón
2
Día de Cálculo
ACT/ACT
Valor Nominal
1000
Rendimiento
5.437768%
Puedo igualar los días devengados y el monto devengado de Bloomberg, pero tengo que usar un día de cálculo diferente al construir mi objeto FixedRateBond (ver código a continuación). Esto se debe a que Bloomberg utiliza ACT/365 al calcular los valores devengados y ACT/ACT para el resto.
Sin embargo, no puedo igualar el precio limpio: Precio BBG: 100.041 Precio QuantLib: 100.021973
Sospecho que porque estoy usando ACT/ACT como parámetro en la llamada a bond.cleanPrice(...)
, el Valor Presente Neto no se calcula correctamente ya que no utiliza ACT/365 para el primer período. Podría estar completamente equivocado acerca de esta teoría.
¿Es correcta mi forma de pensar? ¿Quizás tengo un error en mi lógica a continuación? ¿Me falta algún parámetro en algún lugar o no estoy utilizando QuantLib correctamente?
Soy muy nuevo en el mundo de renta fija y QuantLib, así que por favor ten paciencia. ¡Gracias de antemano!
Aquí está mi código de referencia:
import QuantLib as ql
DÍAS_DE_ASENTAMIENTO = 2
VALOR_NOMINAL = 1000
DÍA_DE_CÁLCULO = ql.ActualActual(ql.ActualActual.ISMA)
DÍA_DE_CÁLCULO_DEV = ql.Actual365Fixed(ql.Actual365Fixed.NoLeap) # Nota - Los valores devengados solo coinciden cuando se usa este día de cálculo
fechaDeEvaluación = ql.Date(14, 2, 2024)
fechaDeEmisión = ql.Date(6, 3, 2009)
fechaDeVencimiento = ql.Date(6, 3, 2024)
rendimiento = 0.05437768
cupón = 0.06215
frecuencia = ql.Period("6M")
ql.Settings.instance().evaluationDate = fechaDeEvaluación
bono = ql.FixedRateBond(
DÍAS_DE_ASENTAMIENTO,
ql.TARGET(),
VALOR_NOMINAL,
fechaDeEmisión,
fechaDeVencimiento,
frecuencia,
[cupón],
DÍA_DE_CÁLCULO_DEV,
ql.Unadjusted,
ql.Unadjusted,
)
px = bono.cleanPrice(
rendimiento,
DÍA_DE_CÁLCULO,
ql.CompoundedThenSimple,
ql.Semiannual,
fechaDeEvaluación,
)
# Imprimir precios para comparar
print(f"Precio BBG: {100.041}")
print(f"Precio QuantLib: {px:.6f}\n")
# Imprimir detalles sobre los intereses devengados
print(f"Período de Devengo: {ql.BondFunctions.accrualPeriod(bono)}")
print(f"Inicio de Devengo: {ql.BondFunctions.accrualStartDate(bono)}")
print(f"Fin de Devengo: {ql.BondFunctions.accrualEndDate(bono)}")
print(f"Días Devengados: {ql.BondFunctions.accrualDays(bono)}")
print(f"Monto Devengado: {ql.BondFunctions.accruedAmount(bono)}") # Coincide con BBG
print(f"Período Devengado: {ql.BondFunctions.accruedPeriod(bono)}")
print(f"Días Devengados: {ql.BondFunctions.accruedDays(bono)}") # Coincide con BBG