Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

SpaceX Joins the Nasdaq-100: The Index-Add Trade

SpaceX's fast-tracked Nasdaq-100 add and the giant closing auction that priced it: Matt Levine's account, verified and extended on our own tick tape.

SpaceX joined the Nasdaq-100 index on Tuesday, July 7, 2026 — and the affair's biggest trade printed the afternoon before: 74.94 million shares of SPCX in a single closing-auction print at $160.42. Matt Levine covered it in Money Stuff the next morning; this post checks his numbers against our tick tape, then goes where a newsletter can't — auction by auction, minute by minute, SQL under every panel.

A fast-tracked index add

Nasdaq added SpaceX to the Nasdaq-100 effective Tuesday, July 7, 2026 — less than a month after the June 12 debut our first-month deep dive covers receipt by receipt. Funds tracking the index — roughly $800 billion in assets, including Invesco's QQQ, per Wall Street Journal reporting that Levine cites — transact at the official closing price of the last session before the change takes effect: one giant matched trade at 4:00 p.m. ET, the closing auction.

"Why was yesterday's closing auction an order of magnitude bigger than it usually is? This is not a great mystery." — Matt Levine, Money Stuff (Bloomberg Opinion), July 7, 2026

One ground rule: we measure what printed; the mechanism story — who bought, who supplied, why — belongs to Levine and the literature, attributed wherever it appears.

One symbol, two companies

SPCX is a reused symbol, so verification comes first: the ticker traded as a thin fund near $22 until April 2026, went silent in May, and was reassigned to Space Exploration Technologies Corp. at the June 12 listing. The receipt panel pins that boundary — 13 minute bars in the old entity's final active month (2026-04), between $21.92 and $23.64; a silent May (5 rows for six calendar months); then 10960 June bars between $146.88 and $225.64. No pre-June-12 row here is attributed to SpaceX.

QueryEntity receipt: the old SPCX tape ends in April 2026, May is silent, SpaceX lists June 12
The exact SQL behind every number
WITH
    (
        SELECT (toString(listing_date), issuer_name)
        FROM global_markets.stocks_ipos
        WHERE ticker = 'SPCX'
        ORDER BY listing_date DESC LIMIT 1
    ) AS ipo
SELECT
    formatDateTime(toStartOfMonth(window_start), '%Y-%m') AS month,
    count() AS minute_bars,
    round(min(toFloat64(low)), 2) AS low_usd,
    round(max(toFloat64(high)), 2) AS high_usd,
    ipo.1 AS spacex_listing_date,
    ipo.2 AS issuer
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPCX'
  AND window_start >= '2026-01-01 00:00:00' AND window_start < '2026-07-01 00:00:00'
GROUP BY month
ORDER BY month

Levine's three sessions, verified

Levine prints three readings per session, from Bloomberg terminal pages. Wednesday, July 1: 109.3 million shares traded, about 5.4 million in the closing auction, a $157.54 close. Thursday, July 2: 61.3 million shares, 2.6 million, $162. Monday, July 6: 188.8 million shares, 74.9 million, $160.42 — down about 1% on a day the broad market rose. Our tape returns the same picture:

QueryLevine's three sessions on our tape: day volume, the closing cross, and the cross's share of the day
The exact SQL behind every number
SELECT
    toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session,
    round(toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]))) / 1e6, 1) AS day_matched_shares_m,
    round(toFloat64(maxIf(size, has(conditions, 8))) / 1e6, 2) AS auction_shares_m,
    round(100 * toFloat64(maxIf(size, has(conditions, 8))) / toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]))), 1) AS auction_pct_of_day,
    round(toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))), 2) AS official_close,
    countIf(has(conditions, 8)) AS code8_prints,
    formatDateTime(toTimeZone(argMaxIf(sip_timestamp, (size, sip_timestamp), has(conditions, 8)), 'America/New_York'), '%H:%i:%S') AS auction_time_et
FROM global_markets.stocks_trades
WHERE ticker = 'SPCX'
  AND ((sip_timestamp >= '2026-07-01 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00')
    OR (sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'))
GROUP BY session
ORDER BY session

The auction sizes and official closes match his to the rounding — 5.38 million at $157.54, 2.58 million at $162, 74.94 million at $160.42 — each session showing exactly one code-8 auction print (the receipt column). Day totals land within a few percent of his (112.4, 61.6, and 188.9 million shares; vendor accounting differs at the edges; see data notes). The added column is one he didn't print — the cross's share of each day: 4.8% on Wednesday, 4.2% on Thursday, 39.7% on Monday.

Every SPCX closing auction since listing

"Order of magnitude" is measurable. Here is the closing cross for all 15 SPCX sessions, listing through add-eve:

QueryEvery SPCX closing cross since the June 12 listing: size, share of the day, and the official close it set
The exact SQL behind every number
SELECT
    toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session,
    round(toFloat64(maxIf(size, has(conditions, 8))) / 1e6, 2) AS auction_shares_m,
    round(100 * toFloat64(maxIf(size, has(conditions, 8))) / toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]))), 1) AS auction_pct_of_day,
    round(toFloat64(sumIf(size, NOT hasAny(conditions, [15, 16, 38]))) / 1e6, 1) AS day_matched_shares_m,
    round(toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))), 2) AS official_close,
    countIf(has(conditions, 8)) AS code8_prints
FROM global_markets.stocks_trades
WHERE ticker = 'SPCX'
  AND sip_timestamp >= '2026-06-12 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'
GROUP BY session
ORDER BY session

The median SPCX cross before July 6 measures 4.49 million shares. July 6 printed 74.94 million — 16.7 times that prior median. Levine's phrase survives the measurement. Two earlier jumbo closes stand out: 52.28 million shares on 2026-06-18 — an expiration Thursday, the session before the June 19 closure — and 39.56 million on 2026-06-26 (31.1% of that day). Calendar context, not explanation — and neither matches July 6 on either axis: the add-eve cross was larger in shares and carried 39.7% of its day.

July 6, minute by minute

Add-eve, minute by minute: SPCX opened at $165.95, stood at $162.18 at 1:00 p.m. ET, and kept sliding. The 3:30 p.m. minute bar spans $155.42–$155.92 — Levine's "$155.50 at 3:30 p.m." checkpoint sits inside that bar — and the bar closed at $155.46. From there to the bell the tape climbed $4.96 on 19.3 million continuous shares, the final continuous print landing at $160.5 at 16:00:00 ET. The five-minute path below (78 buckets) ends at $160.4:

QueryJuly 6, 2026 in five-minute buckets: the slide, the late climb, and the volume underneath
The exact SQL behind every number
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 5 MINUTE), '%H:%i') AS et_time,
    round(toFloat64(argMax(close, window_start)), 2) AS price_usd,
    round(toFloat64(sum(volume)) / 1e6, 2) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPCX'
  AND window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-06 20:00:00'
GROUP BY et_time
ORDER BY et_time

Every checkpoint sits in one auditable row, with the print that mattered:

QueryThe add-eve receipts row: checkpoints, the last continuous trade, and the auction print itself
The exact SQL behind every number
WITH
    (
        SELECT (
            round(toFloat64(argMin(open, window_start)), 2),
            round(toFloat64(argMaxIf(close, window_start, window_start < '2026-07-06 17:01:00')), 2),
            round(toFloat64(argMaxIf(close, window_start, window_start < '2026-07-06 19:31:00')), 2),
            round(toFloat64(minIf(low, window_start = '2026-07-06 19:30:00')), 2),
            round(toFloat64(maxIf(high, window_start = '2026-07-06 19:30:00')), 2),
            round(toFloat64(sumIf(volume, window_start >= '2026-07-06 19:30:00')) / 1e6, 1)
        )
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPCX'
          AND window_start >= '2026-07-06 13:30:00' AND window_start < '2026-07-06 20:00:00'
    ) AS bars,
    (
        SELECT round(quantileDeterministic(0.5)(auction_m, day_key), 2)
        FROM (
            SELECT
                toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS d,
                toUInt64(toYYYYMMDD(toDate(toTimeZone(sip_timestamp, 'America/New_York')))) AS day_key,
                toFloat64(maxIf(size, has(conditions, 8))) / 1e6 AS auction_m
            FROM global_markets.stocks_trades
            WHERE ticker = 'SPCX'
              AND sip_timestamp >= '2026-06-12 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00'
            GROUP BY d, day_key
        )
    ) AS med_prior,
    (
        SELECT round(toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))), 2)
        FROM global_markets.stocks_trades
        WHERE ticker = 'SPCX'
          AND sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00'
    ) AS spcx_prev_close,
    (
        SELECT (
            round(toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8) AND sip_timestamp < '2026-07-03 00:00:00')), 2),
            round(toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8) AND sip_timestamp >= '2026-07-06 00:00:00')), 2)
        )
        FROM global_markets.stocks_trades
        WHERE ticker = 'SPY'
          AND ((sip_timestamp >= '2026-07-02 00:00:00' AND sip_timestamp < '2026-07-03 00:00:00')
            OR (sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'))
    ) AS spy,
    (
        SELECT maxIf(sip_timestamp, has(conditions, 8))
        FROM global_markets.stocks_trades
        WHERE ticker = 'SPCX' AND sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'
    ) AS auction_ts
SELECT
    bars.1 AS open_0930,
    bars.2 AS px_1300_et,
    bars.3 AS px_1530_close,
    bars.4 AS px_1530_bar_low,
    bars.5 AS px_1530_bar_high,
    bars.6 AS shares_1530_1559_m,
    round(toFloat64(argMaxIf(price, (sip_timestamp, sequence_number), sip_timestamp < auction_ts AND NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38]))), 2) AS last_continuous_px,
    formatDateTime(toTimeZone(maxIf(sip_timestamp, sip_timestamp < auction_ts AND NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38])), 'America/New_York'), '%H:%i:%S') AS last_continuous_et,
    countIf(has(conditions, 8)) AS code8_prints,
    round(toFloat64(maxIf(size, has(conditions, 8))) / 1e6, 2) AS auction_shares_m,
    round(toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))), 2) AS auction_price,
    formatDateTime(toTimeZone(auction_ts, 'America/New_York'), '%H:%i:%S') AS auction_time_et,
    round(toFloat64(maxIf(size, has(conditions, 8))) * toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))) / 1e9, 2) AS auction_notional_busd,
    round(toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))) - bars.3, 2) AS close_minus_1530_usd,
    round(bars.1 - toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))), 2) AS open_minus_close_usd,
    round(bars.2 - toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))), 2) AS px1300_minus_close_usd,
    round(bars.1 - bars.2, 2) AS open_minus_1300_usd,
    round((toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))) - toFloat64(argMaxIf(price, (sip_timestamp, sequence_number), sip_timestamp < auction_ts AND NOT has(conditions, 8) AND NOT hasAny(conditions, [15, 16, 38])))) * 100, 1) AS cross_vs_last_tick_cents,
    round((1 - toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))) / spcx_prev_close) * 100, 2) AS spcx_close_below_prior_pct,
    spy.2 AS spy_close_jul6,
    round((spy.2 / spy.1 - 1) * 100, 2) AS spy_day_change_pct,
    med_prior AS median_prior_auction_m,
    round(toFloat64(maxIf(size, has(conditions, 8))) / 1e6 / med_prior, 1) AS auction_vs_prior_median_x
FROM global_markets.stocks_trades
WHERE ticker = 'SPCX'
  AND sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'

The auction: 74.94 million shares at $160.42, stamped 16:00:00 ET — $12.02 billion in a single print. Levine relays Bloomberg Intelligence's Rob Du Boff estimating at least $5.4 billion of index-fund buying at that close, about 31.2 million of the 74.9 million shares. The figures differ by design: ours is the whole print, both sides; his is the estimated index-demand slice inside it.

The close was no spike. The official close printed $5.53 below SPCX's own 9:30 a.m. open and $1.76 below its 1:00 p.m. price; the session finished 0.98% under Thursday's close while SPY rose 0.87% (Monday's recap has the whole session). Levine, on a well-supplied auction:

"If it all works, supply matches demand in the closing auction, and the price doesn't move too much." — Matt Levine, Money Stuff (Bloomberg Opinion), July 7, 2026

By that yardstick, a cross 16.7 times the prior median printing within cents of the last continuous trade ($160.42 against $160.5) is the trade functioning. His framing; our measurements.

Who was on the other side

Here the tape stops and attribution takes over. In Levine's telling, index demand concentrates at the add-date close; liquidity providers — once bank desks, now often multistrategy pod shops — accumulate over prior sessions and supply into the auction, earning the gap between their average buy price and the auction price.

"The banks' incentives here are largely benign: Their job is to smooth out demand." — Matt Levine, Money Stuff (Bloomberg Opinion), July 7, 2026

For scale he points to Bloomberg's Nishant Kumar reporting that two Millennium index-rebalance teams made roughly $3.7 billion in June on index-change trades, and for the wider frame, two papers: Chinco and Sammon (2024), which puts passive ownership near 33.5% of the US market — about double the 16% headline figure — and Greenwood and Sammon (2024), which documents the index-add price effect shrinking across the decades. None of those claims is measurable on our tape; none conflicts with what is.

Where the rest of Monday's volume printed

The cross took 39.7% of July 6's matched volume. The rest split two ways: 45.1 million shares in continuous on-exchange trading (23.9%); 68.8 million off-exchange through FINRA's trade-reporting facilities (36.4%) — the bucket dark pools, wholesalers, and negotiated block trades report into. One trade out-printed the entire continuous on-exchange session.

QueryJuly 6's matched volume by where it printed: the cross, continuous on-exchange, off-exchange (TRF)
The exact SQL behind every number
SELECT
    multiIf(has(conditions, 8), 'Closing auction (one print)', exchange = 4, 'Off-exchange (TRF)', 'On-exchange, continuous') AS bucket,
    round(toFloat64(sum(size)) / 1e6, 1) AS shares_m,
    round(100 * toFloat64(sum(size)) / sum(toFloat64(sum(size))) OVER (), 1) AS pct_of_matched,
    count() AS prints
FROM global_markets.stocks_trades
WHERE ticker = 'SPCX'
  AND sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'
  AND NOT hasAny(conditions, [15, 16, 38])
GROUP BY bucket
ORDER BY bucket

The morning after

Levine notes SPCX traded lower again Tuesday morning. Our feed runs a day or two behind the tape's front edge — as of this writing (July 8), July 7's minute bars reach 12:59 p.m. ET — so the panel below reads the morning only. SpaceX opened Tuesday at $150.64, 6.1% below the $160.42 add-eve close, and held a $150.08–$151.32 band through 12:59 ET, still 5.9% under that close at the panel's edge.

QueryThe morning after, on a partial tape: July 7, 2026 through 12:59 p.m. ET (ingest lag; see data notes)
The exact SQL behind every number
WITH
    (
        SELECT round(toFloat64(argMaxIf(price, (size, sip_timestamp), has(conditions, 8))), 2)
        FROM global_markets.stocks_trades
        WHERE ticker = 'SPCX'
          AND sip_timestamp >= '2026-07-06 00:00:00' AND sip_timestamp < '2026-07-07 00:00:00'
    ) AS monday_close
SELECT
    count() AS morning_bars,
    formatDateTime(toTimeZone(max(window_start), 'America/New_York'), '%H:%i') AS last_bar_et,
    round(toFloat64(argMin(open, window_start)), 2) AS open_0930,
    round((1 - toFloat64(argMin(open, window_start)) / monday_close) * 100, 1) AS open_below_monday_close_pct,
    round(min(toFloat64(low)), 2) AS morning_low,
    round(max(toFloat64(high)), 2) AS morning_high,
    round(toFloat64(argMax(close, window_start)), 2) AS px_1259_et,
    round((1 - toFloat64(argMax(close, window_start)) / monday_close) * 100, 1) AS px_1259_below_monday_close_pct,
    round(toFloat64(sum(volume)) / 1e6, 1) AS morning_shares_m,
    monday_close AS monday_official_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPCX'
  AND window_start >= '2026-07-07 13:30:00' AND window_start < '2026-07-07 17:00:00'

SpaceX Nasdaq-100 FAQ

Why did SpaceX join the Nasdaq-100 so quickly?

Nasdaq's index methodology permits additions between the annual December reconstitutions, and press reports Levine cites (including the WSJ) described SpaceX's July 7, 2026 entry as a fast-tracked add, within a month of the June 12 IPO.

What is an index-add closing auction?

When a stock enters an index, funds tracking it transact at the official closing price of the last session before the change takes effect — a price set by the closing auction, one matched print at 4:00 p.m. ET. On July 6, 2026, SPCX's add-eve cross carried 39.7% of its day's matched volume.

Did SpaceX's stock spike when it joined the Nasdaq-100?

Not on our tape. The add-eve close printed $5.53 below the day's own open and 0.98% under the prior close — after a $4.96 climb over the final half hour — and the next morning it opened 6.1% lower still. Observations from the tape, not a verdict on anyone's execution.

How big was SpaceX's index-add closing auction?

74.94 million shares in one print at $160.42 — $12.02 billion, 39.7% of that day's matched volume, and 16.7 times the median SPCX closing cross before it.

Data notes

Full data notes
  • Entity boundary (the basis for frontmatter verified_tickers). SPCX was reassigned to Space Exploration Technologies Corp. at the 2026-06-12 listing; the old tape ends in April 2026, May shows zero bars (panel above). The first-month deep dive holds the full verification (IPO record, news-tag switch, short-interest cliff).
  • "Matched volume" is the consolidated tape's own accounting: sale conditions whose dictionary entry carries updates_volume = false (15, 16, 38) are excluded from every total and denominator. Vendor "shares traded" figures trim different edges: our July 1 total sits about 3% above Levine's print; July 2 and July 6 agree within a fraction of a percent.
  • The closing cross is sale condition 8, as in the closing-auction explainer. A few sessions carry an extra negligible code-8 record from a second venue (2 on listing day); the cross is the session's largest code-8 print. July 1, 2, and 6 each show exactly one.
  • July 7, 2026 is partial as of generation (July 8): minute bars reach 12:59 p.m. ET (210 bars in the 9:30–1:00 window); the day's tick file had not landed. The morning panel reads only that window; its volume column may revise as ingest completes.
  • Attributed numbers stay attributed. Levine's, the WSJ's, Du Boff's, Kumar's, and the papers' figures are their claims, reproduced for context, not measured here; this post asserts no cause for any move.
  • Timestamps are stored in UTC; July 2026 is EDT (regular hours 13:30–20:00 UTC). The auction notional is print size times print price, nothing more.

Every panel is one stored object — chart, table, SQL. Take these auctions apart further, on any ticker, on the Strasmore terminal.