نیمه نخست سال 2026 ترکیبی از دو بازار متفاوت بود: در سه ماهه نخست، تمامی ETFهای شاخص اصلی کاهش داشتند یا بیتغییر ماندند، اما در سه ماهه دوم، بازار وضعیت را بهبود بخشید. SPY نیمه نخست را با رشد 8.8% به پایان رساند؛ QQQ با رشد 18.7%؛ و 21.3% مربوط به IWM، بهترین عملکرد نیمه نخست را برای این ETF با ارزشهای بازار کوچک در تمامی دادههای ثبتشده ما رقم زد؛ جزئیات این عملکرد در پایین آمده است که در برابر تمامی سالهای پیشین در یک پرسوجو بازبینی شده است. بازار نرخ بهره نیز روایت خاص خود را داشت: 2s10s spread در طول این نیمه، بدون اینکه هرگز معکوس شود، از 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% دقیقاً به همان عددی میرسد که در جدول آمده است، و هر تیتر خبری درباره «بازده نیمه اول» در واقع مجموع این نوسان رفت و برگشتی را در خود نهفته دارد.
The half against every first half on the tape
Is a 8.8% half unusual? The panels below recompute the SAME first-half return — first regular-hours open to last regular-hours close, January through June — for every year of minute history, in one query per ETF pair with identical arithmetic for every year, then rank this half against the rest. The minute tape's earliest date is verified in the methodology below; the first complete first half on file is the one the receipts name.
کد دقیق 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 ASCSPY's 8.8% ranks 6 of 23 first halves since 2004 (rank 1 = best) — upper third, not a record. QQQ's 18.7% ranks 3 of 16 comparable halves — the QQQ series is shorter — the fund traded under a different root symbol for a stretch of years — and any year with fewer than one hundred first-half sessions for a symbol is excluded by a session-count guard shown in the table, so exclusions are visible rather than silent.
کد دقیق 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 ASCThe small-cap row is the half's headline: IWM ranks 1 of 23 first halves since 2004 — the best on record for the fund, ahead of every recovery half in the table. DIA's 8.4% ranks 4 of 23. Basis, stated plainly: regular-hours open-to-close within each calendar first half, identical arithmetic every year, upper bound pinned at this period's end so the comparison set cannot silently grow when later years are ingested.
ماه به ماه
کد دقیق 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 در این شش ماه) و ژوئن با بسته شدن SPY در سطح -1.2%، نیمسال را به آرامی به پایان رساند. خلاصهی عملکرد ژوئن، با بررسی شاخصهای breadth در پشت آن رقم آرام، در اینجا قابل مشاهده است. بررسی ماهانه جدول نشان میدهد: سال با وضعیتی تقریباً خنثی آغاز شد (SPY 0.9% در ژانویه)، در ماههای فوریه (-0.5%) و مارس (-4.2%) کاهش یافت، سپس آوریل روند نزولی را تنها در یک ماه معکوس کرد، ماه می این روند صعودی را ادامه داد (4.9%) و ژوئن با کمی کاهش بسته شد. سه ماه از شش ماه دارای بازده منفی بودند؛ تعداد ماههایی که نشاندهنده احتمال 50-50 است، اما نیمسال در مجموع با بازدهی مثبت و قوی بسته شد. این الگوی معمول در نیمسالهای بازار سهام است و باید به خاطر داشت که نباید یک ماه واحد را به عنوان حکم نهایی بازار در نظر گرفت.
نرخها: بررسی کامل منحنی، بر اساس سررسیدها
منحنی بازدهی اوراق قرضه خزانهداری در این نیمسال به جای جابهجایی موازی، دچار چرخش (Twist) شد. بخش ابتدایی منحنی — یعنی سررسیدهایی که بیشترین نزدیکی را به سیاستهای پولی دارند — تقریباً بدون تغییر باقی ماند؛ نرخ دو ساله دو-سوم واحد درصد افزایش یافت، در حالی که نرخ 30 ساله تقریباً تغییری نکرد. این پنل، کل منحنی را در مقایسه ابتدا و انتهای نیمسال بررسی میکند.
کد دقیق 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 در طول دادههای 124 از 72 به 30 واحد پایه کاهش یافت — و کمترین میزان ثبتشده در این نیمسال 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% در Q1 و سپس 7.7% در Q2. یک عدد واحد برای نیمسال اول، هر دو چرخه را یکسان نشان میدهد؛ اما تفکیک فصلی، دیدگاه واقعبینانهای ارائه میدهد.
هزینه معاملات در هر بخش
جدولهای بازدهی در همه جا دیده میشوند، اما نوار قیمتها (quote tapes) رایج نیستند. این پنل، میانه شکاف قیمت خرید و فروش (bid-ask spread) را برای هر ETF در یک جلسه معاملاتی کامل اندازهگیری میکند؛ یعنی از تمام بهروزرسانیهای NBBO در آن روز. در این بخش، دادههای مربوط به 29 ژوئن که به عنوان جلسه مرجع در نظر گرفته شده، از میان 123 جلسه در نیمسال بررسی شده است.
کد دقیق 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تمام یازده قیمت در محدوده چند واحد پایه (basis points) یا کمتر قرار دارند؛ ارزانترین حالت در 0.62 bps (XLV) و پهنترین حالت در 2.23 bps (XLRE) است. این همان معنای عملیاتی عبارت «ETFهای بخشی نقدشوندگی بالایی دارند» است: هزینه ورود به هر موقعیت معاملاتی در بخشها، بر حسب صدم درصد اندازهگیری میشود. برای مقایسه با سهام انفرادی، تحلیل دقیق 29 ژوئن نشان میدهد که شکاف قیمت یک نماد کمحجم در همان جلسه، صدها برابر این سطوح است.
وسعت بازار در مقیاس نیمسال
وسعت بازار در مقیاس نیمسال به دو سطح تقسیم میشود. سطح کلی: شاخص SPY در مدت 123، تعداد جلسات صعودی 64 و جلسات نزولی 59 را ثبت کرده است؛ این یعنی در یک نیمسالِ بهطور کلی مثبت، تعداد روزها تقریباً برابر با حالت 50-50 بوده است که نشاندهنده روند صعودی تدریجی در نمودار روزانه است. سطح جزئیتر — که شامل تمامی نمادها میشود — در مقیاس ماهانه بررسی میشود: نسبت نمادهای صعودی به نزولی در خلاصهی ماه ژوئن (در آن دوره تعداد نمادهای نزولی بیشتر از صعودی بود) و آمار مرزهای سهماهه در خلاصهی 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 در نمونه ژوئن — که بیشترین میزان در میان این شش مورد است. نکته مهم: این ارقام مربوط به جلسات نمونهبرداری مشخص شده (دومین چهارشنبه هر ماه) هستند، نه میانه کل ماه؛ بررسی میانگین تمام معاملات در یک بازه شش ماهه، فراتر از ظرفیت پردازش این صفحه است. تاریخهای نمونهبرداری در جدول موجود است و قیمتهای نامعتبر نیز در آنجا شمارش شدهاند و حذف نشدهاند.
نامهای برجسته در نیمسال
برجستگی بر اساس حجم معاملات اندازهگیری شده است، نه انتخاب سردبیر: لیست زیر شامل برترینهای جدول حجم معاملات دلاری در این فصل است. این دادهها مجدداً محاسبه شدهاند تا این صفحه سند مستند خود را داشته باشد و هر نامی که بررسی دقیق دارد، به صفحه مربوطه لینک شده است.
کد دقیق 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% بازده داشت — در حالی که نامهای حوزه حافظه چندین برابر شدند، این شرکت بازدهی تکرقمی داشت؛ تحلیل عمیق ماه ژوئن آن این تفاوت را جلسه به جلسه بررسی میکند. 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 رویداد بدون سود سهام (ex-dividend) رخ داد. برای درک بهتر مقیاس، این رقم معادل بیش از یک لیست شدن جدید در هر جلسه معاملاتی در طول نیمسال است. مجموع پروندههای ثبتشده شامل یک نقص در نمایش دادههاست: شاخص 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 و June جداول کامل رهبران بازار را در مقیاسهای خود ارائه میدهند.
- گستره کل بازار در مقیاس نیمسال نیز محدود شده است — تقسیمبندی روزانه نمایش داده شده است؛ شمارشهای سطح تیکر در مقیاس ماهانه و فصلی قرار دارند که در بخش گستره بازار به هم متصل شدهاند.
- سری زمانی تاریخچه QQQ کوتاهتر از SPY است: این صندوق برای دورهای از سالها با نماد ریشهای متفاوتی معامله شده است؛ محدودیت تعداد جلسات، آن سالها را به وضوح مستثنی میکند (تعداد جلسات هر سال در جدول آمده است).
- شش پنل آپشن، اسکنهای ماهانه از کل نوار معاملات هستند و نمونه روند spread، یک جلسه برچسبگذاری شده در هر ماه را بررسی میکند — هر دو از مسیر دستهای (batch) اجرا میشوند؛ پایههای نمونه در متن ذکر شدهاند.
- جزئیات ریزساختار بازار در تحلیل عمیق 29 ژوئن موجود است.
روششناسی
- بازه زمانی از 1 ژانویه تا 30 ژوئن 2026 است — شامل 123 نشست معاملاتی که از کندلهای مشاهدهشده تایید شدهاند. بازدهها ابتدا از زمان بازگشایی ساعات عادی تا آخرین زمان بستهشدن ساعات عادی در هر بازه محاسبه میشوند؛ تمامی محاسبات مطابق با پرسوجوهای (queries) نمایش داده شده انجام شده است.
- مقایسههای تاریخی در زمان تولید گزارش، بهصورت زنده (LIVE) در برابر تاریخچه کامل دقیقهای بازمحاسبه میشوند و هرگز از مقادیر ذخیرهشده خوانده نمیشوند. تایید دقت دادهها: اولین تاریخ کندل دقیقهای در نمای با تأخیر استفاده شده در اینجا، با جدول پایه (سپتامبر 2003) مطابقت دارد که در زمان نگارش بررسی شده است؛ بنابراین اولین نیمسال کامل موجود در فایل، مربوط به سال 2004 است. هر پرسوجوی تاریخی، حد بالای خود را در پایان این دوره تثبیت میکند (مجموعه مقایسهای با وارد کردن سالهای بعدی بزرگتر نمیشود) و از یک محافظ حداقلتعداد نشست با شمارش نشستهای سالانه نمایش داده شده استفاده میکند.
- برچسبهای زمانی با محدوده UTC خام ذخیره شدهاند. بلوکهای تاریخچه چندساله، ساعات عادی را بر اساس ساعت Wall Clock منطقه Eastern (ساعت 9:30 تا 15:59، تبدیل شده برای هر سطر — تنها قرارداد ایمن در برابر DST در طول دههها) فیلتر میکنند؛ بلوکهای تکبازه در محدودههای فقط EDT از باند معادل UTC خام استفاده میکنند. هر دو قرارداد در اینجا ذکر شدهاند.
- فرآیند تولید از طریق مسیر محدود و فقط خواندنی انجام میشود؛ صفحه عمومی هرگز پرسوجویی از دادههای زنده انجام نمیدهد. وضعیت انبار دادهها مربوط به 5 جولای 2026 است.
این اولین نسخه از گزارش نیمسالانه دورهای است؛ نسخه سالانه کامل در ژانویه منتشر خواهد شد. جزئیات فصل: نیمه دوم 2026. دادههای کلان که این نیمسال در برابر آنها معامله شده است، در تصویر کلان قرار دارند.