Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-08-11

Macro Picture Entering H2 2026, With Receipts

The macro picture entering H2 2026: hot headline CPI over a quiet core, anchored expectations, a flattening curve, and the H2 prints that could change it.

Three macro series frame the second half, headline inflation accelerating over a creeping core, long-run expectations that barely moved, and a labor market improving on a thinner base, and two market prices kept score: a Treasury curve flattening from the front, and an equity tape that fit no tidy macro rule. This page shows all five with as-of receipts, then the H2 calendar: what lands when, and what each print would need to show to change the picture. Every number is a stored query result; expand any panel for the exact SQL.

Headline inflation accelerated; core crept

Headline CPI prices the full consumer basket; core CPI strips out food and energy, its two most volatile groups, the comparison separates the noisy edge from the slow-moving middle. The BLS publishes the index monthly, about two weeks after the month it measures. The panel below computes both year-over-year rates directly from the index levels, never from a pre-computed field.

QueryCPI year-over-year, computed from the index against the same month a year earlier
The exact SQL behind every number
SELECT toString(date) AS period_start,
    round(cpi, 1) AS cpi_index,
    round((cpi / any(cpi_prior) - 1) * 100, 1) AS cpi_yoy_pct,
    round((cpi_core / any(core_prior) - 1) * 100, 1) AS core_yoy_pct,
    round(cpi_yoy_pct - first_value(cpi_yoy_pct) OVER (ORDER BY date), 1) AS accel_since_jan_pts
FROM global_markets.inflation
INNER JOIN (
    SELECT date + INTERVAL 1 YEAR AS match_date, cpi AS cpi_prior, cpi_core AS core_prior
    FROM global_markets.inflation
    WHERE date >= toDate('2025-01-01') AND date <= toDate('2025-06-01')
) AS p ON date = p.match_date
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-01')
GROUP BY date, cpi, cpi_core
ORDER BY date
Run this yourself

Headline CPI ran 2.4% year-over-year in January and peaked at 4.2% in May, an acceleration of 1.8 percentage points across five prints, before the mid-July release put June at 3.5%. Core CPI moved only from 2.5% to 2.6% across the six. A headline running away from its core is a specific data shape: the volatile components are doing the moving. Which components, this table cannot say, and so this page doesn't.

The divergence has a start date. In January and February the two series sat on top of each other, headline a touch below core. March is where they crossed, headline jumped to 3.3% against core's 2.6%, and the gap kept widening through 4.2% versus 2.8% in May. June broke the pattern: headline fell back to 3.5% while core eased to 2.6%, the first narrowing since the cross.

A year-over-year rate blends twelve months of history; the month-over-month prints locate the move more precisely:

QueryCPI month-over-month, computed from the index against the prior month
The exact SQL behind every number
SELECT toString(date) AS period_start,
    round((cpi / any(cpi_prev) - 1) * 100, 2) AS headline_mom_pct,
    round((cpi_core / any(core_prev) - 1) * 100, 2) AS core_mom_pct
FROM global_markets.inflation
INNER JOIN (
    SELECT date + INTERVAL 1 MONTH AS match_date, cpi AS cpi_prev, cpi_core AS core_prev
    FROM global_markets.inflation
    WHERE date >= toDate('2025-12-01') AND date <= toDate('2026-05-01')
) AS p ON date = p.match_date
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-01')
GROUP BY date, cpi, cpi_core
ORDER BY date
Run this yourself

March carried the half's largest monthly headline move at 0.87%, with April next at 0.64%. Core's monthly prints stayed low throughout, with April's 0.38% the firmest of the five. The spring acceleration lives in two monthly headline prints and barely shows in the core series.

Expectations: the anchor held

An inflation expectation is the average inflation rate a model or a market price expects over the next one, five, or ten years. "Anchored" is shorthand for a specific pattern, short-horizon expectations swing with the latest prints while long-horizon ones stay put. The series below is model-based and monthly.

QueryModel-based inflation expectations by horizon, monthly
The exact SQL behind every number
SELECT toString(date) AS period_start,
    round(model_1_year, 2) AS exp_1y_pct,
    round(model_5_year, 2) AS exp_5y_pct,
    round(model_10_year, 2) AS exp_10y_pct
FROM global_markets.inflation_expectations
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
ORDER BY date
Run this yourself

The one-year expectation jumped around, 2.59% in January, 3.54% in May, 3.02% in June, but the ten-year barely moved: 2.33% to 2.49%. The five-year stayed close to the ten-year, at 2.34% in January and 2.54% in June. Markets repriced the next year's inflation and left the next decade's alone.

The timing lines up with the CPI panel: the one-year's low print of 2.29% landed in March, and the jump to 3.26% in April followed the March CPI acceleration. This page records the sequence and stops there. For how the bond market compresses this pricing into a single number, and what an inverted curve is, see the 2s10s spread explainer.

What does the curve say about the Fed?

The three-month bill sits closest to the Federal Reserve's current policy rate; the two-year note blends the rate path expected over the next two years; the ten-year adds a term premium, extra yield for bearing duration. The panel takes each month's last joint print of the three.

QueryThe Treasury curve at each month-end of H1 2026: bill, 2-year, 10-year, and the spreads between them
The exact SQL behind every number
SELECT toString(toStartOfMonth(date)) AS period_start,
    round(argMax(yield_3_month, date), 2) AS y3m_pct,
    round(argMax(yield_2_year, date), 2) AS y2_pct,
    round(argMax(yield_10_year, date), 2) AS y10_pct,
    round(argMax(yield_10_year, date) - argMax(yield_2_year, date), 2) AS spread_2s10s_pct,
    round(argMax(yield_2_year, date) - argMax(yield_3_month, date), 2) AS y2_minus_bill_pct,
    round(round(argMax(yield_2_year, date), 2) - first_value(round(argMax(yield_2_year, date), 2)) OVER (ORDER BY toStartOfMonth(date)), 2) AS y2_chg_since_jan,
    round(round(argMax(yield_10_year, date), 2) - first_value(round(argMax(yield_10_year, date), 2)) OVER (ORDER BY toStartOfMonth(date)), 2) AS y10_chg_since_jan
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date < toDate('2026-07-01')
  AND yield_2_year IS NOT NULL AND yield_10_year IS NOT NULL AND yield_3_month IS NOT NULL
GROUP BY toStartOfMonth(date)
ORDER BY period_start
Run this yourself

The bill went nowhere for five months, every month-end through May within a few hundredths of 3.67%, then stepped to 3.87% in June. The two-year moved the whole half: down to 3.38% at February's end, then higher at every month-end after, finishing at 4.14%, 0.62 percentage points above January. The ten-year added just 0.18 points over the same span, so the 2s10s spread compressed from 0.74 to 0.3 points, the narrowest month-end of the six. The H1 curve deep-dive tracks the same spread daily.

The two-year-minus-bill column is the Fed read: negative means the average policy rate priced for the next two years sits under today's, cuts, as arithmetic. It printed -0.15 and -0.29 points in January and February, flipped positive in March, the same month the headline CPI prints accelerated, and ended the half at 0.27 points. The market entered the half pricing a lower policy path and exited pricing a higher one, alongside the CPI acceleration and the one-year expectation's April jump. A two-year average is not the same thing as odds on any single meeting, and the futures arithmetic that prices one meeting at a time shows where the two readings come apart.

The labor market: a better headline on a thinner base

The unemployment rate is the share of the labor force actively looking for work; the participation rate is the share of the adult population working or looking. Both come from the BLS's monthly household survey, and they read best together: a falling unemployment rate can coincide with people leaving the labor force, the denominator does part of the work. Average hourly earnings comes from the employer survey, in dollars per hour.

QueryThe labor market, monthly: unemployment, participation, average hourly earnings, with ingest receipts
The exact SQL behind every number
SELECT toString(date) AS period_start,
    unemployment_rate,
    labor_force_participation_rate AS participation_pct,
    round(avg_hourly_earnings, 2) AS avg_hourly_earnings,
    toString(toDate(_ingest_time)) AS arrived_here
FROM global_markets.labor_market
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
ORDER BY date
Run this yourself

Unemployment ended the half at 4.2%, the lowest print of the six months, but participation slipped from 62.1% to 61.5% over the same stretch: the rate improved while the measured labor force share shrank. This table records the co-movement and stops there. Average hourly earnings rose from $37.17 to $37.64.

The path moved at the edges: 4.3% in January, the half's high of 4.4% in February, then three spring prints above June's 4.2% low. Participation's slide had no single dramatic print, small steps lower, most months.

Did stocks follow the macro prints?

Not tidily. The panel below computes SPY's month-by-month return inside regular hours, first regular-session open to last close, New York clock.

QuerySPY month by month in H1 2026: regular-hours open-to-close return per month
The exact SQL behind every number
WITH bars AS (
    SELECT toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York'))) AS m,
           window_start, open, close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-01-01 00:00:00')
      AND window_start < toDateTime('2026-07-01 00:00:00')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
)
SELECT toString(m) AS period_start,
       round(argMin(toFloat64(open), window_start), 2) AS month_open,
       round(argMax(toFloat64(close), window_start), 2) AS month_close,
       round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 2) AS spy_return_pct
FROM bars
GROUP BY m
ORDER BY m
Run this yourself

March, the month with the half's largest monthly headline CPI print and the two-year's cross above the bill, was SPY's worst of the six at -4.19%. April, when the one-year inflation expectation jumped, was its best at 9.87%. Those two rows sit side by side and retire any rule that hot inflation plus rising short rates equals falling stocks. June printed -1.2% open-to-close, closing at $746.32; the half's full scoreboard by index and sector lives in the H1 market recap.

What existed when this page was written

QueryThe as-of receipts: every June print on file, the July CPI column armed as the next tripwire
The exact SQL behind every number
SELECT
    (SELECT count() FROM global_markets.inflation WHERE date = toDate('2026-06-01')) AS june_cpi_rows,
    (SELECT count() FROM global_markets.inflation WHERE date = toDate('2026-07-01')) AS july_cpi_rows,
    (SELECT count() FROM global_markets.labor_market WHERE date = toDate('2026-06-01')) AS june_labor_rows,
    (SELECT count() FROM global_markets.inflation_expectations WHERE date = toDate('2026-06-01')) AS june_expectations_rows,
    (SELECT toString(toDate(max(_ingest_time))) FROM global_markets.labor_market WHERE date = toDate('2026-06-01')) AS june_labor_arrived
Run this yourself

Macro data arrives on a schedule, and honest pages say where the schedule stood: at generation all three June prints were on file, labor (1 row, arrived 2026-07-02, AFTER June ended, the usual pattern), expectations (1 row), and CPI (1 row, the mid-July release). The July CPI column is the next tripwire: a 1 there holds the page for a refresh.

H2 2026: what to watch

The second half arrives on a known calendar; what follows is schedule and arithmetic, not forecast.

  • June CPI landed mid-July and closed the divergence. May ran 4.2% headline over 2.8% core; June printed 3.5% headline over 2.6% core, the volatile components giving back, the first narrowing of that gap since February. The next print, July CPI, lands mid-August, and the page regenerates when it does.
  • Jobs reports, the first Friday of each month. The half ended at 4.2% unemployment on 61.5% participation. Participation is the tell: whether it stabilizes or keeps sliding decides how much of any further headline improvement is the denominator's work.
  • Four scheduled FOMC meetings. The published 2026 calendar shows one each in July, September, October, and December. The scoreboard to carry into them is the curve panel's two-year-minus-bill gap, 0.27 points at June's end, repriced around every CPI and jobs release; its sign says whether the priced path points up or down.
  • The anchor check. The ten-year expectation sat at 2.49% in June. A jumpy one-year over a still ten-year is what an anchored regime looks like; a ten-year print breaking out of its narrow H1 band would be the first genuinely new macro fact of the half.

Macro data FAQ

What was US CPI year-over-year in June 2026?

Headline CPI printed 3.5% year-over-year in June 2026, computed from the index level against June 2025, down from 4.2% in May. Core CPI, all items less food and energy, printed 2.6% over the same window.

Where was the US unemployment rate as of June 2026?

June 2026 came in at 4.2%, the lowest reading of the first half, alongside labor-force participation of 61.5%, down from 62.1% in January.

What did the 2s10s spread do in H1 2026?

It flattened from the front: 0.74 percentage points at January's month-end to 0.3 at June's, the narrowest of the six, with the two-year up 0.62 points against the ten-year's 0.18. The short end did the moving.

Are long-run inflation expectations still anchored?

On this data, yes: the ten-year expectation printed 2.33% in January and 2.49% in June, while the one-year swung from 2.29% in March to 3.54% in May. The short horizon repriced; the long horizon held.

Why is June 2026 CPI missing from these tables?

It had not been published when this page was generated, the as-of receipt above shows 1 June CPI rows in the warehouse, against 1 June labor row (ingested 2026-07-02). Monthly CPI arrives around the middle of the following month, and the page regenerates once the print lands.

Data notes

Full data notes
  • CPI year-over-year is computed inside the query from the index level against the same month a year earlier, never taken from a pre-computed field (the table's own year-over-year column is null in this window). The month-over-month panel reaches back to December 2025 for its January print.
  • The ingest column is this warehouse's arrival date, the June labor row arrived 2026-07-02, which is why a late-June analysis could not have seen it. Monthly-macro rows regularly arrive after the month they describe.
  • Expectations are model-based series; the market-implied columns are sparsely populated in this window and not used.
  • Treasury rows are each month's last joint print of the bill, two-year, and ten-year (other maturities print sparsely); the series runs about a day behind.
  • SPY monthly returns are regular-hours only, first regular-session open to last close on the New York clock, from the delayed minute view.

Methodology

  • Period: January 1 – June 30, 2026, monthly macro series, month-end Treasury prints, and regular-hours SPY minute bars. The year-over-year and month-over-month joins reach into 2025 by construction; everything else filters to the period.
  • Equity returns group by the ET clock, never hardcoded UTC offsets.
  • Generation runs through the gated read-only path; the public page never queries live. The receipts panel records which prints the warehouse held at generation.

Every panel is one stored object, chart, table, and SQL. Take any series further on the Strasmore terminal.

#macro#inflation#cpi#labor market#treasury yields#fed