viewof discount_rate_pct = Inputs.range([0.5, 10.0], {step: 0.25, value: 3.0, label: "Interest rate (%)"});
viewof maturity = Inputs.range([1, 30], {step: 1, value: 15, label: "Maturity (years)"})
viewof coupon_rate_pct = Inputs.range([0.5, 10.0], {step: 0.25, value: 3.0, label: "Coupon rate (%)"})
Note
While working at Allianz 2-3 years ago, I made this plot to understand why short-term bonds offer better protection against hikes in interest rates. I decided to release it in blog format, because why not?
Explore how bond prices react to changes in interest rates. A bondholder of a $100 bond receives a fixed payment every year (coupon \(C\), e.g. $3/year) for \(T\) years (maturity, e.g. 10 years), plus the face value \(FV\) ($100) back at maturity. The price of a bond today is determined by discounting these future cash flows by the interest rate \(r\), because money today is worth more than money in the future.
- Discounted face value: \(\frac{FV}{(1+r)^T}\).
- Discounted coupon payments: \(C \cdot \frac{1 - (1+r)^{-T}}{r}\).
Notice that in the discounted face value \(\frac{FV}{(1+r)^T}\), the exponent \(T\) amplifies the effect of any change in \(r\) — the longer the maturity, the more the price drops when rates rise.
Use the sliders below to adjust the maturity, coupon rate, and interest rate. We assume annual coupon payments and a face value of $100.
Sensitivity to Interest Rate Changes: Longer maturities are more sensitive to interest rate changes. The plot below shows the bond price as a function of the interest rate for different maturities. The red dot marks your selected bond.
Key Takeaways:
- Higher interest rates lead to lower bond prices — future cash flows are worth less today.
- Longer maturities amplify the effect of interest rate changes.
- When the interest rate equals the coupon rate, the bond price equals the face value ($100), regardless of maturity.