Strasmore Research
Deep Dives · 2026-07-04

MU: The Biggest Tape of June 2026

Micron's June 2026: 995.7 billion dollars of regular-hours turnover — the first-ranked tape in the market — while the quarter's repricing cooled to 14 percent.

Micron spent the first half of 2026 repricing violently — and June was the month the price cooled while the tape did not. MU closed June at $1151.01, up 14% on the month — its quietest month since February, after a 89.8% May — while its $995.7 billion of regular-hours turnover ranked it first on the entire US tape, ahead of SPY itself. This page is the June receipts: the tape, the spread, the options book, the shorts, and the six-month arc under it all. Every number is a stored query result; expand any panel for the exact SQL.

The month on one row

QueryMU's June on one row: open, close, extremes, turnover, and their receipts
The exact SQL behind every number
WITH
    (
        SELECT count() FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY'
          AND window_start >= toDateTime('2026-06-19 00:00:00') AND window_start < toDateTime('2026-06-20 00:00:00')
    ) AS spy_jun19,
    (
        SELECT max(toFloat64(high)) FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'MU'
          AND window_start >= toDateTime('2026-06-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
    ) AS hi,
    (
        SELECT min(toFloat64(low)) FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'MU'
          AND window_start >= toDateTime('2026-06-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
    ) AS lo
SELECT
    round(argMinIf(toFloat64(open), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS month_open,
    round(argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS month_close,
    round((argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) / argMinIf(toFloat64(open), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) - 1) * 100, 1) AS month_return_pct,
    round(hi, 2) AS month_high,
    formatDateTime(toTimeZone(minIf(window_start, toFloat64(high) >= hi - 0.011), 'America/New_York'), '%Y-%m-%d %H:%i') AS month_high_first_bar_et,
    round(lo, 2) AS month_low,
    formatDateTime(toTimeZone(minIf(window_start, toFloat64(low) <= lo + 0.011), 'America/New_York'), '%Y-%m-%d %H:%i') AS month_low_first_bar_et,
    round(minIf(toFloat64(low), (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) - lo, 2) AS rth_minus_extended_low,
    round(toFloat64(sum(volume)) / 1e9, 2) AS month_shares_bn,
    round(sumIf(toFloat64(close) * toFloat64(volume), (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) / 1e9, 1) AS rth_dollar_bn,
    uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS session_days_observed,
    spy_jun19 AS spy_bars_june19
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
  AND window_start >= toDateTime('2026-06-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')

The intramonth range was enormous for a mega-cap-sized name: a $850.1 low (2026-06-05 16:34 ET) to a $1255 high (2026-06-25 09:35 ET) — a swing wider than most stocks' entire year. June 19 was a market-wide closure (0 SPY bars), so the month ran 21 sessions.

June against the six-month arc

Is +14% a big month? For this ticker, in this half, it was the calm one. The panel recomputes every month identically, live.

QueryMU month by month, recomputed live: return, close, and regular-hours turnover
The exact SQL behind every number
SELECT toString(toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York')))) AS period_start,
    round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / argMinIf(toFloat64(open), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS month_return_pct,
    round(argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS month_close,
    round(sumIf(toFloat64(close) * toFloat64(volume), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / 1e9, 1) AS rth_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'MU'
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY period_start
ORDER BY period_start

The arc: 40.5% in January, a -15.9% March, then 48.4% in April and 89.8% in May — a close that went from $414.73 to $1151.01 in six months. Turnover climbed with it: $235.8 billion in January to $995.7 billion in June. June's price move was the smallest since February; June's tape was the biggest on record in this window.

Session by session

QueryThe 21 sessions: close, close-over-close change, full-day volume
The exact SQL behind every number
SELECT et_date, close_usd,
    round(if(prev_close = 0, NULL, (close_usd / prev_close - 1) * 100), 1) AS change_pct,
    shares_m
FROM (
    SELECT et_date, close_usd, shares_m,
           lagInFrame(close_usd) OVER (ORDER BY et_date ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev_close
    FROM (
        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
            round(argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS close_usd,
            round(toFloat64(sum(volume)) / 1e6, 1) AS shares_m
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'MU'
          AND window_start >= toDateTime('2026-06-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
        GROUP BY et_date
    )
)
ORDER BY et_date

The table swings hard in both directions — closes from $1034.83 on 2026-06-01 through the month's turbulence to $1151.01 on the final session. This is what "+14% on the month" hides: the path was anything but quiet, only the endpoints were.

The biggest ticker on the tape

QueryThe whole US tape ranked by June 2026 regular-hours dollar volume (one reused-symbol listing excluded pending entity verification)
The exact SQL behind every number
SELECT ticker,
    round(sum(toFloat64(volume) * toFloat64(close)) / 1e9, 1) AS regular_hours_dollar_bn,
    round(100 * sum(toFloat64(volume) * toFloat64(close)) / max(sum(toFloat64(volume) * toFloat64(close))) OVER (), 1) AS pct_of_leader
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= toDateTime('2026-06-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
  AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
  AND ticker NOT IN ('SPCX')
GROUP BY ticker
ORDER BY regular_hours_dollar_bn DESC
LIMIT 10
QueryThe rank receipt: MU's place, its lead over the next name, and the basis
The exact SQL behind every number
WITH (
    SELECT sum(toFloat64(volume) * toFloat64(close))
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'MU'
      AND window_start >= toDateTime('2026-06-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
      AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
) AS mu_d
SELECT
    countIf(d > mu_d AND ticker != 'MU') + 1 AS mu_rank,
    round(mu_d / 1e9, 1) AS mu_dollar_bn,
    round((mu_d - maxIf(d, d < mu_d AND ticker != 'MU')) / 1e9, 1) AS lead_over_next_bn
FROM (
    SELECT ticker, sum(toFloat64(volume) * toFloat64(close)) AS d
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= toDateTime('2026-06-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
      AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
)

MU ranked first of every US-listed symbol by June regular-hours dollar volume — $995.7 billion, $224.3 billion clear of SPY in second. A single company out-trading the flagship index fund for a full month is rare tape structure; this page measures it and leaves the why alone. Basis: June 1–30 regular hours; one reused-symbol June listing excluded pending entity verification (its receipts). The market-wide view of this same table is in the June recap.

What the tape was made of

QueryThe whole MU tape in one row: prints, print sizes, and the quote census
The exact SQL behind every number
WITH
    (
        SELECT (round(count() / 1e6, 2),
                round(100.0 * countIf(bid_price > 0 AND ask_price > 0 AND ask_price > bid_price) / count(), 2),
                countIf(bid_price > 0 AND ask_price > 0 AND ask_price < bid_price),
                countIf(bid_price <= 0 OR ask_price <= 0))
        FROM global_markets.cache_stocks_quotes
        WHERE ticker = 'MU'
          AND sip_timestamp >= toDateTime64('2026-06-01 00:00:00', 9) AND sip_timestamp < toDateTime64('2026-07-01 00:00:00', 9)
    ) AS quote_census
SELECT
    round(count() / 1e6, 2) AS prints_m,
    quantileDeterministic(0.5)(toFloat64(size), toUInt64(abs(sequence_number))) AS median_print_shares,
    round(avg(toFloat64(size)), 1) AS avg_print_shares,
    round(100.0 * countIf(size < 100) / count(), 1) AS odd_lot_pct_of_prints,
    round(100.0 * countIf(toFloat64(size) != round(toFloat64(size))) / count(), 2) AS fractional_pct_of_prints,
    quote_census.1 AS nbbo_updates_m,
    quote_census.2 AS clean_two_sided_pct,
    quote_census.3 AS crossed_updates,
    quote_census.4 AS one_sided_or_empty_updates
FROM global_markets.stocks_trades
WHERE ticker = 'MU'
  AND sip_timestamp >= toDateTime64('2026-06-01 00:00:00', 9) AND sip_timestamp < toDateTime64('2026-07-01 00:00:00', 9)

35.17 million prints at a median of 8 shares — and 91.7% odd lots, one of the most retail-sliced tapes we have measured (NVDA's June ran materially lower; its deep-dive has the twin panel). At a four-digit share price, a "round lot" is serious money, so small prints dominate by construction — the fractional share of prints (9.04%) points the same direction. The quote half: 19.64 million NBBO updates, 99.86% clean two-sided, 16963 momentarily crossed, 78 one-sided or empty — disclosed, not dropped.

The spread during a repricing

A stock that near-triples in a quarter poses the spread question differently: did the market keep quoting it tightly while its price found a new level?

QueryThe spread by session: regular-hours median in cents and basis points
The exact SQL behind every number
SELECT session,
    round(quantileDeterministicIf(0.5)(toFloat64(ask_price) - toFloat64(bid_price), toUInt64(toUnixTimestamp64Micro(sip_timestamp)), bid_price > 0 AND ask_price >= bid_price) * 100, 1) AS med_spread_cents,
    round(quantileDeterministicIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, toUInt64(toUnixTimestamp64Micro(sip_timestamp)), bid_price > 0 AND ask_price >= bid_price), 2) AS med_spread_bps,
    count() AS quote_updates,
    countIf(NOT (bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price)) AS invalid_dropped
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'MU'
  AND sip_timestamp >= toDateTime64('2026-06-01 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-07-01 00:00:00', 9)
  AND (toHour(sip_timestamp) * 60 + toMinute(sip_timestamp)) BETWEEN 810 AND 1199
GROUP BY toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session
ORDER BY session

In basis points the spread stayed institutional-grade through the whole move: 3.96 bps on 2026-06-01 and 4.19 bps on the last session — while the cents column roughly tracks the price level itself. For what these numbers mean mechanically, see the spread explainer.

Options: a two-way book

QueryMU's options market in one row: totals, expiries, the put/call split
The exact SQL behind every number
SELECT
    round(count() / 1e6, 2) AS prints_m,
    uniqExact(ticker) AS distinct_contracts,
    round(sum(size) / 1e6, 2) AS contracts_traded_m,
    round(sum(toFloat64(price) * size) * 100 / 1e9, 2) AS premium_notional_busd,
    round(toFloat64(sumIf(size, substring(ticker, 11, 1) = 'P')) / toFloat64(sumIf(size, substring(ticker, 11, 1) = 'C')), 2) AS month_put_call_ratio,
    uniqExact(substring(ticker, 5, 6)) AS expiries_traded,
    round(intDiv(toUInt32OrZero(substring(argMax(ticker, sz), 12, 8)), 1000), 0) AS busiest_strike_usd
FROM (
    SELECT ticker, price, size, sum(size) OVER (PARTITION BY ticker) AS sz
    FROM global_markets.options_trades
    WHERE startsWith(ticker, 'O:MU') AND length(ticker) = 19
      AND sip_timestamp >= toDateTime64('2026-06-01 00:00:00', 9) AND sip_timestamp < toDateTime64('2026-07-01 00:00:00', 9)
)

16.76 million contracts traded across 11789 distinct contracts, for $77.13 billion in premium — and unlike its semiconductor peer, the book was two-way: the month put/call ratio was 0.99, essentially parity (NVDA's June ran call-heavy; compare). A near-parity ratio during a violent repricing is the options market split on both sides of the move — the data shows the split, not the intent.

QueryWhere the contracts landed: call and put volume by strike bucket
The exact SQL behind every number
SELECT
    concat('$', toString(toUInt32(bucket))) AS strike_bucket,
    call_contracts,
    put_contracts,
    round(100.0 * put_contracts / (call_contracts + put_contracts), 1) AS put_share_pct
FROM (
    SELECT
        least(floor(toFloat64(toUInt32OrZero(substring(ticker, 12, 8))) / 1000 / 100) * 100, 1500) AS bucket,
        toUInt64(sumIf(size, substring(ticker, 11, 1) = 'C')) AS call_contracts,
        toUInt64(sumIf(size, substring(ticker, 11, 1) = 'P')) AS put_contracts
    FROM global_markets.options_trades
    WHERE startsWith(ticker, 'O:MU') AND length(ticker) = 19
      AND sip_timestamp >= toDateTime64('2026-06-01 00:00:00', 9) AND sip_timestamp < toDateTime64('2026-07-01 00:00:00', 9)
    GROUP BY bucket
)
ORDER BY toUInt32OrZero(substring(strike_bucket, 2))

The strike map spans a range that would have been absurd in January — meaningful volume from the $0 bucket to the $1500+ ceiling, a footprint of how far and how fast the underlying moved.

The news flow

QueryJune's MU-tagged articles: volume, the top publisher's share, co-tags
The exact SQL behind every number
WITH
    (
        SELECT (JSONExtractString(any(publisher), 'name'), count())
        FROM global_markets.stocks_news
        WHERE has(tickers, 'MU')
          AND published_utc >= toDateTime('2026-06-01 00:00:00') AND published_utc < toDateTime('2026-07-01 04:00:00')
        GROUP BY JSONExtractString(publisher, 'name') ORDER BY count() DESC LIMIT 1
    ) AS top_pub
SELECT
    count() AS june_articles,
    uniqExact(JSONExtractString(publisher, 'name')) AS publishers,
    top_pub.1 AS top_publisher,
    round(100.0 * top_pub.2 / count(), 0) AS top_publisher_pct,
    countIf(has(tickers, 'NVDA')) AS nvda_co_articles,
    countIf(has(tickers, 'SNDK')) AS sndk_co_articles,
    countIf(has(tickers, 'INTC')) AS intc_co_articles
FROM global_markets.stocks_news
WHERE has(tickers, 'MU')
  AND published_utc >= toDateTime('2026-06-01 00:00:00') AND published_utc < toDateTime('2026-07-01 04:00:00')

195 MU-tagged articles from 4 publishers — read skeptically, The Motley Fool alone wrote 59% of them. Co-tags frame it as a semiconductor story: NVDA in 86 articles, SNDK in 32, INTC in 21.

The shorts — with a coverage hole

QueryFINRA off-exchange short volume: MU's June coverage and marked-short share
The exact SQL behind every number
SELECT toString(date) AS d,
    round(toFloat64(any(short_volume)) / 1e6, 2) AS short_shares_m,
    round(100 * toFloat64(any(short_volume)) / toFloat64(any(total_volume)), 1) AS short_pct_of_offexchange
FROM global_markets.stocks_short_volume
WHERE ticker = 'MU' AND date >= toDate('2026-06-01') AND date <= toDate('2026-06-30')
GROUP BY date
ORDER BY date
QueryThe mid-June short-interest print (the end-of-June settlement is pending)
The exact SQL behind every number
SELECT
    toString(maxIf(settlement_date, settlement_date >= toDate('2026-06-01'))) AS settlement,
    round(toFloat64(maxIf(short_interest, settlement_date >= toDate('2026-06-01'))) / 1e6, 2) AS shares_short_m,
    countIf(settlement_date > toDate('2026-06-15')) AS settlements_after_jun15
FROM global_markets.stocks_short_interest
WHERE ticker = 'MU'

Two caveats carry this section. First, coverage: MU's June short-volume file holds only 16 of 21 sessions — beyond the market-wide June 29 truncation, several MU rows are simply absent, so no month-level short-volume ratio is computed here (the per-day rows shown are real; the gaps are disclosed, not interpolated). Second, staleness: short interest printed 41.59 million shares at the 2026-06-15 settlement, and the end-of-June print was not yet published at generation (0 later settlements on file) — here is why that lag is normal.

Data notes

Full data notes
  • Entity. MU is Micron Technology, Inc., CIK 0000723125 — a single, continuous EDGAR identity; no symbol-reuse caveats.
  • Short-volume coverage. The June file for MU spans 16 of 21 sessions; missing days include the market-wide June 29 truncation plus MU-specific absences. Ratios are shown per-day only.
  • Options parsing. Expiry, type, and strike re-parsed from the OCC symbol (positions 5/11/12 for this 4-character root); premium notional assumes the 100-share multiplier.
  • June 19 closure verified by the zero-SPY-bars receipt in the scoreboard panel.
  • Spread panels exclude crossed/one-sided quotes WITH counts disclosed in the same row.
  • The month's market-wide context — including this ticker atop the whole-tape leaderboard — is in the June 2026 recap.

Methodology

  • The period is June 1–30, 2026 (21 sessions, verified from observed bars). Returns are first regular-hours open to last regular-hours close; June is entirely EDT, so regular hours are 13:30–20:00 UTC, filtered as raw UTC bounds. The trailing panel spans EST months and uses the Eastern-clock filter (a fixed UTC band selects the wrong session in winter months).
  • Trailing comparisons are recomputed live in the same query as June's row — never read from a stored value.
  • Generation is batch-only through the gated read-only path; the public page never queries live. Warehouse state as of July 4, 2026.

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