Pricing a Multi-Coupon Bond with Yield and Accrued Interest
Summary
The document investigates why a bond price calculated with a simple-interest setting in QuantLib differs from a direct spreadsheet attempt. The question supplies a fixed-rate bond schedule, yield, settlement details, and a price that matches Bloomberg. The response suggests the quoted yield convention is effectively a standard yield-to-maturity calculation, using discount factors based on the annual yield raised to each cash flow's time exponent, with time measured using Actual/365.
The response then sketches the price construction: discount the remaining coupon and principal cash flows and add accrued interest to obtain the dirty price. It reports five remaining payment dates and gives illustrative discount factors, cash flows, and accrued interest. The explanation is explicitly a rough spreadsheet reconstruction and does not resolve the QuantLib-specific mechanics or fully address the original simple-interest question, so its convention and date assumptions should be checked before reuse.
Key ideas
- A multi-coupon bond price discounts each remaining cash flow according to its payment time.
- The response models discounting with the annual yield raised to a time exponent.
- Accrued interest is added to the discounted cash flows to obtain the dirty price.
- The spreadsheet reconstruction is approximate and depends on the settlement date and day-count convention.
Tags
Full text
# Bond price using simple interest
# Bond price using simple interest
I'm trying to model the price of a bond and having some trouble understanding how the "simple" convention works. The bond in question is IL0011948028. I'm able to replicate BBG's price using QuantLib (python) as follows:
```
import QuantLib as ql
faceValue = 100.0
couponType = ql.Annual
issueDate = ql.Date(18, 4, 2023)
EvalDate = ql.Date(12, 9, 2024)
Maturity = ql.Date(28, 2, 2029)
quotedYield = 0.0444
couponRate = 0.0375
settlementDays = 1
dates = ['2023-04-18', '2024-02-29', '2025-02-27', '2026-02-26', '2027-02-28', '2028-02-29', '2029-02-28']
schedule = ql.Schedule([ql.Date(dt, '%Y-%m-%d') for dt in dates])
bond = ql.FixedRateBond(settlementDays, faceValue, schedule, [couponRate], ql.Actual365Fixed(ql.Actual365Fixed.Standard))
print(bond.dirtyPrice(quotedYield, ql.Actual365Fixed(ql.Actual365Fixed.Standard), ql.Simple, ql.Annual))
```
This produces the correct value (99.24176 vs 99.242 in BBG). However, I don't really understand how the simple interest calculation works; looking at the source code, it just returns 1.0+r*t, but if I try replicating this in Excel by discounting coupons with $1+yield\times t$ where t is time to maturity and yield=4.44%, I'm off by more than a dollar (same if I include the factor of fraction of a year).
Could someone explain in equations what the QuantLib/BBG calculation is doing? Sorry if this is really simple, but I can't seem to find good resources about simple yield/interest for multiperiod bonds. Thanks.
Edit: I'm using a trade date of 9/12/2024 with settlement 9/13/2024. Terribly sorry for the omission. I should also note, Israel uses a Sunday-Thursday work week.
Using the normal $\frac{CF}{(1+r\frac{d}{365})^t}$ (d is days in the period), I get 99.321 which is close but not close enough for my purposes.
## Answer by LongTimeLurker (score 1)
https://quant.stackexchange.com/a/80632
I'm going to take a punt on this one. (I can't comment on the Quantlib aspect of it)
Looking at the yield you quote (bid yield?) it looks like you're pricing this around the 6th of September, which would mean a settlement date on the 9th of September. Is this correct?
Looking at Eikon, it looks like the "native" yield convention is the same as ISMA. four our purposes, that's just a normal YTM calculation.
So let's mock something up very crudely in a spreadsheet. If we calculate the discount factors as (1+0.0444)^t and construct the coupon schedule using actual/365, and add the accrued interest, I get 99.242 as the dirty price in a spreadsheet calculation.
There are 5 remaining coupons dates.
Accrued interest 3.75% x 193/365 = 1.988288
Discount factors: 0.97983, 0.93826, 0.89812, 0.85980, 0.82322
Coupons/flows: 1.7568, 3.7397, 3.7705, 3.7603, 103.75Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.