Explainer

Bond yields explained: why prices fall when yields rise

A bond’s coupon never changes, so its price does all the adjusting. By 21 October 2026 that arithmetic had taken 7.9% off a long Treasury fund’s price this year, more than four times what a short one lost.

On this page
  1. What are bond yields?
  2. Why bond prices fall when yields rise
  3. Coupon rate, current yield and yield to maturity
  4. Duration and convexity: why long bonds move more
  5. Why bond yields rose in 2026
  6. Bond yields from an API, priced in Python
  7. Questions

Key takeaways

  • A bond yield is the annual return a bond pays at its current price: 5.13% for the US 10-year Treasury on 21 October 2026, 3.44% for Germany’s.
  • The coupon is fixed, so prices fall when yields rise: a 4.25% 10-year bond worth $1,000 at a 4.25% yield is worth $931.83 at 5.13%.
  • Priced at 93.00, a 4.25% 10-year bond has three yields: a 4.25% coupon rate, a 4.57% current yield and a 5.155% yield to maturity.
  • From a 5.13% yield, a one-point rise takes 1.86% off a 2-year par bond and 13.65% off a 30-year, while a one-point fall adds 17.11% to the 30-year, the asymmetry called convexity.
  • From 31 December 2025 to 21 October 2026 the long Treasury fund USTBOND fell 7.9% in price, against 4.6% for USBOND and 1.8% for SHORTBOND.

A bond yield is the annual return a bond pays at its current price, in percent. The coupon is fixed, so yield and price move in opposite directions: a cheaper bond pays more per dollar. On 21 October 2026 the US 10-year Treasury yield was 5.13%: a buyer at that day’s price who holds to maturity earns about 5.13% a year.

What are bond yields?

The coupon rate is fixed at issue as a percent of face value: a 4.25% bond pays $42.50 a year per $1,000 for life. The yield is what that income is worth at today’s price, so it changes whenever the price does. A Treasury yield is the same measure for US government debt; on 21 October the US curve ran from 4.09% at one month to a high of 5.47% at 20 years.

The 2-year yielded 4.81%, so the 2s10s spread behind yield curve inversion, the 10-year minus the 2-year, stood at +32 basis points: the curve was not inverted. Other governments borrow at their own rates, and the gaps between them are what the yen carry trade earns:

Ten-year government bond yields, latest observation

  • United Kingdom5.384%
  • United States5.13%
  • France4.985%
  • Spain4.063%
  • Germany3.44%
Observations dated 21 October 2026 for the US, France and Germany and 20 October for the UK and Spain, all read on 22 October. The UK yield arrives unrounded (5.384075...) and is shown to three decimals, like France and Spain. Italy is left out: its latest 10-year observation was dated 30 September (4.589%).TickerLayer GET /bond/snapshot/{CC}:10Y.

Why bond prices fall when yields rise

Follow a 4.25% 10-year bond as market yields rise to 5.13%:

  1. The coupon is fixed. The bond pays $42.50 a year per $1,000, in two halves of $21.25, until it matures.
  2. New bonds pay more. A new 10-year bond issued at 5.13% pays $51.30 a year, $8.80 more.
  3. The old price drops until the yields match. At $931.83 the old bond also yields 5.13%: the $68.17 discount is exactly the present value of that $8.80 a year shortfall over ten years.

P = Σ (C ÷ 2) ÷ (1 + y ÷ 2)^k + F ÷ (1 + y ÷ 2)^(2n)k = 1, 2, …, 2n

P
Price today, on a coupon date (no accrued interest)
C
Annual coupon in dollars: coupon rate × face, $42.50 here
y
Yield to maturity per year, as a decimal: 0.0513
n
Years to maturity: 10, so 20 half-year payments
F
Face value repaid at maturity: $1,000
Twenty coupons of $21.25 and $1,000 at the end, each discounted at 2.565% per half-year, add up to $931.83, or 93.18 per 100 of face.

Repeat the sum at other yields and the bond price and yield relationship fits in one table:

YieldPricevs par
3.75%$1,041.38+4.14%
4.00%$1,020.44+2.04%
4.25%$1,000.000.00%
4.50%$980.05-2.00%
5.00%$941.54-5.85%
5.13%$931.83-6.82%
5.50%$904.83-9.52%
6.00%$869.82-13.02%
Price of a 4.25% 10-year bond at different yields: $1,000 face, coupons twice a year, priced on a coupon date. Bold: the 21 October US 10-year yield. A quarter point up from 4.25% costs 2.00%; a quarter point down adds 2.04%.

For a holder the drop fades with time. At an unchanged 5.13% yield the bond climbs to 96.16 with five years left and 98.35 with two, then repays 100: the pull to par. The discount measures income given up against a new 5.13% bond, and turns into a cash loss only on a sale before maturity.

Coupon rate, current yield and yield to maturity

Price the same 4.25% 10-year at 93.00 and three different yields appear:

  • 4.25%Coupon rate: $42.50 ÷ $1,000 face, fixed at issue
  • 4.57%Current yield: $42.50 ÷ $930 price, one year of income
  • 5.155%Yield to maturity: coupons plus the $70 gain to par
One bond, three yields: a 4.25% 10-year bond with coupons twice a year, priced at $930 per $1,000. Figures from bond_yields.py below.

The yield to maturity (YTM) is the one rate that makes the price formula return today’s price, assuming you hold to the end, every payment arrives and coupons are reinvested at that rate. No closed-form YTM formula exists: ytm() in the script below solves for it by bisection in five lines.

Many guides print a shortcut as the YTM formula: (C + (F − P) ÷ n) ÷ ((F + P) ÷ 2). Here it gives (42.50 + 7.00) ÷ 965 = 5.130%, 2.5 basis points under the exact 5.155%, and on a 4.25% 30-year priced at 80 it falls 18 basis points short. Another common slip divides the coupon by the market price and calls it the coupon rate: that is the current yield.

Bond price calculator

Bond price and yield calculator

%
yrs
%
per 100
USD
Price of the face amount
$941.54
Current yield
4.5139%
Modified duration
7.99 years
Price if yields rise 1 point
-7.62%
Price if yields fall 1 point
+8.38%

Fixed coupon paid twice a year, priced on a coupon date (no accrued interest). Yield is the yield to maturity, compounded twice a year. Edit the yield or the price; the other follows.

Type 5.13 as the yield to get $931.83, then press 30 years: the price falls to $865.99, and a one-point rise now costs 14.15% while a one-point fall adds 17.85%, more than the par 30-year in the next table because a lower coupon means a longer duration.

Duration and convexity: why long bonds move more

Modified duration is the standard gauge of interest rate risk: roughly the percent a bond’s price moves for a one-point change in yield. It grows with maturity and shrinks as the coupon rises. Divided by 100 it gives the percent move per basis point; times the price, that is the DV01 worked through in basis points and DV01.

MaturityYield +1 ptYield -1 ptDuration
2 years-1.86%+1.90%1.88
5 years-4.25%+4.48%4.36
10 years-7.39%+8.12%7.75
30 years-13.65%+17.11%15.23
Price change of par bonds with coupon and yield both at 5.13%, the 21 October US 10-year yield, when yields jump one percentage point either way; duration is modified duration in years. Illustrative maths: a real curve moves by a different amount at each maturity.

Read the 30-year row: duration predicts a 15.23% move either way, but the bond loses 13.65% when yields rise and gains 17.11% when they fall. That bend in the price curve is convexity, and it grows with maturity: the gain is 1.02 times the loss at 2 years, 1.25 times at 30.

Price of a 4.25% 10-year bond at yields from 2% to 9%

  • Price
  • Duration estimate

price per 100 of face

Coupons twice a year, yields in half-point steps. The dashed line is the duration estimate, a straight line that touches the curve at 5.13% (price 93.18, modified duration 7.97). The real price sits above it on both sides, by 3.87 at 2% and 4.67 at 9%: that gap is convexity. Illustrative maths, not market data.

The 2026 test: the longest bonds fell furthest

Fund prices show the same ordering in real data. From the last close of 2025 to 21 October 2026, three US bond ETFs fell in order of the maturities they hold:

US bond fund prices in 2026, rebased to 100 on 31 December 2025

  • USTBOND, long Treasury
  • USBOND, core bonds
  • SHORTBOND, short Treasury

price, 31 Dec 2025 = 100

The last close of each week from 2 January, plus 21 October. Prices only: fund distributions are not included, so total returns were higher than the lines show. End values: USTBOND 92.06 (-7.9%), USBOND 95.41 (-4.6%), SHORTBOND 98.15 (-1.8%). USTBOND’s lowest daily close, 77.11 on 5 October, was 11.5% below its 31 December close.TickerLayer GET /etfs/agg/{symbol}/1/day, daily closes 31 December 2025 to 21 October 2026.

All three closed lowest on 2 or 5 October and had won part of the loss back by 21 October, USTBOND 4.1% above its low; the USTBOND symbol page tracks the long fund.

Why bond yields rose in 2026

Yields rise when inflation runs ahead of forecasts, when the central bank lifts short rates and when governments sell more debt than buyers want. In 2026 the first two came with an energy price shock: in TickerLayer’s BRENTUSD daily closes, Brent crude went from $60.91 a barrel at the end of 2025 to $109.58 on 21 October, up 79.9%. On 16 September the Federal Reserve raised its target range 25 basis points to 3.75% to 4.00%, saying in its statement that inflation "remains elevated".

TickerLayer’s 10-year observations trace October: 5.24% on the 1st, 5.10% on the 15th, 5.13% on the 21st. Four of these releases came in above consensus and one, housing starts, below:

ReleaseActualConsensusDate
CPI, Sep, y/y3.7%3.6%14 Oct
Core CPI, Sep, y/y2.6%2.5%14 Oct
PPI, Sep, m/m+1.3%+0.5%15 Oct
Retail sales, Sep, m/m+0.8%+0.3%15 Oct
Housing starts, Sep1.221m1.30m20 Oct
Fed rate decisiondue4.00%28 Oct
US releases rated high importance. CPI is the consumer price index and PPI producer prices; housing starts are in millions of units at an annual rate. The Fed row is the upper bound of the target range, where the consensus sits unchanged from the 16 September decision. Data releases at 12:30 UTC, the decision at 18:00 UTC. Source: TickerLayer GET /fundamentals/economic-events (Fundamentals add-on), read on 22 October 2026.

Hot numbers did not lift yields every time. On 14 and 15 October, when consumer prices, producer prices and retail sales all came in above consensus, the long fund USTBOND still closed 0.7% and 1.4% higher, a sign that long yields fell on both days. The economic calendar endpoint serves these rows.

What high bond yields mean for stocks and borrowers

Higher yields raise the rate used to discount future profits, which weighs most on companies whose earnings lie far ahead, and give stocks a rival that pays about 5% with little credit risk. Borrowers feel it directly: mortgages and corporate loans are priced off the same curve.

Bond yields from an API, priced in Python

TickerLayer serves daily government bond yields for the US curve, 1 month to 30 years, and the German, French, Spanish, Italian and UK curves, 1 to 30 years. The bond snapshot endpoint adds the previous observation:

GET /bond/snapshot/US:10Y

{
  "symbol": "US:10Y",
  "rate": 5.13,1
  "unit": "percent",2
  "date": "2026-10-21",3
  "timestamp": 1792540800000,
  "prev_rate": 5.12,
  "prev_date": "2026-10-20",4
  "prev_timestamp": 1792454400000,
  "change": 0.01,
  "change_bps": 1,5
  "change_percent": 0.1953
}
  1. rateThe yield to maturity: 5.13 means 5.13%, so y = 0.0513 in the price formula.
  2. unitPercent on every bond symbol: divide by 100 before using it as a decimal.
  3. dateThe observation date, not the time of the request: read on 22 October, the latest US value was dated 21 October.
  4. prev_dateThe date of prev_rate. Compare it with date to see what the change covers: the previous business day on most curves, the previous monthly auction on Italy’s short tenors. Store each day’s row to build a longer history.
  5. change_bpsThe move in basis points: whole numbers on the US curve, fractions such as 5.7 on France’s.
A live response read on 22 October 2026.

bond_yields.py fetches five snapshots and prices the 4.25% bond at the live 10-year yield, reproducing the bond maths on this page. It needs Python 3.9 or newer, the standard library and a TICKERLAYER_API_KEY environment variable.

bond_yields.pyPython
"""Price a bond at today's government bond yields. Python 3.9+, standard library only."""
import json
import os
import sys
import urllib.error
import urllib.request

API = "https://api.tickerlayer.com"
KEY = os.environ.get("TICKERLAYER_API_KEY") or sys.exit("Set TICKERLAYER_API_KEY first.")


def snapshot(symbol):
    """Latest daily observation and the one before it."""
    req = urllib.request.Request(f"{API}/bond/snapshot/{symbol}", headers={"x-api-key": KEY})
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            return json.load(resp)
    except urllib.error.HTTPError as err:  # 403: the key has no Bonds add-on
        sys.exit(f"HTTP {err.code}: {err.read().decode()}")


def price(coupon, years, ytm, face=100.0):
    """Price of a bond paying coupon % a year in two halves, at a yield to maturity in %."""
    n, c, y = round(years * 2), face * coupon / 200, ytm / 200
    return sum(c / (1 + y) ** k for k in range(1, n + 1)) + face / (1 + y) ** n


def ytm(target, coupon, years):
    """Exact yield to maturity in %, by bisection: the price falls as the yield rises."""
    lo, hi = -5.0, 60.0
    for _ in range(100):
        mid = (lo + hi) / 2
        lo, hi = (mid, hi) if price(coupon, years, mid) > target else (lo, mid)
    return (lo + hi) / 2


def duration(coupon, years, y):
    """Modified duration in years: the % price change for a 1-point move, from 1 bp either side."""
    return (price(coupon, years, y - 0.01) - price(coupon, years, y + 0.01)) / (0.0002 * price(coupon, years, y))


print("symbol  yield   observed    change")
rates = {}
for symbol in ["US:2Y", "US:10Y", "US:30Y", "DE:10Y", "FR:10Y"]:
    s = snapshot(symbol)
    rates[symbol] = round(s["rate"], 3)  # some curves arrive unrounded
    print(f"{symbol:<8}{rates[symbol]:<7g} {s['date']}  {s['change_bps']:+g} bps")

y10 = rates["US:10Y"]
p = price(4.25, 10, y10)
print(f"\n4.25% 10-year at {y10}%: {p:.2f} per 100, ${p * 10:,.2f} per $1,000, "
      f"duration {duration(4.25, 10, y10):.2f}")
print("yield   per $1,000  vs par")
for y in sorted({3.75, 4.0, 4.25, 4.5, 5.0, 5.5, 6.0, y10}):
    q = price(4.25, 10, y)
    print(f"{y:5.2f}%  {q * 10:>10,.2f}  {q - 100:+6.2f}%")

print("\nbond            price  current  exact ytm  shortcut")
for years, px in [(10, 93.0), (30, 80.0)]:
    shortcut = (4.25 + (100 - px) / years) / ((100 + px) / 2) * 100  # the textbook approximation
    print(f"4.25% {years}-year  {px:6.2f}  {4.25 / px * 100:6.2f}%  {ytm(px, 4.25, years):8.3f}%"
          f"  {shortcut:7.3f}%")

print(f"\npar bond at {y10}%  +1 point  -1 point  duration")
for years in (2, 5, 10, 30):
    up, down = price(y10, years, y10 + 1) - 100, price(y10, years, y10 - 1) - 100
    print(f"{years:>2}-year          {up:+7.2f}%  {down:+7.2f}%  {duration(y10, years, y10):8.2f}")
python bond_yields.py
symbol  yield   observed    change
US:2Y   4.81    2026-10-21  +2 bps
US:10Y  5.13    2026-10-21  +1 bps
US:30Y  5.42    2026-10-21  +0 bps
DE:10Y  3.44    2026-10-21  -1 bps
FR:10Y  4.985   2026-10-21  +5.7 bps

4.25% 10-year at 5.13%: 93.18 per 100, $931.83 per $1,000, duration 7.97
yield   per $1,000  vs par
 3.75%    1,041.38   +4.14%
 4.00%    1,020.44   +2.04%
 4.25%    1,000.00   +0.00%
 4.50%      980.05   -2.00%
 5.00%      941.54   -5.85%
 5.13%      931.83   -6.82%
 5.50%      904.83   -9.52%
 6.00%      869.82  -13.02%

bond            price  current  exact ytm  shortcut
4.25% 10-year   93.00    4.57%     5.155%    5.130%
4.25% 30-year   80.00    5.31%     5.640%    5.463%

par bond at 5.13%  +1 point  -1 point  duration
 2-year            -1.86%    +1.90%      1.88
 5-year            -4.25%    +4.48%      4.36
10-year            -7.39%    +8.12%      7.75
30-year           -13.65%   +17.11%     15.23

On another day the snapshot lines, the live-yield row and the par-bond table follow the curve; the other rows use fixed yields or prices. For a push feed instead, the bonds.quotes channel sends the latest observation on subscribe, then one frame per symbol for each new observation, with the same fields; WebSocket market data covers the client. AI agents get the same numbers from get_bond_yield on the financial MCP server.

Bonds are a data add-on, 39 USD a month on Individual and 349 USD on Business (data add-ons); without it /bond answers 403. Expect gaps in the dates: the US bond market closes on Veterans Day, Wednesday 11 November 2026, while stocks trade, one of the bond market holidays that stock calendars miss.

Questions

Is a higher bond yield good?

It depends on your side: better for new buyers, who lock in more income; worse for holders, whose bonds lose price, and for borrowers. A one-point rise takes 7.39% off a 10-year par bond at 5.13%.

What does a 5% bond yield mean?

Bought at today’s price and held to maturity, the bond returns 5% a year, if every payment arrives and coupons are reinvested at 5%. A 4.25% 10-year bond yields 5% at $941.54 per $1,000.

What is a Treasury yield?

The yield to maturity on US government debt, in percent a year. On 21 October 2026 the 10-year Treasury yield was 5.13%, the 2-year 4.81% and the 30-year 5.42%.

Why do bond prices fall when interest rates rise?

The coupon is fixed, so when new bonds pay more an old bond sells only at a discount. At a 5.13% yield a 4.25% 10-year bond is worth $931.83 per $1,000.

What is the difference between coupon rate and yield?

The coupon rate is fixed interest as a percent of face value. The yield is the return at today’s price: a 4.25% bond priced at 93.00 has a 4.57% current yield and a 5.155% yield to maturity.

What does yield to maturity mean?

The annual return from buying at today’s price and holding to the end, counting every coupon and the gain or loss to face value. It is solved numerically; the common shortcut misses by 18 basis points on a 4.25% 30-year bond priced at 80.

Keep reading

Ready to integrate?

Start with the free tier, explore the docs, and connect via REST or WebSocket in minutes.