Price a fixed-coupon bond from its yield and measure its interest-rate risk with duration.
Why it matters
Insurers and pension plans hold large bond portfolios to back the promises they make. An actuary needs to price those bonds, understand why their market value moves when interest rates move, and check that the assets move in step with the liabilities. The tools are a present value, a yield, and duration, the single most used measure of interest-rate risk. All three are on Exam FM.
What a bond pays
A standard fixed-coupon bond has:
- a face value
F(often 100 or 1,000), - a coupon rate
r: the bond paysF * reach period, - a term of
nperiods, with the redemption amount (here equal toF) repaid at the end.
Its price at a yield j per period is the present value of those cash flows at j:
price = F * r * a_n + F * v^n (a_n and v at rate j)
The yield to maturity is the single rate that makes this present value equal the market price. It is an internal rate of return, so it is found numerically (bisection or Newton's method), not with a closed formula.
Worked example 1: price from yield
A 5-year bond, face 1,000, annual coupons of 6%, priced at a 5% yield:
coupon = 60
a_5 at 5% = 4.329477, v^5 = 0.783526
price = 60 * 4.329477 + 1000 * 0.783526 = 259.77 + 783.53 = 1,043.29
The coupon rate (6%) is above the yield (5%), so the bond sells at a premium, above face. When coupon = yield the price equals face (par); when coupon < yield it sells at a discount. Higher yields mean lower prices: the price-yield curve slopes down and is convex.
US Treasury and most corporate bonds pay coupons semiannually: use half the coupon rate, half the annual nominal yield, and twice as many periods.
Duration: how sensitive is the price?
Macaulay duration is the present-value-weighted average time of the cash flows:
D_mac = sum( t * CF_t * v^t ) / price
For our bond at 5%:
| t | cash flow | PV | t * PV |
|---|---|---|---|
| 1 | 60 | 57.14 | 57.14 |
| 2 | 60 | 54.42 | 108.84 |
| 3 | 60 | 51.83 | 155.49 |
| 4 | 60 | 49.36 | 197.45 |
| 5 | 1,060 | 830.54 | 4,152.69 |
| 1,043.29 | 4,671.61 |
D_mac = 4671.61 / 1043.29 = 4.478 years
D_mod = D_mac / (1 + j) = 4.478 / 1.05 = 4.265
Modified duration gives the first-order price change: % change in price ≈ -D_mod * change in yield. If yields rise from 5% to 5.5%, the price falls by about 4.265 * 0.005 = 2.13%, to about 1,021.05. The exact price at 5.5% is 1,021.35; the gap is due to convexity, the curvature that duration ignores. Adding the convexity term + 0.5 * C * (change)^2 closes most of the gap.
A zero-coupon bond has Macaulay duration exactly equal to its term, because it has one cash flow. Coupons pull the duration below the term.
Why actuaries care: matching
If an insurer's liabilities have a duration of 8 years and its bonds have a duration of 4, a fall in interest rates raises the value of the liabilities more than the value of the assets, and the surplus shrinks. Immunization (Redington's conditions: equal present values, equal durations, asset convexity greater than liability convexity) protects against small parallel rate moves. Asset-liability management (ALM) teams do this every quarter.
def bond_price(face, coupon_rate, y, n):
c = face * coupon_rate
return sum(c / (1 + y) ** t for t in range(1, n + 1)) + face / (1 + y) ** n
print(round(bond_price(1000, 0.06, 0.05, 5), 2)) # 1043.29
Common mistakes
- Using the coupon rate to discount. Discount at the yield; the coupon rate only sets the cash flows.
- Forgetting the redemption payment in the last period, or counting it twice.
- Mixing Macaulay and modified duration. Price sensitivity uses modified duration.
- Treating duration as exact. It is a linear approximation, good for small rate changes only.
Quick recap
- Price = PV of coupons + PV of redemption at the yield.
- Premium when coupon > yield, par when equal, discount when coupon < yield.
D_mac= PV-weighted average time;D_mod = D_mac / (1 + j);%ΔP ≈ -D_mod * Δj.
Try it
In the Do tab, write bond_price, macaulay_duration and modified_duration, then estimate a price change and compare it with the exact one.