Treasury Yield Curve H1 2026: Twist, No Be Shift
H1 2026 Treasury yield curve review: di belly climb while both ends hold steady, 2s10s spread flat without ever inverting, and di 30-year nearly touch 5%.
Di Treasury yield curve twist instead of just shift for di first half of 2026. From January first print reach June last print, di 2-year yield rise 67 basis points while di 1-month bill move -2 and di 30-year bond just 5 — di middle of di curve climb and both ends hold almost steady. For di same six months, di 2s10s spread flat from 72 to 30 basis points without ever inverting. Dis page na di half-year full rates ledger: di curve for three moments, di twist maturity by maturity, di daily 2s10s path, di 30-year run above 5%, and fifty years of half-year twists to rank dis one against. Every number na stored query result — expand any panel for di SQL behind am.
Wetin twist be — and why e read different from shift
Parallel shift na when every maturity move by almost di same amount: di whole curve just slide up or down and di shape remain. Twist na when different maturities move by different amounts, so di shape itself change. Di difference dey important wen you read di parts of di curve as different instruments. Di very front — bills wey dey mature for weeks — dey trade close to di current policy rate. Di long end na decades-long view on growth and inflation, and e fit just dey steady through months of front-end drama. Di middle — di 2-year na di classic gauge — na where di next couple of years of expected policy dey get repriced. One half wey di middle rise two-thirds of a point while both ends hold na di market dey redraw im near-term rate path and leave di long-run picture where e dey.
Di curve for three times: January, March, June
Di cleanest way to see twist na to snap di whole curve for different times and put di pictures side by side. Di panel wey dey below get three single-day snapshots — di first print for di half, di last print for March, and di last print for June — across seven maturities.
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
)Di January picture no be clean upward slope. Di 2-year first print for di year, 3.47%, siddon below di 1-month bill own wey be 3.72% — na sag for di curve belly, with di trough park for di exact maturities wey dey price near-term policy. By di last March print, di 2-year don climb go 3.79%, and by di last June print, di sag don disappear totally: di 2-year stand for 4.14%, above every bill maturity for di panel, and yields step higher for each point along di curve, ending with di 30-year for 4.91%. Six months turn curve wey get dent into one wey dey slope upward normally — no be by moving everything up, but by lifting di dent.
Di twist, maturity by maturity
Make you comot di January snapshot from di June one, and di twist get im own shape: one hump wey dey center for di 2-year, e dey taper go zero for both ends. Di panel divide each maturity move into im Q1 and Q2 legs.
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
)Di 2-year own 67 basis points na di biggest move for di panel — e big pass di 1-year own 51, di 5-year own 45, and di 10-year own 25, and e dey one order of magnitude beyond di ends. Di quarter split talk say di climb steady instead of one single lurch: 32 basis points for first quarter, 35 for second. Wetin repriced di middle of di curve do am across both quarters, print by print — di daily series wey dey below make di same point for finer grain.
Di 2s10s spread bin invert for H1 2026?
No — and di evidence show exactly how close e reach. Di one-row panel hold di half boundary values; di chart under am na every daily print.
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)Di spread between di 10-year and 2-year yields open di half at 72 basis points, e never print wide pass 74, and e end June at 30. Im floor na 27 basis points, wey print on 2026-06-18 — di closest approach to inversion, still dey comfortably positive. Any reader wey only want di inversion answer fit stop here; di path matter for different question.
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 dateDi flattening na one sharp event or na grind? Di daily series answer: 124 prints dey step down from 72 basis points on 2026-01-02 to 30 at di June close, with no single-day collapse anywhere for di sequence. Flattening wey arrive print by print na slow repricing; di one wey arrive for one week usually get date attach. Dis one na grind.
Di 30-year and di 5% line
Di long bond half look calm for di change column — 5 basis points from start to finish — but di journey touch one level wey make sense to record. Di receipt wey dey below measure dat visit.
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)Di 30-year open di half at 4.86%, e print at or above 5% for di first time on 2026-05-04, e spend 16 out of di half 124 prints at or above dat line, e reach im highest at 5.18% on 2026-05-19, and e finish back below am at 4.91%. Round numbers no get any special magic, but 5% on di 30-year na level wey mortgage desks and pension allocators dey quote, and di tape verdict dey specific: di stay at or above am run from 2026-05-04 to 2026-06-10 — one early-May-to-mid-June episode inside one flat half wey im inside get one one-third-of-a-point round trip.
Fifty years of half-year twists
Dis kind twist, e dey rare? Make we define half-year twist as di change for 2-year minus di change for 10-year — positive value mean say di front rise faster (or fall less) dan di long end, na flattening from di front. Di panel dey calculate dat number for every half since 1976, di first year wey di 2-year and 10-year series print togeda for full half, plus each half im 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 ASCThe 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
)H1 2026 im twist measure na 42 basis points, wey rank 42 out of 100 halves by absolute size — e dey mid-pack, no be outlier. Di table get halves wey be three and four times dis size for both directions. Wetin make dis half stand out na di reversal of direction: for both halves of 2025 di 2-year FALL (-53 basis points for H1 2025, -31 for H2), and H1 2026 answer with 67 basis-point rise — di front-middle of di curve change direction for di year boundary. Di inversion column place di half for im era: 28 of di 100 halves print negative 2s10s for some point, and di most recent of dem start 2024-07-01 — di tail end of di long 2022–2024 inversion. H1 2026 im floor of 27 basis points keep am out of dat club entirely.
Wetin flat curve dey touch
Three place wey twist like dis one show face outside bond market, we talk am as mechanics no be forecast. Mortgage rates: 30-year fixed mortgage rates dem dey always quote as spread above di 10-year Treasury yield, and di 10-year finish di half at 4.44% — na move of 25 basis points, small fraction of wetin 2-year own be. Twist wey concentrate for 2-year dey touch mortgage pricing far less dan parallel shift of di same headline size go do. Bank margins: banks dey fund with short rates and lend with longer ones, and flattening dey narrow di gap wey those two rates define — di raw material of net interest margin. Recession arithmetic: inverted 2s10s don show face before past U.S. recessions, na why di spread dey draw attention at all. Dis half never print one; di floor na 27 basis points. Whether any of dat dey talk something about wetin dey come next na forecast, and dis page no dey make forecasts.
One note about di auction calendar
None of di panels wey dey up show supply, but di rhythm wey dey under dem worth knowing. Treasury dey sell 2-, 5-, and 7-year notes every month and dey auction di 10-year and 30-year on di quarterly refunding cycle, with reopenings in between — every yield wey dey here na market price wey dem set against dat steady calendar of new issuance. Auction-level results (bid-to-cover ratios, tails) no dey inside dis dataset, so dis page no dey make any claims about demand for any specific sale.
FAQ
Di Treasury yield curve invert for 2026?
E no invert for di first half. Di 2s10s spread im lowest print for H1 2026 na 27 basis points, wey happen for 2026-06-18 — e start di year for 72 and end June for 30, e flat small but e still dey positive all through.
Wetin be yield-curve twist?
Na change for di curve im shape, no be im level: different maturities dey move by different amounts. For H1 2026, di 2-year rise by 67 basis points while di 1-month and 30-year move by single-digit amounts — na twist wey center for di curve im belly, as opposed to parallel shift wey dey move everitin together.
How much di 2-year Treasury yield rise for 2026?
E rise by 67 basis points across di first half — from 3.47% for di first January print go reach 4.14% for di last June print, e split into 32 and 35 across di two quarters.
When di 30-year Treasury yield cross 5%?
Im first H1 2026 print wey reach or pass 5% come for 2026-05-04. E peak for 5.18% for 2026-05-19 and end di half come back below di line for 4.91%.
When last di US yield curve invert?
By dis page im half-by-half accounting, di most recent half-year wey contain inverted 2s10s print start for 2024-07-01. In total, 28 out of 100 halves since 1976 print negative 2s10s at least once.
Di equity, sector, and options ledgers of di same six months dey inside di H1 2026 market recap, and di macro releases wey di half trade against dey inside di macro picture wey dey enter H2. Everi panel wey dey up so na im you fit reproduce — paste di SQL inside Strasmore terminal and run am against di same tables.
How We Do Am
- Start and end values na di first and last prints for each maturity inside January 1 – June 30, 2026, wey dem pick by date for di query; di snapshots na single-day rows (di half first print, di last March print, di last June print), and all seven maturities dey fully populated for those dates.
- Di half-year history join di 2-year and 10-year from July 1976 go front — dat na di first full half wey both series print together. Halves wey get fewer than 100 joint prints, dem exclude dem by one in-query guard, and di per-half print counts show for di table. Di history upper bound dey fixed for June 30, 2026, so di comparison set no fit grow as later data dey come.
- Extremes dem break tie deterministically (value–date tuples), so regeneration no fit flip one date for tied print.
- Generation dey run through di gated read-only path; di public page never dey query live. Warehouse state as of July 12, 2026.