Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-07-26

Treasury Yield Curve, H1 2026: Twist, Not Shift

H1 2026 Treasury yield curve review: a twist that lifted the belly while both ends held, a 2s10s spread that never inverted, and the 30-year's brush with 5%.

The Treasury yield curve twisted rather than shifted in the first half of 2026. Between the first print of January and the last print of June, the 2-year yield rose 67 basis points while the 1-month bill moved -2 and the 30-year bond just 5, the middle of the curve climbed and both ends held nearly still. Over the same six months the 2s10s spread flattened from 72 to 30 basis points without ever inverting. This page is the half's full rates ledger: the curve at three moments, the twist maturity by maturity, the daily 2s10s path, the 30-year's run above 5%, and fifty years of half-year twists to rank this one against. Every number is a stored query result, expand any panel for the SQL behind it.

What a twist is, and why it reads differently from a shift

A parallel shift moves every maturity by roughly the same amount: the whole curve slides up or down and its shape survives. A twist moves different maturities by different amounts, so the shape itself changes. The distinction matters when you read the curve's parts as different instruments. The very front, bills maturing in weeks, trades close to the current policy rate. The long end is a decades-long view on growth and inflation, and it can sit still through months of front-end drama. The middle, the 2-year is the classic gauge, is where the next couple of years of expected policy get repriced. A half in which the middle rises two-thirds of a point while both ends hold is the market redrawing its near-term rate path and leaving the long-run picture where it was.

The curve at three moments: January, March, June

The cleanest way to see a twist is to photograph the whole curve at intervals and lay the pictures side by side. The panel below holds three single-day snapshots, the half's first print, the last print of March, and the last print of June, across seven maturities.

QuerySeven maturities, three single-day snapshots: the half's first print, the last March print, and the last June print
The exact SQL behind every number
WITH
    (SELECT (yield_1_month, yield_3_month, yield_1_year, yield_2_year, yield_5_year, yield_10_year, yield_30_year) FROM global_markets.treasury_yields
     WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') ORDER BY date ASC LIMIT 1) AS jan_row,
    (SELECT (yield_1_month, yield_3_month, yield_1_year, yield_2_year, yield_5_year, yield_10_year, yield_30_year) FROM global_markets.treasury_yields
     WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-03-31') ORDER BY date DESC LIMIT 1) AS mar_row,
    (SELECT (yield_1_month, yield_3_month, yield_1_year, yield_2_year, yield_5_year, yield_10_year, yield_30_year) FROM global_markets.treasury_yields
     WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') ORDER BY date DESC LIMIT 1) AS jun_row
SELECT z.1 AS maturity, z.2 AS jan_pct, z.3 AS mar_pct, z.4 AS jun_pct
FROM (
    SELECT arrayJoin(arrayZip(['1-month','3-month','1-year','2-year','5-year','10-year','30-year'],
        [jan_row.1, jan_row.2, jan_row.3, jan_row.4, jan_row.5, jan_row.6, jan_row.7],
        [mar_row.1, mar_row.2, mar_row.3, mar_row.4, mar_row.5, mar_row.6, mar_row.7],
        [jun_row.1, jun_row.2, jun_row.3, jun_row.4, jun_row.5, jun_row.6, jun_row.7])) AS z
)
Run this yourself

The January photograph is not a clean upward slope. The 2-year's first print of the year, 3.47%, sat below the 1-month bill's 3.72%, a sag in the curve's belly, with the trough parked at the very maturities that price near-term policy. By the last March print the 2-year had climbed to 3.79%, and by the last June print the sag was gone entirely: the 2-year stood at 4.14%, above every bill maturity on the panel, and yields stepped higher at each point out the curve, ending with the 30-year at 4.91%. Six months turned a dented curve into a conventionally upward-sloping one, not by moving everything up, but by lifting the dent.

The twist, maturity by maturity

Subtract the January snapshot from the June one and the twist has a shape of its own: a hump centered on the 2-year, tapering toward zero at both ends. The panel splits each maturity's move into its Q1 and Q2 legs.

QueryThe H1 2026 move per maturity, split into quarters: the hump sits squarely on the 2-year
The exact SQL behind every number
WITH
    (SELECT (yield_1_month, yield_3_month, yield_1_year, yield_2_year, yield_5_year, yield_10_year, yield_30_year) FROM global_markets.treasury_yields
     WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') ORDER BY date ASC LIMIT 1) AS jan_row,
    (SELECT (yield_1_month, yield_3_month, yield_1_year, yield_2_year, yield_5_year, yield_10_year, yield_30_year) FROM global_markets.treasury_yields
     WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-03-31') ORDER BY date DESC LIMIT 1) AS mar_row,
    (SELECT (yield_1_month, yield_3_month, yield_1_year, yield_2_year, yield_5_year, yield_10_year, yield_30_year) FROM global_markets.treasury_yields
     WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') ORDER BY date DESC LIMIT 1) AS jun_row
SELECT z.1 AS maturity,
       round((z.3 - z.2) * 100, 0) AS q1_change_bp,
       round((z.4 - z.3) * 100, 0) AS q2_change_bp,
       round((z.4 - z.2) * 100, 0) AS h1_change_bp
FROM (
    SELECT arrayJoin(arrayZip(['1-month','3-month','1-year','2-year','5-year','10-year','30-year'],
        [jan_row.1, jan_row.2, jan_row.3, jan_row.4, jan_row.5, jan_row.6, jan_row.7],
        [mar_row.1, mar_row.2, mar_row.3, mar_row.4, mar_row.5, mar_row.6, mar_row.7],
        [jun_row.1, jun_row.2, jun_row.3, jun_row.4, jun_row.5, jun_row.6, jun_row.7])) AS z
)
Run this yourself

The 2-year's 67 basis points is the largest move on the panel, bigger than the 1-year's 51, the 5-year's 45, and the 10-year's 25, and an order of magnitude beyond the ends. The quarter split says the climb was steady rather than a single lurch: 32 basis points in the first quarter, 35 in the second. Whatever repriced the middle of the curve did it across both quarters, print by print, the daily series below makes the same point at finer grain.

Did the 2s10s spread invert in H1 2026?

No, and the receipts pin down exactly how close it came. The one-row panel holds the half's boundary values; the chart under it is every daily print.

QueryThe 2s10s slope receipt: start, end, minimum (with its date), maximum, and print count
The exact SQL behind every number
SELECT
    round((argMin(yield_10_year - yield_2_year, date)) * 100, 0) AS start_bp,
    round((argMax(yield_10_year - yield_2_year, date)) * 100, 0) AS end_bp,
    round(min(yield_10_year - yield_2_year) * 100, 0) AS min_bp,
    argMin(toString(date), (yield_10_year - yield_2_year, date)) AS min_date,
    round(max(yield_10_year - yield_2_year) * 100, 0) AS max_bp,
    count() AS prints
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
  AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)
Run this yourself

The spread between the 10-year and 2-year yields opened the half at 72 basis points, never printed wider than 74, and ended June at 30. Its floor was 27 basis points, printed on 2026-06-18, the closest approach to inversion, still comfortably positive. A reader who only wants the inversion answer can stop here; the path matters for a different question.

QueryThe 2s10s spread, every print of the half
The exact SQL behind every number
SELECT toString(date) AS d, round((yield_10_year - yield_2_year) * 100, 0) AS spread_2s10s_bp
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
  AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)
ORDER BY date
Run this yourself

Was the flattening one sharp event or a grind? The daily series answers: 124 prints stepping down from 72 basis points on 2026-01-02 to 30 at the June close, with no single-day collapse anywhere in the sequence. A flattening that arrives print by print is a slow repricing; one that arrives in a week usually has a date attached. This one was a grind.

The 30-year and the 5% line

The long bond's half looks placid in the change column, 5 basis points end to end, but the path visited a level worth recording. The receipt below measures the visit.

QueryThe 30-year's half: start, end, the first and last 5% prints, time spent at or above 5%, and the high
The exact SQL behind every number
SELECT
    round(argMin(yield_30_year, date), 2) AS start_pct,
    round(argMax(yield_30_year, date), 2) AS end_pct,
    toString(minIf(date, yield_30_year >= 5)) AS first_5_date,
    toString(maxIf(date, yield_30_year >= 5)) AS last_5_date,
    countIf(yield_30_year >= 5) AS prints_at_or_above_5,
    round(max(yield_30_year), 2) AS high_pct,
    argMax(toString(date), (yield_30_year, date)) AS high_date,
    count() AS prints
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_30_year)
Run this yourself

The 30-year opened the half at 4.86%, printed at or above 5% for the first time on 2026-05-04, spent 16 of the half's 124 prints at or above that line, topped at 5.18% on 2026-05-19, and finished back below it at 4.91%. Round numbers carry no special mechanics, but 5% on the 30-year is a level mortgage desks and pension allocators quote, and the tape's verdict is specific: the stay at or above it ran from 2026-05-04 to 2026-06-10, an early-May-to-mid-June episode inside a flat half whose interior held a one-third-of-a-point round trip.

Fifty years of half-year twists

Is a twist like this rare? Define a half-year's twist as the 2-year's change minus the 10-year's change, positive values mean the front rose faster (or fell less) than the long end, a flattening from the front. The panel computes that number for every half since 1976, the first year the 2-year and 10-year series print together for a full half, along with each half's lowest 2s10s print.

QueryEvery half-year since 1976: the 2y and 10y change, the twist between them, and the half's lowest 2s10s print
The exact SQL behind every number
SELECT concat(toString(toYear(date)), if(toMonth(date) <= 6, '-01-01', '-07-01')) AS period_start,
       concat(toString(toYear(date)), if(toMonth(date) <= 6, ' H1', ' H2')) AS half,
       count() AS prints,
       round((argMax(yield_2_year, date) - argMin(yield_2_year, date)) * 100, 0) AS change_2y_bp,
       round((argMax(yield_10_year, date) - argMin(yield_10_year, date)) * 100, 0) AS change_10y_bp,
       round((argMax(yield_2_year, date) - argMin(yield_2_year, date)) * 100
           - (argMax(yield_10_year, date) - argMin(yield_10_year, date)) * 100, 0) AS twist_bp,
       round(min(yield_10_year - yield_2_year) * 100, 0) AS min_2s10s_bp
FROM global_markets.treasury_yields
WHERE date >= toDate('1976-07-01') AND date <= toDate('2026-06-30')
  AND isNotNull(yield_2_year) AND isNotNull(yield_10_year)
GROUP BY period_start, half
HAVING prints >= 100
ORDER BY period_start ASC
Run this yourself
QueryThe rank receipt: H1 2026's twist against every prior half, by absolute size
The exact SQL behind every number
SELECT
    round(anyIf(twist, period_start = '2026-01-01'), 0) AS h1_2026_twist_bp,
    arrayCount(x -> abs(x) > abs(anyIf(twist, period_start = '2026-01-01')), groupArrayIf(twist, period_start != '2026-01-01')) + 1 AS rank_by_magnitude,
    count() AS halves_compared,
    toUInt16OrZero(substring(min(period_start), 1, 4)) AS first_year,
    countIf(min_2s10s < 0) AS halves_with_inversion,
    max(if(min_2s10s < 0, period_start, '')) AS last_inverted_half_start
FROM (
    SELECT concat(toString(toYear(date)), if(toMonth(date) <= 6, '-01-01', '-07-01')) AS period_start,
           count() AS prints,
           (argMax(yield_2_year, date) - argMin(yield_2_year, date)) * 100
             - (argMax(yield_10_year, date) - argMin(yield_10_year, date)) * 100 AS twist,
           min(yield_10_year - yield_2_year) * 100 AS min_2s10s
    FROM global_markets.treasury_yields
    WHERE date >= toDate('1976-07-01') AND date <= toDate('2026-06-30')
      AND isNotNull(yield_2_year) AND isNotNull(yield_10_year)
    GROUP BY period_start
    HAVING prints >= 100
)
Run this yourself

H1 2026's twist measures 42 basis points, which ranks 42 of 100 halves by absolute size, mid-pack, not an outlier. The table holds halves three and four times this size in both directions. What sets the half apart is the reversal of direction: in both halves of 2025 the 2-year FELL (-53 basis points in H1 2025, -31 in H2), and H1 2026 answered with a 67 basis-point rise, the front-middle of the curve changed direction at the year boundary. The inversion column places the half in its era: 28 of the 100 halves printed a negative 2s10s at some point, and the most recent of them began 2024-07-01, the tail end of the long 2022–2024 inversion. H1 2026's floor of 27 basis points kept it out of that club entirely.

What a flatter curve touches

Three places a twist like this one shows up outside the bond market, stated as mechanics rather than forecasts. Mortgage rates: 30-year fixed mortgage rates are typically quoted at a spread above the 10-year Treasury yield, and the 10-year finished the half at 4.44%, a move of 25 basis points, a fraction of the 2-year's. A twist concentrated in the 2-year touches mortgage pricing far less than a parallel shift of the same headline size would. Bank margins: banks tend to fund at short rates and lend at longer ones, and a flattening narrows the gap those two rates define, the raw material of net interest margin. Recession arithmetic: an inverted 2s10s preceded past U.S. recessions, which is why the spread draws attention at all. This half never printed one; the floor was 27 basis points. Whether any of that says something about what comes next is a forecast, and this page doesn't make forecasts.

A note on the auction calendar

None of the panels above show supply, but the rhythm underneath them is worth knowing. The Treasury sells 2-, 5-, and 7-year notes every month and auctions the 10-year and 30-year on the quarterly refunding cycle, with reopenings in between, every yield here is a market price set against that steady calendar of new issuance. Auction-level results (bid-to-cover ratios, tails) are not in this dataset, so this page makes no claims about demand at any specific sale.

FAQ

Did the Treasury yield curve invert in 2026?

Not in the first half. The 2s10s spread's lowest print of H1 2026 was 27 basis points, on 2026-06-18, it started the year at 72 and ended June at 30, flatter but positive throughout.

What is a yield-curve twist?

A change in the curve's shape rather than its level: different maturities move by different amounts. In H1 2026 the 2-year rose 67 basis points while the 1-month and 30-year moved single-digit amounts, a twist centered on the curve's belly, as opposed to a parallel shift that moves everything together.

How much did the 2-year Treasury yield rise in 2026?

67 basis points across the first half, from 3.47% at the first January print to 4.14% at the last June print, split 32 and 35 across the two quarters.

When did the 30-year Treasury yield cross 5%?

Its first H1 2026 print at or above 5% came on 2026-05-04. It peaked at 5.18% on 2026-05-19 and ended the half back below the line at 4.91%.

When was the US yield curve last inverted?

By this page's half-by-half accounting, the most recent half-year containing an inverted 2s10s print began 2024-07-01. In total, 28 of 100 halves since 1976 printed a negative 2s10s at least once.


The equity, sector, and options ledgers of the same six months live in the H1 2026 market recap, and the macro releases the half traded against are in the macro picture entering H2. Every panel above is reproducible, paste the SQL into the Strasmore terminal and run it against the same tables.

Methodology

  • Start and end values are the first and last prints per maturity within January 1 – June 30, 2026, picked by date in-query; the snapshots are single-day rows (the half's first print, the last March print, the last June print), and all seven maturities are fully populated on those dates.
  • The half-year history pairs the 2-year and 10-year from July 1976 on, the first full half in which both series print together. Halves with fewer than 100 joint prints are excluded by an in-query guard, with per-half print counts shown in the table. The history's upper bound is pinned at June 30, 2026, so the comparison set cannot grow as later data arrives.
  • Extremes are tie-broken deterministically (value–date tuples), so regeneration cannot flip a date on a tied print.
  • Generation runs through the gated read-only path; the public page never queries live. Warehouse state as of July 12, 2026.