Strasmore Research
Market Recap

2026上半年市場總回顧

Matt ConnorBy Matt Connor Updated 2026-07-25

2026年上半年是兩個截然不同的市場縫合在一起:第1季主要指數ETF全數下跌或原地踏步,第2季不僅修復,還補得更多。SPY上半年收漲8.8%;QQQ上漲18.7%;IWM的21.3%漲幅,是我們手中紀錄裡這檔小型股ETF表現最好的上半年——下方附上憑據,以單一查詢對歷年所有數據重新計算。利率市場則講述自己的故事:2年期與10年期利差72個基點收窄至30,整個上半年從未倒掛。本頁是這半年的完整帳本——記分板、歷史排名、逐月階梯、各天期整條殖利率曲線、十一大板塊、選擇權市場逐月演變,以及上半年值得關注的個股。此處每個數字皆為儲存查詢結果;展開任一面板即可查看SQL。

上半年成績單

查詢2026年上半年:四檔指數ETF的上半年、第1季與第2季報酬 — 單一查詢計算
每個數據背後的精確 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% 的漲幅,成為上半年低調的領頭羊——小型股在這六個月內,表現優於所有大型股指數。季度細節請見第2季回顧。關於上半年報酬率的計算方式:SPY 這六個月的 8.8%,遠低於單看第2季的數字,因為上半年串聯了一波下跌與一波回升——-5.2% 與 14.1% 的複合結果,正是表格所呈現的數字,而任何「上半年報酬率」的標題,都默默包含了這趟完整的來回走勢。

盤面上每一個上半年對比這一個上半年

一個 8.8% 的上半年算不算罕見?以下面板重新計算相同的上半年報酬——從1月到6月,以第一個常規交易時段開盤價到最後一個常規交易時段收盤價為準——針對每一年的分鐘歷史資料,每個ETF配對用一個查詢,每年採用完全相同的計算方式,然後將這個上半年與其餘年份進行排名。分鐘資料的最早日期已在下方的方法論中驗證;檔案中第一個完整的上半年,就是收據上所標示的那一個。

查詢歷年每個上半年:SPY與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 ('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為最佳;排除自身)
每個數據背後的精確 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(排名1為最佳)——位於前三分之一,並非紀錄。QQQ 的 18.7% 在 16 個可比較的上半年中排名第 3——QQQ 的序列較短——該基金曾有數年以不同的根代碼交易——且任何一個符號若上半年交易日少於一百天,就會被表格中顯示的交易日數防護機制排除,因此排除情況是可見的,而非隱性的。

查詢歷年每個上半年:DIA與IWM,相同計算方式
每個數據背後的精確 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為最佳;排除自身)
每個數據背後的精確 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,單一查詢以相同方式重新計算)
每個數據背後的精確 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 月則有所緩和。六個月中有三個月收跌——對於一個最終穩健收紅的半年度來說,漲跌月份數量各半,這是股票市場半年度表現的常見型態,值得記住,以免將單一月份的表現誤判為最終結論。

利率:整條曲線,逐個年期檢視

美國公債殖利率曲線在這半年間是扭轉,而非平移。最前端——追蹤政策最緊密的年期——幾乎紋風不動;兩年期上升三分之二個百分點;三十年期幾乎沒有反應。下表將整條曲線在半年開始與結束時的狀況並列呈現。

查詢七種期限:上半年起始與結束時的殖利率,以及變動
每個數據背後的精確 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)

短端上升速度快於長端,正是殖利率曲線平坦化的定義:2年期與10年期公債利差124 筆報價中,從 72 個基點逐步收窄至 30 個基點——而該半年度最低報價為 27,因此曲線是平坦化,但從未出現倒掛。平坦化的曲線是否「預示」未來走勢,屬於預測範疇,而本表不做預測。

查詢2年10年期利差,上半年每一筆報價
每個數據背後的精確 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,一次查詢呈現半年與季度拆分。

查詢十一檔產業ETF:2026年上半年報酬、第1季與第2季拆分,以及上半年成交金額
每個數據背後的精確 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%,其中第2季為 42%,而通訊服務 (XLC) 收在 -9.3%,六個月內最佳與最差類股的差距約達四十個百分點。持有「全市場」意味著同時持有這兩個極端。能源股是長期視角下的警示案例:XLE 顯示出健康的 18.8% 上半年漲幅,但這是由第1季的 36.9% 加上第2季的 -11% 所構成。在指數下跌的那一季,它是市場中最強的大型類股;而在指數復甦的那一季,它卻成了最弱的類股之一。金融股 (XLF) 則上演了相反的戲碼:第1季為 -9.9%,隨後第2季為 7.7%。單一的上半年數字抹平了這兩趟往返;季度拆分才是誠實的觀點。

交易各類股板塊的成本

報酬率表格隨處可見,但報價紀錄卻不是。這張圖表衡量的是每個類股板塊 ETF 在一個完整代表性交易日的買賣價差中位數——該半年度包含 123 個交易日,而此處衡量並標示的是 6 月 29 日當天,取自當日每一次的全美最佳買賣價更新。

查詢各產業ETF的中位報價價差,取一個代表性交易日(2026年6月29日),一般交易時段
每個數據背後的精確 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 具有流動性」的實際意義:建立任何板塊觀點的成本是以百分點的零頭來計算。若要與個股對照,6 月 29 日深入分析衡量了一檔流動性較差標的的價差,在同一個交易日達到這些水準的數百倍。

半年廣度

半年度規模的廣度在此分為兩種顆粒度。粗顆粒:SPY 在這半年 123 個交易日中,上漲 64 次,下跌 59 次——在一個穩健上漲的半年裡,每日表現幾乎像是擲硬幣,這正是從逐日記錄來看緩步走高的樣貌。細顆粒——逐一計算每檔股票——則以月為單位呈現:6 月的漲跌家數比請見6 月回顧(當月下跌家數多於上漲家數),而季度邊界的統計則在第 2 季回顧中。單次掃描全市場半年漲跌家數會超出本頁面產生的查詢預算;此限制在此揭露,而非默默縮小範圍。

查詢SPY上半年上漲與下跌交易時段數,一份簡易收據
每個數據背後的精確 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 百萬口——這是上半年最繁忙的選擇權交易月份——而當日到期合約的交易占比,則從1月的 26.5% 上升至6月的 34.3%,創下上半年單月最高紀錄。6月有三分之一的選擇權交易量,是來自當天到期的合約。

查詢1月:全市場選擇權合約成交量與當日到期占比(單次掃描)
每個數據背後的精確 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月:全市場選擇權合約成交量與當日到期占比(單次掃描)
每個數據背後的精確 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月:全市場選擇權合約成交量與當日到期占比(單次掃描)
每個數據背後的精確 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月:全市場選擇權合約成交量與當日到期占比(單次掃描)
每個數據背後的精確 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月:全市場選擇權合約成交量與當日到期占比(單次掃描)
每個數據背後的精確 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月:全市場選擇權合約成交量與當日到期占比(單次掃描)
每個數據背後的精確 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更新
每個數據背後的精確 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 在每月第二個星期三的報價中位數買賣價差:1月樣本為 0.145 個基點,2月樣本為 0.144,春季各月樣本約為該數字的兩倍,而6月樣本則為 0.409 個基點——是六次抽樣中最寬的。揭露基礎:這些是單一標記的抽樣時段(每月第二個星期三),而非全月中位數——為期六個月的完整報價紀錄掃描超出了本頁面的查詢預算。抽樣日期列於面板中,無效報價亦在其中計數,而非直接剔除。

上半年值得關注的個股

這裡衡量的是客觀關注度,而非編輯主觀挑選:以下名單是季度美元成交量排行榜的頂端,在此重新計算,讓本頁面自帶數據憑證,而每一檔獲得深入分析的個股都會附上連結。

查詢第2季一般交易時段成交金額,全市場(一檔重複代碼上市標的待實體驗證後排除)
每個數據背後的精確 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 在第2季的成交量超越 SPY(2047.5 億美元對上 2032 億美元)——與 第2季回顧 所載的數據憑證相同。針對該領先組合中的六檔個股,上半年表現如下:

查詢領先群的上半年與第2季報酬,加上上半年成交金額 — 經代碼篩選的查詢
每個數據背後的精確 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%——其6月逐筆交易分析在此——INTC 回報 269.3%。NVDA 是該組合中上半年成交量最大的個股,達 3287.9 億美元,回報 5.2%——當記憶體股倍數成長時,其漲幅僅為個位數;其6月深入分析 逐個交易日記錄了此一分歧走勢。TSLA 是該組合中唯一下跌的個股,跌幅為 -8.2%。6月那檔巨額上市交易使用了一個重複使用的代碼,在實體驗證完成前,將被排除在領先股掃描之外——其首月表現有獨立的逐筆數據文章。計算基礎:領先組合是根據第2季正常交易時段美元成交量選出(即上方掃描結果);回報欄位為上半年數據,從第一個正常交易時段開盤價至最後一個正常交易時段收盤價。

上半年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

這波上市潮集中在上半段且分布不均:2月是上半年最繁忙的月份,共有47件掛牌,3月則最冷清,僅17件——而著名的6月超級IPO登場當月,其餘交易量僅屬一般水準(35件掛牌)。

半年行事曆

查詢2026年上半年公司行事曆(揭露三個月結申報索引缺口)
每個數據背後的精確 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個交易時段,經由交易紀錄驗證
每個數據背後的精確 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日——即該半年度中,最後一個日曆日落在週間的每個月月底);已隨筆數一併揭露,並於月末缺口說明中診斷原因。前一年度同月月底均有數千筆申報,因此此為資料饋送缺口,而非申報假日。
  • 半年度規模的排行榜有其範圍限制:六個月全市場掃描超出本頁面生成所依據的查詢預算,因此值得關注的名單係由內文所示的季度規模排行榜掃描選出,半年度的回報則針對此固定名單計算——使用處均載明基礎。第2季6月回顧則各自包含其規模下的完整排行榜表格。
  • 半年度規模的全市場廣度同樣有其範圍限制——顯示了逐日劃分的數據;逐檔劃分的筆數則存在於月度與季度規模,並於廣度段落中提供連結。
  • QQQ歷史序列較SPY為短:該基金在若干年份以不同的根代碼交易;交易時段筆數防護機制已將那些年份明顯排除(每年交易時段筆數見表格)。
  • 六個選擇權面板為全市場月度掃描,而價差趨勢則每月取樣一個標記時段——兩者均於批次路徑執行;取樣基礎均於內文載明。
  • 微觀結構詳見6月29日深度分析

方法說明

  • 期間為2026年1月1日至6月30日 — 共 123 個交易日,以實際K線驗證。報酬率計算方式為各區間內第一個正常交易時段開盤價至最後一個正常交易時段收盤價,所有計算均於下方所示相同查詢中完成。
  • 歷史比較數據係於生成當下,針對完整分鐘歷史資料即時重新計算 — 絕非讀取預存數值。深度驗證:此處使用之延遲視圖中,最早的分鐘K線日期與基礎資料表相符(2003年9月),已於撰寫時核對,因此檔案中第一個完整上半年紀錄為2004年。每一項歷史查詢均將其上限固定於本期結束時點(後續年度資料匯入時,比較數據集不會隨之擴大),並設有最低交易時段門檻,同時附上各年度交易時段數。
  • 時間戳記以UTC儲存,並以原始UTC邊界界定。多年期歷史區塊依美東時間篩選正常交易時段(9:30–15:59,逐列轉換 — 此為跨數十年間唯一能正確處理夏令時的慣例);僅涵蓋美東夏令時區間的單一區塊,則使用等效的原始UTC區間。兩種慣例均於此處載明。
  • 生成過程經由管制唯讀路徑執行;公開頁面絕不進行即時查詢。資料倉儲狀態截至2026年7月5日。

此為定期半年度回顧之首版;完整年度版本將於1月發布。季度詳情:2026年第2季。本半年度交易對應之宏觀數據發布,請見宏觀圖景