Перше півріччя 2026 року складалося з двох різних ринків: у першому кварталі кожен основний індексний ETF падав або не демонстрував зростання, а у другому кварталі ситуація повністю виправилася. SPY завершив півріччя зростанням на 8.8%; QQQ зростав на 18.7%; а показник 21.3% для IWM став найкращим результатом для ETF з малою капіталізацією за всю історію наших даних — звіт наведено нижче, розрахований порівняльно з кожним попереднім роком у одному запиті. Ринок відсоткових ставок мав власну динаміку: спред 2s10s звузився з 72 базисних пунктів до 30 протягом півріччя, так і не перейшовши у стан інверсії. Ця сторінка є повним реєстром півріччя — звітність, історичний рейтинг, щомісячна динаміка, вся крива доходності за термінами погашення, одинадцять секторів, щомісячна еволюція ринку опціонів та помітні окремі акції. Кожне число тут є результатом збереженого запиту; розгорніть будь-яку панель, щоб переглянути SQL-код.
Половина на табло
Точний SQL-код для кожного числа
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Розподіл на два квартали визначає структуру півріччя: SPY -5.2% потім 14.1%; QQQ -6.9% потім 26.5%. IWM був тихим лідером півріччя у 21.3% — компанії з малою капіталізацією перевершили кожен індекс з великою капіталізацією протягом цих шести місяців. Деталі за кварталами наведені у огляді Q2. Примітка щодо арифметики півріччя: показник 8.8% для SPY за шість місяців значно менший, ніж лише за Q2, оскільки півріччя поєднує падіння та відновлення — кумулятивний ефект -5.2% та 14.1% відповідає табличним даним, і будь-який заголовок про «прибуток за перше півріччя» фактично приховує весь цей цикл коливань.
Перше півріччя проти всіх інших перших півріччях
Чи є 8.8% півріччя нетиповим? На панелях нижче перераховано ТУ Ж саму прибутковість першого півріччя — від відкриття до закриття в межах регулярних торгових сесій з січня по червень — для кожного року з доступної хвилинної історії. Розрахунок виконується одним запитом для кожної пари ETF з однаковою арифметикою для кожного року, після чого це півріччя порівнюється з іншими. Найраніша дата хвилинних даних перевірена в методології нижче; перше повне перше півріччя у базі даних — це те, що вказано в документах.
Точний SQL-код для кожного числа
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Точний SQL-код для кожного числа
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% показник SPY займає 6 місце серед 23 перших півріччя з 2004 (ранг 1 = найкращий) — це верхня третина, але не рекорд. 18.7% показник QQQ займає 3 місце серед 16 порівнянних півріччя — серія QQQ коротша, оскільки фонд протягом певних років торгувався під іншим базовим символом. Будь-який рік, де кількість сесій у першому півріччі становить менше ніж сто, виключається за допомогою фільтра кількості сесій, що відображено в таблиці; таким чином, виключення є видимими, а не прихованими.
Точний SQL-код для кожного числа
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Точний SQL-код для кожного числа
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Рядок з компаніями малої капіталізації є головним у цьому порівнянні: IWM займає 1 місце серед 23 перших півріччя з 2004 — це найкращий показник в історії фонду, що перевершує всі інші півріччя відновлення в таблиці. 8.4% показник DIA займає 4 місце серед 23. Суть методу: розрахунок прибутку від відкриття до закриття в межах кожного календарного першого півріччя, однакова арифметика для кожного року; верхня межа зафіксована на кінці цього періоду, щоб набір для порівняння не збільшувався при додаванні наступних років.
Помісячний огляд
Точний SQL-код для кожного числа
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Графік демонструє нерівномірну динаміку: невелике зростання, спад, різке зростання, знову зростання та невеликий спад. Ключовим моментом стало травень (SPY 9.9%, QQQ 14.8% — найкращий місяць для QQQ за півріччя), а червень завершив півріччя зі стабільним показником -1.2% для SPY. Детальний аналіз червня з урахуванням широти ринку доступний тут. Аналіз таблиці за місяцями: рік розпочався майже без змін (SPY 0.9% у січні), демонстрував падіння протягом лютого (-0.5%) та березня (-4.2%), після чого у квітні відбулося розворот тренду, а у травні зростання продовжилося (4.9%), після чого у червні відбулося невелике зниження. Три з шести місяців були негативними — такий розподіл характерний для півріччя, яке завершилося суттєвим зростанням. Це стандартна динаміка ринку акцій, яку слід враховувати, щоб не сприймати результати одного окремого місяця як остаточний вердикт.
Ставки: вся крива, за термінами погашення
Крива Treasury протягом півріччя зазнала зміщення (twist), а не паралельного зсуву (shift). Короткостроковий сегмент — терміни, що найтісніше пов'язані з монетарною політикою, — майже не змінився; дворічна ставка зросла на дві третини відсоткового пункту; тридцятирічна майже не змінилася. Панель наводить огляд всієї кривої: порівняння на початку півріччя та наприкінці.
Точний SQL-код для кожного числа
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Якщо читати стовпець змін зверху вниз, зміщення кривизни є очевидним: 1-місячна ставка змінилася на -2 базисних пунктів за шість місяців, тоді як 2-річна зросла на 67, а 30-річна лише на 5. Паралельний зсув передбачає одночасну зміну всіх термінів; у цьому півріччя відбулося зміщення середньої частини кривої при стабілізації обох її кінців — короткострокові ставки зафіксовані поблизу рівня монетарної політики, а довгострокові майже не переоцінювалися.
What that did to the slope
Точний SQL-код для кожного числа
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)The short end rising faster than the long end is what a flattening IS: the 2s10s spread ground down from 72 to 30 basis points across 124 prints — and its lowest print of the half was 27, so the curve flattened without ever inverting. Whether a flatter curve "means" anything about what comes next is a forecast, and this table doesn't make forecasts.
Точний SQL-код для кожного числа
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 dateThe daily series shows the flattening was not one event but a grind — 124 prints stepping down through the half, with the spread starting the year at 72 basis points and ending at 30.
Сектори: дисперсія, яку приховував індекс
Які саме частини ринку принесли прибуток за півріччя? Один запит щодо одинадцяти секторних ETF від SPDR з розподілом за півріччя та кварталами.
Точний SQL-код для кожного числа
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Головним фактором є дисперсія: технологічний сектор (XLK) завершив півріччя зростанням на 30.8% — з 42% у другому кварталі — тоді як сектор комунікаційних послуг (XLC) завершив з -9.3%. Різниця між найкращим і найгіршим сектором за шість місяців склала приблизно сорок відсоткових пунктів. Купівля «ринку» означала володіння обома цими полюсами. Енергетичний сектор (XLE) є прикладом того, як не варто тримати довгі позиції: він продемонстрував здоровий 18.8% за півріччя, що складається з 36.9% у першому кварталі та -11% у другому. Він був найсильнішим великим сектором у кварталі падіння індексів і одним із найслабших у кварталі їхнього відновлення. Фінансовий сектор (XLF) продемонстрував протилежну динаміку: -9.9% у першому кварталі, потім 7.7% у другому. Одне число за H1 згладжує обидва цикли; розподіл за кварталами дає об'єктивну картину.
Вартість торгівлі в кожному секторі
Таблиці прибутковості зустрічаються часто, тоді як котирувальні стрічки — рідко. Ця панель вимірює медіанний спред bid-ask для кожного секторного ETF протягом однієї повної репрезентативної сесії — 123 сесій за півріччя; тут вимірюються дані за 29 червня, що позначено відповідно — на основі кожного оновлення NBBO того дня.
Точний SQL-код для кожного числа
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Кожна з одинадцяти котирувань становить кілька базисних пунктів або менше — найменший складає 0.62 bps (XLV), найбільший — 2.23 bps (XLRE). Саме це на практиці означає «ліквідність секторних ETF»: вартість відкриття будь-якої секторної позиції вимірюється у сотих частках відсотка. Для порівняння з окремими акціями, глибокий аналіз за 29 червня показує, що спред малоліквідного активу в ту саму сесію був у сотні разів більшим за ці рівні.
Ширина ринку за півроку
Ширина ринку на напівмасштабному рівні має два показники. Грубий показник: SPY зафіксував 64 зростаючих сесій проти 59 спадних протягом 123 півроку — це майже рівні шанси на успіх при загальному позитивному тренді, що характерно для повільного зростання на денних графіках. Детальний показник — з урахуванням кожного тікера — відображається у місячному масштабі: розподіл між тікерами, що зростають, та тікерами, що падають, за червень наведено у огляді за червень (там кількість тікерів, що впали, перевищила кількість тих, що зросли), а дані за квартальний період доступні у огляді за Q2. Повний аналіз зростаючих активів за шість місяців перевищує ліміт запитів, доступний на цій сторінці; це обмеження вказано тут, а не шляхом прихованого звуження вибірки.
Точний SQL-код для кожного числа
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
)Динаміка опціонів за місяцями
Лише дані за півріччя дозволяють простежити еволюцію ринку опціонів. Кожна панель нижче представляє повний огляд ринку за один місяць — загальний обсяг контрактів та частку контрактів, що торгувалися в день їхнього експірації (0DTE). Основна тенденція: обсяг зріс з 1316.1 мільйонів контрактів у січні до 1477.9 мільйонів у червні — найактивнішого місяця півріччя. Частка контрактів з експірацією в той самий день зросла з 26.5% у січні до 34.3% у червні, що стало найвищим показником за півріччя. Третина обсягу опціонів у червні припала на контракти, термін дії яких закінчувався того ж дня.
Точний SQL-код для кожного числа
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')Точний SQL-код для кожного числа
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')Точний SQL-код для кожного числа
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')Точний SQL-код для кожного числа
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')Точний SQL-код для кожного числа
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')Точний SQL-код для кожного числа
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')Витрати на торгівлю, що вибираються щомісяця
Точний SQL-код для кожного числа
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Медіанний котируваний spread для SPY у другу середу кожного місяця: 0.145 bps у вибірці за січень, 0.144 у лютому, приблизно вдвічі більше протягом весняних вибірок, і 0.409 bps у вибірці за червень — найширший показник серед шести. Basis, розкритий: це окремі сесії вибірки (друга середа кожного місяця), а не медіани за весь місяць — сканування котирувань за шість місяців перевищує бюджет запитів цієї сторінки. Дати вибірок вказані в таблиці; недійсні котирування також враховуються в ній, а не видаляються без відома.
Помітні імена півріччя
Виміряна помітність, а не редакційний вибір: наведений нижче перелік містить лідерів за обсягом торгів у доларах за квартал. Дані перераховані, щоб сторінка мала власне підтвердження, а кожна назва з детальною аналізом веде на відповідну статтю.
Точний SQL-код для кожного числа
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 переторгував SPY протягом другого кварталу ($2047.5 мільярдів проти $2032 мільярдів) — ті самі дані, що містяться в огляді Q2. Для шести окремих назв із цього списку лідерів за півріччя:
Точний SQL-код для кожного числа
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Сектор пам'яті та напівпровідників домінує в півріччі: SNDK принесла 830.1% за шість місяців, MU 290% — її червень проаналізовано тут посекундно — та INTC 269.3%. NVDA, найбільший за обсягом торгів у списку з оборотом $3287.9 мільярдів за півріччя, показала прибутковість 5.2% — однозначні показники, тоді як акції пам'яті зросли у кілька разів; детальний аналіз її червня містить розбір цієї дивергенції за кожною торговою сесією. TSLA є єдиним активом у списку, що продемонстрував падіння на -8.2%. Велика лістинг-акція червня торгується під повторно використаним символом і виключена зі сканування лідерів до підтвердження юридичної особи — її перший місяць має власний звіт по днях. Основа: набір лідерів обрано за обсягом торгів у доларах у межах регулярних торгових годин за Q2 (сканування вище); стовпці прибутковості вказані за півріччя: від першого відкриття регулярних торгових годин до останнього закриття регулярних торгових годин.
Хвиля IPO за півріччя, місяць за місяцем
Точний SQL-код для кожного числа
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Хвиля лістингу була нерівномірною та зосередженою на початку періоду: лютий став найактивнішим місяцем півріччя з 47 лістингами, а березень — найспокійнішим з 17 — відомий мега-лістинг у червні відбувся на фоні звичайних обсягів (35 лістинги).
Календар півріччя
Точний SQL-код для кожного числа
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 компаній вийшли на публічний ринок у цьому півріччі — хвиля IPO, найбільший дебют якої у червні описаний у окремому звіті по кожній реєстраційній заяві — поряд із 830 сплітами та 28356 дивідендними виплатами. Для порівняння: це більше ніж одне нове лістингування за кожну торгову сесію протягом півріччя. Загальна кількість заявок містить подвійне викривлення: індекс SEC майже порожній на кожен кінець місяця протягом півріччя, якщо останній календарний день був буднім днем (55 заявок на 31 березня, 34 на 30 квітня та 31 на 30 червня, порівняно з тисячами заявок у сусідні дні), тому показники кількості заявок за півріччя є заниженими, доки дані не будуть доповнені — про розрив наприкінці місяця є окрема діагностична примітка.
Звіт за сесію
Точний SQL-код для кожного числа
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Примітки до даних
Повні примітки до даних
- Short interest розраховано станом на розрахункову дату 15 червня на момент генерації (очікується звіт за кінець червня — повна інформація у огляді за червень; цей пост оновлюється після публікації даних).
- Три дні подання звітності на кінець місяця у 2026 році майже порожні (31 березня, 30 квітня, 30 червня — кожен кінець місяця у півріччі, чий останній календарний день був буднім днем); дані розкриті разом із показниками, деталі наведено у примітці про пропуски наприкінці місяця. Наприкінці місяців минулого року подається тисячі звітів, тому це пропуск у потоці даних, а не вихідний день для подання звітності.
- Лідерборд напівмасштабу обмежений: шестимісячне сканування всього ринку перевищує бюджет запитів, передбачений для цієї сторінки, тому набір помітних назв обирається за результатами квартального сканування лідерів, наведеного нижче; прибутки за півріччя розраховано для цього фіксованого набору — основу вказано у відповідних місцях. Q2 та червень огляди містять повні таблиці лідерів відповідно до їхніх масштабів.
- Широта всього ринку на напівмасштабу також обмежена — показано розподіл за денною зернистістю; підрахунки за тикерами доступні на місячному та квартальному масштабах і поєднані в розділі широти ринку.
- Серія історії QQQ коротша за SPY: протягом певного періодику фонд торгувався під іншим базовим символом; захисний механізм підрахунку сесій виключає ці роки (кількість сесій за кожен рік вказана в таблиці).
- Шість панелей опціонів — це щомісячні сканування всієї стрічки, а зразок тренду spread використовує одну позначену сесію на місяць — обидва процеси виконуються пакетним методом; вибірки вказано в тексті.
- Мікроструктура наведена у глибокому аналізі за 29 червня.
Методологія
- Період охоплює період з 1 січня по 30 червня 2026 року — 123 сесій, підтверджених за спостережуваними барами. Дохідність розраховується від відкриття до закриття регулярних торгів у межах кожного вікна; всі розрахунки виконані за допомогою запитів, наведених у тексті.
- Історичні порівняння перераховуються в режимі LIVE на основі повної хвилинної історії під час генерації — дані не зчитуються зі збережених значень. Перевірка глибини даних: найраніша дата хвилинного бару у затриманому режимі перегляду, що використовується тут, відповідає базовій таблиці (вересень 2003 року), що було перевірено під час підготовки; тому перша повна півріччя у наявності — це 2004 рік. Кожен запит історії встановлює свою верхню межу на кінці цього періоду (набір для порівняння не може збільшуватися після додавання наступних років) і застосовує захисний механізм мінімальної кількості сесій із зазначеною кількістю сесій за кожен рік.
- Часові мітки зберігаються в UTC з сирими межами UTC. Багаторічні блоки історії фільтрують регулярні години за часом Eastern wall clock (9:30–15:59, конвертований для кожного рядка — єдиний безпечний для DST стандарт протягом десятиліть); блоки з одним вікном у діапазонах лише EDT використовують еквівалентний сирий UTC діапазон. Обидва методи наведено тут.
- Генерація виконується через обмежений доступ для читання; публічна сторінка ніколи не робить запитів у реальному часі. Стан сховища станом на 5 липня 2026 року.
Це перше видання регулярного піврічного звіту; повне річне видання вийде у січні. Деталізація за кварталами: Q2 2026. Макроекономічні показники, з якими порівнюється півріччя, наведені в макроекономічній картині.