Strasmore Research
Marktoverzichten Matt ConnorDoor Matt Connor · Bijgewerkt 2026-07-24

Marktoverzicht 29 juni 2026 in cijfers

Bekijk de markt van 29 juni 2026: een indexstijging door groei, een sector spread van vier punten en de 0DTE tape. Lees hier de volledige analyse.

Maandag 29 juni 2026 was een stijgende dag gedreven door groei met een smalle groep leidende aandelen: QQQ steeg met 2.57%, SPY met 1.62%, terwijl 3968 liquide namen stegen tegenover 2327 decliners — toch sloot bijna de helft van de sectorbaskets rood af. Elk getal is afkomstig uit een database; open een paneel voor de SQL. De tick-by-tick laag van dezelfde sessie: de microstructure deep dive van 29 juni.

De scorelijst

Elke wijziging vergelijkt de laatste reguliere sessie-minuutbar van 29 juni met die van vrijdag 26 juni.

QuerySPY / QQQ / DIA / IWM — 29 juni t.o.v. slot 26 juni, regular hours
De exacte SQL achter elk getal
WITH friday AS (
    SELECT ticker, argMax(close, window_start) AS friday_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
      AND window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00'
    GROUP BY ticker
),
monday AS (
    SELECT ticker,
           argMin(open, window_start) AS monday_open,
           argMax(close, window_start) AS monday_close,
           max(high) AS day_high,
           min(low) AS day_low,
           round(toFloat64(sum(volume)) / 1e6, 1) AS shares_traded_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
      AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    GROUP BY ticker
)
SELECT
    m.ticker AS ticker,
    toFloat64(f.friday_close) AS jun26_close,
    toFloat64(m.monday_open) AS jun29_open,
    toFloat64(m.monday_close) AS jun29_close,
    round((toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) * 100, 2) AS pct_change,
    round(100 * (toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) / max(toFloat64(m.monday_close) / toFloat64(f.friday_close) - 1) OVER (), 1) AS pct_of_best_change,
    toFloat64(m.day_high) AS day_high,
    toFloat64(m.day_low) AS day_low,
    m.shares_traded_m AS shares_traded_m
FROM monday m
JOIN friday f ON m.ticker = f.ticker
ORDER BY m.ticker

SPY opende op $736.525 ten opzichte van de slotkoers van vrijdag op $729.09 en sloot op $740.88, onder de high van $741.56. De +2.57% van QQQ ten opzichte van de +0.81% van DIA duidt op een dag in het teken van groei en tech; small-cap IWM steeg met 0.45%.

Was de dag ongebruikelijk?

Een procentuele beweging zegt weinig zonder referentiekader. Dit paneel rangschikt 29 juni ten opzichte van de voorgaande maand op basis van de absolute close-over-close omvang.

QueryQQQ en SPY: 29 juni gerangschikt t.o.v. de voorgaande maand (rank 1 = grootste absolute move)
De exacte SQL achter elk getal
SELECT
    round(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-06-29')), 2) AS qqq_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'QQQ' AND d = toDate('2026-06-29'))), groupArrayIf(abs(cc_pct), ticker = 'QQQ' AND d != toDate('2026-06-29'))) + 1 AS qqq_abs_move_rank,
    countIf(ticker = 'QQQ') AS qqq_sessions_compared,
    round(max(if(ticker = 'QQQ', abs(cc_pct), 0)), 2) AS qqq_biggest_move_of_month_pct,
    countIf(ticker = 'QQQ' AND cc_pct > 0) AS qqq_up_sessions,
    round(anyIf(cc_pct, ticker = 'SPY' AND d = toDate('2026-06-29')), 2) AS spy_close_over_close_pct,
    arrayCount(x -> x > abs(anyIf(cc_pct, ticker = 'SPY' AND d = toDate('2026-06-29'))), groupArrayIf(abs(cc_pct), ticker = 'SPY' AND d != toDate('2026-06-29'))) + 1 AS spy_abs_move_rank,
    countIf(ticker = 'SPY') AS spy_sessions_compared,
    round(anyIf(oc_pct, ticker = 'SPY' AND d = toDate('2026-06-29')), 2) AS spy_open_to_close_pct,
    concat(monthName(min(d)), ' ', toString(toDayOfMonth(min(d))), ', ', toString(toYear(min(d)))) AS first_session
FROM (
    SELECT ticker, d,
           (close_px / lagInFrame(close_px) OVER (PARTITION BY ticker ORDER BY d) - 1) * 100 AS cc_pct,
           oc_pct
    FROM (
        SELECT ticker,
               toDate(toTimeZone(window_start, 'America/New_York')) AS d,
               argMax(toFloat64(close), window_start) AS close_px,
               (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS oc_pct
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker IN ('SPY', 'QQQ')
          AND window_start >= toDateTime('2026-05-28 00:00:00')
          AND window_start < toDateTime('2026-06-30 00:00:00')
          AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199
        GROUP BY ticker, d
    )
)
WHERE isFinite(cc_pct)

Groot, maar geen record: de 2.57% beweging van QQQ staat op de 5 plaats van de 21 sessies sinds May 29, 2026, in een maand waarin de grootste enkele beweging 4.76% bedroeg; de 1.62% van SPY staat op de 4 plaats van de 21. De oorzaak van de beweging is relevant: de grind van de open-to-close van SPY was slechts 0.59%, waardoor het grootste deel van de winst voortkwam uit de overnight gap, voordat er een enkele bar tijdens de reguliere handelsuren werd geregistreerd. QQQ sloot hoger op 10 van die sessies: een maand met een verhouding van bijna twee-op-één.

Breedte: hoe groot was de rally?

Een advancer is een ticker waarvan de maandagsluiting hoger lag dan die van vrijdag, onder namen met een handelsvolume van minstens $1 miljoen — een filter dat 5,108 van de 11,475 tickers met een dubbele sessie wegfiltert.

QueryAdvancers vs decliners bij tickers met min. $1M handel op 29 juni
De exacte SQL achter elk getal
WITH per_ticker AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-29 00:00:00') AS monday_dollar_volume
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE (window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
       OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00')
    GROUP BY ticker
)
SELECT
    countIf(monday_close > friday_close AND monday_dollar_volume >= 1000000) AS advancers,
    countIf(monday_close < friday_close AND monday_dollar_volume >= 1000000) AS decliners,
    countIf(monday_close = friday_close AND monday_dollar_volume >= 1000000) AS unchanged,
    countIf(monday_dollar_volume >= 1000000) AS liquid_tickers,
    count() AS tickers_traded_both_sessions,
    reverse(arrayStringConcat(extractAll(reverse(toString(count())), '[0-9]{1,3}'), ',')) AS tickers_traded_both_sessions_label,
    count() - countIf(monday_dollar_volume >= 1000000) AS dropped_by_liquidity_filter,
    reverse(arrayStringConcat(extractAll(reverse(toString(count() - countIf(monday_dollar_volume >= 1000000))), '[0-9]{1,3}'), ',')) AS dropped_by_liquidity_filter_label,
    round(100.0 * countIf(monday_close > friday_close AND monday_dollar_volume >= 1000000)
        / countIf(monday_dollar_volume >= 1000000), 1) AS advancer_pct
FROM per_ticker
WHERE friday_close > 0 AND monday_close > 0

3968 advancers, 2327 decliners, 72 unchanged: 62.3% van de liquid tape steeg — berekend per individuele naam, een brede dag.

Sector voor sector: de rally was beperkter dan het leek

Het tellen van het aantal stijgende namen is één benadering; het wegen op basis van bedrijfsgrootte is een andere. De elf SPDR sector ETF's zijn de afkorting voor de tweede methode — één op marktwaarde gewogen mandje per sector van de S&P 500. Deze wijken sterk af van de breedte-meting.

QueryDe elf sector baskets: 29 juni t.o.v. slot 26 juni, regular hours
De exacte SQL achter elk getal
WITH per_etf AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
        round(sumIf(toFloat64(close) * toFloat64(volume), window_start >= '2026-06-29 00:00:00') / 1e6, 0) AS dollar_volume_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
      AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
        OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    GROUP BY ticker
)
SELECT
    sector,
    ticker,
    round((monday_close / friday_close - 1) * 100, 2) AS pct_change,
    round((day_high / day_low - 1) * 100, 2) AS range_pct,
    dollar_volume_m,
    round((monday_close / friday_close - 1) * 100 - min((monday_close / friday_close - 1) * 100) OVER (), 2) AS pct_above_worst_sector
FROM (
    SELECT *,
        multiIf(ticker = 'XLB', 'Materials',
                ticker = 'XLC', 'Communication services',
                ticker = 'XLE', 'Energy',
                ticker = 'XLF', 'Financials',
                ticker = 'XLI', 'Industrials',
                ticker = 'XLK', 'Technology',
                ticker = 'XLP', 'Consumer staples',
                ticker = 'XLRE', 'Real estate',
                ticker = 'XLU', 'Utilities',
                ticker = 'XLV', 'Health care',
                'Consumer discretionary') AS sector
    FROM per_etf
)
ORDER BY pct_change DESC

Technology leidde met 2.52%, consumer discretionary volgde met 2.37%; materials sloot met -1.82% en real estate met -0.64%. Het verschil tussen de best presterende en slechtste sector — de sector-dispersie van de dag — bedroeg 4.34 basis points, waarbij utilities, staples, energy, real estate en materials allemaal in het rood stonden op een dag dat de index steeg. Breed qua aantal namen, beperkt qua gewicht: dat is wat de winst van een indexfonds kan verhullen.

The day's highlight: memory and storage

Four names traded the same theme with very different outcomes — co-movement and magnitude only; the data does not say why.

QueryMemory/storage aandelen: verandering t.o.v. slot vrijdag en intraday range
De exacte SQL achter elk getal
WITH per_name AS (
    SELECT
        ticker,
        toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')) AS friday_close,
        toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')) AS monday_close,
        maxIf(toFloat64(high), window_start >= '2026-06-29 00:00:00') AS day_high,
        minIf(toFloat64(low), window_start >= '2026-06-29 00:00:00') AS day_low,
        argMinIf(window_start, toFloat64(low), window_start >= '2026-06-29 00:00:00') AS low_bar,
        argMaxIf(window_start, toFloat64(high), window_start >= '2026-06-29 00:00:00') AS high_bar
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('MU', 'SNDK', 'STX', 'WDC')
      AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
        OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    GROUP BY ticker
)
SELECT
    ticker,
    round(friday_close, 2) AS jun26_close,
    round(monday_close, 2) AS jun29_close,
    round((monday_close / friday_close - 1) * 100, 2) AS pct_chg,
    round(day_high, 2) AS day_high,
    formatDateTime(toTimeZone(high_bar, 'America/New_York'), '%H:%i') AS day_high_et,
    round(day_low, 2) AS day_low,
    formatDateTime(toTimeZone(low_bar, 'America/New_York'), '%H:%i') AS day_low_et,
    round((day_high / day_low - 1) * 100, 2) AS range_pct
FROM per_name
ORDER BY ticker

MU is the textbook case of range versus net change: a 12.22% intraday range — a $1023.65 low at 10:18 ET, a $1148.79 high at 15:59 — yet a close 1.97% above Friday. Western Digital rose 11.15% and Seagate 8.17%; SanDisk closed -1.9% across a 10.33% range — the cluster's one lower close. A close hides what holders lived through.

Waar de handel plaatsvond

Op basis van de verhandelde dollars overtrof Micron (MU) alles, inclusief indexfondsen: $58.47 miljard tegenover $33.97 miljard voor SPY. Op basis van het aantal aandelen was de situatie anders.

QueryVolume leaders op twee manieren: top 6 naar dollars, top 4 naar shares
De exacte SQL achter elk getal
SELECT ticker, leaderboard, dollar_volume_bn, if(dollar_volume_bn < 1, dollar_volume_m, NULL) AS dollar_value_m, shares_m,
    round(100 * if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m)
        / max(if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m)) OVER (PARTITION BY leaderboard), 1) AS pct_of_board_leader
FROM (
    SELECT
        'by dollars traded' AS leaderboard,
        ticker,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 2) AS dollar_volume_bn,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e6, 0) AS dollar_volume_m,
        round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    GROUP BY ticker
    ORDER BY dollar_volume_bn DESC
    LIMIT 6
    UNION ALL
    SELECT
        'by shares traded' AS leaderboard,
        ticker,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 2) AS dollar_volume_bn,
        round(sum(toFloat64(close) * toFloat64(volume)) / 1e6, 0) AS dollar_volume_m,
        round(sum(toFloat64(volume)) / 1e6, 1) AS shares_m
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    GROUP BY ticker
    ORDER BY shares_m DESC
    LIMIT 4
)
ORDER BY leaderboard ASC, if(leaderboard = 'by dollars traded', dollar_volume_bn, shares_m) DESC

Overzichten van het aantal aandelen zijn misleidend: de koplopers waren SOXS, een 3x-leveraged inverse semiconductor ETF (695.3 miljoen aandelen), en INLF, een penny stock waarvan de 353.8 miljoen aandelen de hele dag ongeveer $23 miljoen waard waren. Dollar volume laat zien waar het geld naartoe bewoog; relatieve volume laat zien of de activiteit van een aandeel ongebruikelijk is voor dat specifieke aandeel.

In blokken van 30 minuten in New York vertoont 29 juni de klassieke volume "smile":

QueryShares traded per 30-minuten bucket, regular hours (billions)
De exacte SQL achter elk getal
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE), '%H:%i') AS et_time,
    round(sum(toFloat64(volume)) / 1e9, 2) AS shares_bn,
    round(100 * sum(toFloat64(volume)) / max(sum(toFloat64(volume))) OVER (), 1) AS pct_of_biggest_bucket,
    round(100 * (sum(toFloat64(volume)) / min(sum(toFloat64(volume))) OVER () - 1), 1) AS pct_above_trough
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
GROUP BY et_time
ORDER BY et_time

2.3 miljard aandelen in het eerste halfuur, een dal van 0.77 miljard om 13:30, en het grootste blok — 2.39 miljard — in het laatste halfuur, waar closing auctions en index-tracking flows zich concentreren.

De options tape

Er werden 66.33 miljoen contracten verhandeld over 11.04 miljoen prints.

QueryEén rij voor de gehele options dag: volume, 0DTE, de holiday-shifted week
De exacte SQL achter elk getal
WITH
    (
        SELECT (any(underlying_symbol), any(toFloat64(strike_price)), any(option_type),
                any(toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6)))),
                sum(size), count(), round(avg(toFloat64(price)), 3))
        FROM global_markets.options_trades
        WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'
        GROUP BY ticker
        ORDER BY sum(size) DESC
        LIMIT 1
    ) AS top_contract,
    (
        SELECT round(toFloat64(argMax(close, window_start)), 2)
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    ) AS spy_regular_close
SELECT
    round(count() / 1e6, 2) AS option_prints_m,
    round(toFloat64(sum(size)) / 1e6, 2) AS contracts_m,
    round(100.0 * sumIf(size, option_type = 'C') / sum(size), 1) AS call_pct_of_volume,
    round(100.0 * sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260629') / sum(size), 1) AS same_day_expiry_pct,
    round(toFloat64(sumIf(size, substring(ticker, length(ticker) - 14, 6) = '260702')) / 1e6, 2) AS thu_jul2_expiry_contracts_m,
    countIf(substring(ticker, length(ticker) - 14, 6) = '260703') AS fri_jul3_expiry_prints,
    countIf(sip_timestamp < '2026-06-29 13:30:00') AS premarket_prints,
    reverse(arrayStringConcat(extractAll(reverse(toString(countIf(sip_timestamp < '2026-06-29 13:30:00'))), '[0-9]{1,3}'), ',')) AS premarket_prints_label,
    countIf(sip_timestamp < '2026-06-29 13:30:00'
        AND underlying_symbol NOT IN ('SPX', 'SPXW', 'XSP', 'RUTW', 'VIX', 'VIXW')) AS premarket_non_index_prints,
    arrayStringConcat(arraySort(groupUniqArrayIf(underlying_symbol, sip_timestamp < '2026-06-29 13:30:00')), ', ') AS premarket_underlyings,
    round(toFloat64(sumIf(size, underlying_symbol = 'SPY')) / 1e6, 2) AS spy_contracts_m,
    round(toFloat64(sumIf(size, underlying_symbol = 'QQQ')) / 1e6, 2) AS qqq_contracts_m,
    top_contract.1 AS top_contract_underlying,
    top_contract.2 AS top_contract_strike,
    top_contract.3 AS top_contract_type,
    top_contract.4 AS top_contract_expiry,
    top_contract.5 AS top_contract_volume,
    reverse(arrayStringConcat(extractAll(reverse(toString(assumeNotNull(top_contract.5))), '[0-9]{1,3}'), ',')) AS top_contract_volume_label,
    round(top_contract.7, 3) AS top_contract_avg_price,
    round(top_contract.2 - spy_regular_close, 2) AS top_strike_minus_spy_close
FROM global_markets.options_trades
WHERE sip_timestamp >= '2026-06-29 00:00:00' AND sip_timestamp < '2026-06-30 00:00:00'

Calls vormden 55.7% van het contractvolume, en 35.8% van het totale handelsvolume verliep op diezelfde maandag — de zero-days-to-expiry (0DTE) share. Het meest verhandelde individuele contract was de SPY $741 call met dezelfde expiratiedatum: 788,133 contracten tegen een gemiddelde premium van $0.474, waarbij de SPY-sluiting 0.12 dollar onder de strike eindigde — de meest verhandelde optie van de dag eindigde out of the money. SPY werd verhandeld als underlying met 12.01 miljoen contracten; QQQ 7.32 miljoen.

Het panel registreert ook 40,621 option prints vóór de opening van de aandelenmarkt om 9:30 — allemaal op een cash-settled index root (RUTW, SPX, SPXW, VIX, VIXW, XSP), met 0 stock of ETF option prints in dezelfde periode. Dit is de regel, geen toeval: indexopties hebben sessies met wereldwijde handelsuren, terwijl opties op aandelen en ETF's openen met de aandelenmarkt. De aandelen worden vroeg verhandeld — zie premarket en after-hours trading — hun opties niet.

Geen enkel contract met een expiratiedatum van vrijdag 3 juli werd gedurende de dag verhandeld (0 prints) — de markt is die vrijdag gesloten — terwijl de expiratiedatum van donderdag 2 juli 10.73 miljoen verhandelde.

De quote tape: de kosten van de handel gedurende de dag

Elke prijs op deze pagina is gebaseerd op een quote stream — de National Best Bid and Offer, die continu wordt herzien voor elk genoteerd aandeel. Het verschil tussen de beste bid en de beste offer, de bid-ask spread, is wat een order betaalt om te handelen.

QueryKosten om de spread te crossen: NBBO updates en median quoted width, regular hours
De exacte SQL achter elk getal
SELECT
    ticker,
    round(count() / 1e6, 2) AS nbbo_updates_m,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price), 2) AS median_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 14:00:00'), 2) AS open_30min_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 17:00:00' AND sip_timestamp < '2026-06-29 17:30:00'), 2) AS midday_spread_bps,
    round(quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 14:00:00')
        - quantileExactIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, bid_price > 0 AND ask_price >= bid_price AND sip_timestamp >= '2026-06-29 17:00:00' AND sip_timestamp < '2026-06-29 17:30:00'), 2) AS open_minus_midday_bps,
    countIf(NOT (bid_price > 0 AND ask_price >= bid_price)) AS dropped_invalid_quotes
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'QQQ', 'MU', 'WDC')
  AND sip_timestamp >= '2026-06-29 13:30:00' AND sip_timestamp < '2026-06-29 20:00:00'
GROUP BY ticker
ORDER BY ticker

De mediane quoted width van SPY was 0.41 basis points van de mid-price, tegenover 0.84 voor QQQ, 4.6 voor Micron en 8.2 voor Western Digital — de breedste van de vier. Eén basis point op een order van $10.000 is één dollar, dus het kopen en direct weer verkopen van $10.000 aan SPY tegen de quote kost ongeveer $0.41; dezelfde round trip in Western Digital kost $8.2. De handelsomvang bleef gelijk; alleen het aandeel veranderde.

Alle vier de aandelen hadden een bredere quote in het eerste half uur dan in het controlevenster rond het middaguur — SPY 0.41 bps tegenover 0.27, Western Digital 14.33 tegenover 7.55, een openingspremie van 6.78 bp op het breedste aandeel. Churn vormt de andere helft: 3.98 miljoen NBBO updates voor SPY tijdens de reguliere handel, 4.42 miljoen voor QQQ.

Rentes: de curve bewoog nauwelijks

Treasuries kenden een rustige maandag. De yields zijn dagsluitingen, veranderd ten opzichte van 26 juni.

QueryDe Treasury curve, slot 29 juni t.o.v. 26 juni (alleen gepopuleerde maturities)
De exacte SQL achter elk getal
SELECT
    t.1 AS curve_point,
    round(t.2, 2) AS jun29_yield_pct,
    round((t.2 - t.3) * 100) AS one_day_change_bp
FROM (
    SELECT arrayJoin([
        ('1 month',  toFloat64(mon.yield_1_month),  toFloat64(fri.yield_1_month)),
        ('3 month',  toFloat64(mon.yield_3_month),  toFloat64(fri.yield_3_month)),
        ('1 year',   toFloat64(mon.yield_1_year),   toFloat64(fri.yield_1_year)),
        ('2 year',   toFloat64(mon.yield_2_year),   toFloat64(fri.yield_2_year)),
        ('5 year',   toFloat64(mon.yield_5_year),   toFloat64(fri.yield_5_year)),
        ('10 year',  toFloat64(mon.yield_10_year),  toFloat64(fri.yield_10_year)),
        ('30 year',  toFloat64(mon.yield_30_year),  toFloat64(fri.yield_30_year)),
        ('2s10s spread', toFloat64(mon.yield_10_year - mon.yield_2_year), toFloat64(fri.yield_10_year - fri.yield_2_year))
    ]) AS t
    FROM (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-29') AS mon,
         (SELECT * FROM global_markets.treasury_yields WHERE date = '2026-06-26') AS fri
)

De 10-year sloot op 4.38%, ongewijzigd op de dag (0 bp), terwijl de 3-month bill 4 bp toenam naar 3.87%. De 2s10s spread — de 10-year minus de 2-year — sloot op 0.28 procentpunt (-3 bp): nog steeds positief, iets platter.

De kalender van de dag

QueryCorporate calendar en informatieverloop van 29 juni in één rij
De exacte SQL achter elk getal
WITH
    (
        SELECT (argMax(d, n), max(n))
        FROM (
            SELECT ex_dividend_date AS d, count() AS n
            FROM global_markets.stocks_dividends
            WHERE ex_dividend_date BETWEEN '2026-06-22' AND '2026-07-02'
            GROUP BY d
        )
    ) AS peak_ex_div,
    (
        SELECT (countIf(form_type = '424B2'), countIf(form_type = '4'), countIf(form_type = '8-K'), count())
        FROM global_markets.stocks_sec_edgar_index
        WHERE filing_date = '2026-06-29'
    ) AS filings,
    (
        SELECT (count(), uniqExact(publisher), countIf(has(tickers, 'NVDA')))
        FROM global_markets.stocks_news
        WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-29'
    ) AS news,
    (
        SELECT max(n)
        FROM (
            SELECT t, count() AS n
            FROM (
                SELECT arrayJoin(tickers) AS t
                FROM global_markets.stocks_news
                WHERE toDate(toTimeZone(published_utc, 'America/New_York')) = '2026-06-29'
            )
            WHERE t NOT IN ('NVDA', 'SPCX')
            GROUP BY t
        )
    ) AS runner_up_articles,
    (
        SELECT (any(split_from), any(split_to), count())
        FROM global_markets.stocks_splits
        WHERE ticker = 'HON' AND execution_date = '2026-06-29'
    ) AS hon_split,
    (
        SELECT (
            round(toFloat64(argMaxIf(close, window_start, window_start < '2026-06-27 00:00:00')), 2),
            round(toFloat64(argMaxIf(close, window_start, window_start >= '2026-06-29 00:00:00')), 2)
        )
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'HON'
          AND ((window_start >= '2026-06-26 13:30:00' AND window_start < '2026-06-26 20:00:00')
            OR (window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'))
    ) AS hon_close
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-29') AS ex_dividend_records_jun29,
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date = '2026-06-29'
        AND ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'GOOG', 'META', 'TSLA', 'JPM', 'JNJ',
                       'XOM', 'KO', 'PG', 'V', 'MA', 'HD', 'WMT', 'CVX', 'MRK', 'PEP',
                       'SPY', 'QQQ', 'DIA', 'IWM', 'VTI')) AS household_name_ex_dividends,
    length(['AAPL', 'MSFT', 'NVDA', 'AMZN', 'GOOGL', 'GOOG', 'META', 'TSLA', 'JPM', 'JNJ',
            'XOM', 'KO', 'PG', 'V', 'MA', 'HD', 'WMT', 'CVX', 'MRK', 'PEP',
            'SPY', 'QQQ', 'DIA', 'IWM', 'VTI']) AS household_names_checked,
    concat(monthName(peak_ex_div.1), ' ', toString(toDayOfMonth(peak_ex_div.1))) AS busiest_ex_div_day_of_window,
    peak_ex_div.2 AS busiest_ex_div_day_records,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date = '2026-06-29') AS splits_executed,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date = '2026-06-29') AS ipos_listed_jun29,
    (SELECT arrayStringConcat(groupArray(ticker), ', ') FROM (
        SELECT ticker FROM global_markets.stocks_ipos WHERE listing_date = '2026-07-01' ORDER BY ticker
    )) AS jul1_ipo_debuts,
    filings.4 AS sec_filings,
    filings.1 AS prospectus_424b2_filings,
    filings.2 AS insider_form4_filings,
    filings.3 AS filings_8k,
    news.1 AS news_articles,
    news.2 AS news_publishers,
    news.3 AS nvda_articles,
    runner_up_articles AS next_most_covered_articles,
    news.3 - runner_up_articles AS nvda_minus_next_most_covered,
    hon_split.3 AS hon_split_records,
    hon_split.1 AS hon_split_from,
    hon_split.2 AS hon_split_to,
    hon_close.1 AS hon_close_jun26,
    hon_close.2 AS hon_close_jun29

449 dividend records gingen op 29 juni ex-dividend — bezit het aandeel vóór de ex-dividend datum om aanspraak te maken op de betaling — toch kwam 0 voor bij de 25 bekende namen die wij hebben gecontroleerd. De golf van kwartaalafsluitingen bereikte een piek van 745 records op July 1. Er werden 23 splits uitgevoerd en 0 IPO's genoteerd; de debuten van woensdag (BSP, ITG, LIME) staan al in de agenda.

De SEC registreerde 6173 filings met de datum 29 juni: 1473 pricing supplements voor gestructureerde producten (form 424B2) en 1277 insider-trade rapporten (Form 4) overtreffen de 231 8-K's die het nieuws halen. Onze nieuwsfeed bevatte 170 artikelen van 3 uitgevers; met uitzondering van één ambigu getagd hergebruikt symbool (verwijderd uit de query), was NVDA met 14 artikelen de meest besproken naam, vergeleken met 12 voor de nummer twee.

Databemerkingen

Afwijkende data krijgt een toelichting, er vindt nooit een stille uitsluiting plaats — deze vier punten hebben invloed op de koerscijfers.

  • De sector baskets zijn een vastgestelde methode. "Sector" verwijst naar de elf SPDR sector ETF's, gewogen naar marktkapitalisatie — dezelfde namen elke sessie, niet de classificatie per ticker van een leverancier.
  • Dollar volume is een proxy per minuut — de som van koers × volume per minuut-bar; dit ligt dicht bij, maar is niet identiek aan de som van de print-waarden.
  • Quoted spreads sluiten ongeldige quotes uit (eenzijdige of gecrossde NBBO-records); het panel houdt bij wat er is verwijderd (1544 op SPY). Een mediane quoted width is een quoting-statistiek, geen transactiekosten — orders worden vaak binnen de quote uitgevoerd.
  • Eén enkele print kan de high of low van een minuut-bar beïnvloeden. De 11:07 ET bar van QQQ bevat een low van $709.58, terwijl geen enkele omliggende bar onder $715.09 zakte — één print zat $5.51 onder de gelijktijdige markt. Elke high en low hierboven is gecontroleerd tegen de aangrenzende bars; de $705.172 session low van QQQ is goedgekeurd.
Volledige databemerkingen
  • De Treasury coverage is beperkter dan het schema. Vier geadverteerde looptijden (6-maand, 3-, 7- en 20-jaar) zijn nooit ingevuld; de curve toont de zeven die bestaan, plus de 2s10s rij.
  • De tape bevat een tegenstrijdige Honeywell "reverse split". De feed bevat een 1 HON record gedateerd 29 juni: een reverse split waarbij 2 oude aandelen worden omgezet in 1 nieuwe aandelen. HON sloot op $231.3 vrijdag en $227.71 maandag — geen verdubbeling. Wij hebben dit niet toegepast.
  • Het aantal nieuwsberichten is afkomstig van één leverancier, de 3 uitgevers die wij gebruiken — niet "al het marktnieuws".
  • De tick-level receipts — gecrossde quotes, de phantom-volume correctie, het ingekorte FINRA short-volume bestand (en waarom short volume is niet short interest) — vindt u in de deep dive.

De sessie, geverifieerd

QuerySession check: SPY's geobserveerde minute-bar span en de vrijdag closure op de tape
De exacte SQL achter elk getal
WITH
    (
        SELECT (
            round(toFloat64(minIf(low, formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') = '11:07')), 2),
            round(toFloat64(minIf(low, formatDateTime(toTimeZone(window_start, 'America/New_York'), '%H:%i') IN ('11:04', '11:05', '11:06', '11:08', '11:09', '11:10'))), 2)
        )
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'QQQ' AND window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00'
    ) AS qqq_lone
SELECT
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= '2026-07-03 00:00:00' AND window_start < '2026-07-04 00:00:00') AS jul3_spy_bars,
    formatDateTime(min(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS first_spy_bar_et,
    formatDateTime(max(toTimeZone(window_start, 'America/New_York')), '%H:%i') AS last_spy_bar_et,
    count() AS spy_minute_bars,
    countIf(window_start >= '2026-06-29 13:30:00' AND window_start < '2026-06-29 20:00:00') AS regular_session_bars,
    qqq_lone.1 AS qqq_1107_lone_low,
    qqq_lone.2 AS qqq_1107_adjacent_bars_low,
    round(qqq_lone.2 - qqq_lone.1, 2) AS qqq_lone_print_below_adjacent
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= '2026-06-29 00:00:00' AND window_start < '2026-06-30 00:00:00'

De bars van SPY lopen van 04:00 tot 19:59 New York tijd met exact 390 regular-window bars — een volledige sessie, geverifieerd via de tape (de exchange-calendar dataset bevat alleen toekomstige sluitingen). Die vrijdag 3 juli was een volledige handelsdag — 0 SPY bars werden de hele dag geprint; 4 juli viel op een zaterdag; de week met vier sessies heeft zijn eigen recap.

FAQ

Hoe heeft de aandelenmarkt het gedaan op 29 juni 2026?

Een stijgende dag onder leiding van growth: QQQ sloot 2.57% hoger dan vrijdag, SPY 1.62%, DIA 0.81% en IWM 0.45%, waarbij 62.3% van de tickers met een handelsvolume van $1m of meer hoger sloot.

Was 29 juni 2026 een belangrijke dag voor de Nasdaq?

Belangrijk, maar niet uitzonderlijk: de 2.57% close-over-close beweging van QQQ rangschikte op de 5 van de 21 sessies van de afgelopen maand op basis van absolute grootte, tegenover een maandelijkse piek van 4.76%.

Welke sectoren leidden de markt op 29 juni 2026?

Technology (2.52%) en consumer discretionary (2.37%) leidden de elf SPDR sector baskets; materials eindigde als laatste op -1.82%, een spread van 4.34 basispunten. Utilities, staples, energy en real estate sloten eveneens lager.

Welk deel van het optievolume op 29 juni 2026 bestond uit 0DTE?

Same-day expiries vormden 35.8% van de 66.33 miljoen verhandelde contracts; het drukste individuele contract, een same-day SPY $741 call (788,133 contracts), eindigde out of the money.

Waarom worden opties verhandeld voordat de aandelenmarkt opent?

Alleen index opties doen dit. Alle 40,621 optie-prints voor 9:30 a.m. ET op 29 juni waren gebaseerd op cash-settled index roots (RUTW, SPX, SPXW, VIX, VIXW, XSP), die sessies met uitgebreide wereldwijde handelsuren omvatten; het aantal stock en ETF optie-prints in die periode bedroeg 0.

Methodologie

  • Timestamps worden opgeslagen in UTC en binnen de queries omgezet naar New York-tijd. "Close" is de laatste minuutbar van de reguliere sessie, niet de auction print; dagveranderingen vergelijken 29 juni met 26 juni, en de sessie is geverifieerd op basis van de geobserveerde bar span.
  • De trailing-month rank gebruikt bewegingen van de close-over-close tijdens de reguliere uren, waarbij de eerste sessie is weggelaten (geen voorafgaande close binnen het venster). Option expiries worden opnieuw geparsed vanuit de OCC ticker (de eigen expiry kolom van de tabel is defect).
  • Elk paneel wordt eenmalig gelezen op het moment van redactie via het gated read-only pad. Warehouse-status per 13 juli 2026.

Elk paneel is een resultaat van een opgeslagen query — een grafiek, tabel en SQL in één object. Plak elk van deze elementen in de Strasmore terminal. Volgende sessie: 30 juni.