B - The IOU Market
Governments and massive companies need to borrow billions of euros to build bridges, lay down fiber-optic cables, or launch satellites. Since no single bank wants to take on that much risk, they write millions of tiny paper promises called Bonds and sell them to regular people.
1. What is a Bond?
A bond is simply a formalized, tradable IOU ("I Owe You"). When you buy a bond, you are lending your money to the issuer. Every bond has three key details:
- Face Value (Par Value): The amount of money you lend today and that the issuer promises to pay you back at the very end (e.g., €100).
- Maturity: The duration of the loan (e.g., 5 years).
- Coupon Rate: The fixed annual rent the issuer pays you while they have your money (e.g., 5%, which equals €5 per year on a €100 bond).
We can express the annual coupon payment mathematically:
2. The Seesaw Effect
Bonds are not locked in a vault. If you buy a 5-year bond today, you can sell it to another investor tomorrow on the secondary market.
But how much will they pay you for it? The market price of a bond fluctuates constantly due to the Seesaw Effect:
- If market rates rise: Imagine you hold a bond paying a 5% coupon. The next day, the central bank raises general interest rates, and new bonds start paying 7%. If you try to sell your 5% bond for €100, nobody will buy it! Why buy your bond for €5/year when they can buy a new one for €7/year? To attract a buyer, you must lower your selling price below €100 (selling at a Discount).
- If market rates drop: If general interest rates fall to 3%, your fixed 5% coupon bond is suddenly a goldmine. Everyone wants it, driving its price above €100 (selling at a Premium).
IMPORTANT 🤔
The Seesaw Rule: When market interest rates go UP, existing bond prices go DOWN. When rates go DOWN, bond prices go UP.
3. Bond Pricing
Present Value (PV) vs. Future Value (FV) ❗
To understand bond pricing, we must recall two key concepts:
- Future Value (FV): The value of a payment to be received at a specific date in the future (for example, a coupon payout of €5 in 3 years). To calculate the FV from today's value, we compound it forward:
- Present Value (PV): The value of that future cash flow today. Because money can be rented out to earn interest (
), a payment received in the future is worth less today. To calculate the PV, we discount the FV back in time:
To find the fair market price of a bond today (
Where:
is the current fair market price of the bond. is the fixed annual coupon payment. is the face value (par value) of the bond (e.g., ). is the current market interest rate (discount rate). is the number of years remaining to maturity.
If you buy a bond at a discount for €95:
- You receive the fixed annual coupons.
- At maturity, the issuer pays you back the full €100 face value.
That extra €5 gain is part of your return! The total annualized return you get (including coupons and the capital gain from buying at a discount) is called the Yield to Maturity (YTM).
As the bond gets closer to its maturity date (
TIP 🤔
At maturity (
4. Bond Visualizer
Use the interactive simulator below to see how changes in the market interest rate tilt your bond's price. Observe the Seesaw Effect in action, check the year-by-year cash flows in the table, and watch the Pull to Par curve converge to €100 at maturity!
5. Yield Curve
Why does lending money to the government for 10 years usually pay a higher interest rate than lending for 10 days? Because time adds uncertainty:
- Inflation Risk: Prices might spike in 10 years, shrinking your purchasing power.
- Opportunity Cost: Your money is locked away and can't be used for other investments.
If you plot the interest rates of bonds with different maturities (from 1 month to 30 years) on a graph, you get the Yield Curve. Normally, it slopes upward because investors demand more rent for longer durations.
Use the interactive visualizer below to build your own yield curve. See how changing rates for specific years impacts the present value of a 5% coupon bond's cash flows, and try shifting or tilting the curve to invert it!
💻 Python Script
Let's calculate the fair price of a bond programmatically using the spot rates from a yield curve. This script calculates the price of a 5-year bond paying a 5% coupon (€5/year) using the default upward-sloping yield curve.
You can find the companion script here: 2-bond-pricing.py
# Default parameters from the simulator widget
coupon = 5.0 # €5 annual coupon (5% coupon rate on €100 par value)
principal = 100.0 # €100 Face Value (Par Value)
years = 5 # 5 years to maturity
# Default Yield Curve Spot Rates from the visualizer widget (Yr 1: 3%, Yr 2: 4%, Yr 3: 4.8%, Yr 4: 5.5%, Yr 5: 6.0%)
spot_rates = [0.03, 0.04, 0.048, 0.055, 0.06]
# Commented line for a flat yield curve (fixed rate case, e.g. flat 7%)
# spot_rates = [0.07] * years
# Calculate bond price as the sum of discounted cash flows using corresponding spot rates
bond_price = sum(coupon / (1 + spot_rates[t - 1])**t for t in range(1, years + 1)) + (principal / (1 + spot_rates[years - 1])**years)
print(f"--- Bond Pricing under a Yield Curve ---")
print(f"Coupon Rate: 5.0%")
print(f"Years to Run: {years}")
print(f"Yield Curve Rates: " + ", ".join(f"Yr {i+1}: {r*100:.1f}%" for i, r in enumerate(spot_rates)))
print(f"Bond Fair Price: €{bond_price:.2f} (Discounted by €{principal - bond_price:.2f})")To execute this locally, run:
python3 python/2-bond-pricing.py