Pierwsza połowa 2026 roku składała się z dwóch różnych rynków: pierwszego kwartału, w którym wszystkie główne indeksy ETF odnotowały spadki lub brak zmian, oraz drugiego kwartału, który w pełni zrekompensował te wyniki. SPY zakończył półrocze wzrostem o 8.8%; QQQ wzrósł o 18.7%; natomiast 21.3% dla IWM był najlepszym pierwszym półroczem, jakie ten ETF spółek o małej kapitalizacji odnotował w naszych danych — zestawienie znajduje się poniżej, po przeliczeniu względem wszystkich poprzednich lat w jednym zapytaniu. Rynek stóp procentowych przedstawił własną analizę: spread 2s10s uległ spłaszczeniu z 72 punktów bazowych do 30 w ciągu półrocza, nigdy nie przechodząc w stan inwersji. Niniejsza strona stanowi pełne rozliczenie półrocza — zawiera zestawienie wyników, ranking historyczny, miesięczne zestawienie, pełną krzywą rentowności według terminów zapadalności, jedenaście sektorów, miesięczną ewolucję rynku opcji oraz najważniejsze pojedyncze walory z tego okresu. Każda liczba jest wynikiem zapytania SQL; aby zobaczyć kod, należy rozwinąć dowolny panel.
Wyniki półrocza
Dokładny kod SQL dla każdej liczby
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 tickerPodział na dwa kwartały definiuje kształt półrocza: SPY -5.2%, a następnie 14.1%; QQQ -6.9%, a następnie 26.5%. IWM był cichym liderem półrocza w 21.3% — spółki o małej kapitalizacji wyprzedziły każdy indeks typu large-cap w ciągu tych sześciu miesięcy. Szczegółowe dane kwartalne znajdują się w podsumowaniu Q2. Uwaga dotycząca obliczeń półrocznych: półroczna rentowność SPY wynosząca 8.8% jest znacznie niższa niż sama rentowność za Q2, ponieważ półrocze obejmuje zarówno spadek, jak i odbicie — skumulowane wyniki -5.2% oraz 14.1% odpowiadają danym w tabeli, a każdy nagłówek dotyczący „zysku z pierwszego półrocza” w rzeczywistości zawiera w sobie cały ten cykl.
Pierwsza połowa roku względem wszystkich pozostałych okresów
Czy 8.8% połowa roku jest nietypowa? Poniższe panele ponownie obliczają TEN SAM zwrot z pierwszej połowy roku — od otwarcia do zamknięcia w godzinach sesyjnych, od stycznia do czerwca — dla każdego roku z historii z dokładnością co do minuty. Obliczenia są wykonywane w jednym zapytaniu dla każdej pary ETF przy zastosowaniu identycznej arytmetyki dla każdego roku, a następnie ta połowa jest zestawiana z pozostałymi. Najwcześniejsza data w danych minutowych została zweryfikowana w poniższej metodologii; pierwsza pełna pierwsza połowa roku w bazie danych to ta, którą wskazują dane.
Dokładny kod SQL dla każdej liczby
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 ASCDokładny kod SQL dla każdej liczby
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 ASC8.8% dla SPY zajmuje 6 miejsce w 23 pierwszych połowach roku od 2004 (miejsce 1 = najlepsze) — jest to górna trzecia, a nie rekord. 18.7% dla QQQ zajmuje 3 miejsce w 16 porównywalnych połowach — seria QQQ jest krótsza — fundusz przez pewien czas był notowany pod innym symbolem bazowym — a każdy rok z mniej niż stu sesjami pierwszej połowy roku dla danego symbolu jest wykluczany przez mechanizm kontroli liczby sesji widoczny w tabeli, zatem wykluczenia są jawne.
Dokładny kod SQL dla każdej liczby
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 ASCDokładny kod SQL dla każdej liczby
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 ASCWiersz dla spółek o małej kapitalizacji stanowi główny temat: IWM zajmuje 1 miejsce w 23 pierwszych połowach roku od 2004 — jest to najlepszy wynik w historii funduszu, wyprzedzający wszystkie okresy odbicia w tabeli. 8.4% dla DIA zajmuje 4 miejsce w 23. Podstawa metodologii: zwrot od otwarcia do zamknięcia w godzinach sesyjnych w ramach każdej pierwszej połowy roku kalendarzowego, identyczna arytmetyka dla każdego roku, górna granica ustalona na koniec tego okresu, aby zestaw porównawczy nie powiększał się niejawnie po przetworzeniu późniejszych lat.
Miesiąc po miesiącu
Dokładny kod SQL dla każdej liczby
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, tickerWykres wykazuje zmienność: niewielki wzrost, następnie spadki, gwałtowny wzrost, kolejne wzrosty i niewielki spadek. Kwiecień stanowił punkt zwrotny półrocza (SPY 9.9%, QQQ 14.8% — najlepszy miesiąc dla QQQ w tym półroczu), a czerwiec zakończył okres spokojnym wynikiem na poziomie -1.2% dla SPY. Podsumowanie czerwca wraz z analizą szerokości rynku przy tym wyniku znajduje się tutaj. Analiza tabeli w ujęciu miesięcznym: rok rozpoczął się niemal bez zmian (SPY 0.9% w styczniu), odnotowano spadki w lutym (-0.5%) oraz marcu (-4.2%), po czym kwiecień odwrócił trend w ciągu jednego miesiąca, maj kontynuował wzrosty (4.9%), a czerwiec przyniósł lekkie osłabienie. Trzy z sześciu miesięcy zakończyły się spadkami — taki rozkład przypada na półrocze, które zamknęło się na wyraźnym plusie. Jest to typowy przebieg dla półroczy na rynku akcji, co należy brać pod uwagę, gdy pojedynczy miesiąc wydaje się ostatecznym rozstrzygnięciem.
Stopy procentowe: cała krzywa, termin zapadalności po terminie zapadalności
Krzywa obligacji skarbowych w ciągu półrocza uległa wygięciu, a nie przesunięciu. Najkrótszy koniec krzywej — terminy najbardziej powiązane z polityką pieniężną — niemal nie zmienił wartości; rentowność dwóch lat wzrosła o dwie trzecie punktu procentowego, natomiast trzydziestoletnia niemal nie uległa zmianie. Zestawienie przedstawia całą krzywą, porównując początek półrocza z jego końcem.
Dokładny kod SQL dla każdej liczby
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 oAnaliza kolumny zmian od góry do dołu jednoznacznie wskazuje na wygięcie: termin jednomiesięczny zmienił się o -2 punktów bazowych w ciągu sześciu miesięcy, podczas gdy termin dwuletni wzrósł o 67, a trzydziestoletni o zaledwie 5. Przesunięcie równoległe powoduje jednoczesną zmianę wszystkich terminów zapadalności; w tym półroczu nastąpiło wygięcie środkowej części krzywej przy jednoczesnym unieruchomieniu obu jej końców — krótkoterminowe stopy pozostały blisko poziomu polityki pieniężnej, natomiast długoterminowe stopy niemal nie uległy wycenie.
Wpływ na nachylenie krzywej
Dokładny kod SQL dla każdej liczby
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)Spadek rentowności obligacji o krótkim terminie zapadalności szybciej niż obligacji o długim terminie zapadalności stanowi proces spłaszczania krzywej: spread 2s10s obniżył się z 72 do 30 punktów bazowych w kolejnych odczytach 124 — najniższy odczyt w półroczu wyniósł 27, zatem krzywa uległa spłaszczeniu bez wystąpienia inwersji. To, czy spłaszczona krzywa ma jakiekolwiek znaczenie dla przyszłych trendów, jest prognozą, a niniejsza tabela nie zawiera prognoz.
Dokładny kod SQL dla każdej liczby
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 dateSzereg dzienny wskazuje, że spłaszczanie nie było pojedynczym zdarzeniem, lecz procesem — odczyty 124 systematycznie spadały w ciągu półrocza, przy czym spread na początku roku wynosił 72 punktów bazowych, a na koniec 30.
Sektory: rozproszenie ukryte przez indeks
Które części rynku wygenerowały zysk w półroczu? Jeden zapytanie obejmuje jedenaście funduszy ETF na sektory SPDR, z podziałem na półrocze i kwartały.
Dokładny kod SQL dla każdej liczby
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 tickerKluczowym elementem jest rozproszenie: sektor technologiczny (XLK) zakończył półrocze wzrostem o 30.8% — przy 42% w drugim kwartale — podczas gdy sektor usług komunikacyjnych (XLC) zakończył z wynikiem -9.3%. Różnica między najlepszym a najsłabszym sektorem w ciągu sześciu miesięcy wyniosła około czterdziestu punktów procentowych. Posiadanie "rynku" oznaczało ekspozycję na oba te skrajne wyniki. Sektor energetyczny (XLE) stanowi ostrzeżenie dotyczące długich okresów trendu: wykazał on zdrowy wzrost o 18.8% w półroczu — zbudowany z 36.9% w pierwszym kwartale, po którym nastąpił -11% w drugim. Był to najsilniejszy duży sektor rynku w kwartale, w którym indeksy spadały, oraz jeden z najsłabszych w kwartale, w którym nastąpiło odbicie. Sektor finansowy (XLF) wykazał odwrotny trend: -9.9% w Q1, a następnie 7.7% w Q2. Pojedyncza wartość za pierwsze półrocze zaciera oba te cykle; podział na kwartały przedstawia rzetelny obraz sytuacji.
Koszty handlu w poszczególnych sektorach
Tabele stóp zwrotu są powszechne; bezpośrednie notowania nie. Niniejszy panel mierzy medianę spreadu bid-ask dla każdego sektora ETF w ciągu jednej pełnej sesji reprezentatywnej — 123 sesji w półroczu, przy czym analizowane dane pochodzą z 29 czerwca — na podstawie każdej aktualizacji NBBO tego dnia.
Dokładny kod SQL dla każdej liczby
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_bpsWszystkie jedenaście ofert mieści się w granicach kilku punktów bazowych lub mniej — najniższa wynosi 0.62 bps (XLV), a najwyższa 2.23 bps (XLRE). To właśnie oznacza w praktyce, że „sektorowe ETF są płynne”: koszt zajęcia pozycji w dowolnym sektorze mierzy się w setnych częściach procenta. Dla porównania z pojedynczymi akcjami, szczegółowa analiza z 29 czerwca wykazuje, że spread mało płynnego waloru w tej samej sesji był setki razy wyższy.
Szerokość rynku w skali półrocza
Szerokość rynku w skali półrocza wykazuje dwa trendy. Trend główny: SPY odnotował 64 sesji wzrostowych względem 59 sesji spadkowych w ciągu 123 półrocza — niemal równy podział dni przy wyraźnie dodatnim wyniku, co odpowiada powolnemu trendowi wzrostowemu w ujęciu dziennym. Trend szczegółowy — uwzględniający każdy ticker — widoczny jest w skali miesięcznej: podział na spółki rosnące i spadające w czerwcu znajduje się w podsumowaniu za czerwiec (w tym okresie spadków było więcej niż wzrostów), natomiast dane za koniec kwartału zawiera podsumowanie za Q2. Pełne skanowanie wszystkich spółek rosnących w skali sześciu miesięcy przekracza limit zapytań generowanych na tej stronie; limit ten został tutaj ujawniony, zamiast dokonywać niejawnego zawężania danych.
Dokładny kod SQL dla każdej liczby
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
)Rynek opcji, miesiąc po miesiącu
Półroczne zestawienie obrazuje ewolucję obrotów na rynku opcji. Każdy panel poniżej przedstawia pełny skan miesięczny – całkowity wolumen kontraktów oraz udział instrumentów wygasających w dniu notowań (0DTE). Dane wskazują, że wolumen wzrósł z 1316.1 milionów kontraktów w styczniu do 1477.9 milionów w czerwcu – co stanowi najaktywniejszy miesiąc opcyjny w tym półroczu. Udział kontraktów wygasających tego samego dnia wzrósł z 26.5% w styczniu do 34.3% w czerwcu, osiągając najwyższy poziom w półroczu. Jedna trzecia wolumenu opcji w czerwcu dotyczyła kontraktów wygasających tego samego dnia.
Dokładny kod SQL dla każdej liczby
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')Dokładny kod SQL dla każdej liczby
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')Dokładny kod SQL dla każdej liczby
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')Dokładny kod SQL dla każdej liczby
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')Dokładny kod SQL dla każdej liczby
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')Dokładny kod SQL dla każdej liczby
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')Koszt handlu, próbka miesięczna
Dokładny kod SQL dla każdej liczby
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 ASCMediana spreadu ofertowego dla SPY w drugą środę każdego miesiąca: 0.145 bps w próbce styczniowej, 0.144 w lutowej, około dwukrotnie więcej w próbkach wiosennych oraz 0.409 bps w próbce czerwcowej — najwyższa z sześciu. Wyjaśnienie podstaw: są to pojedyncze sesje próbkowania (druga środa miesiąca), a nie mediany miesięczne — skanowanie całego arkusza zleceń przez sześć miesięcy przekroczyłoby budżet zapytań tej strony. Daty próbek znajdują się w tabeli; nieprawidłowe oferty są tam uwzględnione, a nie pomijane.
Najważniejsze podmioty półrocza
Wartość mierzona obrotem, a nie redakcyjnym wyborem: poniższe zestawienie obejmuje liderów rankingu pod względem wolumenu obrotu w USD za dany kwartał. Dane zostały przeliczone, aby strona zawierała własne potwierdzenie, a każda nazwa z linkiem do szczegółowej analizy prowadzi do odpowiedniego artykułu.
Dokładny kod SQL dla każdej liczby
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 8MU odnotował większy obrót niż SPY w drugim kwartale ($2047.5 miliardów wobec $2032 miliardów) — jest to ta sama wartość, którą zawiera podsumowanie Q2. W przypadku sześciu spółek z tego zestawienia liderów, wyniki za półrocze prezentują się następująco:
Dokładny kod SQL dla każdej liczby
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 tickerSektor pamięci i półprzewodników dominuje w półroczu: SNDK osiągnął stopę zwrotu na poziomie 830.1% w ciągu sześciu miesięcy, MU 290% — jego czerwcowe wyniki są tu szczegółowo analizowane — oraz INTC 269.3%. NVDA, z największym obrotem w zestawieniu wynoszącym $3287.9 miliardów w półrocze, osiągnął stopę zwrotu 5.2% — wyniki są jednocyfrowe, podczas gdy spółki pamięciowe odnotowały wielokrotne wzrosty; jego czerwcowa analiza przedstawia tę rozbieżność sesja po sesji. TSLA jest jedynym spadkowiczem w zestawieniu z wynikiem -8.2%. Czerwcowa mega-spółka jest notowana pod zmienionym symbolem i została wykluczona z rankingów liderów do czasu weryfikacji podmiotu — jej pierwszy miesiąc ma własny wpis z zestawieniem danych. Podstawa: zestawienie liderów jest wybierane na podstawie wolumenu obrotu w USD podczas regularnych godzin sesyjnych w Q2 (powyższy skan); kolumny stóp zwrotu dotyczą półrocza, licząc od pierwszego otwarcia w regularnych godzinach sesyjnych do ostatniego zamknięcia w regularnych godzinach sesyjnych.
Fala IPO w półroczu, miesiąc po miesiącu
Dokładny kod SQL dla każdej liczby
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 mFala debiutów była skoncentrowana na początku okresu i nierównomierna: luty był najintensywniejszym miesiącem półrocza z 47 listingami, natomiast marzec był najspokojniejszy z 17 listingami — słynny mega-listing z czerwca wystąpił w miesiącu o standardowym wolumenie (35 listingi).
Kalendarz półrocza
Dokładny kod SQL dla każdej liczby
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_jun30205 spółek zadebiutowało na giełdzie w tym półroczu — fala debiutów, z której największy w czerwcu został opisany w osobnym zestawieniu — obok 830 podziałów akcji i 28356 zdarzeń ex-dividend. Dla skali: to więcej niż jedna nowa rejestracja na każdą sesję handlową w ciągu półrocza. Całkowita liczba zgłoszeń zawiera potrójne zjawisko: indeks SEC wykazuje niemal zerową aktywność na każdym końcu miesiąca w tym półroczu, jeśli ostatni dzień kalendarzowy był dniem roboczym (55 zgłoszeń w dniu 31 marca, 34 w dniu 30 kwietnia oraz 31 w dniu 30 czerwca, w porównaniu do tysięcy w sąsiednich dniach), zatem półroczne liczby zgłoszeń są zaniżone do czasu uzupełnienia danych przez system — luka na koniec miesiąca posiada własną notę diagnostyczną.
Podsumowanie sesji
Dokładny kod SQL dla każdej liczby
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_sessionsUwagi do danych
Pełne uwagi do danych
- Short interest kończy się na rozliczeniu z 15 czerwca według stanu na moment generowania (oczekuje się na dane z końca czerwca — pełne wyjaśnienie znajduje się w podsumowaniu za czerwiec; wpis zostanie odświeżony po publikacji danych]).
- Trzy dni raportowania na koniec miesiąca w 2026 roku są niemal puste (31 marca, 30 kwietnia, 30 czerwca — każdy koniec miesiąca w półroczu, którego ostatni dzień kalendarzowy był dniem roboczym); dane są ujawniane wraz z liczebnością, szczegóły znajdują się w notatce o lukach na koniec miesiąca. Koniec miesiąca w roku ubiegłym obejmuje tysiące raportów, zatem jest to luka w strumieniu danych, a nie święto w raportowaniu.
- Lista liderów w skali półrocznej jest ograniczona: sześciomiesięczny skan całego rynku przekracza budżet zapytań generowanych na tej stronie, dlatego zestaw znanych spółek jest wybierany na podstawie skanu liderów w skali kwartalnej przedstawionego poniżej, a stopy zwrotu za półrocze są obliczane dla tego stałego zestawu — podstawa jest wskazana w miejscu użycia. Podsumowania za Q2 oraz czerwiec zawierają pełne tabele liderów w odpowiednich skalach.
- Szerokość całego rynku w skali półrocznej jest analogicznie ograniczona — przedstawiono podział w skali dziennej; liczby w skali pojedynczych tickerów są dostępne w skali miesięcznej i kwartalnej, połączone w sekcji dotyczącej szerokości rynku.
- Seria historyczna QQQ jest krótsza niż SPY: fundusz przez pewien czas był notowany pod innym symbolem bazowym; limit liczby sesji wyklucza te lata w sposób widoczny (liczba sesji w ujęciu rocznym znajduje się w tabeli).
- Sześć paneli opcyjnych to miesięczne skany całego rejestru, a próbka trendu spreadu obejmuje jedną oznaczoną sesję miesięcznie — oba procesy działają w trybie wsadowym; bazy próbek są wskazane w tekście.
- Szczegóły mikrostruktury znajdują się w analizie pogłębionej z 29 czerwca.
Metodologia
- Okres obejmuje okres od 1 stycznia do 30 czerwca 2026 r. — 123 sesji, zweryfikowanych na podstawie obserwowanych słupków. Stopy zwrotu są obliczane od otwarcia do zamknięcia sesji regulowanych w ramach każdego okna, zgodnie z zapytaniami przedstawionymi w zestawieniu.
- Porównania historyczne są przeliczane na żywo względem pełnej historii minutowej w momencie generowania danych — wartości nie są odczytywane z zapisanych rekordów. Weryfikacja głębokości: najwcześniejsza data słupka minutowego w opóźnionym widoku używanym tutaj jest zgodna z tabelą bazową (wrzesień 2003), co zostało sprawdzone podczas tworzenia; zatem pierwszy pełny półrok w bazie danych to rok 2004. Każde zapytanie historyczne ustala górną granicę na końcu tego okresu (zbiór porównawczy nie powiększa się po wprowadzeniu danych z późniejszych lat) i stosuje zabezpieczenie minimalnej liczby sesji z uwzględnieniem liczby sesji w poszczególnych latach.
- Znaczniki czasu są przechowywane w formacie UTC z surowymi granicami UTC. Wieloletnie bloki historyczne filtrują godziny regulowane według czasu wschodniego (9:30–15:59, konwertowane dla każdego wiersza — jedyna konwencja bezpieczna względem DST na przestrzeni dekad); bloki pojedynczego okna w zakresach wyłącznie EDT wykorzystują ekwiwalentny surowy pasma UTC. Obie konwencje są tutaj wskazane.
- Generowanie odbywa się poprzez zabezpieczoną ścieżkę tylko do odczytu; strona publiczna nigdy nie wykonuje zapytań na żywo. Stan magazynu danych na dzień 5 lipca 2026 r.
Jest to pierwsza edycja cyklicznego półrocznego podsumowania; pełna edycja roczna zostanie opublikowana w styczniu. Szczegóły kwartalne: Q2 2026. Dane makroekonomiczne, względem których dokonano porównania, znajdują się w obrazie makroekonomicznym.