Strasmore Research
Market Recap

Podsumowanie rynku tydzień 29 czerwca 2026

Matt ConnorBy Matt Connor Updated 2026-07-24

Ostatni tydzień czerwca liczył cztery sesje: handel odbywał się od poniedziałku 29 czerwca do czwartku 2 lipca, natomiast piątek 3 lipca był dniem wolnym z powodu obchodów Independence Day — 4 lipca wypadał w sobotę, więc święto obchodzono w poprzedzący piątek. Wyniki za ten okres oraz pozostałe dane znajdują się w panelach. Najważniejszą informacją z tego tygodnia jest wartość widoczna w tabeli wolumenu: jeden producent pamięci operacyjnych wygenerował obrót o wartości $190.2 billion w ciągu czterech dni — o połowę więcej niż sam ETF SPY. Wszystkie liczby na tej stronie są wynikiem zapytań bazodanowych; aby uzyskać dokładne zapytanie SQL, należy rozwinąć dowolny panel.

Tydzień na wykresie

Czy rynek odrobił spadki z poprzedniego tygodnia, czy je pogłębił? Wyniki wskazują na odbicie: panel ten oblicza zmianę każdego indeksu ETF w ujęciu YoY oraz dla porównania zmianę z poprzedniego tygodnia — obie wartości pochodzą z tego samego zapytania.

ZapytanieTydzień do tygodnia: cztery fundusze ETF względem zamknięcia z poprzedniego piątku
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-26') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS prior_friday_close,
    round(argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-06-29') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS week_close,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-06-29') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199)
         / argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-26') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) - 1) * 100, 1) AS week_change_pct,
    round((argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-26') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199)
         / argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-18') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) - 1) * 100, 1) AS prior_week_change_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ', 'DIA', 'IWM')
  AND window_start >= toDateTime('2026-06-15 00:00:00') AND window_start < toDateTime('2026-07-03 00:00:00')
GROUP BY ticker
ORDER BY ticker

SPY zakończył tydzień na poziomie $744.8, co stanowi wzrost o 2.2% względem poprzedniego piątku — po -2.3% w tygodniu poprzednim. QQQ wzrosło o 1% po -4.6% w poprzednim tygodniu, DIA zyskało 2%, a IWM zamknął się na poziomie 297.53 — co oznacza 0% w skali tygodnia, czyli brak zmian, podczas gdy indeksy spółek o dużej kapitalizacji rosły.

Tydzień w zestawieniu z ostatnim rokiem

ZapytanieBieżący tydzień względem ubiegłego roku: SPY, open-to-close w każdym tygodniu (rank 1 = najlepszy; pominięto krótkie tygodnie)
Dokładny kod SQL dla każdej liczby
SELECT round(anyIf(ret, wk = toDate('2026-06-29')), 2) AS week_2026_pct,
       arrayCount(x -> x > anyIf(ret, wk = toDate('2026-06-29')), groupArrayIf(ret, wk != toDate('2026-06-29'))) + 1 AS rank_best,
       count() AS weeks_compared,
       toString(min(wk)) AS first_week,
       anyIf(sessions, wk = toDate('2026-06-29')) AS sessions_this_week
FROM (
    SELECT toStartOfWeek(toDate(toTimeZone(window_start, 'America/New_York')), 1) AS wk,
           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 = 'SPY'
      AND window_start >= toDateTime('2025-06-29 00:00:00')
      AND window_start < toDateTime('2026-07-03 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 wk
    HAVING sessions >= 3
)

Zmiana od otwarcia do zamknięcia w skali tygodnia — od pierwszej sesji w poniedziałek do ostatniej w czwartek — stanowi nieco inną perspektywę niż zestawienie zamknięć z piątku powyżej. Wynik wskazuje, że tydzień SPY zajmuje 14 miejsce w ciągu ostatnich 53 tygodni (miejsce 1 = najlepsze): jest to wynik średni w skali roku, który obejmował zarówno wyprzedaż, jak i odbicie. Tygodnie liczące mniej niż trzy sesje są wykluczane przez filtr sesji; ten tydzień miał 4 sesji. Kontekst historyczny zmienia się wraz z wybranym oknem czasowym — podsumowania dla miesiąca, kwartału oraz półrocza porównują dane okresowe z każdym rokiem z rejestru danych.

Cztery sesje, następnie święto

Pięciodniowy tydzień handlowy jest założeniem, a nie faktem — obecny tydzień obejmował cztery sesje. Panel rozliczeniowy weryfikuje zamknięcie na podstawie danych rynkowych: zero słupków SPY odnotowanych 3 lipca przy 1560 słupkach sesji regulaminowych w ciągu czterech dni handlowych.

ZapytanieSesje: cztery dni handlowe, jedno zamknięcie piątkowe, zweryfikowane z danych
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-06-29 00:00:00') AND window_start < toDateTime('2026-07-03 00:00:00')) AS sessions_in_week,
    (SELECT countIf((toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-06-29 00:00:00') AND window_start < toDateTime('2026-07-03 00:00:00')) AS regular_bars_week,
    (SELECT count() FROM global_markets.delayed_stocks_minute_aggs
     WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-07-03 00:00:00') AND window_start < toDateTime('2026-07-04 00:00:00')) AS jul3_spy_bars
ZapytanieSesja po sesji: zamknięcie SPY, zmiana i całkowity wolumen dzienny
Dokładny kod SQL dla każdej liczby
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS et_date,
    round(argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199), 2) AS spy_close,
    round((argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) / any(prev) - 1) * 100, 1) AS change_pct,
    round(toFloat64(sum(volume)) / 1e6, 1) AS shares_m
FROM global_markets.delayed_stocks_minute_aggs
INNER JOIN (
    SELECT d, lagInFrame(c) OVER (ORDER BY d ASC ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM (
        SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d, argMaxIf(toFloat64(close), window_start, (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-06-26 00:00:00') AND window_start < toDateTime('2026-07-03 00:00:00')
        GROUP BY d
    )
) AS p ON toDate(toTimeZone(window_start, 'America/New_York')) = p.d
WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-06-29 00:00:00') AND window_start < toDateTime('2026-07-03 00:00:00')
GROUP BY et_date
ORDER BY et_date

Wszystkie cztery sesje przebiegały zgodnie z pełnym harmonogramem regulaminowym — 1560 słupków regulaminowych stanowi dokładnie cztery 390-minutowe sesje. Tydzień zamknął się niemal bez zmian (-0.1%) dnia 2026-07-02, przed przerwą świąteczną — wzrosty w tym tygodniu zostały wypracowane w ciągu jego pierwszych trzech sesji.

Szerokość rynku: ile podmiotów odnotowało wzrosty

Wzrost jednego indeksu może maskować spadki na całym rynku. Niniejsza tabela uwzględnia każdy ticker, którego cena zamknięcia zmieniła się w ujęciu tygodniowym; zestaw wykluczonych danych jest jawnie podawany, a nie pomijany.

ZapytanieLiczba wzrostowych i spadkowych indeksów w tygodniu, z uwzględnieniem filtra płynności
Dokładny kod SQL dla każdej liczby
SELECT
    countIf(chg > 0 AND NOT dropped) AS advancers,
    countIf(chg < 0 AND NOT dropped) AS decliners,
    countIf(chg = 0 AND NOT dropped) AS unchanged,
    countIf(dropped) AS dropped_by_liquidity_filter,
    count() AS tickers_with_both_closes
FROM (
    SELECT ticker,
        argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-06-29') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199)
      - argMaxIf(toFloat64(close), window_start, toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-26') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) AS chg,
        sumIf(toFloat64(close) * toFloat64(volume), toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-06-29')) < 1e6 AS dropped
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= toDateTime('2026-06-26 00:00:00') AND window_start < toDateTime('2026-07-03 00:00:00')
    GROUP BY ticker
    HAVING countIf(toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-06-26') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) > 0
       AND countIf(toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2026-06-29') AND (toHour(window_start) * 60 + toMinute(window_start)) BETWEEN 810 AND 1199) > 0
)

5047 tickerów wzrosło w ciągu tygodnia względem 3525, które odnotowało spadki (39 bez zmian) — wzrosty miały charakter szeroki, a nie tylko indeksowy. Filtr płynności wykluczył 3163 tickerów, których obrót przez cały tydzień nie przekroczył 1M USD; są one uwzględnione w zestawieniu, a nie ukryte.

Liderzy rynku: jedna spółka wyprzedza ETF

ZapytanieWolumen USD w godzinach sesyjnych, tydzień od 29 czerwca (pominięto jeden symbol w trakcie weryfikacji)
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-06-29 00:00:00') AND window_start < toDateTime('2026-07-03 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 zdominował cały rynek, osiągając obrót w godzinach sesyjnych na poziomie 190.2 mld USD — SPY, największy ETF, wygenerował 66.4% tej kwoty. Fakt, że jedna spółka osiągnęła większy obrót niż główny fundusz indeksowy rynku w ciągu całego tygodnia, jest kluczowym wskaźnikiem; niniejsza strona raportuje wielkość przepływów, a nie ich przyczyny. Podstawa: godziny sesyjne od 29 czerwca do 2 lipca; wykluczono jedną spółkę z listingu z czerwca z powodu powtórzonego symbolu, oczekując na weryfikację podmiotu — szczegółowe dane znajdują się w szczegółowej analizie.

Święto wpłynęło na termin wygasania instrumentów tygodniowych

Gdzie trafia termin wygasania instrumentów tygodniowych, gdy piątek jest dniem wolnym od handlu? Odpowiedź daje rejestr opcji: niniejszy panel wyodrębnia datę wygasania z każdego kontraktu obróconego w ciągu tygodnia i szereguje je.

ZapytanieKontrakty handlowane w tygodniu według daty wygaśnięcia (skan jednokierunkowy; generowane masowo)
Dokładny kod SQL dla każdej liczby
SELECT concat('20', substring(expiry_raw, 1, 2), '-', substring(expiry_raw, 3, 2), '-', substring(expiry_raw, 5, 2)) AS expiry,
    round(sum(size) / 1e6, 1) AS contracts_m,
    round(100 * sum(size) / max(sum(size)) OVER (), 1) AS pct_of_biggest
FROM (
    SELECT substring(ticker, length(ticker) - 14, 6) AS expiry_raw, size
    FROM global_markets.options_trades
    WHERE sip_timestamp >= toDateTime64('2026-06-29 00:00:00', 9) AND sip_timestamp < toDateTime64('2026-07-03 00:00:00', 9)
)
GROUP BY expiry
ORDER BY contracts_m DESC
LIMIT 6

Największy wolumen wygasających instrumentów w tym tygodniu odnotowano w przypadku 2026-07-02 — w czwartek — wynoszący 74.1 milion kontraktów, co stanowi 42.2% więcej niż w przypadku kolejnego terminu. Ze względu na zamknięcie rynku 3 lipca, termin wygasania przypisany do piątku przesunął się na czwartek; w zestawieniu uwzględniono codzienne terminy wygasania od poniedziałku do środy oraz termin miesięczny z 17 lipca. Daty wygasania są wyodrębniane z symbolu OCC każdego kontraktu (kolumna wygasania w samym rejestrze jest niewiarygodna); mechanizmy tygodni wygasania, takich jak ten, wyjaśniają wyjaśnienia dotyczące dni wolnych od handlu.

Stopy procentowe: wzrost rentowności obligacji 10-letnich

ZapytanieRentowność obligacji skarbowych w ciągu tygodnia (dane z 2 lipca nie zostały jeszcze przetworzone)
Dokładny kod SQL dla każdej liczby
SELECT toString(date) AS d,
    round(yield_10_year, 2) AS y10,
    round(yield_2_year, 2) AS y2,
    round((yield_10_year - yield_2_year) * 100, 0) AS spread_2s10s_bp
FROM global_markets.treasury_yields
WHERE date >= toDate('2026-06-26') AND date <= toDate('2026-07-02')
ORDER BY date

Rentowność obligacji 10-letnich wzrosła z poziomu 4.38% w poprzedzielą piątek do 4.48% w 2026-07-01, podczas gdy spread 2s10s utrzymał się w okolicach 31 punktów bazowych. Uwaga: dane dotyczące rentowności za lipiec nie zostały jeszcze uwzględnione w momencie generowania tej strony (4 wierszy do 1 lipca) — panel zostanie zaktualizowany podczas kolejnego odświeżenia.

Kalendarz: koniec kwartału i brakujący dzień raportowania

ZapytanieKalendarz korporacyjny na dany tydzień — z uwzględnieniem luki indeksowej z 30 czerwca
Dokładny kod SQL dla każdej liczby
SELECT
    (SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-06-29') AND ex_dividend_date <= toDate('2026-07-02')) AS ex_div_events,
    (SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= toDate('2026-06-29') AND execution_date <= toDate('2026-07-02')) AS splits,
    (SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-06-29') AND listing_date <= toDate('2026-07-02')) AS ipos,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-06-29')) AS filings_jun29,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-06-30')) AS filings_jun30,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-07-01')) AS filings_jul1,
    (SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-07-02')) AS filings_jul2,
    (SELECT count() FROM global_markets.stocks_news WHERE published_utc >= toDateTime('2026-06-29 00:00:00') AND published_utc < toDateTime('2026-07-03 00:00:00')) AS news_articles

Wraz z końcem kwartału tydzień przyniósł zdarzenia ex-dividend 2217, podziały akcji 48 oraz nowe listy 7. Kolumny raportowe zawierają błąd w jakości danych z tego tygodnia: indeks raportów SEC wykazuje 4439 zgłoszeń dnia 29 czerwca oraz 4282 dnia 1 lipca, jednak tylko 31 dnia 30 czerwca — ostatniego dnia kwartału. W analogicznych dniach kończących kwartał w roku ubiegłym odnotowano tysiące zgłoszeń. Luka wynika z błędu w strumieniu danych, a nie z faktycznej liczby złożonych dokumentów; każda liczba raportów z czerwca lub Q2 obejmująca 30 czerwca jest zaniżona, dopóki indeks nie dokona uzupełnienia danych wstecznych. Jest to element wzorca z końcem miesiąca występującego w 2026 roku — notatka diagnostyczna zawiera dowody — ujawnione tutaj oraz w podsumowaniach za czerwiec i Q2.

Krótkie pozycje: jeden niepełny plik, trzy kompletne

ZapytaniePozagiełdowy wolumen short FINRA według sesji: pokrycie i akcje oznaczone jako short
Dokładny kod SQL dla każdej liczby
SELECT toString(date) AS d,
    uniqExact(ticker) AS tickers_on_file,
    max(ticker) AS alphabetical_end,
    round(100 * sum(toFloat64(short_volume)) / sum(toFloat64(total_volume)), 1) AS marked_short_pct
FROM (
    SELECT date, ticker, any(short_volume) AS short_volume, any(total_volume) AS total_volume
    FROM global_markets.stocks_short_volume
    WHERE date >= toDate('2026-06-29') AND date <= toDate('2026-07-02')
    GROUP BY date, ticker
)
GROUP BY date
ORDER BY date

Wolumen pozagiełdowy odnotowano na poziomie około 48.8% w połowie tygodnia — jest to rutynowe operacje animatorów rynku, a nie sygnał squeeze. Kolumny dotyczące pokrycia zawierają zastrzeżenie: plik z 29 czerwca jest niekompletny w skali całego rynku (5489 tickerów kończących się na "SSUS" w porównaniu do około 15 000 kończących się na "ZYME" w dniach pełnych), zatem 45.8% z 29 czerwca jest obliczone na podstawie niepełnego pliku. Szczegółowa analiza z 29 czerwca zawiera pełne badanie rynku.

Uwagi do danych

Pełne uwagi do danych
  • 3 lipca był pełnym dniem wolnym od handlu, a nie wcześniejszym zamknięciem sesji. 4 lipca 2026 roku przypadał w sobotę; NYSE oraz Nasdaq obchodziły święto w piątek 3 lipca — 0 słupki SPY zostały tego dnia wygenerowane. Uwaga do zbioru danych wykryta podczas odświeżania strony: tabela kalendarza giełdowego to strumień nadchodzących świąt, a wiersz dotyczący 3 lipca wygasł po upływie święta (był obecny w pierwszej wersji tej strony), zatem brak danych wynika z zamknięcia sesji; szczegóły techniczne znajdują się w wyjaśnieniu dotyczącym świąt.
  • Short interest kończy się na rozliczeniu z dnia 15 czerwca. Rozliczenie dwumiesięczne z końca czerwca nie zostało opublikowane w momencie generowania tej strony; żadne dane tutaj go nie wykorzystują, a podsumowanie z czerwca zawiera pełne informacje. Ten wpis zostanie odświeżony po publikacji danych.
  • Luka indeksowa z dnia 30 czerwca została wskazana powyżej; dane dotyczące obligacji skarbowych z 2 lipca oczekują na przetworzenie.
  • Plik FINRA short-volume z dnia 29 czerwca jest skrócony w skali całego rynku; jego wskaźnik jest przedstawiony wraz z zakresem danych.
  • Wykluczenie lidera wolumenu: jedna czerwcowa pozycja na liście jest handlowana pod powtórzonym symbolem i została wykluczona z rankingu do czasu weryfikacji podmiotu (szczegóły zawiera osobny wpis).

Metodologia

  • Okres obejmuje czas od 29 czerwca do 2 lipca 2026 roku — cztery sesje handlowe w tym tygodniu; 3 lipca był dniem wolnym od handlu. Granice sesji są weryfikowane na podstawie obserwowanych słupków, a nie zakładane (zbiór danych kalendarza giełdowego zawiera wyłącznie nadchodzące święta — patrz: uwaga do danych).
  • Znaczniki czasu są przechowywane w formacie UTC i filtrowane przy użyciu surowych granic UTC; regularne godziny handlu w tym tygodniu (EDT) trwają od 13:30 do 20:00 UTC. Zamknięcia stanowią ostatni minutowy słupek w regularnych godzinach; wolumen dolarowy to iloczyn ceny zamknięcia i wolumenu za dany minutowy słupek, zsumowany w regularnych godzinach.
  • Wskaźniki YoY są porównywane z zamknięciem z poprzedniego piątku, obliczanego na nowo w tym samym zapytaniu co dane z bieżącego tygodnia — wartości nie są odczytywane z zapisanych danych. Ranking z ostatniego roku jest przeliczany co tydzień w ten sam sposób (regularne godziny według czasu wschodniego, ochrona minimalnej sesji, górna granica ustalona na koniec bieżącego tygodnia).
  • Generowanie danych 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 roku.

Jest to pierwsza edycja cyklicznego podsumowania tygodniowego — edycja z przyszłego tygodnia obejmie okres od 6 do 10 lipca i będzie odsyłać do tego miejsca. Podsumowanie dzienne z 29 czerwca zawiera szczegółowe dane z poniedziałku.