Strasmore Research
Market Recap

Market Recap: H1 2026 — buong ledger

Matt ConnorBy Matt Connor Updated 2026-07-25

Ang unang kalahati ng 2026 ay dalawang magkaibang merkado na pinagdugtong: isang unang quarter kung saan ang bawat pangunahing index ETF ay bumagsak o hindi gumalaw, at isang ikalawang quarter na higit pa sa nagawang ayusin ito. Natapos ng SPY ang kalahati na tumataas ng 8.8%; ang QQQ ay tumataas ng 18.7%; at ang 21.3% ng IWM ang pinakamagandang unang kalahati na naitala ng small-cap ETF sa tape na hawak namin — ang resibo ay nasa ibaba, muling kinomputa laban sa bawat nakaraang taon sa isang query. Iba ang ikinuwento ng rates market: ang 2s10s spread ay lumapad mula 72 basis points tungo sa 30 sa buong kalahati nang hindi kailanman nag-invert. Ang pahinang ito ay ang kumpletong ledger ng kalahati — ang scoreboard, ang history rank, ang buwanang hagdan, ang buong yield curve na maturity sa bawat maturity, ang labing-isang sektor, ang buwanang ebolusyon ng options tape, at ang mga kapansin-pansing solong pangalan ng kalahati. Bawat numero dito ay resulta ng isang nakaimbak na query; palawakin ang anumang panel para sa SQL.

Ang kalahati sa talaan

QueryH1 2026: half, Q1, at Q2 returns para sa apat na index ETFs — kinompta sa isang query
Ang eksaktong SQL sa likod ng bawat numero
SELECT ticker,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS h1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-03-31') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-04-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q2_return_pct,
    round(argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS h1_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY ticker
ORDER BY ticker

Ang dalawang-quarter na paghati ang siyang pinakakilalang anyo ng kalahati: SPY -5.2% tapos 14.1%; QQQ -6.9% tapos 26.5%. Ang IWM ang tahimik na lider ng kalahati sa 21.3% — ang small caps ay lumampas sa bawat large-cap index sa loob ng anim na buwan. Ang detalye ng quarter ay nasa Q2 buod. Isang tala tungkol sa aritmetika ng mga kalahati: ang 8.8% ng SPY sa loob ng anim na buwan ay mas mababa nang husto kaysa Q2 nito lamang, dahil nag-uugnay ang kalahati ng isang drawdown at isang recovery — ang compounding ng -5.2% at 14.1% ay napupunta kung saan sinasabi ng talaan, at anumang headline ng 'first-half return' ay tahimik na nag-eencode ng buong round trip na iyon.

Ang kalahati laban sa bawat unang kalahati sa tape

Karaniwan ba ang isang 8.8% na kalahati? Ang mga panel sa ibaba ay muling kinakalkula ang SAME na return ng unang kalahati — mula unang regular-hours open hanggang huling regular-hours close, Enero hanggang Hunyo — para sa bawat taon ng minute history, sa isang query bawat ETF pair na may magkaparehong arithmetic para sa bawat taon, saka irinarank ang kalahating ito laban sa iba. Ang pinakamaagang petsa ng minute tape ay nabe-verify sa methodology sa ibaba; ang unang kumpletong unang kalahati na nasa file ay ang pinangalanan ng mga resibo.

QueryBawat first half sa tape: SPY at QQQ, parehong pag-compute taun-taon (ipinapakita ang per-year session counts)
Ang eksaktong SQL sa likod ng bawat numero
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
       ticker,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
       round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 1) AS h1_return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
  AND window_start >= toDateTime('2003-01-01 00:00:00')
  AND window_start < toDateTime('2026-07-01 00:00:00')
  AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY y, ticker
HAVING sessions >= 100
ORDER BY y ASC, ticker ASC
QueryAng mga rank receipt: ang kalahating ito laban sa bawat nauna (SPY at QQQ; rank 1 = pinakamahusay; self-excluded)
Ang eksaktong SQL sa likod ng bawat numero
SELECT ticker,
       round(anyIf(ret, y = 2026), 1) AS h1_2026_pct,
       arrayCount(x -> x > anyIf(ret, y = 2026), groupArrayIf(ret, y != 2026)) + 1 AS rank_best,
       count() AS halves_compared,
       min(y) AS first_year,
       anyIf(sessions, y = 2026) AS sessions_2026
FROM (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
           ticker,
           uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS ret
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'QQQ')
      AND window_start >= toDateTime('2003-01-01 00:00:00')
      AND window_start < toDateTime('2026-07-01 00:00:00')
      AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY y, ticker
    HAVING sessions >= 100
)
GROUP BY ticker
ORDER BY ticker ASC

Ang 8.8% ng SPY ay nasa rank 6 sa 23 na unang kalahati mula 2004 (rank 1 = pinakamahusay) — upper third, hindi record. Ang 18.7% ng QQQ ay nasa rank 3 sa 16 na comparable na kalahati — ang QQQ series ay mas maikli — ang fund ay nai-trade sa ibang root symbol sa loob ng ilang taon — at anumang taon na may kulang sa isang daang first-half session para sa isang symbol ay ini-exclude ng session-count guard na makikita sa table, kaya ang mga exclusion ay nakikita at hindi tahimik.

QueryBawat first half sa tape: DIA at IWM, parehong aritmetika
Ang eksaktong SQL sa likod ng bawat numero
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
       ticker,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
       round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 1) AS h1_return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('DIA', 'IWM')
  AND window_start >= toDateTime('2003-01-01 00:00:00')
  AND window_start < toDateTime('2026-07-01 00:00:00')
  AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
  AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY y, ticker
HAVING sessions >= 100
ORDER BY y ASC, ticker ASC
QueryAng mga rank receipt: DIA at IWM laban sa bawat naunang first half (rank 1 = pinakamahusay; self-excluded)
Ang eksaktong SQL sa likod ng bawat numero
SELECT ticker,
       round(anyIf(ret, y = 2026), 1) AS h1_2026_pct,
       arrayCount(x -> x > anyIf(ret, y = 2026), groupArrayIf(ret, y != 2026)) + 1 AS rank_best,
       count() AS halves_compared,
       min(y) AS first_year,
       anyIf(sessions, y = 2026) AS sessions_2026
FROM (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
           ticker,
           uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
           (argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100 AS ret
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('DIA', 'IWM')
      AND window_start >= toDateTime('2003-01-01 00:00:00')
      AND window_start < toDateTime('2026-07-01 00:00:00')
      AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY y, ticker
    HAVING sessions >= 100
)
GROUP BY ticker
ORDER BY ticker ASC

Ang small-cap row ang headline ng kalahati: ang IWM ay nasa rank 1 sa 23 na unang kalahati mula 2004 — ang pinakamahusay sa record para sa fund, ahead ng bawat recovery half sa table. Ang 8.4% ng DIA ay nasa rank 4 sa 23. Basis, sinabi nang malinaw: regular-hours open-to-close sa loob ng bawat calendar first half, magkaparehong arithmetic bawat taon, upper bound na naka-pin sa dulo ng period na ito para hindi tahimik na lumaki ang comparison set kapag ang mga susunod na taon ay i-ingest.

Buwan-buwan

QueryAng kalahati, buwan-buwan (SPY at QQQ, parehong pag-compute sa isang query)
Ang eksaktong SQL sa likod ng bawat numero
SELECT toString(toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York')))) AS period_start, ticker,
    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
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY period_start, ticker
ORDER BY period_start, ticker

Ang hagdan ay umaangat nang bahagya, bumababa, bumababa, biglaang umaangat, umaangat, bumababa nang bahagya: si Abril ang magiging pivot ng semestre (SPY 9.9%, QQQ 14.8% — pinakamagandang buwan ng QQQ sa anim), at ang Hunyo ay tahimik na nagsara sa -1.2% para sa SPY. Ang sariling recap ng Hunyo, kasama ang paghahati ng breadth sa likod ng tahimik na numerong iyon, ay nasa dito. Pagbasa ng talahanayan buwan-buwan: halos patag ang pagbubukas ng taon (SPY 0.9% sa Enero), dahan-dahang bumababa sa Pebrero (-0.5%) at Marso (-4.2%), pagkatapos ay isang buwan lamang ang kailangan ni Abril para baligtarin ang daloy, pinahaba ito ng Mayo (4.9%), at humupa sa Hunyo. Tatlo sa anim na buwan ang negatibo — isang coin-flip na bilang ng buwan para sa isang semestre na matatag na nagtapos positibo, na siyang karaniwang hugis ng mga semestre ng equity at karapat-dapat tandaan kapag ang isang solong buwan ay tila isang hatol.

Mga rate: buong kurba, bawat maturity

Ang kurba ng Treasury ay nagtungo sa buong kalahating taon, hindi lumipat. Ang pinaka-una — ang mga maturity na malapit na sumusunod sa patakaran — halos walang galaw; ang two-year ay tumaas ng two-thirds ng isang percentage point; ang thirty-year ay halos hindi na rin napansin. Ipinapakita ng panel ang buong kurba, simula ng kalahating taon laban sa dulo.

QueryPitong maturity: yield sa simula ng half vs sa dulo, at ang change
Ang eksaktong SQL sa likod ng bawat numero
SELECT maturity, start_pct, end_pct, round((end_pct - start_pct) * 100, 0) AS change_bp FROM (
    SELECT '1-month' AS maturity, (SELECT round(argMin(yield_1_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_month)) AS start_pct, (SELECT round(argMax(yield_1_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_month)) AS end_pct, 1 AS o
    UNION ALL SELECT '3-month', (SELECT round(argMin(yield_3_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_3_month)), (SELECT round(argMax(yield_3_month, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_3_month)), 2
    UNION ALL SELECT '1-year', (SELECT round(argMin(yield_1_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_year)), (SELECT round(argMax(yield_1_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_1_year)), 3
    UNION ALL SELECT '2-year', (SELECT round(argMin(yield_2_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_2_year)), (SELECT round(argMax(yield_2_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_2_year)), 4
    UNION ALL SELECT '5-year', (SELECT round(argMin(yield_5_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_5_year)), (SELECT round(argMax(yield_5_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_5_year)), 5
    UNION ALL SELECT '10-year', (SELECT round(argMin(yield_10_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_10_year)), (SELECT round(argMax(yield_10_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_10_year)), 6
    UNION ALL SELECT '30-year', (SELECT round(argMin(yield_30_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_30_year)), (SELECT round(argMax(yield_30_year, date), 2) FROM global_markets.treasury_yields WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30') AND isNotNull(yield_30_year)), 7
) ORDER BY o

Basahin ang column ng pagbabago mula taas pababa at hindi maiiwasang makita ang twist: ang 1-month ay gumalaw ng -2 basis points sa loob ng anim na buwan habang ang 2-year ay tumaas ng 67 at ang 30-year ay 5 lamang. Ang parallel shift ay naglilipat ng bawat maturity nang magkasabay; ang kalahating taong ito ay gumalaw sa gitna ng kurba at ikinapit ang magkabilang dulo — ang mga short rate ay nakatigil malapit sa patakaran, ang mga long rate ay halos hindi na-reprice.

Ano ang ginawa nito sa slope

QueryMga slope receipt: simula, dulo, minimum — hindi kailanman nag-invert ang spread ngayong half
Ang eksaktong SQL sa likod ng bawat numero
SELECT
    round((argMin(yield_10_year - yield_2_year, date)) * 100, 0) AS start_bp,
    round((argMax(yield_10_year - yield_2_year, date)) * 100, 0) AS end_bp,
    round(min((yield_10_year - yield_2_year)) * 100, 0) AS min_bp,
    count() AS prints
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
  AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)

Ang short end na tumataas nang mas mabilis kaysa long end ang siyang kahulugan ng flattening: ang 2s10s spread ay bumaba mula 72 hanggang 30 basis points sa loob ng 124 na pag-print — at ang pinakamababang print nitong semestre ay 27, kaya ang curve ay lumapat nang hindi tuluyang nag-invert. Kung ang flatter curve ay "nangangahulugan" ng anumang bagay tungkol sa susunod ay isang forecast na, at ang talahanayang ito ay hindi nagbibigay ng forecast.

QueryAng 2s10s spread, bawat print ng half
Ang eksaktong SQL sa likod ng bawat numero
SELECT toString(date) AS d, round((yield_10_year - yield_2_year) * 100, 0) AS spread_2s10s_bp
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-01-01') AND date <= toDate('2026-06-30')
  AND isNotNull(yield_10_year) AND isNotNull(yield_2_year)
ORDER BY date

Ipinapakita ng pang-araw-araw na serye na ang flattening ay hindi isang kaganapan lamang kundi isang dahan-dahang paggalaw — 124 na pag-print ang lumalakad pababa sa buong semestre, kung saan nagsimula ang spread sa taon sa 72 basis points at natapos sa 30.

Mga sektor: ang pagkakawatak-watak na itinago ng index

Aling bahagi ng merkado ang talagang kumita sa kalahating taon? Ang labing-isang SPDR sector ETFs, hati at quarter na paghati, isang query.

QueryLabing-isang sector ETFs: H1 2026 return, Q1 at Q2 split, at H1 dollar volume
Ang eksaktong SQL sa likod ng bawat numero
SELECT ticker,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS h1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-03-31') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-01-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q1_return_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-30') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
         / argMinIf(toFloat64(open), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-04-01') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q2_return_pct,
    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 h1_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY ticker
ORDER BY ticker

Ang pagkakawatak-watak ang kwento: ang teknolohiya (XLK) ay natapos ang kalahating taon na pataas ng 30.8% — na may 42% na ikalawang quarter — habang ang communication services (XLC) ay natapos na -9.3%, isang spread na humigit-kumulang apatnapung percentage point sa pagitan ng pinakamahusay at pinakamasamang sektor sa anim na buwan. Ang pagmamay-ari ng "merkado" ay nangangahulugang pagmamay-ari ng parehong dulo nito. Ang enerhiya ang cautionary tale ng panel tungkol sa mahahabang window: ang XLE ay nagpakita ng malusog na 18.8% na kalahating taon — na binuo mula sa 36.9% na UNANG quarter na sinundan ng -11% na ikalawang quarter. Ito ang pinakamatibay na malaking sektor ng merkado sa quarter na bumagsak ang mga index, at kabilang sa pinakamahina nito sa quarter na sila ay bumangon. Ang financials (XLF) ay tumakbo ng parehong pelikula paatras: -9.9% sa Q1, pagkatapos 7.7% sa Q2. Ang isang solong H1 na numero ay pinapantay ang parehong round trips; ang quarter split ang tapat na tanaw.

Magkano ang gastos sa pag-trade ng bawat sektor

Ang return tables ay nasaan-man; ang quote tapes ay hindi. Sinusukat ng panel na ito ang median bid-ask spread ng bawat sector ETF sa loob ng isang buong representatibong session — 123 sessions sa kalahating ito, at ang June 29 ang sinusukat dito, na may label na ganon — mula sa bawat NBBO update sa araw na iyon.

QueryMedian quoted spread ayon sa sector ETF, isang representative session (June 29, 2026), regular hours
Ang eksaktong SQL sa likod ng bawat numero
SELECT ticker,
    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,
    round(count() / 1e6, 2) AS quote_updates_m,
    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 IN ('XLB', 'XLC', 'XLE', 'XLF', 'XLI', 'XLK', 'XLP', 'XLRE', 'XLU', 'XLV', 'XLY')
  AND sip_timestamp >= toDateTime64('2026-06-29 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-06-29 20:00:00', 9)
GROUP BY ticker
ORDER BY med_spread_bps

Ang bawat isa sa labing-isang quote ay nasa ilang basis points o mas mababa — ang pinakamura ay 0.62 bps (XLV), ang pinakamalawak ay 2.23 bps (XLRE) — na siyang praktikal na kahulugan ng "liquid ang sector ETFs": ang gastos sa pagpasok sa anumang sector view ay sinusukat sa mga daang bahagi ng isang porsyento. Para sa sukat laban sa mga individual stocks, ang June 29 deep-dive ay sumusukat sa spread ng isang thin name sa mga daang beses ng mga antas na ito, sa parehong session.

Lawak sa buong kalahati

Ang lawak sa kalahating sukat ay may dalawang butil dito. Ang magaspang na butil: nakapagtala ang SPY ng 64 up session laban sa 59 down session sa loob ng 123 ng kalahati — halos isang toss coin ng mga araw sa ilalim ng isang matatag na positibong kalahati, na siyang hitsura ng pag-akyat na mabagal mula sa pang-araw-araw na tape. Ang pinong butil — bawat ticker na binilang — ay nasa buwang sukat: ang split ng advancer/decliner ng Hunyo ay nasa ang recap ng Hunyo (mas maraming ticker ang bumagsak kaysa tumakas doon), at ang bilang sa hangganan ng quarter ay nasa ang recap ng Q2. Ang isang buong anim-na-buwang pag-scan ng advancer ng buong merkado ay lumalampas sa query budget na ginagawa ng pahinang ito; ang hangganang iyon ay ibinubunyag dito sa halip na tahimik na paliitin.

QuerySPY sessions up vs down sa buong half, isang murang receipt
Ang eksaktong SQL sa likod ng bawat numero
SELECT countIf(day_ret > 0) AS up_sessions,
       countIf(day_ret < 0) AS down_sessions,
       countIf(day_ret = 0) AS flat_sessions,
       count() AS sessions_total
FROM (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 2) AS day_ret
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= toDateTime('2026-01-01 00:00:00')
      AND window_start < toDateTime('2026-07-01 00:00:00')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
)

Ang options tape, buwan-buwan

Ang tanging makikita sa isang pahina ng anim na buwan: kung paano umunlad ang options tape mismo. Ang bawat panel sa ibaba ay isang buong-tape scan ng isang buwan — kabuuang volume ng kontrata, at ang bahagi na na-trade sa sariling araw ng pag-expire (0DTE). Ang kwento ng pagsusukat: tumakbo ang volume mula 1316.1 milyong kontrata noong Enero hanggang 1477.9 milyon noong Hunyo — ang pinakamatinding options month ng kalahating taon — at ang bahagi ng same-day-expiry ay tumaas mula 26.5% noong Enero hanggang 34.3% noong Hunyo, ang pinakamataas na buwan ng kalahating taon. Ang ikatlong bahagi ng options volume noong Hunyo ay na-trade sa mga kontratang nag-expire sa parehong araw na iyon.

QueryJanuary: whole-tape options contract volume at same-day-expiry share (isang scan)
Ang eksaktong SQL sa likod ng bawat numero
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-01-01 00:00:00')
  AND window_start < toDateTime('2026-02-01 00:00:00')
QueryFebruary: whole-tape options contract volume at same-day-expiry share (isang scan)
Ang eksaktong SQL sa likod ng bawat numero
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-02-01 00:00:00')
  AND window_start < toDateTime('2026-03-01 00:00:00')
QueryMarch: whole-tape options contract volume at same-day-expiry share (isang scan)
Ang eksaktong SQL sa likod ng bawat numero
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-03-01 00:00:00')
  AND window_start < toDateTime('2026-04-01 00:00:00')
QueryApril: whole-tape options contract volume at same-day-expiry share (isang scan)
Ang eksaktong SQL sa likod ng bawat numero
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-04-01 00:00:00')
  AND window_start < toDateTime('2026-05-01 00:00:00')
QueryMay: whole-tape options contract volume at same-day-expiry share (isang scan)
Ang eksaktong SQL sa likod ng bawat numero
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-05-01 00:00:00')
  AND window_start < toDateTime('2026-06-01 00:00:00')
QueryJune: whole-tape options contract volume at same-day-expiry share (isang scan)
Ang eksaktong SQL sa likod ng bawat numero
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
       round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
       uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-06-01 00:00:00')
  AND window_start < toDateTime('2026-07-01 00:00:00')

Ang halaga ng pag-trade, sinampling buwan-buwan

QuerySPY median quoted spread sa isang labeled sample session bawat buwan (second Wednesdays), bawat NBBO update
Ang eksaktong SQL sa likod ng bawat numero
SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session,
       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), 3) AS med_spread_bps,
       round(count() / 1e6, 2) AS quote_updates_m,
       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 = 'SPY'
  AND ((sip_timestamp >= toDateTime64('2026-01-14 14:30:00', 9) AND sip_timestamp < toDateTime64('2026-01-14 21:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-02-11 14:30:00', 9) AND sip_timestamp < toDateTime64('2026-02-11 21:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-03-11 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-03-11 20:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-04-15 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-04-15 20:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-05-13 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-05-13 20:00:00', 9))
    OR (sip_timestamp >= toDateTime64('2026-06-10 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-06-10 20:00:00', 9)))
GROUP BY session
ORDER BY session ASC

Ang median quoted spread ng SPY sa ikalawang Miyerkules ng bawat buwan: 0.145 bps sa sample ng Enero, 0.144 sa sample ng Pebrero, halos doble nito sa mga sample ng tagsibol, at 0.409 bps sa sample ng Hunyo — ang pinakamalawak sa anim. Batayan, inihayag: ang mga ito ay solong may-label na sample session (ang ikalawang Miyerkules ng bawat buwan), hindi buwanang medians — ang anim-na-buwang whole-quote-tape scan ay lumalampas sa query budget ng pahinang ito. Ang mga petsa ng sample ay nasa panel, at ang mga invalid na quote ay binibilang doon, hindi tahimik na tinatanggal.

Mga kapansin-pansing pangalan ng kalahating taon

Hindi pinili batay sa editoryal — sinusukat ang kapansin-pansin: ang set sa ibaba ay ang tuktok ng leaderboard ng dolyar-volume sa antas ng quarter, muling kinalkula dito para magdala ang pahinang ito ng sarili nitong resibo, at ang bawat pangalan na nakakuha ng deep-dive ay naka-link dito.

QueryQ2 regular-hours dollar volume, whole tape (isang reused-symbol listing ang hindi pa kasama pending entity verification)
Ang eksaktong SQL sa likod ng bawat numero
SELECT ticker,
    round(sum(toFloat64(close) * toFloat64(volume)) / 1e9, 1) AS dollar_bn,
    round(100 * sum(toFloat64(close) * toFloat64(volume)) / max(sum(toFloat64(close) * toFloat64(volume))) OVER (), 1) AS pct_of_leader
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= toDateTime('2026-04-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 dollar_bn DESC
LIMIT 8

MU ang mas maraming volume kaysa SPY sa ikalawang quarter ($2047.5 bilyon laban sa $2032 bilyon) — ang parehong resibo na dala ng Q2 recap. Para sa anim na solong pangalan sa leader set na iyon, ang kalahating taon:

QueryHalf at Q2 returns ng leader set plus half dollar volume — isang ticker-filtered query
Ang eksaktong SQL sa likod ng bawat numero
SELECT ticker,
    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 h1_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)
         / argMinIf(toFloat64(open), window_start, window_start >= toDateTime('2026-04-01 00:00:00') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q2_return_pct,
    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 h1_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('MU', 'NVDA', 'TSLA', 'SNDK', 'AMD', 'INTC')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY ticker
ORDER BY ticker

Ang memory-and-semiconductor complex ang may-ari ng kalahating taon: bumalik ang SNDK ng 830.1% sa anim na buwan, MU 290% — ang Hunyo nito ay sinuri tick by tick dito — at INTC 269.3%. Ang NVDA, ang pinakamalaking tape ng set sa $3287.9 bilyon na half-year turnover, ay bumalik ng 5.2% — single digits habang ang mga pangalan ng memory ay dumami; ang June deep-dive nito ay nagdadala ng divergence na iyon session by session. Ang TSLA ay ang nag-iisang decliner ng set sa -8.2%. Ang June mega-listing ay nakikipagkalakalan sa ilalim ng isang muling ginamit na simbolo at hindi kasama sa mga leader scan habang naghihintay ng entity verification — ang unang buwan nito ay may sariling post na resibo-by-resibo. Batayan: ang leader SET ay pinili batay sa Q2 regular-hours dollar volume (ang scan sa itaas); ang return columns ay sa kalahating taon, mula sa unang regular-hours open hanggang sa huling regular-hours close.

Ang alon ng IPO ng kalahating taon, buwan-buwan

QueryBagong listings bawat buwan sa buong half
Ang eksaktong SQL sa likod ng bawat numero
SELECT toString(toStartOfMonth(listing_date)) AS m, count() AS listings
FROM global_markets.stocks_ipos
WHERE listing_date >= toDate('2026-01-01') AND listing_date <= toDate('2026-06-30')
GROUP BY m
ORDER BY m

Nakauna at hindi pantay ang alon ng mga listahan: si Pebrero ang pinaka-abalang buwan ng kalahating taon na may 47 na listahan, at si Marso ang pinaka-tahimik na may 17 — ang tanyag na mega-listahan noong Hunyo ay dumating sa isang buwan na kung hindi man ay karaniwang volume (35 na listahan).

Ang kalendaryo ng kalahating taon

QueryCorporate calendar ng H1 2026 (lahat ng tatlong month-end filing-index gaps ay inihayag)
Ang eksaktong SQL sa likod ng bawat numero
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-01-01') AND ex_dividend_date <= toDate('2026-06-30')) AS ex_div_events,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= toDate('2026-01-01') AND execution_date <= toDate('2026-06-30')) AS splits,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-01-01') AND listing_date <= toDate('2026-06-30')) AS ipos,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date >= toDate('2026-01-01') AND filing_date <= toDate('2026-06-30')) AS h1_filings,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-03-31')) AS filings_mar31,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-04-30')) AS filings_apr30,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-06-30')) AS filings_jun30

205 na kompanya ang pumasok sa publiko sa kalahating taon — isang alon ng pag-listing na ang pinakamalaking debut noong Hunero ay may sariling post na naka-detalye bawat resibo — kasama ang 830 na split at 28356 na ex-dividend na kaganapan. Para sa sukat, iyan ay higit sa isang bagong listing bawat sesyon ng pag-trade sa buong kalahating taon. Ang kabuuang filing ay may tatlong disclosure: ang indeks ng SEC ay halos walang laman sa bawat katapusan ng buwan ng kalahating taon na ang huling araw ng kalendaryo ay weekday (55 filing na na-index noong Marso 31, 34 noong Abril 30, at 31 noong Hunero 30, laban sa libu-libo sa mga katabing araw), kaya ang bilang ng filing sa kalahating taon ay kulang hanggang sa mag-backfill ang feed — ang month-end gap ay may sariling diagnostic note.

Ang session receipt

Query123 sessions sa half, na-verify mula sa tape
Ang eksaktong SQL sa likod ng bawat numero
SELECT
    (SELECT uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')) AS h1_sessions

Mga tala sa data

Buong mga tala sa data
  • Ang short interest ay nagtatapos sa June 15 settlement ayon sa oras ng pagbuo (end-of-June print ay pending — buong disclosure sa June recap; ang post na ito ay magre-regenerate kapag dumating na).
  • Tatlong 2026 month-end filing-index days ay halos walang laman (March 31, April 30, June 30 — bawat month-end ng kalahating taon na ang huling araw ng kalendaryo ay weekday); na-disclose inline kasama ang mga bilang, na-diagnose sa the month-end gap note. Ang mga month-end ng nakaraang taon ay may libu-libong filings, kaya ito ay feed gap, hindi filing holiday.
  • Ang leaderboard sa half scale ay bounded: ang six-month market-wide scan ay lumalampas sa query budget na ginagawa ng page na ito, kaya ang notable-names set ay pinili ayon sa quarter-scale leader scan na ipinapakita inline, at ang returns ng kalahating taon ay kinakalkula para sa fixed set na iyon — ang basis ay sinasabi kung saan ito ginagamit. Ang Q2 at June recaps ay may buong leader tables sa kanilang mga scale.
  • Ang whole-market breadth sa half scale ay naka-bound din — ang day-grain split ay ipinapakita; ang ticker-grain counts ay nasa month at quarter scale, na-link sa breadth section.
  • Ang QQQ history series ay mas maikli kaysa SPY's: ang fund ay nag-trade sa ibang root symbol sa loob ng ilang taon; ang session-count guard ay visible na nag-eexclude sa mga taong iyon (ang per-year session counts ay nasa table).
  • Ang anim na options panels ay whole-tape monthly scans at ang spread trend ay nag-sample ng isang labeled session bawat buwan — parehong tumatakbo sa batch path; ang sample bases ay sinasabi inline.
  • Ang microstructure ay nasa June 29 deep-dive.

Metodolohiya

  • Ang saklaw ay Enero 1 – Hunyo 30, 2026 — 123 na sesyon, beripikado mula sa mga na-obserbahang bar. Ang mga return ay unang regular-hours open hanggang last regular-hours close sa loob ng bawat window, lahat ay kinuwenta sa parehong mga query na ipinakita.
  • Ang mga makasaysayang paghahambing ay muling kinukwenta LIVE laban sa buong minutong kasaysayan sa oras ng pagbuha — hindi kailanman binabasa mula sa mga nakaimbak na halaga. Pag-verify ng lalim: ang pinakaunang minute-bar na petsa sa delayed view na ginamit dito ay tumutugma sa base table (Setyembre 2003), tiningnan sa pagbuha, kaya ang unang kumpletong unang kalahati na nasa file ay ang 2004. Bawat query sa kasaysayan ay naka-pin ang upper bound sa katapusan ng panahong ito (ang comparison set ay hindi maaaring lumaki kapag ang mga susunod na taon ay na-ingest) at nag-aaplay ng minimum-session guard na may ipinapakitang bilang ng sesyon kada taon.
  • Ang mga timestamp ay nakaimbak sa UTC na may raw UTC bounds. Ang mga multi-year history block ay nagfi-filter ng regular hours sa Eastern wall clock (9:30–15:59, kino-convert kada row — ang tanging DST-safe na kumbensyon sa mga dekada); ang mga single-window block sa EDT-only na saklaw ay gumagamit ng katumbas na raw-UTC band. Parehong kumbensyon ay nakasaad dito.
  • Ang pagbuha ay dumadaan sa gated read-only na daanan; ang pampublikong pahina ay hindi kailanman nag-q-query nang live. Estado ng warehouse mula Hulyo 5, 2026.

Ito ang unang edisyon ng standing semiannual recap; ang full-year na edisyon ay susunod sa Enero. Detalye ng quarter: Q2 2026. Ang mga macro release na kinakalaban ng kalahati ay nasa the macro picture.