[Python] QuantLib FixedRateBond versus Excel Yield()

Discussão em 'Python' iniciado por Stack, Junho 13, 2025.

  1. Stack

    Stack Membro Participativo

    I'm currently trying to calculate the Yield of Treasury Bonds in Python using the QuantLib library. As a reference I used the Excel Yield function, but I'm getting different results for the same input-values.

    I don't understand why I'm getting different results and I don't understand where this difference comes from.

    I have two columns using the Yield function, a YTM column and an Actual Yield column. I'll start with YTM.

    I know that similar questions already exists, like the next two links, but it doesn't resolve my issue.


    YTM

    In Excel I use the following values:

    =YIELD(valuedate, maturitydate, rate, price, redemption, coupons, 3)

    • valuedate = 26/11/2021
    • maturitydate = 26/01/2026
    • rate = 0.000%
    • price = 45.340
    • redemption = 100
    • coupons = 1
    • dayCount = 3 = Actual365

    With these values I get a YTM of 20.903%.

    To replicate this in Python I used this code:.

    #Dates
    start = 26/11/2021
    maturity = 26/01/2026

    #Yield Params
    redemption = 100
    coup = 1
    price = 45.340
    couponRate = 0.000%
    rate = [couponRate]
    calendar = ql.NullCalendar()
    settlementDays = 0

    tenor = ql.Period(ql.Annual)
    fixedRateBond = ql.FixedRateBond(settlementDays, calendar, redemption, start, maturity, tenor, rate, ql.Actual365Fixed())
    fixedRateBond.bondYield(price,
    ql.Actual365Fixed(),
    ql.SimpleThenCompounded, #SimpleThenCompounded gives best result yet
    ql.Annual,
    start,
    1.0e-16,
    100
    )


    With QuantLib, using the same values as Excel Yield, I get a Yield of 20.827% which is a small difference of 0.075%.

    But, when looking at Actual Yield, I get bigger differences using the same parameters as with YTM.

    So, with the same mindset of trial-and-error, I've used slightly different parameters which returned the best results I could obtain.

    Actual Yield

    Excel values:

    =YIELD(quotationdate+3, maturitydate, rate, quotationprice, redemption, coupons, 3)


    (note: that we do +3 because the accrued interest is calculated on the settlementDate)

    • quotationdate = 2/3/2022
    • maturitydate = 16/10/2049
    • rate = 3.897%
    • quotationprice = 15
    • redemption = 100
    • coupons = 1
    • dayCount = 3 = Actual365

    which returns a yield of 26.044%

    QuantLib:

    ql.Settings.instance().evaluationDate = 2/3/2022
    start = 2/3/2022
    maturity = 16/10/2049

    coup = 1
    price = 15
    couponRate = 3.897%
    rate = [couponRate]
    settlementDays = 3

    calendar = ql.NullCalendar()
    businessConvention = ql.Unadjusted
    dateGeneration = ql.DateGeneration.Backward
    monthEnd = False
    redemption = 100
    tenor = ql.Period(ql.Annual)

    schedule = ql.Schedule(start,
    maturity,
    tenor,
    calendar,
    businessConvention,
    businessConvention,
    dateGeneration,
    monthEnd)

    bond = ql.FixedRateBond(settlementDays, redemption, schedule, rate, ql.Actual365Fixed())
    bond.bondYield(price,
    ql.Actual365Fixed(),
    ql.Compounded,
    ql.Annual)


    Resulting in a Yield of 26.368% which is a difference of 0.324%

    I want to stress that I don't have a financial background. I got these parameters via other similar StackOverflow questions and through a lot of trial-and-error.

    Using the same parameters in QuantLib for Actual Yield as used in YTM gave worse results than these parameters.

    Could someone explain to me which parameters I should use to replicate the Excel Yield() function and why I'm getting differences between QuantLib and Excel?

    Also, is the Excel function granted to be 100% correct?

    Continue reading...

Compartilhe esta Página