Первое полугодие 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 ASCПоказатель SPY 8.8% занимает 6 место из 23 первых половин с 2004 года (ранг 1 — лучший) — это верхняя треть, но не рекорд. Показатель QQQ 18.7% занимает 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 года — это лучший показатель в истории фонда, опережающий все периоды восстановления в таблице. Показатель DIA 8.4% занимает 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 подверглась «твисту», а не параллельному сдвигу. Короткий конец — инструменты, наиболее близкие к политике регулятора — практически не изменился; доходность двухлетних облигаций выросла на две трети процентного пункта; тридцатилетние облигации почти не изменились. В таблице представлен обзор всей кривой: сравнение показателей в начале и в конце полугодия.
Точный 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. Параллельный сдвиг подразумевает одновременное изменение всех сроков; в данном полугодии изменилась средняя часть кривой, при этом края остались стабильными — короткие ставки зафиксировались вблизи уровня денежно-кредитной политики, а длинные ставки практически не переоценились.
Влияние на наклон кривой
Точный 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)Ускорение роста краткосрочных ставок относительно долгосрочных и является процессом уплощения: спред 2s10s сократился с 72 до 30 базисных пунктов по итогам 124 публикаций. Минимальное значение за полугодие составило 27 базисных пунктов, поэтому кривая уплостилась, так и не перейдя в состояние инверсии. Прогнозы о том, что означает уплощение кривой для будущих событий, являются предположениями; данная таблица не содержит прогнозов.
Точный 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 dateЕжедневные данные показывают, что уплощение было постепенным процессом, а не единичным событием: в течение полугодия было зафиксировано 124 снижений. В начале года спред составлял 72 базисных пунктов, а в конце — 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% во втором. Единый показатель за полугодие сглаживает эти циклы; разделение по кварталам дает более точную картину.
Стоимость торговли по секторам
Таблицы доходности встречаются часто, а ленты котировок — нет. В данной панели измеряется медианный бид-аск спред каждого отраслевого ETF за одну полную торговую сессию. Здесь представлены данные за 29 июня, что соответствует 123 сессиям за полугодие. Расчет произведен на основе каждого обновления 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 б.п. (XLV), самый высокий — 2.23 б.п. (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Медианный спред SPY во вторую среду каждого месяца: 0.145 б.п. в январе, 0.144 в феврале, примерно в два раза больше в весенних выборках и 0.409 б.п. в июне — самый широкий показатель за шесть месяцев. Важное уточнение: данные основаны на медианах за конкретные сессии (вторая среда каждого месяца), а не за весь месяц. Сканирование котировок за весь шестимесячный период превышает лимит запросов для данной страницы. Даты выборок указаны в таблице; некорректные котировки учитываются в расчетах, а не удаляются.
Основные имена полугодия
Это не редакционный выбор, а показатели значимости: ниже представлен список лидеров по объему торгов за квартал. Данные пересчитаны для подтверждения показателей на этой странице; каждая компания с глубоким анализом имеет на него ссылку.
Точный 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 8Объем торгов MU превысил объем торгов 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% — в то время как акции памяти выросли в несколько раз, доходность NVDA составила лишь однозначное число; анализ ее июня содержит разбор этого расхождения по сессиям. 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 компаний вышли на биржу в этом полугодии. Эта волна листингов, крупнейшим дебютом в июне стала отдельная публикация по каждой регистрации, сопровождалась 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: в течение нескольких лет фонд торговался под другим базовым символом; ограничение по количеству сессий исключает эти годы (количество сессий по годам указано в таблице).
- Шесть панелей опционов представляют собой ежемесячные обзоры всей ленты, а выборка тренда спреда включает по одной отмеченной сессии в месяц — оба процесса работают в пакетном режиме; основы выборок указаны в тексте.
- Микроструктура представлена в подробном анализе от 29 июня.
Методология
- Период: с 1 января по 30 июня 2026 года — 123 сессий, подтвержденных по наблюдаемым барам. Доходность рассчитывается от открытия до закрытия регулярных торгов внутри каждого окна; все расчеты выполнены с помощью указанных запросов.
- Исторические сравнения пересчитываются в режиме LIVE по полной минутной истории в момент генерации — данные не считываются из сохраненных значений. Проверка глубины данных: самая ранняя дата минутной свечи в используемом здесь отложенном представлении совпадает с базовой таблицей (сентябрь 2003 года), что было проверено при подготовке. Таким образом, первый полный отчет за первое полугодие относится к 2004 году. Каждый запрос истории ограничивает верхнюю границу концом данного периода (набор для сравнения не может расти при добавлении последующих лет) и применяет ограничение по минимальному количеству сессий с указанием количества сессий по годам.
- Временные метки хранятся в формате UTC с необработанными границами UTC. Многолетние блоки истории фильтруют регулярные часы по восточному времени (9:30–15:59, конвертируется для каждой строки — это единственный метод, безопасный с учетом перехода на летнее время на протяжении десятилетий); блоки для одного окна в диапазонах только EDT используют эквивалентный диапазон необработанного UTC. Оба метода указаны здесь.
- Генерация выполняется через защищенный путь только для чтения; публичная страница никогда не делает запросы к живым данным. Состояние хранилища на 5 июля 2026 года.
Это первое издание регулярного полугодового обзора; полное годовое издание выйдет в январе. Детализация по кварталам: Q2 2026. Макроэкономические показатели, с которыми проводится сравнение, представлены в макроэкономической картине.