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

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 June's repricing cooled to 14 percent.

Micron spent the first half of 2026 repricing violently, and in June the price cooled while the tape did not. MU closed June at $1151.01, up 14%, 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. Measured day by day it was also the half's most volatile month (127.6% annualized): the calm is an endpoint illusion. Here are the June receipts, tape, earnings-week filings, volatility, peers, spread, options, shorts, and the six-month arc. Every number is a stored query; expand any panel for its 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')
Run this yourself

The intramonth range was enormous for a name this size: a $850.1 low (2026-06-05 16:34 ET) to a $1255 high (2026-06-25 09:35 ET), 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% big? 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
Run this yourself

The arc: 40.5% in January, a flat 0% February, a -15.9% March marking the half's low-water close ($337.62), then 48.4% in April and 89.8% in May, $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 in the window.

The price cooled. The volatility did not.

Is a +14% month calm? Realized volatility, the day-to-day closing moves, annualized, reads June very differently.

QueryMU by month: annualized realized volatility, average session range, biggest single-day move
The exact SQL behind every number
SELECT
    toString(toStartOfMonth(et_date)) AS period_start,
    round(stddevSamp(log_ret) * sqrt(252) * 100, 1) AS realized_vol_ann_pct,
    round(100 * stddevSamp(log_ret) / max(stddevSamp(log_ret)) OVER (), 1) AS pct_of_peak_vol,
    round(avg(day_range_pct), 1) AS avg_day_range_pct,
    round(max(abs(day_move_pct)), 1) AS biggest_day_move_pct,
    count() AS return_days
FROM (
    SELECT et_date, day_range_pct,
        if(prev_close > 0, ln(close_usd / prev_close), NULL) AS log_ret,
        if(prev_close > 0, (close_usd / prev_close - 1) * 100, NULL) AS day_move_pct
    FROM (
        SELECT et_date, close_usd, day_range_pct,
            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,
                argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) AS close_usd,
                (maxIf(toFloat64(high), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / minIf(toFloat64(low), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100 AS day_range_pct
            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 et_date
        )
    )
)
WHERE isFinite(log_ret) AND log_ret IS NOT NULL
GROUP BY period_start
ORDER BY period_start
Run this yourself

June was the half's wildest month by this measure: 127.6% annualized, above even May's 101.4%, with a 7.6% average session range and one close-over-close move of 15.8%. The endpoints were quiet; the days between were not.

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
Run this yourself

The table swings hard both ways, from $1034.83 on 2026-06-01 through the turbulence to $1151.01 at the final session. This is what "+14% on the month" hides: only the endpoints were quiet. The heaviest rows sit in earnings week, pinned next.

Did the swings line up with a reported quarter?

They can be dated, MU's June paper trail from the SEC's own index, beside what the tape did on those dates.

QueryMU's June SEC filings and the session that followed the quarterly 8-K
The exact SQL behind every number
WITH
    (
        SELECT maxIf(filing_date, form_type = '8-K')
        FROM global_markets.stocks_sec_edgar_index
        WHERE cik = '0000723125' AND filing_date >= toDate('2026-06-01') AND filing_date <= toDate('2026-06-30')
    ) AS last_8k_date,
    (
        SELECT minIf(filing_date, form_type = '10-Q')
        FROM global_markets.stocks_sec_edgar_index
        WHERE cik = '0000723125' AND filing_date >= toDate('2026-06-01') AND filing_date <= toDate('2026-06-30')
    ) AS tenq_date,
    (
        SELECT (count(), countIf(form_type = '8-K'), countIf(form_type = '4'))
        FROM global_markets.stocks_sec_edgar_index
        WHERE cik = '0000723125' AND filing_date >= toDate('2026-06-01') AND filing_date <= toDate('2026-06-30')
    ) AS filing_census,
    (
        SELECT toDate(toTimeZone(min(window_start), 'America/New_York'))
        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 toFloat64(high) >= (
              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')
          ) - 0.011
    ) AS month_high_date
SELECT
    toString(last_8k_date) AS earnings_8k_filed,
    if(last_8k_date = toDate('2026-06-24'), 1, 0) AS eightk_on_jun24,
    toString(tenq_date) AS tenq_filed,
    dateDiff('day', last_8k_date, tenq_date) AS days_8k_to_10q,
    filing_census.1 AS june_filings_total,
    filing_census.2 AS eightk_filings,
    filing_census.3 AS form4_filings,
    round((anyIf(close_usd, et_date = toDate('2026-06-25')) / anyIf(close_usd, et_date = toDate('2026-06-24')) - 1) * 100, 1) AS next_session_move_pct,
    round(anyIf(shares_m, et_date = toDate('2026-06-25')), 1) AS next_session_shares_m,
    round(anyIf(shares_m, et_date = toDate('2026-06-25')) - maxIf(shares_m, et_date != toDate('2026-06-25')), 1) AS shares_lead_over_next_busiest_m,
    if(month_high_date = toDate('2026-06-25'), 1, 0) AS month_high_on_jun25
FROM (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
        argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) AS close_usd,
        toFloat64(sum(volume)) / 1e6 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
)
Run this yourself

MU's quarterly 8-K is dated 2026-06-24, the 10-Q 1 day behind it (8 June filings, 3 insider Form 4s). The session after the 8-K date closed 15.8% higher on 77.2 million shares, the month's heaviest, 5.9 million clear of the next busiest, and the month's $1255 high printed that same session (2026-06-25 09:35 ET; the agreement column pins the match). The alignment is the observation; this page stops there.

A Micron story, or a memory story?

Did the rest of the memory and storage complex move too? The basket is fixed and declared: the three storage names June's news co-tags paired with MU most, plus NVDA and SPY as yardsticks.

QueryJune side by side: the memory/storage basket, NVDA, and SPY
The exact SQL behind every number
WITH (
    SELECT (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
    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 mu_return
SELECT ticker,
    round(june_return_pct, 1) AS june_return_pct,
    round(june_return_pct - mu_return, 1) AS vs_mu_pct_points,
    rth_dollar_bn,
    round(100 * rth_dollar_bn / max(rth_dollar_bn) OVER (), 1) AS pct_of_top_turnover
FROM (
    SELECT ticker,
        (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 AS june_return_pct,
        round(sumIf(toFloat64(close) * toFloat64(volume), (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) / 1e9, 1) AS rth_dollar_bn
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('MU', 'SNDK', 'WDC', 'INTC', 'NVDA', 'SPY')
      AND window_start >= toDateTime('2026-06-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
    GROUP BY ticker
)
ORDER BY june_return_pct DESC
Run this yourself

It was a memory move, and MU lagged it. SNDK rose 31.3%, INTC 27.5%, WDC 19.1%, every storage name beat MU by 5.1 to 17.3 points, while SPY and NVDA closed June lower. MU's distinction: its turnover tops every row here.

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
Run this yourself
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
)
Run this yourself

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 month is rare tape structure; the earnings-week and peer sections above hold its context. Basis: June 1–30 regular hours, one reused-symbol listing excluded pending entity verification (its receipts). The market-wide view 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)
Run this yourself

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; fractional prints (9.04%) point the same way. The quote half: 19.64 million NBBO updates, 99.86% clean two-sided, 16963 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: was it still quoted tightly while the 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
Run this yourself

In basis points the spread stayed institutional-grade through the whole move: 3.96 bps on 2026-06-01, 4.19 bps on the last session, the cents column roughly tracks the price level itself. For the mechanics, 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)
)
Run this yourself

16.76 million contracts across 11789 distinct contracts, for $77.13 billion in premium, and the book was two-way: a month put/call ratio of 0.99, essentially parity (NVDA's June ran call-heavy; compare). Near-parity 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))
Run this yourself

The strike map spans a range that would have been absurd in January, real volume from the $0 bucket to the $1500+ ceiling, a footprint of how far the underlying moved. What did owning that movement cost? The month's final session prices it:

QueryMonth-end price of movement: the last at-the-money straddle of June
The exact SQL behind every number
WITH (
    SELECT argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199)
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'MU' AND window_start >= toDateTime('2026-06-30 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
) AS spot
SELECT
    toString(any(expiry)) AS nearest_expiry,
    dateDiff('day', toDate('2026-06-30'), any(expiry)) AS calendar_days_to_expiry,
    round(spot, 2) AS spot_close,
    argMin(strike_usd, (dist, strike_usd)) AS atm_strike,
    round(argMin(call_last + put_last, (dist, strike_usd)), 2) AS straddle_usd,
    round(argMin(call_last + put_last, (dist, strike_usd)) / spot * 100, 2) AS straddle_pct_of_spot,
    count() AS two_sided_strikes
FROM (
    SELECT expiry, strike_usd, abs(strike_usd - spot) AS dist,
        anyIf(last_px, opt_type = 'C') AS call_last,
        anyIf(last_px, opt_type = 'P') AS put_last
    FROM (
        SELECT
            toDateOrNull(concat('20', substring(ticker, 5, 2), '-', substring(ticker, 7, 2), '-', substring(ticker, 9, 2))) AS expiry,
            substring(ticker, 11, 1) AS opt_type,
            toFloat64(toUInt32OrZero(substring(ticker, 12, 8))) / 1000 AS strike_usd,
            argMax(toFloat64(price), (sip_timestamp, toFloat64(price))) AS last_px
        FROM global_markets.options_trades
        WHERE startsWith(ticker, 'O:MU') AND length(ticker) = 19
          AND sip_timestamp >= toDateTime64('2026-06-30 00:00:00', 9) AND sip_timestamp < toDateTime64('2026-07-01 00:00:00', 9)
        GROUP BY expiry, opt_type, strike_usd
    )
    WHERE expiry > toDate('2026-06-30')
    GROUP BY expiry, strike_usd
    HAVING countIf(opt_type = 'C') > 0 AND countIf(opt_type = 'P') > 0
)
WHERE expiry = (
    SELECT min(toDateOrNull(concat('20', substring(ticker, 5, 2), '-', substring(ticker, 7, 2), '-', substring(ticker, 9, 2))))
    FROM global_markets.options_trades
    WHERE startsWith(ticker, 'O:MU') AND length(ticker) = 19
      AND sip_timestamp >= toDateTime64('2026-06-30 00:00:00', 9) AND sip_timestamp < toDateTime64('2026-07-01 00:00:00', 9)
      AND toDateOrNull(concat('20', substring(ticker, 5, 2), '-', substring(ticker, 7, 2), '-', substring(ticker, 9, 2))) > toDate('2026-06-30')
)
Run this yourself

As of the June 30 close, the nearest expiry sat 2 calendar days out; the at-the-money pair, a call plus a put at the $1150 strike, last traded for a combined $69.95: 6.08% of the $1151.01 share price. A buyer needed a move that size, either way, within those 2 days to break even, June ended still priced for outsized movement.

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')
Run this yourself

195 MU-tagged articles from 4 publishers, read skeptically, The Motley Fool alone wrote 59% of them. Co-tags frame a semiconductor story: NVDA in 86 articles, SNDK in 32, INTC in 21. What was it about? The vendor's own article tags give the vocabulary without adopting it:

QueryWhat June's MU coverage was about: the vendor's own article tags, counted
The exact SQL behind every number
SELECT keyword, count() AS articles,
    round(100.0 * count() / (SELECT 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')), 1) AS pct_of_articles
FROM global_markets.stocks_news
ARRAY JOIN keywords AS keyword
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 keyword
ORDER BY articles DESC, keyword ASC
LIMIT 10
Run this yourself

"AI infrastructure" leads at 49 of 195 articles, with "memory chips", "DRAM" and "high-bandwidth memory" behind it, an AI-memory vocabulary, reported as tag counts, not as an explanation.

The shorts shrank, and a coverage hole remains

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
Run this yourself

Coverage first: 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 ratio is computed; the per-day rows are real, the gaps disclosed.

QueryThe June settlement pair: mid-month and month-end short interest
The exact SQL behind every number
SELECT
    toString(maxIf(settlement_date, settlement_date <= toDate('2026-06-20'))) AS mid_june_settlement,
    round(toFloat64(maxIf(short_interest, settlement_date <= toDate('2026-06-20'))) / 1e6, 2) AS mid_june_shares_short_m,
    toString(maxIf(settlement_date, settlement_date > toDate('2026-06-20'))) AS eom_settlement,
    round(toFloat64(maxIf(short_interest, settlement_date > toDate('2026-06-20'))) / 1e6, 2) AS eom_shares_short_m,
    round((toFloat64(maxIf(short_interest, settlement_date <= toDate('2026-06-20'))) - toFloat64(maxIf(short_interest, settlement_date > toDate('2026-06-20')))) / 1e6, 2) AS decline_m_shares,
    round(toFloat64(maxIf(short_interest, settlement_date > toDate('2026-06-20'))) / toFloat64(maxIf(avg_daily_volume, settlement_date > toDate('2026-06-20'))), 2) AS eom_days_to_cover
FROM global_markets.stocks_short_interest
WHERE ticker = 'MU' AND settlement_date >= toDate('2026-06-01') AND settlement_date <= toDate('2026-06-30')
Run this yourself

The settlement pair is complete: 41.59 million shares short at the 2026-06-15 settlement fell to 31.67 million by 2026-06-30, a 9.92 million-share decline across the back half, the half that held earnings week. The month-end position equals 0.53 days of average volume, small for this tape. This page first shipped with that print pending (the lag is normal); the number above is its arrival.

The fundamentals under the tape

What do the company's own statements show? One caveat: the feed trails the filing calendar, the newest row predates the June 10-Q, so the trend is the exhibit, not the front edge.

QueryMU's last six reported quarters on file: revenue, net income, diluted EPS
The exact SQL behind every number
SELECT quarter_end, revenue_bn,
    round(100 * revenue_bn / max(revenue_bn) OVER (), 1) AS pct_of_peak_revenue,
    net_income_bn, diluted_eps
FROM (
    SELECT toString(period_end) AS quarter_end,
        round(toFloat64(revenue) / 1e9, 2) AS revenue_bn,
        round(toFloat64(net_income_loss_attributable_common_shareholders) / 1e9, 2) AS net_income_bn,
        round(toFloat64(diluted_earnings_per_share), 2) AS diluted_eps
    FROM global_markets.stocks_income_statements
    WHERE has(tickers, 'MU') AND timeframe = 'quarterly'
    ORDER BY period_end DESC
    LIMIT 6
)
ORDER BY quarter_end ASC
Run this yourself

Across the six quarters on file, revenue runs from $7.75 billion (2024-08-29) to $13.64 billion (2025-11-27), the newest row is the window's peak, with $5.24 billion net income and $4.6 diluted EPS in that quarter. Not a straight line, but the window ends at its high.

What to watch from here

Calendar facts only: the next short-interest settlement lands mid-July, publishing on FINRA's usual lag; the June-filed quarter becomes a fundamentals row once the vendor feed catches up; and the July tape gets this treatment in the series' next edition.

FAQ

Why did MU stock move so much in June 2026?

This page measures rather than explains: MU traded between $850.1 and $1255; the quarterly 8-K is dated 2026-06-24, with the next session up 15.8% on the month's heaviest volume; the whole memory basket moved the same way over the period.

How volatile was MU in June 2026?

The most volatile month of its half: 127.6% annualized realized volatility and a 7.6% average session range, against an endpoint-to-endpoint return of just 14%.

Was MU's June move company-specific or sector-wide?

Sector-wide, with MU the laggard of the gainers: SNDK rose 31.3% and every storage name beat MU's 14%, while SPY and NVDA closed lower. MU's distinction was turnover: $995.7 billion, the basket's biggest.

Is MU's short interest high?

Small relative to its own trading: 31.67 million shares at the 2026-06-30 settlement, about 0.53 days of average volume to cover, down 9.92 million from mid-June. Short interest always publishes on a settlement lag.

What does MU's put/call ratio mean?

June's ratio of 0.99 means puts and calls traded in nearly equal volume, a two-way market, not a one-sided bet. Well below one reads call-tilted (NVDA's June did), well above one put-tilted.

Data notes

Full data notes
  • Entity. MU is Micron Technology, Inc., CIK 0000723125, one continuous EDGAR identity; no symbol-reuse caveats.
  • Short-volume coverage. The June file spans 16 of 21 sessions (the June 29 truncation plus MU-specific absences); ratios shown per-day only.
  • Peer basket. SNDK, WDC, INTC, June's most frequent storage co-tags in MU's news flow, plus NVDA and SPY as yardsticks; declared up front, never assembled after the fact.
  • Options parsing. Expiry/type/strike re-parsed from the OCC symbol (positions 5/11/12); premium assumes the 100-share multiplier.
  • Straddle method. Last TRADED prices (not quotes) at the strike nearest the final close, nearest expiry after month end, a trade receipt, not model-implied volatility.
  • Fundamentals lag. The income-statement feed trails the filing calendar; its newest MU row predates the June 10-Q, trend context only.
  • June 19 closure verified by the zero-SPY-bars scoreboard receipt.
  • Spread panels exclude crossed/one-sided quotes, with drop counts disclosed in-row.
  • Market-wide context, this ticker atop the whole-tape leaderboard included, 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 as raw bounds. The trailing panels span EST months and use the Eastern-clock filter instead.
  • Realized volatility = sample stddev of daily close-over-close log returns (regular-hours closes), annualized by the square root of 252; a month's first return crosses the month boundary and counts in the later month.
  • Trailing comparisons recompute live, never from a stored value.
  • Generation is batch-only through the gated read-only path; the public page never queries live. Warehouse as of July 12, 2026.

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