Strasmore Research
Market Recap

2026年上半年市场回顾与数据总结

Matt ConnorBy Matt Connor Updated 2026-08-08

2026年上半年由两种截然不同的市场拼接而成:第一季度所有主要指数ETF都下跌或原地踏步;第二季度的涨幅则足以完全收复失地。SPY上半年收涨 8.8%;QQQ收涨 18.7%;IWM的21.3%则创下该小盘股ETF在我们掌握的交易记录中最强的上半年表现,相关记录见下方。该结果通过一条查询与此前每一年重新计算后得出。利率市场也讲述了自己的故事:2s10s利差在上半年从72个基点收窄至30个基点,但始终没有倒挂。本页汇总了上半年的完整账本、成绩表、历史排名、月度阶梯、按期限逐一列出的完整收益率曲线、11个行业、期权交易记录逐月演变情况,以及上半年值得关注的个股。这里的每个数字都来自已存储的查询;展开任一面板即可查看SQL。

半年表现

查询2026年上半年:四只指数ETF的半年度、第一季度和第二季度回报,一次查询计算
ticker上半年回报率 (%)第一季度回报率 (%)第二季度回报率 (%)上半年收盘价
DIA8.4-3.912.1522.28
IWM21.30.120.2300.42
QQQ18.7-6.926.5735.76
SPY8.8-5.214.1746.32
每个数字背后的完整 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% 的表现成为上半年表现最佳的指数,小盘股在这六个月里跑赢了所有大盘股指数。季度细节请参阅第二季度回顾。关于半年度计算,有一点需要说明:SPY 六个月的 8.8% 远低于其单独第二季度的表现,因为半年度数据连接了下跌与复苏两个阶段;将 -5.2% 与 14.1% 复合计算后,结果正如表格所示,而任何“上半年回报率”的标题,其实都隐含了完整的这一轮往返行情。

一季度对照盘面上每个上半年

8.8%上半年是否异常?下方各面板重新计算相同的上半年回报,即从一月到六月、从常规交易时段开盘到最后一个常规交易时段收盘。计算覆盖每个ETF组合自分钟级历史数据开始以来的所有年份。每个ETF组合单独使用一条查询,所有年份采用完全相同的计算方式,然后将该上半年与其余年份进行排名。分钟级交易数据的最早日期已在下方方法说明中核验;文件中第一个完整的上半年,就是收据所列的那个上半年。

查询历年上半年表现:SPY和QQQ按年以相同方法重算(显示每年交易日数量)
39 rows (showing 20)
年ticker交易日上半年回报率 (%)
2004QQQ1242.9
2004SPY1242.4
2005SPY125-2.1
2006SPY1251.5
2007SPY1245.4
2008SPY125-12.8
2009SPY1241.8
2010SPY124-8.2
2011SPY1254.2
2012QQQ12512.7
2012SPY1256.6
2013QQQ1246.8
2013SPY12410.4
2014QQQ1247.3
2014SPY1246.4
2015QQQ1243.2
2015SPY124-0.2
2016QQQ125-1.7
2016SPY1254.5
2017QQQ12515.2
每个数字背后的完整 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
自己运行这个查询
查询排名记录:本次上半年与此前每个上半年比较(SPY和QQQ;第1名=最佳;不含自身)
ticker2026年上半年 (%)最佳排名比较的半年期数首年2026年交易日
QQQ18.73162004123
SPY8.86232004123
每个数字背后的完整 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%在自2004以来的23个上半年中排名6(排名第一为最佳),位于上三分之一,但并非历史纪录。QQQ的18.7%在16个可比上半年中排名3。QQQ的时间序列较短;该基金在一段时期内使用过不同的根符号。对于某一符号而言,任何上半年交易日少于一百个的年份,都会因表中所示的交易日计数限制而被排除。因此,排除情况是明确可见的,而不是被静默处理。

查询历年上半年表现:DIA和IWM,采用相同算法
46 rows (showing 20)
年ticker交易日上半年回报率 (%)
2004DIA124-0.5
2004IWM1245.9
2005DIA125-5.1
2005IWM125-51.3
2006DIA1253.9
2006IWM1256.3
2007DIA1247
2007IWM1245.2
2008DIA125-14.5
2008IWM125-9.3
2009DIA124-3.9
2009IWM1242.5
2010DIA124-6.8
2010IWM124-3.4
2011DIA1256.4
2011IWM1254.9
2012DIA1253.7
2012IWM1255.3
2013DIA12411.7
2013IWM12412.3
每个数字背后的完整 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
自己运行这个查询
查询排名记录:DIA和IWM与此前每个上半年比较(第1名=最佳;不含自身)
ticker2026年上半年 (%)最佳排名比较的半年期数首年2026年交易日
DIA8.44232004123
IWM21.31232004123
每个数字背后的完整 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自2004以来在23个上半年中排名1,为该基金有记录以来的最佳表现,超过表中每一个复苏期上半年。DIA的8.4%在23个上半年中排名4。计算基础如下:每个日历上半年内,按常规交易时段开盘至收盘计算;每年采用完全相同的算法;比较区间的上限固定在本期末,因此后续年份录入时,比较样本不会在不知不觉中扩大。

逐月回顾

查询上半年逐月表现(SPY和QQQ,一次查询以相同方法重算)
期间起点ticker月回报率 (%)月收盘价
2026-01-01QQQ0.3621.81
2026-01-01SPY0.9691.85
2026-02-01QQQ-1.8607.45
2026-02-01SPY-0.5686.23
2026-03-01QQQ-3.6577.14
2026-03-01SPY-4.2650.24
2026-04-01QQQ14.8667.6
2026-04-01SPY9.9718.43
2026-05-01QQQ10.3738.25
2026-05-01SPY4.9756.4
2026-06-01QQQ-0.2735.76
2026-06-01SPY-1.2746.32
每个数字背后的完整 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
自己运行这个查询

这段“阶梯”走势先小幅上行,随后连续下跌,再大幅上行、继续上涨,最后小幅回落:4月是上半年的转折点(SPY 9.9%,QQQ 14.8%,也是QQQ这六个月中表现最佳的月份),6月则在SPY -1.2% 的水平上平静收官。6月回顾及这一平静数据背后的市场广度分化见此处。按月份阅读表格:年初几乎持平(SPY 1月为0.9%),2月(-0.5%)和3月(-4.2%)持续下滑;4月在单月内扭转跌势,5月延续涨势(4.9%),6月涨幅收窄。六个月中有三个月下跌。对于最终稳健收涨的上半年而言,这一月度涨跌各半的结果并不罕见。股市半年度通常就是这种形态;当单个月份被解读为结论时,投资者应记住这一点。

利率:整条收益率曲线逐个期限变化

美国国债收益率曲线在这半年里发生了扭转,而不是整体平移。最前端、最贴近货币政策的期限几乎没有变化;两年期上升了三分之二个百分点;三十年期几乎未受影响。图表展示了整条曲线从半年度初到半年度末的变化。

查询七个期限:上半年初与末的收益率及其变化
到期日起始 (%)结束 (%)变动(基点)
1-month3.723.7-2
3-month3.653.8722
1-year3.473.9851
2-year3.474.1467
5-year3.744.1945
10-year4.194.4425
30-year4.864.915
每个数字背后的完整 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个基点。平行移动意味着所有期限同步变化;本半年中,曲线中段发生移动,两端则基本保持不变。短端利率受政策利率锚定,长端利率几乎没有重新定价。

收益率曲线斜率的变化

查询期限利差记录:起点、终点、最低值;本次上半年从未倒挂
起始(基点)结束(基点)最低(基点)成交记录
723027124
每个数字背后的完整 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)
自己运行这个查询

短端收益率升幅快于长端收益率,正是收益率曲线趋平的表现:在124笔成交中,2s10s利差从72个基点逐步收窄至30个基点;本半年度最低成交水平为27。因此,收益率曲线在从未倒挂的情况下趋于平坦。趋平的收益率曲线是否“意味着”未来会发生什么,属于预测范畴,而本表不作预测。

查询2s10s利差:上半年每次数据
124 rows (showing 20)
日2s10s利差(基点)
2026-01-0272
2026-01-0571
2026-01-0671
2026-01-0768
2026-01-0870
2026-01-0964
2026-01-1265
2026-01-1365
2026-01-1464
2026-01-1561
2026-01-1665
2026-01-2070
2026-01-2166
2026-01-2265
2026-01-2364
2026-01-2666
2026-01-2771
2026-01-2870
2026-01-2971
2026-01-3074
每个数字背后的完整 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个基点。

行业板块:指数掩盖了分化

市场哪些部分真正贡献了上半年的收益?十一只 SPDR 行业ETF,按半年和季度拆分,一次查询即可看清。

查询11只行业ETF:2026年上半年回报、第一季度与第二季度拆分及上半年美元成交额
ticker上半年回报率 (%)第一季度回报率 (%)第二季度回报率 (%)上半年金额(十亿美元)
XLB11.79.8186.8
XLC-9.3-6.2-3.790.3
XLE18.836.9-11316.2
XLF-2.2-9.97.7271.7
XLI193.913.3222.8
XLK30.8-8.742286
XLP6.95.51.7163.7
XLRE9.11.37.738.4
XLU5.77-1128.7
XLV2.5-5.47.8218.8
XLY-2.3-9.36.9132.5
每个数字背后的完整 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在一个完整代表性交易时段内的买卖价差中位数。该时段属于半年中的123个交易时段之一,本文测量的是6月29日,并以此标注。数据来自当天每次NBBO更新。

查询各行业ETF的报价中位价差:一个代表性交易日(2026年6月29日)常规交易时段
ticker中位利差(基点)报价更新(百万)已剔除无效项
XLV0.622.11150
XLY0.861.1921
XLC0.931.1282
XLI1.11.3812
XLK1.12.7255
XLP1.180.7633
XLE1.850.591
XLF1.860.382
XLB1.970.410
XLU2.180.296
XLRE2.230.280
每个数字背后的完整 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
自己运行这个查询

十一个行业ETF的价差都在几个基点以内。最窄的是0.62个基点(XLV),最宽的是2.23个基点(XLRE)。这就是“行业ETF具有流动性”的实际含义:建立任何行业观点的成本,都以百分之零点零几计。作为个股的比较尺度,6月29日深度分析显示,同一交易时段内,一只成交清淡个股的价差可能是这些水平的数百倍。

半年度市场广度

这里的半年度市场广度分为两个层次。粗粒度来看,SPY在这半年123个交易日中有64个上涨日、59个下跌日。上涨与下跌日几乎各占一半,但整个半年度表现稳步上行。这正是从日线交易记录中看到的缓慢上涨。

细粒度来看,统计范围涵盖每个ticker,按月度展开。六月的上涨股与下跌股分布见六月回顾(下跌ticker多于上涨ticker);季度边界的统计见Q2回顾。对全市场进行一次覆盖六个月的上涨股扫描,会超过本页生成所依据的查询预算。这里披露这一限制,而不是在未说明的情况下缩小统计范围。

查询上半年SPY上涨与下跌交易日:一项简明记录
上涨交易日下跌交易日持平交易日交易日总数
64590123
每个数字背后的完整 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)。数据显示,成交量从1月的1316.1百万张合约增至6月的1477.9百万张。6月是上半年期权成交最活跃的月份。同日到期合约的成交份额也从1月的26.5%升至6月的34.3%,为上半年最高。6月期权成交量中,有三分之一来自当日到期的合约。

查询1月:全市场期权合约成交量及当日到期占比(一次扫描)
合约数(百万)零日到期占比 (%)交易日
1316.126.520
每个数字背后的完整 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')
自己运行这个查询
查询2月:全市场期权合约成交量及当日到期占比(一次扫描)
合约数(百万)零日到期占比 (%)交易日
1262.32719
每个数字背后的完整 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')
自己运行这个查询
查询3月:全市场期权合约成交量及当日到期占比(一次扫描)
合约数(百万)零日到期占比 (%)交易日
1442.629.522
每个数字背后的完整 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')
自己运行这个查询
查询4月:全市场期权合约成交量及当日到期占比(一次扫描)
合约数(百万)零日到期占比 (%)交易日
1386.930.321
每个数字背后的完整 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')
自己运行这个查询
查询5月:全市场期权合约成交量及当日到期占比(一次扫描)
合约数(百万)零日到期占比 (%)交易日
1394.630.320
每个数字背后的完整 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')
自己运行这个查询
查询6月:全市场期权合约成交量及当日到期占比(一次扫描)
合约数(百万)零日到期占比 (%)交易日
1477.934.321
每个数字背后的完整 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')
自己运行这个查询

交易成本:按月抽样

查询SPY每月一个标记样本交易日(第二个星期三)的报价中位价差:每次NBBO更新
交易日中位利差(基点)报价更新(百万)已剔除无效项
2026-01-140.14510.651410
2026-02-110.14412.391365
2026-03-110.2957.595639
2026-04-150.2862.121047
2026-05-130.272.64661
2026-06-100.4097.4812382
每个数字背后的完整 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个基点,是六个月中最宽的价差。需要说明的是,这些数据来自每月第二个周三这一单日样本,并非整月价差中位数。扫描六个月内全部报价记录会超出本页面的查询预算。样本日期已在面板中列出,无效报价也计入其中,并未被悄然剔除。

上半年值得关注的股票

这是按数据衡量的关注度,而非编辑推荐。下表列出按季度美元成交额排名靠前的股票。本文重新计算了该排名,因此页面本身包含完整依据。对每只进行深度分析的股票,均附有链接。

查询第二季度常规交易时段美元成交额,全市场(排除一个待实体核验的重复代码上市)
ticker金额(十亿美元)占领先者 (%)
MU2047.5100
SPY203299.2
QQQ1658.581
NVDA1591.877.7
TSLA1198.858.5
SNDK98047.9
AMD755.236.9
INTC712.334.8
每个数字背后的完整 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十亿美元,而SPY为2032十亿美元)。这与第二季度回顾中的数据一致。在这组排名靠前的六只个股中,上半年表现如下:

查询领先标的组合的上半年和第二季度回报及上半年美元成交额:一次按代码筛选的查询
ticker上半年回报率 (%)第二季度回报率 (%)上半年金额(十亿美元)
AMD165.3179.81185.9
INTC269.3210969
MU290229.92862.1
NVDA5.213.53287.9
SNDK830.1248.41592.7
TSLA-8.2112577.1
每个数字背后的完整 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%。六月上市的大型新股使用了一个被重复使用的代码。在完成实体核验前,该股不纳入排名扫描;其首月表现另有一篇逐笔记录的文章。统计口径:排名集合按第二季度正常交易时段的美元成交额确定(即上文扫描结果);回报率为上半年从正常交易时段开盘至最后一个正常交易时段收盘的表现。

上半年的IPO浪潮:按月回顾

查询上半年每月新增上市数量
米上市
2026-01-0136
2026-02-0147
2026-03-0117
2026-04-0130
2026-05-0140
2026-06-0135
每个数字背后的完整 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
自己运行这个查询

上市浪潮主要集中在前期,且各月分布不均:2月以47宗上市成为上半年最繁忙的月份,3月则最为平静,仅有17宗。备受关注的6月大型上市发生当月,但当月整体上市数量并不突出,仅为35宗。

半年度日历

查询2026年上半年公司日历(披露全部三个月底申报索引缺口)
除息事件拆股首次公开募股上半年申报3月31日申报4月30日申报6月30日申报
28356830205471377553431
每个数字背后的完整 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_jun30
自己运行这个查询

上半年共有 205 家公司上市,形成一轮上市潮。其中,规模最大的六月首日上市另有逐笔收据记录;同期还发生了 830 次拆股和 28356 次除息事件。作为规模参照,这意味着上半年每个交易日平均有超过一家新公司上市。

备案总量还存在三重披露问题:在上半年每个最后一个日历日为工作日的月末,SEC 索引几乎为空(3月31日收录 55 份备案,4月30日收录 34 份,6月30日收录 31 份;相邻日期则有数千份)。因此,在数据源完成回补前,半年度备案数量都会被低估;月末缺口另有诊断说明。

本次交易记录

查询上半年共123个交易日,已从行情记录核实
上半年交易时段
123
每个数字背后的完整 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
自己运行这个查询

数据说明

完整数据说明
  • 截至生成时,空头持仓数据截至6月15日结算日(6月底的成交数据尚未发布,完整披露见6月回顾;数据发布后,本帖会重新生成)。
  • 2026年有三个接近空白的月末申报索引日(3月31日、4月30日和6月30日,均为上半年中最后一个日历日落在工作日的月末);相关情况已在计数中直接披露,原因分析见月末缺口说明。上年月末通常有数千份申报,因此这是数据源缺口,并非申报假期。
  • 半年度范围内的排行榜存在覆盖边界:全市场六个月扫描会超过本页生成所用的查询预算。因此,重要标的集合根据文中展示的季度范围领先者扫描结果确定;半年度回报均基于这一固定集合计算,具体口径已在使用处说明。Q2和6月回顾分别提供对应范围内的完整领先者表格。
  • 半年度范围内的全市场广度数据同样存在覆盖边界。文中展示了按日粒度的拆分;按ticker粒度的计数位于月度和季度范围的广度部分,并附有链接。
  • QQQ的历史序列短于SPY:该基金有一段时期使用不同的根符号交易。会话数量筛选会明确排除这些年份,表格中列出了逐年的会话数量。
  • 六个期权面板均为对全市场逐月扫描,价差趋势则每月抽取一个带标签的交易日;两者均通过批处理路径运行,样本口径已在文中直接说明。
  • 微观结构分析见6月29日深度分析。

方法论

  • 统计区间为2026年1月1日至6月30日,共123个交易日,已根据实际观测到的K线完成核验。各区间回报均取常规交易时段开盘至最后一个常规交易时段收盘的表现,且全部通过所示的同一组查询计算。
  • 历史比较结果在生成时基于完整的分钟级历史数据实时重算,绝不读取已存储数值。数据深度核验显示:本文使用的延迟视图中最早分钟K线日期与基础表一致,均为2003年9月;该结果已在撰写时检查。因此,文件中首个完整的上半年为2004年。所有历史查询均将上限固定在本统计区间结束日,避免后续年份录入后比较样本扩大;同时设置最小交易日数量限制,并显示各年的交易日数量。
  • 时间戳以UTC存储,并使用原始UTC上下限。多年历史数据块按美国东部时钟筛选常规交易时段(9:30–15:59),逐行转换时区。这是跨越数十年且能够适应夏令时变化的唯一规范。仅针对单一区间、且采用EDT的代码块,则使用对应的原始UTC时间段。本文在此说明两种规范。
  • 数据生成通过受控的只读路径执行;公开页面从不查询实时数据。数据仓库状态截至2026年7月5日。

这是本系列半年度定期回顾的第一期,全年版将于明年1月发布。季度详情见:2026年第二季度。本半年度交易期间发布的宏观数据见宏观背景。

#market recap#semiannual#rates#ipos#yield curve