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

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
monthminute_barslow_usdhigh_usdspacex_listing_dateissuer
2026-014621.6722.512026-06-12Space Exploration Technologies Corp.
2026-023021.6922.572026-06-12Space Exploration Technologies Corp.
2026-036421.6222.592026-06-12Space Exploration Technologies Corp.
2026-041321.9223.642026-06-12Space Exploration Technologies Corp.
2026-0610960146.88225.642026-06-12Space Exploration Technologies Corp.
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
Run this yourself

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
sessionday_matched_shares_mauction_shares_mauction_pct_of_dayofficial_closecode8_printsauction_time_et
2026-07-01112.45.384.8157.54116:00:00
2026-07-0261.62.584.2162116:00:00
2026-07-06188.974.9439.7160.42116:00:00
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
Run this yourself

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
sessionauction_shares_mauction_pct_of_dayday_matched_shares_mofficial_closecode8_prints
2026-06-127.851.5522.3160.952
2026-06-153.991.6257192.52
2026-06-164.981.5322.6201.81
2026-06-173.691.8201.7191.821
2026-06-1852.2819.2272.21851
2026-06-223.972.3169.2154.62
2026-06-233.22157.3156.111
2026-06-242.583.476.1154.541
2026-06-252.984.862.21531
2026-06-2639.5631.1127.3153.231
2026-06-298.6310.681.4164.191
2026-06-305.927.282170.861
2026-07-015.384.8112.4157.541
2026-07-022.584.261.61621
2026-07-0674.9439.7188.9160.421
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
Run this yourself

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
78 rows (showing 20)
et_timeprice_usdshares_m
09:30166.323.24
09:35164.321.48
09:40166.081.34
09:45166.691.49
09:501660.89
09:55164.70.97
10:00164.960.73
10:05165.280.81
10:10163.211.02
10:15163.80.77
10:20164.070.6
10:25162.941.16
10:30162.960.69
10:35162.550.72
10:40162.781.02
10:45161.420.85
10:50161.121.59
10:55161.870.89
11:00161.140.98
11:05161.710.5
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
Run this yourself

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
open_0930px_1300_etpx_1530_closepx_1530_bar_lowpx_1530_bar_highshares_1530_1559_mlast_continuous_pxlast_continuous_etcode8_printsauction_shares_mauction_priceauction_time_etauction_notional_busdclose_minus_1530_usdopen_minus_close_usdpx1300_minus_close_usdopen_minus_1300_usdcross_vs_last_tick_centsspcx_close_below_prior_pctspy_close_jul6spy_day_change_pctmedian_prior_auction_mauction_vs_prior_median_x
165.95162.18155.46155.42155.9219.3160.516:00:00174.94160.4216:00:0012.024.965.531.763.77-80.98751.280.874.4916.7
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'
Run this yourself

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)
bucketshares_mpct_of_matchedprints
Closing auction (one print)74.939.71
Off-exchange (TRF)68.836.4598632
On-exchange, continuous45.123.9644125
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
Run this yourself

The morning after

Levine notes SPCX traded lower again Tuesday morning, and the shape of that morning is worth a panel: this was selling through the session, not an overnight gap. SpaceX opened Tuesday at $158.92, just 0.9% below the $160.42 add-eve close, then traded a $150.12–$159.3 range and sat 5.2% under that close by 12:59 ET, the panel's fixed edge. (This panel's first edition, written July 8 on a partially ingested tape, showed a deeper "open", an artifact of missing early bars, corrected here on the complete session; see data notes.)

QueryThe morning after: July 7, 2026 through 12:59 p.m. ET (window pinned by design; see data notes)
morning_barslast_bar_etopen_0930open_below_monday_close_pctmorning_lowmorning_highpx_1259_etpx_1259_below_monday_close_pctmorning_shares_mmonday_official_close
21012:59158.920.9150.12159.3152.015.242.9160.42
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'
Run this yourself

The panel above deliberately stops at 12:59 p.m. ET (data notes). The completed July 7 session, the stock's first inside the index, and the day its slide back to the IPO price finished, is measured end to end in SpaceX stock's round trip from the peak.

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 0.9% 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.
  • The morning panel stops at 12:59 p.m. ET by design (210 bars in the 9:30–1:00 window): that was the ingested edge when this post was first written (July 8, 2026), and the window is pinned so the figures reproduce. The completed July 7 session is measured in the round-trip post.
  • 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.