Strasmore Research
Market Recap

Rekap Pasar H1 2026

Matt ConnorBy Matt Connor Updated 2026-07-25

Paruh pertama tahun dua ribu dua puluh enam terdiri dari dua kondisi pasar yang berbeda: kuartal pertama di mana setiap ETF indeks utama turun atau stagnan, dan kuartal kedua yang memperbaiki kondisi tersebut. SPY mengakhiri paruh tahun dengan kenaikan 8.8%; QQQ naik 18.7%; dan 21.3% milik IWM merupakan paruh pertama terbaik yang pernah tercatat untuk ETF small-cap dalam data kami — buktinya ada di bawah, dihitung ulang terhadap setiap tahun sebelumnya dalam satu query. Pasar suku bunga menunjukkan tren tersendiri: spread 2s10s mendatar dari 72 basis point menjadi 30 sepanjang paruh tahun tanpa pernah mengalami inversi. Halaman ini adalah buku besar lengkap untuk paruh tahun ini — papan skor, peringkat historis, tangga bulanan, seluruh yield curve berdasarkan maturitas, sebelas sektor, evolusi bulanan dari data opsi, dan saham-saham individu yang menonjol pada paruh tahun ini. Setiap angka di sini adalah hasil query tersimpan; perluas panel apa pun untuk melihat SQL.

Hasil semester ini

QueryH1 2026: return half, Q1, dan Q2 untuk empat index ETF — dihitung dalam satu query
SQL tepat di balik setiap angka
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

Pembagian dua kuartal menjadi bentuk utama semester ini: SPY -5.2% kemudian 14.1%; QQQ -6.9% kemudian 26.5%. IWM menjadi pemimpin yang tenang pada semester ini di angka 21.3% — small caps mengalahkan setiap indeks large-cap selama enam bulan tersebut. Detail kuartalan tersedia di rekap Q2. Catatan mengenai aritmatika semester: 8.8% SPY untuk enam bulan jauh lebih rendah daripada Q2 saja, karena semester ini menghubungkan drawdown dan pemulihan — penggabungan -5.2% dan 14.1% menghasilkan angka yang tertera pada tabel, dan setiap tajuk 'return semester pertama' secara tersirat mencakup seluruh siklus tersebut.

Perbandingan semester pertama terhadap seluruh data historis

Apakah 8.8% semester pertama tergolong tidak biasa? Panel di bawah ini menghitung ulang return semester pertama yang SAMA — dari pembukaan jam reguler pertama hingga penutupan jam reguler terakhir, Januari hingga Juni — untuk setiap tahun dalam riwayat data per menit, dalam satu query per pasangan ETF dengan perhitungan aritmatika yang identik untuk setiap tahun, kemudian mengurutkan semester ini terhadap sisanya. Tanggal paling awal dari data per menit diverifikasi dalam metodologi di bawah; semester pertama lengkap pertama yang tercatat adalah yang disebutkan dalam tanda terima.

QuerySetiap first half pada tape: SPY dan QQQ, dihitung ulang secara identik per tahun (jumlah sesi per tahun ditampilkan)
SQL tepat di balik setiap angka
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
QueryPeringkat: half ini dibandingkan dengan setiap half sebelumnya (SPY dan QQQ; rank 1 = terbaik; self-excluded)
SQL tepat di balik setiap angka
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

8.8% milik SPY menempati peringkat 6 dari 23 semester pertama sejak 2004 (peringkat satu = terbaik) — berada di sepertiga atas, bukan sebuah rekor. 18.7% milik QQQ menempati peringkat 3 dari 16 semester yang sebanding — seri QQQ lebih pendek — dana tersebut diperdagangkan dengan simbol akar yang berbeda selama beberapa tahun — dan tahun apa pun dengan kurang dari seratus sesi semester pertama untuk suatu simbol dikecualikan oleh penjaga jumlah sesi yang ditampilkan dalam tabel, sehingga pengecualian terlihat dan tidak tersembunyi.

QuerySetiap first half pada tape: DIA dan IWM, aritmetika yang sama
SQL tepat di balik setiap angka
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
QueryPeringkat: DIA dan IWM dibandingkan dengan setiap first half sebelumnya (rank 1 = terbaik; self-excluded)
SQL tepat di balik setiap angka
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

Baris small-cap adalah sorotan utama semester ini: IWM menempati peringkat 1 dari 23 semester pertama sejak 2004 — yang terbaik dalam catatan untuk dana tersebut, melampaui setiap semester pemulihan dalam tabel. 8.4% milik DIA menempati peringkat 4 dari 23. Basis, dinyatakan secara jelas: pembukaan-ke-penutupan jam reguler dalam setiap semester pertama kalender, aritmatika yang identik setiap tahun, batas atas dipatok pada akhir periode ini sehingga set perbandingan tidak dapat bertambah secara tersembunyi saat tahun-tahun berikutnya dimasukkan.

Bulan demi bulan

QueryReturn half, bulan demi bulan (SPY dan QQQ, dihitung ulang secara identik dalam satu query)
SQL tepat di balik setiap angka
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

Pergerakan pasar naik sedikit, turun, turun, naik tajam, naik, lalu turun sedikit. April menjadi titik balik semester ini (SPY 9.9%, QQQ 14.8% — bulan terbaik QQQ dari enam bulan tersebut). Juni menutup semester ini dengan tenang pada -1.2% untuk SPY. Rekapitulasi bulan Juni, dengan rincian breadth split di balik angka tersebut, tersedia di sini. Berdasarkan tabel bulan demi bulan: tahun ini dibuka hampir datar (SPY 0.9% pada Januari), menurun selama Februari (-0.5%) dan Maret (-4.2%). Kemudian April membalikkan tren tersebut dalam satu bulan, Mei melanjutkannya (4.9%), dan Juni melandai. Tiga dari enam bulan bernilai negatif. Ini adalah jumlah bulan yang terbagi rata untuk semester yang berakhir positif secara solid. Hal ini merupakan pola umum dari semester ekuitas dan perlu diingat ketika satu bulan dianggap sebagai hasil akhir.

Suku Bunga: seluruh kurva, berdasarkan maturitas

Kurva Treasury menghabiskan semester ini dengan mengalami twisting, bukan shifting. Bagian paling depan — maturitas yang paling mengikuti kebijakan — hampir tidak bergerak; tenor dua tahun naik dua pertiga percentage point; tenor tiga puluh tahun hampir tidak terpengaruh. Panel ini menyajikan seluruh kurva, antara awal semester dibandingkan dengan akhir semester.

QueryTujuh maturity: yield pada awal half vs akhir, dan perubahannya
SQL tepat di balik setiap angka
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

Baca kolom perubahan dari atas ke bawah dan twist tersebut terlihat jelas: tenor 1-month bergerak -2 basis points dalam enam bulan sementara tenor 2-year naik 67 dan tenor 30-year hanya 5. Parallel shift menggerakkan setiap maturitas secara bersamaan; semester ini menggerakkan bagian tengah kurva dan menahan kedua ujungnya — short rates tertambat di dekat policy, long rates hampir tidak mengalami repriced.

Dampak terhadap kemiringan kurva

QuerySlope: awal, akhir, minimum — spread tidak pernah inverted pada half ini
SQL tepat di balik setiap angka
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)

Kenaikan tenor pendek yang lebih cepat daripada tenor panjang adalah definisi dari flattening: 2s10s spread menurun dari 72 menjadi 30 basis point selama 124 pencatatan — dan angka terendahnya pada semester ini adalah 27, sehingga kurva mendatar tanpa pernah mengalami inversi. Apakah kurva yang lebih datar "berarti" sesuatu tentang apa yang akan terjadi selanjutnya adalah sebuah prediksi, dan tabel ini tidak membuat prediksi.

QuerySpread 2s10s, setiap print pada half ini
SQL tepat di balik setiap angka
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

Seri harian menunjukkan bahwa flattening bukan merupakan satu peristiwa tunggal melainkan proses penurunan bertahap — 124 pencatatan yang menurun sepanjang semester, dengan spread dimulai tahun ini pada 72 basis point dan berakhir pada 30.

Sektor: dispersi yang tersembunyi oleh indeks

Bagian pasar mana yang sebenarnya menghasilkan uang selama semester ini? Sebelas SPDR sector ETF, dibagi per semester dan kuartal, dalam satu kueri.

QuerySebelas sector ETF: return H1 2026, split Q1 dan Q2, serta dollar volume H1
SQL tepat di balik setiap angka
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

Dispersi adalah poin utamanya: teknologi (XLK) mengakhiri semester dengan kenaikan 30.8% — dengan hasil 42% pada kuartal kedua — sementara communication services (XLC) berakhir di -9.3%, dengan spread sekitar empat puluh percentage points antara sektor terbaik dan terburuk dalam enam bulan. Memiliki "pasar" berarti memiliki kedua ujung tersebut. Energy adalah peringatan dalam panel ini mengenai jendela waktu yang panjang: XLE menunjukkan hasil semester yang sehat sebesar 18.8% — dibangun dari 36.9% pada kuartal pertama yang diikuti oleh -11% pada kuartal kedua. Sektor ini merupakan sektor besar terkuat di pasar pada kuartal saat indeks turun, dan termasuk yang terlemah pada kuartal saat indeks pulih. Financials (XLF) mengalami hal yang sebaliknya: -9.9% pada Q1, kemudian 7.7% pada Q2. Satu angka H1 meratakan kedua perjalanan tersebut; pembagian kuartal adalah pandangan yang jujur.

Biaya perdagangan setiap sektor

Tabel return tersedia di mana-mana; namun data quote tidak. Panel ini mengukur median bid-ask spread setiap ETF sektor selama satu sesi representatif penuh — 123 sesi dalam periode setengah tahun, dan 29 Juni adalah sesi yang diukur di sini, sesuai labelnya — dari setiap update NBBO pada hari tersebut.

QueryMedian quoted spread per sector ETF, satu sesi representatif (29 Juni 2026), regular hours
SQL tepat di balik setiap angka
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

Setiap satu dari sebelas quote berada pada beberapa basis point atau kurang — yang termurah sebesar 0.62 bps (XLV), yang terlebar sebesar 2.23 bps (XLRE) — yang merupakan makna praktis dari "ETF sektor bersifat likuid": biaya untuk mengambil posisi pada sektor apa pun diukur dalam seperseratus persen. Sebagai skala perbandingan dengan saham individual, analisis mendalam 29 Juni mengukur spread nama saham yang tidak likuid pada ratusan kali level ini, pada sesi yang sama.

Breadth selama semester ini

Breadth pada skala semester hadir dalam dua tingkatan di sini. Tingkatan kasar: SPY mencatat 64 sesi naik berbanding 59 sesi turun dari total 123 hari selama semester ini — hampir seperti lemparan koin di tengah hasil semester yang positif kuat, yang menunjukkan karakteristik kenaikan bertahap jika dilihat dari data harian. Tingkatan halus — di mana setiap ticker dihitung — berada pada skala bulanan: pembagian advancer/decliner bulan Juni ada di rekap Juni (lebih banyak ticker yang turun daripada naik), dan hitungan batas kuartal ada di rekap Q2. Pemindaian advancer seluruh pasar untuk satu periode enam bulan melampaui anggaran query yang tersedia untuk halaman ini; batasan tersebut diungkapkan di sini daripada dipersempit secara diam-diam.

QuerySesi SPY naik vs turun selama half ini, satu receipt sederhana
SQL tepat di balik setiap angka
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
)

Rekaman opsi, bulan demi bulan

Apa yang hanya bisa ditunjukkan oleh halaman setengah tahunan: bagaimana rekaman opsi itu sendiri berkembang. Setiap panel di bawah ini adalah satu pemindaian seluruh rekaman dalam satu bulan — total volume kontrak, dan pangsa yang diperdagangkan pada hari kedaluwarsanya sendiri (0DTE). Data yang terukur: volume berjalan dari 1316.1 juta kontrak pada Januari menjadi 1477.9 juta pada Juni — bulan opsi tersibuk di semester ini — dan pangsa kedaluwarsa hari yang sama naik dari 26.5% pada Januari menjadi 34.3% pada Juni, bulan tertinggi di semester ini. Sepertiga dari volume opsi Juni diperdagangkan pada kontrak yang kedaluwarsa pada hari yang sama.

QueryJanuari: volume kontrak options whole-tape dan pangsa same-day-expiry (satu scan)
SQL tepat di balik setiap angka
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')
QueryFebruari: volume kontrak options whole-tape dan pangsa same-day-expiry (satu scan)
SQL tepat di balik setiap angka
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')
QueryMaret: volume kontrak options whole-tape dan pangsa same-day-expiry (satu scan)
SQL tepat di balik setiap angka
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: volume kontrak options whole-tape dan pangsa same-day-expiry (satu scan)
SQL tepat di balik setiap angka
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')
QueryMei: volume kontrak options whole-tape dan pangsa same-day-expiry (satu scan)
SQL tepat di balik setiap angka
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')
QueryJuni: volume kontrak options whole-tape dan pangsa same-day-expiry (satu scan)
SQL tepat di balik setiap angka
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')

Biaya perdagangan, sampel bulanan

QueryMedian quoted spread SPY pada satu sesi sampel berlabel per bulan (Rabu kedua), setiap update NBBO
SQL tepat di balik setiap angka
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

Median quoted spread SPY pada hari Rabu kedua setiap bulan: 0.145 bps pada sampel Januari, 0.144 pada Februari, kira-kira dua kali lipat jumlah tersebut melalui sampel musim semi, dan 0.409 bps pada sampel Juni — yang terlebar dari keenamnya. Basis pengungkapan: ini adalah sesi sampel label tunggal (hari Rabu kedua setiap bulan), bukan median selama satu bulan penuh — pemindaian seluruh quote-tape selama enam bulan melampaui anggaran query halaman ini. Tanggal sampel tersedia di panel, dan kuotasi yang tidak valid dihitung di sana, tidak dihapus secara diam-diam.

Nama-nama terkemuka semester ini

Keterkemukan yang terukur, bukan pilihan editorial: kumpulan di bawah ini adalah papan peringkat volume dolar skala kuartalan tertinggi, dihitung ulang di sini agar halaman ini memiliki datanya sendiri, dan setiap nama yang mendapatkan analisis mendalam tertaut ke sana.

QueryDollar volume regular-hours Q2, whole tape (satu listing reused-symbol dikecualikan menunggu verifikasi entitas)
SQL tepat di balik setiap angka
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 diperdagangkan lebih banyak daripada SPY sepanjang kuartal kedua ($2047.5 miliar berbanding $2032 billion) — data yang sama dengan yang tercantum dalam rekap Q2. Untuk enam nama tunggal dalam kumpulan pemimpin tersebut, hasilnya selama semester ini:

QueryReturn half dan Q2 set leader ditambah dollar volume half — satu query filter-ticker
SQL tepat di balik setiap angka
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

Kompleks memori dan semikonduktor mendominasi semester ini: SNDK memberikan return 830.1% dalam enam bulan, MU 290% — analisis Juni-nya dibedah per tick di sini — dan INTC 269.3%. NVDA, dengan volume perdagangan terbesar dalam kumpulan ini sebesar $3287.9 miliar turnover semesteran, memberikan return 5.2% — angka satu digit sementara nama-nama memori berlipat ganda; analisis mendalam Juni-nya menyajikan divergensi tersebut sesi demi sesi. TSLA adalah satu-satunya penurunan dalam kumpulan ini sebesar -8.2%. Listing besar bulan Juni diperdagangkan di bawah simbol yang digunakan kembali dan dikecualikan dari pemindaian pemimpin menunggu verifikasi entitas — bulan pertamanya memiliki postingan data tersendiri. Basis: KUMPULAN pemimpin dipilih berdasarkan volume dolar jam reguler Q2 (pemindaian di atas); kolom return adalah hasil semesteran, dari pembukaan jam reguler pertama hingga penutupan jam reguler terakhir.

Gelombang IPO semester ini, bulan demi bulan

QueryListing baru per bulan selama half ini
SQL tepat di balik setiap angka
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

Gelombang pencatatan saham terjadi lebih awal dan tidak merata: Februari menjadi bulan tersibuk di semester ini dengan 47 pencatatan dan Maret menjadi yang paling sepi dengan 17 — mega-listing Juni yang terkenal terjadi pada bulan dengan volume yang biasanya biasa saja (35 pencatatan).

Kalender semester ini

QueryKalender korporasi H1 2026 (semua tiga gap filing-index akhir bulan diungkapkan)
SQL tepat di balik setiap angka
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 perusahaan melakukan IPO pada semester ini — gelombang pencatatan yang debut terbesarnya pada bulan Juni memiliki artikel terpisah untuk setiap tanda terima — bersamaan dengan 830 stock split dan 28356 peristiwa ex-dividend. Sebagai skala, jumlah ini berarti lebih dari satu pencatatan baru per sesi perdagangan selama semester ini. Total pengajuan dokumen membawa tiga pengungkapan: indeks SEC hampir kosong pada setiap akhir bulan di semester ini yang hari kalender terakhirnya adalah hari kerja (55 pengajuan terindeks pada tiga puluh satu Maret, 34 pada tiga puluh April, dan 31 pada tiga puluh Juni, dibandingkan dengan ribuan pengajuan pada hari-hari di sekitarnya), sehingga jumlah pengajuan semesteran menjadi lebih rendah dari seharusnya sampai data terisi kembali — celah akhir bulan memiliki catatan diagnostik tersendiri.

Tanda terima sesi

Query123 sesi dalam half ini, diverifikasi dari tape
SQL tepat di balik setiap angka
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

Catatan data

Catatan data lengkap
  • Short interest berakhir pada settlement 15 Juni saat pembuatan (cetakan akhir Juni tertunda — pengungkapan lengkap ada di rekap Juni; postingan ini akan diperbarui saat data tersedia).
  • Tiga hari indeks pelaporan akhir bulan 2026 hampir kosong (31 Maret, 30 April, 30 Juni — setiap akhir bulan pada semester ini yang hari kalender terakhirnya adalah hari kerja); diungkapkan secara inline bersama jumlah hitungan, didiagnosis dalam catatan celah akhir bulan. Akhir bulan tahun sebelumnya memiliki ribuan pelaporan, jadi ini adalah celah feed, bukan hari libur pelaporan.
  • Leaderboard pada skala semester dibatasi: pemindaian seluruh pasar selama enam bulan melebihi anggaran query yang dihasilkan halaman ini, sehingga set nama terkemuka dipilih berdasarkan pemindaian leader skala kuartal yang ditampilkan secara inline, dan return semester dihitung untuk set tetap tersebut — basisnya dinyatakan di tempat penggunaan. Rekap Q2 dan Juni memuat tabel leader lengkap pada skala masing-masing.
  • Breadth seluruh pasar pada skala semester juga dibatasi — split grain harian ditampilkan; hitungan grain ticker tersedia pada skala bulan dan kuartal, tertaut di bagian breadth.
  • Seri riwayat QQQ lebih pendek daripada SPY: dana tersebut diperdagangkan dengan simbol root yang berbeda selama beberapa tahun; guard hitungan sesi mengecualikan tahun-tahun tersebut secara terlihat (hitungan sesi per tahun ada di tabel).
  • Enam panel opsi adalah pemindaian bulanan whole-tape dan tren spread mengambil sampel satu sesi berlabel per bulan — keduanya berjalan pada jalur batch; basis sampel dinyatakan secara inline.
  • Microstructure tersedia di deep-dive 29 Juni.

Metodologi

  • Periode yang digunakan adalah 1 Januari – 30 Juni 2026 — 123 sesi, diverifikasi dari bar yang teramati. Return dihitung dari harga open jam reguler pertama hingga close jam reguler terakhir dalam setiap jendela, semuanya dikomputasi dalam kueri yang sama seperti yang ditampilkan.
  • Perbandingan historis dikomputasi ulang secara LIVE terhadap seluruh riwayat menit pada saat pembuatan — tidak pernah membaca dari nilai yang tersimpan. Verifikasi kedalaman: tanggal bar menit paling awal dalam tampilan tertunda yang digunakan di sini sesuai dengan tabel dasar (September 2003), diperiksa saat penulisan, sehingga semester pertama lengkap pertama yang tersedia dalam berkas adalah tahun 2004. Setiap kueri riwayat menetapkan batas atas pada akhir periode ini (set perbandingan tidak dapat bertambah saat tahun-tahun berikutnya dimasukkan) dan menerapkan pengaman sesi minimum dengan jumlah sesi per tahun yang ditampilkan.
  • Timestamp disimpan dalam UTC dengan batas UTC mentah. Blok riwayat multi-tahun memfilter jam reguler berdasarkan jam dinding Eastern (9:30–15:59, dikonversi per baris — satu-satunya konvensi yang aman terhadap DST selama beberapa dekade); blok jendela tunggal dalam rentang EDT-saja menggunakan pita UTC mentah yang setara. Kedua konvensi tersebut dinyatakan di sini.
  • Pembuatan berjalan melalui jalur read-only yang terproteksi; halaman publik tidak pernah melakukan kueri secara live. Status warehouse per 5 Juli 2026.

Ini adalah edisi pertama dari rekap semesteran rutin; edisi tahunan penuh akan menyusul pada bulan Januari. Detail kuartal: Q2 2026. Rilis makro yang menjadi acuan perdagangan semester ini terdapat dalam gambaran makro.