Skip to content

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:

  1. 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).
  2. Maturity: The duration of the loan (e.g., 5 years).
  3. 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:

Coupon Payment (C)=Face Value (F)×Coupon Rate (c)=€100×0.05=€5

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:FV=PV×(1+r)t
  • Present Value (PV): The value of that future cash flow today. Because money can be rented out to earn interest (r), a payment received in the future is worth less today. To calculate the PV, we discount the FV back in time:PV=FV(1+r)t

To find the fair market price of a bond today (P), we calculate and sum the Present Value of all its future cash flows (each remaining coupon plus the final principal repayment at maturity):

Bond Price (P)=∑t=1TC(1+r)t+F(1+r)T

Where:

  • P is the current fair market price of the bond.
  • C is the fixed annual coupon payment.
  • F is the face value (par value) of the bond (e.g., €100).
  • r is the current market interest rate (discount rate).
  • T 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 (T→0), the price of the bond converges toward the €100 face value because the payback date is near. This phenomenon is called Pull to Par.

TIP 🤔

At maturity (T=0), the fair value of a bond is exactly its Face Value because there are no future coupons left to discount, and the issuer pays back the principal immediately.

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!

Bond Seesaw & Pull to Par Simulator

5%
0%7%15%
7%
0%7%15%
5 Yrs
1 Yr5 Yrs10 Yrs
Time PointPayout (FV)Interest Rate (r)Maturity (t)PV (%) ?PV (Payout Today)Bond Price at Time Point
Year 1 Coupon€5.007.0%1 Yr93.5%€4.67€91.80
Year 2 Coupon€5.007.0%2 Yrs87.3%€4.37€87.13
Year 3 Coupon€5.007.0%3 Yrs81.6%€4.08€82.76
Year 4 Coupon€5.007.0%4 Yrs76.3%€3.81€78.68
Year 5 Coupon€5.007.0%5 Yrs71.3%€3.56€74.86
Year 5 Principal€100.007.0%5 Yrs71.3%€71.30€71.30
Market Rate7% Bond Price €92
⚖️ The Seesaw Mechanism: When Market Rate is higher than Coupon Rate (5%), Bond Price drops.
€80€90€100€110€120MaturityYr 1Yr 3Yr 4Yr 5
💡 Interactive Chart: Scroll mouse wheel to zoom. Click & drag to pan. Hover to inspect year-by-year Present Values.

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!

Interactive Yield Curve & Pricing Simulator

0.0%
-5.0%0.0%+5.0%
Normal (0.0%)
Invert / FlattenBalancedSteepened

Yield Curve (Spot Rates)

0% 3% 6% 9% 12% 15% Yr 1Yr 2Yr 3Yr 4Yr 53.0% 4.0% 4.8% 5.5% 6.0%
👆 Drag Nodes: Drag the blue circles up/down directly on the chart to customize individual spot yields!

DCF Pricing (5% Coupon Bond)

Bond Price: €96.32Discount 📉
Payout TermFV PayoutSpot Yield (r_t)Time (t)PV Factor (%)PV TodayBond Price at Time Point
Year 1 Coupon€5.003.0%1 yr97.1%€4.85€96.32
Year 2 Coupon€5.004.0%2 yrs92.5%€4.62€91.46
Year 3 Coupon€5.004.8%3 yrs86.9%€4.34€86.84
Year 4 Coupon€5.005.5%4 yrs80.7%€4.04€82.50
Year 5 Coupon€5.006.0%5 yrs74.7%€3.74€78.46
Year 5 Principal€100.006.0%5 yrs74.7%€74.73€74.73

💻 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

python
# 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:

bash
python3 python/2-bond-pricing.py