4 votos

Cálculo de Flujos de Efectivo Utilizando el Día de Cuenta ISMA en Bonos de Tasa Fija

Estoy trabajando con un bono de tasa fija en QuantLib, y he establecido la convención de conteo de días en ISMA, pero me gustaría entender cómo se utiliza esta convención específica de conteo de días en el cálculo del primer flujo de efectivo del bono. He leído el enlace https://www.isda.org/a/pIJEE/The-Actual-Actual-Day-Count-Fraction-1999.pdf pero aún no logro entender cómo quantlib está calculando el primer flujo de efectivo de período corto o largo. Aquí están el código relevante y los flujos de efectivo:

issue_date = ql.Date(1, 1, 2021)
maturity_date = ql.Date(15, 1, 2022)
stubdate = ql.Date(28, 2, 2021)
coupon_rate = 8.40 / 100
face_value = 1000000
calendar = ql.NullCalendar()
day_count = ql.ActualActual(ql.ActualActual.ISMA)
compounding = ql.Simple
payfreq = ql.Monthly
payment_schedule = ql.Schedule(issue_date, maturity_date, ql.Period(payfreq), calendar, ql.Unadjusted, ql.Unadjusted, ql.DateGeneration.Forward, True, stubdate)
lst_pysch = list(payment_schedule)
lst_pysch.pop(0)
lst_pysch.insert(0, issue_date)
new_paysch = ql.Schedule(lst_pysch)

fixedrate_leg = ql.FixedRateLeg(
            schedule=new_paysch, dayCount=day_count, nominals=[face_value], couponRates=[coupon_rate])

bond = ql.Bond(0, calendar, 100.0, maturity_date, issue_date, fixedrate_leg)

[(a.date(), a.amount()) for a in fixedrate_leg]

Resultado:

[(Date(28, 2, 2021), 14000.000000000013),
 (Date(31, 3, 2021), 6999.999999999895),
 ...
 (Date(15, 1, 2022), 3452.054794520487)]

Mi pregunta concreta es, ¿cómo se calcula el valor del primer flujo de efectivo de 14,000? Me gustaría entender la lógica y los cálculos detrás de este flujo de efectivo en particular.

¡Gracias por tu ayuda!

0 votos

No especificaste la issue_date.

0 votos

Se ha añadido issue_date

5voto

dotnetcoder Puntos 1262

No puedo hablar por Quantlib, de hecho no creo que el cálculo sea correcto.

Pero puedo decirte cómo se realiza este cálculo en Rateslib.

from rateslib import *

bono = FixedRateBond(
    effective=dt(2021, 1, 1),
    terminación=dt(2022, 1, 15),
    front_stub=dt(2021, 2, 28),
    stub="LongFrontShortBack",
    roll=31,
    convención="ActActICMA",
    modificador="none",
    frecuencia="M",
    tasa_fija=8.4
)
curva = Curve({dt(2021, 1, 1): 1.0, dt(2022, 12, 31): 0.96})
bono.flujos_de_efectivo(curva)

ingresar descripción de la imagen aquí

En este caso, el primer período se identifica como un Stub bajo el modo ActActICMA y el cálculo procede de la siguiente manera:

i) Restar un período normal hasta el 28-feb-21 para llegar al 31-ene-21.

ii) El inicio es anterior al 31-ene-21, por lo que debe ser un LongStub. Establecer fracción=1.0.

iii) Restar otro período normal hasta el 31-ene-21 para llegar al 31-dic-20.

iv) El 1-ene-21 es posterior a esta fecha, por lo que agregamos la siguiente cantidad a fracción:

$$ \frac{31/ene/21 - 1/ene/21}{31/ene/21 - 31/dic/21} = 0.967741935483871 $$

v) fracción = 1.967741935483871 y cupón=8.4% / 12 * fracción * 1mm = 13,774.19

Otros Factores

Día de Rollo

Observé en tu calendario de bonos que el rollo era a fin de mes (31), por lo que esto se ha agregado para generar el calendario. Si el rollo era 28, esto cambiaría los cálculos anteriores. Nada más acerca del bono necesita cambiar excepto el rollo y esto producirá flujos de efectivo diferentes en los stubs delanteros y traseros.

otro_bono = FixedRateBond(
    effective=dt(2021, 1, 1),
    terminación=dt(2022, 1, 15),
    front_stub=dt(2021, 2, 28),
    stub="LONGFRONTSHORTBACK",
    roll=28,
    tasa_fija=8.4,
    frecuencia="M",
    convención="ActActICMA",
)
otro_bono.flujos_de_efectivo(curva)

ingresar descripción de la imagen aquí

Convención de Modo de Cálculo

Algunas convenciones, como los Bonos del Gobierno Canadiense, funcionan de manera diferente con ActActICMA. Bajo este cálculo, cualquier período identificado como Stub adopta un cálculo Act365F en la parte fraccional. Rateslib tiene una convención de conteo de días específicamente nombrada para estos bonos: 'ActActICMA_stub365f':

otro_bono = FixedRateBond(
    effective=dt(2021, 1, 1),
    termination=dt(2022, 1, 15),
    front_stub=dt(2021, 2, 28),
    stub="LONGFRONTSHORTBACK",
    roll=31,
    fixed_rate=8.4,
    frecuencia="M",
    convention="ActActICMA_stub365f",
)
otro_bono.flujos_de_efectivo(curva)

ingresar descripción de la imagen aquí

En este último caso, la fracción se evalúa como: $$ fracción = 1.0 + \frac{31/ene/21 - 1/ene/21}{365} * 12 = 1.986301369.. $$ Y el flujo de efectivo se calcula como: $$ 1mm * 8.4\% / 12 * fracción = 13,904.11 $$

Especulación de QuantLib

Si afirmas que quantlib está utilizando algo similar al cálculo "ActActICMA_stub365f" pero está utilizando una convención 'Act360' en lugar de la convención 'ACT365f' entonces el flujo de efectivo del primer stub es en realidad muy cercano a \$14,000.

4voto

Brad Tutterow Puntos 5628

Calcula primero el horario y luego crea el contador de días como:

day_count = ql.ActualActual(ql.ActualActual.ISMA, payment_schedule)

esto permite que la instancia act/act tenga toda la información que necesita para realizar los cálculos tan detalladamente por @Attack68. Después de este cambio, la salida de tu código es:

[(Date(28,2,2021), 13774.193548387047),
 (Date(31,3,2021), 6999.999999999895),
 (Date(30,4,2021), 6999.999999999895),
 (Date(31,5,2021), 6999.999999999895),
 (Date(30,6,2021), 6999.999999999895),
 (Date(31,7,2021), 6999.999999999895),
 (Date(31,8,2021), 6999.999999999895),
 (Date(30,9,2021), 6999.999999999895),
 (Date(31,10,2021), 6999.999999999895),
 (Date(30,11,2021), 6999.999999999895),
 (Date(31,12,2021), 6999.999999999895),
 (Date(15,1,2022), 3387.0967741935765)]

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