Strasmore Research
Market Recap

สรุปภาวะตลาด H1 2026

Matt ConnorBy Matt Connor Updated 2026-07-24

ครึ่งแรกของปี 2026 ประกอบด้วยสภาวะตลาดที่แตกต่างกันสองรูปแบบ โดยในไตรมาสแรกดัชนีหลักทุกตัวใน ETF ต่างปรับตัวลดลงหรือไม่มีการเปลี่ยนแปลง แต่ในไตรมาสที่สองตลาดกลับฟื้นตัวขึ้นมาได้อย่างมาก SPY ปิดครึ่งปีที่ระดับเพิ่มขึ้น 8.8%; QQQ เพิ่มขึ้น 18.7%; และ 21.3% ของ IWM ถือเป็นครึ่งปีแรกที่ดีที่สุดเท่าที่ ETF กลุ่ม small-cap เคยบันทึกไว้ในฐานข้อมูลของเรา โดยมีรายละเอียดผลลัพธ์จากการคำนวณเปรียบเทียบกับทุกปีก่อนหน้าในคำสั่งเดียว ตลาดอัตราดอกเบี้ยแสดงทิศทางที่ชัดเจนเช่นกัน โดย ส่วนต่าง 2s10s ปรับตัวลดลงจาก 72 basis points เป็น 30 ตลอดช่วงครึ่งปีโดยไม่เกิดสภาวะ inversion หน้าเพจนี้คือบัญชีสรุปผลการดำเนินงานทั้งหมดของครึ่งปีนี้ ซึ่งประกอบด้วย สกอร์บอร์ด, การจัดอันดับทางประวัติศาสตร์, ลำดับการเปลี่ยนแปลงรายเดือน, เส้นอัตราผลตอบแทน (yield curve) ตามอายุครบกำหนดทุกช่วง, ทั้ง 11 กลุ่มอุตสาหกรรม, วิวัฒนาการรายเดือนของตลาด options และหุ้นรายตัวที่น่าสนใจในครึ่งปีนี้ ทุกตัวเลขในที่นี้คือผลลัพธ์จากการดึงข้อมูลในระบบ คุณสามารถขยายส่วนต่างๆ เพื่อดูคำสั่ง SQL ได้

ผลลัพธ์ครึ่งปี

คำสั่งดึงข้อมูลH1 2026: ผลตอบแทนครึ่งปี, Q1 และ Q2 ของ 4 index ETFs — คำนวณด้วย query เดียว
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% โดยหุ้นขนาดเล็ก (small caps) ให้ผลตอบแทนชนะทุกดัชนีหุ้นขนาดใหญ่ (large-cap) ตลอดระยะเวลาหกเดือน รายละเอียดรายไตรมาสปรากฏอยู่ใน สรุปผล Q2 ข้อสังเกตเกี่ยวกับการคำนวณแบบครึ่งปี: ค่า 8.8% ของ SPY สำหรับระยะเวลาหกเดือนนั้นน้อยกว่าค่าเฉพาะ Q2 อย่างมาก เนื่องจากช่วงครึ่งปีประกอบด้วยช่วงที่ราคาปรับตัวลดลงและการฟื้นตัว การทบต้นของ -5.2% และ 14.1% เป็นไปตามที่ระบุในตาราง และพาดหัวข่าว "ผลตอบแทนครึ่งปีแรก" ใดๆ ได้รวมวงจรการแกว่งตัวทั้งหมดนี้ไว้แล้ว

ผลตอบแทนครึ่งปีแรกเมื่อเทียบกับครึ่งปีแรกทั้งหมดในข้อมูลย้อนหลัง

ผลตอบแทนช่วง 8.8% ถือว่าผิดปกติหรือไม่? ตารางด้านล่างนี้คำนวณผลตอบแทนช่วงครึ่งปีแรกแบบเดิม — เริ่มตั้งแต่ราคาเปิดจนถึงราคาปิดในช่วงเวลาทำการปกติ ตั้งแต่เดือนมกราคมถึงมิถุนายน — ของทุกปีที่มีข้อมูลรายนาที โดยใช้การคำนวณแบบเดียวกันในทุกปีต่อหนึ่งคู่ ETF จากนั้นจึงนำผลตอบแทนช่วงครึ่งปีนี้ไปจัดลำดับเทียบกับช่วงเวลาอื่นๆ ข้อมูลรายนาทีที่เก่าที่สุดได้รับการตรวจสอบแล้วตามระเบียบวิธีวิจัยด้านล่าง โดยช่วงครึ่งปีแรกที่สมบูรณ์ช่วงแรกที่มีในฐานข้อมูลคือช่วงที่ระบุไว้ในรายการ

คำสั่งดึงข้อมูลสถิติทุกครึ่งปีแรก: SPY และ QQQ คำนวณแบบเดียวกันในแต่ละปี (แสดงจำนวน session ต่อปี)
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

8.8% ของ SPY อยู่ในลำดับที่ 6 จาก 23 ของช่วงครึ่งปีแรกทั้งหมดตั้งแต่ 2004 (ลำดับที่ 1 คือดีที่สุด) ซึ่งอยู่ในกลุ่มหนึ่งในสามอันดับแรก แต่ยังไม่ใช่สถิติสูงสุด ส่วน 18.7% ของ QQQ อยู่ในลำดับที่ 3 จาก 16 ของช่วงครึ่งปีแรกที่เทียบเคียงกันได้ — โดยชุดข้อมูลของ 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 อยู่ในลำดับที่ 1 จาก 23 ของช่วงครึ่งปีแรกทั้งหมดตั้งแต่ 2004 ซึ่งเป็นผลตอบแทนที่ดีที่สุดเท่าที่มีการบันทึกไว้สำหรับกองทุนนี้ และสูงกว่าช่วงครึ่งปีที่ฟื้นตัวทุกช่วงในตาราง ส่วน 8.4% ของ DIA อยู่ในลำดับที่ 4 จาก 23 เกณฑ์การคำนวณคือ: ราคาเปิดถึงราคาปิดในช่วงเวลาทำการปกติภายในแต่ละครึ่งปีตามปฏิทิน โดยใช้การคำนวณแบบเดียวกันในทุกปี และกำหนดเพดานสูงสุดไว้ที่จุดสิ้นสุดของช่วงเวลานี้ เพื่อป้องกันไม่ให้ชุดข้อมูลเปรียบเทียบขยายตัวขึ้นโดยไม่ทราบสาเหตุเมื่อมีการเพิ่มข้อมูลของปีต่อๆ ไปในภายหลัง

รายเดือน

คำสั่งดึงข้อมูลผลตอบแทนรายเดือนในครึ่งปี (SPY และ QQQ คำนวณแบบเดียวกันใน query เดียว)
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT toString(toStartOfMonth(toDate(toTimeZone(window_start, 'America/New_York')))) AS period_start, ticker,
    round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / argMinIf(toFloat64(open), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS month_return_pct,
    round(argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959), 2) AS month_close
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('SPY', 'QQQ')
  AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY period_start, ticker
ORDER BY period_start, ticker

ราคาเคลื่อนไหวในลักษณะขึ้นเล็กน้อย แล้วปรับตัวลงลงต่อเนื่อง ก่อนจะพุ่งขึ้นอย่างรุนแรง ตามด้วยการปรับตัวขึ้นและลงเล็กน้อย โดยเดือนเมษายนเป็นจุดเปลี่ยนสำคัญของครึ่งปี (SPY 9.9%, QQQ 14.8% — ซึ่งเป็นเดือนที่ดีที่สุดของ QQQ ในรอบหกเดือน) และเดือนมิถุนายนปิดตลาดอย่างเงียบๆ ที่ระดับ -1.2% สำหรับ SPY สามารถอ่านสรุปภาพรวมของเดือนมิถุนายนพร้อมข้อมูลความกว้างของตลาด (breadth) ที่แยกย่อยจากตัวเลขดังกล่าวได้ที่ นี่ เมื่อพิจารณาตารางรายเดือน: ปีนี้เริ่มต้นด้วยสภาวะเกือบทรงตัว (SPY 0.9% ในเดือนมกราคม) ปรับตัวลดลงในช่วงเดือนกุมภาพันธ์ (-0.5%) และมีนาคม (-4.2%) จากนั้นเดือนเมษายนได้พลิกกลับทิศทางภายในเดือนเดียว เดือนพฤษภาคมปรับตัวขึ้นต่อเนื่อง (4.9%) และเดือนมิถุนายนชะลอตัวลง ทั้งนี้มีสามเดือนจากหกเดือนที่มีผลตอบแทนเป็นลบ ซึ่งเป็นสัดส่วนที่ก้ำกึ่งสำหรับครึ่งปีที่ปิดตลาดในแดนบวกอย่างแข็งแกร่ง ซึ่งเป็นลักษณะปกติของผลตอบแทนหุ้นรายครึ่งปี และเป็นสิ่งที่ควรระลึกไว้เมื่อผลลัพธ์ของเดือนใดเดือนหนึ่งดูเหมือนจะเป็นข้อสรุปเพียงอย่างเดียว

อัตราดอกเบี้ย: วิเคราะห์เส้นอัตราผลตอบแทนตามอายุตราสาร

เส้นอัตราผลตอบแทนพันธบัตรรัฐบาล (Treasury curve) ในช่วงครึ่งปีที่ผ่านมามีการปรับเปลี่ยนรูปแบบ (twisting) แต่ไม่มีการเคลื่อนที่ไปในทิศทางเดียวกันทั้งเส้น (shifting) อัตราผลตอบแทนระยะสั้นสุด ซึ่งเป็นกลุ่มที่เคลื่อนไหวตามนโยบายการเงินมากที่สุด แทบไม่มีการเปลี่ยนแปลง โดยอัตราผลตอบแทนอายุ 2 ปี เพิ่มขึ้นสองในสามของหนึ่งเปอร์เซ็นต์ ในขณะที่อายุ 30 ปี แทบไม่มีการเปลี่ยนแปลง คณะทำงานได้แสดงรายละเอียดของเส้นอัตราผลตอบแทนทั้งหมด โดยเปรียบเทียบระหว่างต้นงวดกับสิ้นงวด

คำสั่งดึงข้อมูล7 ช่วงอายุ: อัตราผลตอบแทนต้นงวดเทียบกับปลายงวด และส่วนต่าง
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 basis points ในช่วง 6 เดือน ในขณะที่อายุ 2 ปี เพิ่มขึ้น 67 และอายุ 30 ปี เพิ่มขึ้นเพียง 5 การเคลื่อนที่แบบขนาน (parallel shift) คือการที่ทุกช่วงอายุเคลื่อนที่ไปในทิศทางเดียวกัน แต่ในครึ่งปีนี้เป็นการเคลื่อนที่บริเวณช่วงกลางของเส้นอัตราผลตอบแทน โดยที่ปลายทั้งสองด้านถูกตรึงไว้ กล่าวคือ อัตราดอกเบี้ยระยะสั้นเคลื่อนไหวใกล้เคียงกับนโยบายการเงิน และอัตราดอกเบี้ยระยะยาวแทบไม่มีการปรับราคาใหม่

ผลกระทบต่อความชันของเส้นอัตราผลตอบแทน

คำสั่งดึงข้อมูลข้อมูลความชัน: จุดเริ่มต้น, จุดสิ้นสุด, ค่าต่ำสุด — ส่วนต่างไม่เกิดการ inversion ในครึ่งปีนี้
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)

การที่อัตราผลตอบแทนระยะสั้นปรับตัวขึ้นเร็วกว่าระยะยาว คือลักษณะของการเกิด flattening: โดย ส่วนต่าง 2s10s ลดลงจาก 72 เหลือ 30 basis points ตลอดช่วงการรายงานผลใน 124 — และระดับต่ำสุดในช่วงครึ่งปีคือ 27 ดังนั้นเส้นอัตราผลตอบแทนจึงมีความชันลดลงโดยไม่เกิดภาวะ inversion การวิเคราะห์ว่าเส้นอัตราผลตอบแทนที่แบนลงจะ "บ่งบอก" ถึงสิ่งที่จะเกิดขึ้นต่อไปหรือไม่นั้นเป็นการคาดการณ์ และตารางนี้ไม่ได้จัดทำข้อมูลเพื่อการคาดการณ์

คำสั่งดึงข้อมูลส่วนต่าง 2s10s ทุกการบันทึกข้อมูลในครึ่งปี
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

ข้อมูลรายวันแสดงให้เห็นว่าการ flattening ไม่ได้เกิดขึ้นเพียงครั้งเดียว แต่เป็นการค่อยๆ ลดลง — โดยมีการรายงานผลที่ 124 ตลอดช่วงครึ่งปี โดยส่วนต่างเริ่มต้นปีที่ 72 basis points และสิ้นสุดที่ 30

กลุ่มอุตสาหกรรม: ความแตกต่างที่ดัชนีปกปิดไว้

ส่วนใดของตลาดที่สร้างผลตอบแทนส่วนใหญ่ในช่วงครึ่งปี? การแบ่งสัดส่วนครึ่งปีและรายไตรมาสของ ETF 11 กลุ่มอุตสาหกรรมของ SPDR จากการตรวจสอบเพียงครั้งเดียว

คำสั่งดึงข้อมูล11 sector ETFs: ผลตอบแทน H1 2026, แยกตาม Q1 และ Q2 และปริมาณการซื้อขาย (dollar volume) ใน H1
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) คือบทเรียนเตือนใจเกี่ยวกับช่วงเวลาที่ยาวนาน: XLE แสดงผลตอบแทนในครึ่งปีที่แข็งแกร่งที่ 18.8% — ซึ่งประกอบด้วยไตรมาสแรกที่เติบโต 36.9% ตามด้วยไตรมาสที่สองที่เติบโต -11% กลุ่มนี้เป็นกลุ่มอุตสาหกรรมขนาดใหญ่ที่แข็งแกร่งที่สุดในไตรมาสที่ดัชนีปรับตัวลดลง และเป็นหนึ่งในกลุ่มที่อ่อนแอที่สุดในไตรมาสที่ดัชนีฟื้นตัว กลุ่มการเงิน (XLF) มีทิศทางตรงกันข้าม: -9.9% ในไตรมาสที่หนึ่ง และ 7.7% ในไตรมาสที่สอง การใช้ตัวเลขรวมของ H1 เพียงตัวเดียวทำให้การเคลื่อนไหวที่ผันผวนทั้งสองทิศทางดูราบเรียบ การแยกดูรายไตรมาสจึงเป็นมุมมองที่สะท้อนความเป็นจริงมากกว่า

ต้นทุนในการซื้อขายแต่ละกลุ่มอุตสาหกรรม

ตารางแสดงผลตอบแทนนั้นมีอยู่ทั่วไป แต่ข้อมูลราคาเสนอซื้อเสนอขาย (quote tapes) นั้นหาได้ยากกว่า แผงข้อมูลนี้วัดค่ามัธยฐานของส่วนต่างราคาเสนอซื้อเสนอขาย (bid-ask spread) ของ ETF ในแต่ละกลุ่มอุตสาหกรรม ตลอดหนึ่งเซสชันเต็ม โดยวัดจากทุกการอัปเดตราคา NBBO ในวันนั้น ซึ่งในที่นี้คือวันที่ 29 มิถุนายน โดยวัดจากทั้งหมด 123 เซสชันในครึ่งปี

คำสั่งดึงข้อมูลค่ากลางของ quoted spread ตาม sector ETF ตัวแทนหนึ่ง session (29 มิถุนายน 2026) ช่วงเวลาทำการปกติ
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 มีจำนวนวันที่ปิดบวก 64 ครั้ง และปิดลบ 59 ครั้ง ตลอดช่วง 123 ของครึ่งปีนี้ ซึ่งเกือบจะเป็นการเสี่ยงดุลแบบหัวก้อยภายใต้ภาพรวมครึ่งปีที่เป็นบวกอย่างแข็งแกร่ง และนี่คือลักษณะของการปรับตัวขึ้นอย่างค่อยเป็นค่อยไปเมื่อพิจารณาจากข้อมูลรายวัน ส่วนลักษณะที่ละเอียดกว่าคือการพิจารณาทุก ticker ซึ่งดูในระดับรายเดือน: สัดส่วนหุ้นขาขึ้นต่อหุ้นขาลงในเดือนมิถุนายน ปรากฏอยู่ใน สรุปผลเดือนมิถุนายน (ซึ่งมีจำนวนหุ้นที่ราคาลดลงมากกว่าหุ้นที่ราคาเพิ่มขึ้น) และจำนวนหุ้นที่ข้ามผ่านเส้นแบ่งไตรมาสปรากฏอยู่ใน สรุปผล Q2 การสแกนหุ้นขาขึ้นทั่วทั้งตลาดในช่วงหกเดือนเพียงอย่างเดียวมีจำนวนเกินขีดจำกัดที่หน้าเว็บนี้จะแสดงผลได้ ดังนั้นจึงมีการเปิดเผยข้อจำกัดดังกล่าวไว้ที่นี่แทนที่จะใช้วิธีการตัดข้อมูลออกโดยไม่แจ้งให้ทราบ

คำสั่งดึงข้อมูลจำนวน session ของ 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
)

ข้อมูลการซื้อขาย options รายเดือน

ข้อมูลครึ่งปีแสดงให้เห็นถึงวิวัฒนาการของตลาด options แต่ละช่องด้านล่างคือการสรุปข้อมูลการซื้อขายรายเดือน ซึ่งประกอบด้วยปริมาณสัญญาซื้อขายทั้งหมด และสัดส่วนของสัญญาที่ซื้อขายในวันหมดอายุของมันเอง (0DTE) ข้อมูลระบุว่า ปริมาณการซื้อขายเพิ่มขึ้นจาก 1316.1 ล้านสัญญาในเดือนมกราคม เป็น 1477.9 ล้านสัญญาในเดือนมิถุนายน ซึ่งเป็นเดือนที่มีการซื้อขาย options หนาแน่นที่สุดในครึ่งปีนี้ และสัดส่วนของสัญญาที่หมดอายุในวันเดียวกันได้เพิ่มขึ้นจาก 26.5% ในเดือนมกราคม เป็น 34.3% ในเดือนมิถุนายน ซึ่งเป็นเดือนที่มีสัดส่วนสูงสุดในครึ่งปีนี้ โดยหนึ่งในสามของปริมาณการซื้อขาย options ในเดือนมิถุนายน คือสัญญาที่ซื้อขายในวันเดียวกับที่หมดอายุ

คำสั่งดึงข้อมูลมกราคม: ปริมาณสัญญา options ทั้งตลาด และสัดส่วนที่หมดอายุในวันเดียวกัน (1 scan)
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')
คำสั่งดึงข้อมูลกุมภาพันธ์: ปริมาณสัญญา options ทั้งตลาด และสัดส่วนที่หมดอายุในวันเดียวกัน (1 scan)
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')
คำสั่งดึงข้อมูลมีนาคม: ปริมาณสัญญา options ทั้งตลาด และสัดส่วนที่หมดอายุในวันเดียวกัน (1 scan)
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')
คำสั่งดึงข้อมูลเมษายน: ปริมาณสัญญา options ทั้งตลาด และสัดส่วนที่หมดอายุในวันเดียวกัน (1 scan)
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')
คำสั่งดึงข้อมูลพฤษภาคม: ปริมาณสัญญา options ทั้งตลาด และสัดส่วนที่หมดอายุในวันเดียวกัน (1 scan)
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')
คำสั่งดึงข้อมูลมิถุนายน: ปริมาณสัญญา options ทั้งตลาด และสัดส่วนที่หมดอายุในวันเดียวกัน (1 scan)
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')

ต้นทุนในการซื้อขายจากการสุ่มตัวอย่างรายเดือน

คำสั่งดึงข้อมูลค่ากลาง quoted spread ของ SPY ตามตัวอย่าง session ต่อเดือน (วันพุธที่สองของเดือน) ทุกการอัปเดต 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

ค่ามัธยฐานของ spread ที่เสนอซื้อขายของ SPY ในวันพุธที่สองของทุกเดือน: อยู่ที่ 0.145 bps ในกลุ่มตัวอย่างเดือนมกราคม, 0.144 ในเดือนกุมภาพันธ์ และเพิ่มขึ้นเป็นประมาณสองเท่าในช่วงกลุ่มตัวอย่างฤดูใบไม้ผลิ ส่วนในเดือนมิถุนายนอยู่ที่ 0.409 bps ซึ่งเป็นค่าที่กว้างที่สุดในบรรดาทั้งหกเดือน ทั้งนี้ Basis ที่เปิดเผยคือ ข้อมูลเหล่านี้เป็นค่ามัธยฐานจากการสุ่มตัวอย่างเพียงเซสชันเดียว (วันพุธที่สองของแต่ละเดือน) ไม่ใช่ค่ามัธยฐานตลอดทั้งเดือน เนื่องจากขอบเขตการสืบค้นข้อมูลราคาตลอดทั้งหกเดือนนั้นเกินกว่างบประมาณการสืบค้นของหน้านี้ วันที่ที่ใช้สุ่มตัวอย่างแสดงอยู่ในตาราง และมีการนับรวมราคาที่ไม่ถูกต้องไว้ในนั้นด้วยโดยไม่มีการตัดออกโดยไม่แจ้งให้ทราบ

รายชื่อที่โดดเด่นในครึ่งปี

เป็นการวัดความโดดเด่นเชิงปริมาณ ไม่ใช่การคัดเลือกโดยบรรณาธิการ: รายชื่อด้านล่างคือกลุ่มที่มีมูลค่าการซื้อขายสูงสุดในไตรมาส ซึ่งคำนวณใหม่เพื่อให้หน้านี้มีข้อมูลอ้างอิงในตัว และแต่ละชื่อที่ทำกำไรสูงจะเชื่อมโยงไปยังบทวิเคราะห์เชิงลึก

คำสั่งดึงข้อมูลปริมาณการซื้อขาย (dollar volume) ช่วงเวลาทำการปกติใน Q2 ทั้งตลาด (ไม่รวม 1 สัญลักษณ์ที่อยู่ระหว่างตรวจสอบ)
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 ระบุไว้ สำหรับหุ้นรายตัวหกตัวในกลุ่มผู้นำนี้ ในช่วงครึ่งปี:

คำสั่งดึงข้อมูลผลตอบแทนครึ่งปีและ Q2 ของกลุ่มผู้นำ พร้อมปริมาณการซื้อขาย (dollar volume) ในครึ่งปี — กรองด้วย ticker
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 ราย)

ปฏิทินครึ่งปี

คำสั่งดึงข้อมูลปฏิทินบริษัทประจำ H1 2026 (แสดงช่องว่างการยื่นรายงานสิ้นเดือนทั้ง 3 เดือน)
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 ครั้ง และเหตุการณ์จ่ายเงินปันผลแบบ ex-dividend จำนวน 28356 ครั้ง หากพิจารณาในเชิงเปรียบเทียบ จะพบว่ามีบริษัทจดทะเบียนใหม่มากกว่าหนึ่งแห่งต่อหนึ่งวันทำการตลอดช่วงครึ่งปี ข้อมูลการยื่นแบบแสดงรายการข้อมูลทั้งหมดมีข้อควรระวังสามประการ: ดัชนี SEC มีข้อมูลเกือบเป็นศูนย์ในทุกวันสิ้นเดือนของครึ่งปีที่วันสุดท้ายของเดือนเป็นวันทำการ (พบการยื่นแบบ 55 ในวันที่ 31 มีนาคม, 34 ในวันที่ 30 เมษายน และ 31 ในวันที่ 30 มิถุนายน เมื่อเทียบกับข้อมูลหลายพันรายการในวันข้างเคียง) ดังนั้นจำนวนการยื่นแบบในช่วงครึ่งปีจึงอาจต่ำกว่าความเป็นจริงจนกว่าระบบจะดึงข้อมูลย้อนหลังมาเติมเต็ม — ช่องว่างช่วงสิ้นเดือนมีหมายเหตุประกอบการวินิจฉัย

รายงานสรุปผลการซื้อขาย

คำสั่งดึงข้อมูล123 session ในครึ่งปี ตรวจสอบข้อมูลจาก tape
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 มิถุนายน — ทุกวันสิ้นเดือนของครึ่งปีที่มีวันสุดท้ายของเดือนเป็นวันธรรมดา); ข้อมูลถูกเปิดเผยรวมกับจำนวนที่นับได้ และระบุสาเหตุไว้ใน หมายเหตุช่องว่างข้อมูลสิ้นเดือน เนื่องจากวันสิ้นเดือนของปีก่อนหน้ามีการยื่นเอกสารหลายพันรายการ ดังนั้นนี่จึงเป็นช่องว่างของข้อมูลในระบบ ไม่ใช่ช่วงวันหยุดการยื่นเอกสาร
  • ขอบเขตของ Leaderboard ที่ระดับครึ่งปีมีการจำกัดไว้: การสแกนตลาดทั้งหมดในช่วงหกเดือนมีขนาดเกินกว่างบประมาณการสืบค้นที่หน้านี้กำหนด ดังนั้นจึงมีการเลือกชุดรายชื่อหุ้นที่โดดเด่นโดยใช้การสแกนผู้นำระดับรายไตรมาสที่แสดงในเนื้อหา และคำนวณผลตอบแทนของครึ่งปีจากชุดข้อมูลที่กำหนดไว้นี้ — โดยมีการระบุเกณฑ์ที่ใช้ไว้ในจุดที่เกี่ยวข้อง ทั้งนี้ Q2 และ มิถุนายน จะแสดงตารางผู้นำฉบับเต็มตามระดับข้อมูลของช่วงเวลานั้น
  • ความกว้างของตลาด (Whole-market breadth) ที่ระดับครึ่งปีมีการจำกัดไว้เช่นกัน — มีการแสดงการแบ่งข้อมูลตามระดับรายวัน; ส่วนจำนวนหุ้นรายตัว (Ticker-grain) จะแสดงในระดับเดือนและไตรมาส ซึ่งเชื่อมโยงกันในส่วนความกว้างของตลาด
  • ชุดข้อมูลประวัติของ QQQ มีระยะเวลาสั้นกว่า SPY: เนื่องจากกองทุนเคยซื้อขายภายใต้สัญลักษณ์หลักอื่นเป็นเวลาหลายปี; ระบบจึงคัดกรองจำนวนรอบการซื้อขาย (Session-count) โดยยกเว้นช่วงปีดังกล่าวออกไปอย่างชัดเจน (จำนวนรอบการซื้อขายต่อปีแสดงอยู่ในตาราง)
  • แผงข้อมูล Options ทั้งหกชุดเป็นการสแกนข้อมูลรายเดือนแบบทั้งตลาด (Whole-tape) และตัวอย่างแนวโน้ม Spread จะสุ่มหนึ่งรอบการซื้อขายต่อเดือน — ทั้งสองส่วนประมวลผลผ่านระบบ Batch; โดยมีการระบุฐานข้อมูลตัวอย่างไว้ในเนื้อหา
  • ข้อมูล Microstructure อยู่ใน บทวิเคราะห์เจาะลึก 29 มิถุนายน

ระเบียบวิธีวิจัย

  • ช่วงเวลาคือ 1 มกราคม – 30 มิถุนายน 2026 — มีทั้งหมด 123 sessions ซึ่งตรวจสอบแล้วจากแท่งเทียนที่สังเกตได้ ผลตอบแทนคำนวณจากราคาเปิดในช่วงเวลาปกติจนถึงราคาปิดในช่วงเวลาปกติสุดท้ายภายในแต่ละช่วงเวลา โดยคำนวณผ่านชุดคำสั่งเดียวกันกับที่แสดงไว้
  • การเปรียบเทียบข้อมูลย้อนหลังจะถูกคำนวณใหม่แบบ LIVE โดยเทียบกับข้อมูลรายนาทีฉบับเต็ม ณ เวลาที่สร้างข้อมูล และไม่ได้อ่านจากค่าที่จัดเก็บไว้ การตรวจสอบความลึกของข้อมูล: วันที่ของแท่งเทียนรายนาทีที่เก่าที่สุดในมุมมองแบบหน่วงเวลาที่ใช้ในที่นี้ ตรงกับตารางฐานข้อมูล (กันยายน 2003) ซึ่งได้รับการตรวจสอบขณะจัดทำ ดังนั้นข้อมูลครึ่งปีแรกที่สมบูรณ์ชุดแรกที่มีในระบบคือของปี 2004 ทุกการเรียกดูข้อมูลย้อนหลังจะกำหนดขอบเขตบนไว้ที่จุดสิ้นสุดของช่วงเวลานี้ (ชุดข้อมูลเปรียบเทียบจะไม่ขยายตัวเพิ่มขึ้นเมื่อมีการนำข้อมูลปีหลังๆ เข้ามา) และมีการใช้เกณฑ์ป้องกันจำนวน session ขั้นต่ำพร้อมแสดงจำนวน session ต่อปีไว้ให้ทราบ
  • การบันทึกเวลาใช้มาตรฐาน UTC พร้อมขอบเขตเวลา UTC ดั้งเดิม ข้อมูลย้อนหลังหลายปีจะกรองเฉพาะช่วงเวลาทำการตามเวลา Eastern wall clock (9:30–15:59 โดยแปลงค่าตามแต่ละแถว ซึ่งเป็นวิธีเดียวที่ปลอดภัยจาก DST ตลอดหลายทศวรรษ) ส่วนข้อมูลแบบช่วงเวลาเดียวในช่วง EDT จะใช้ช่วงเวลา UTC ดั้งเดิมที่เทียบเท่ากัน ทั้งสองวิธีถูกระบุไว้ในที่นี้
  • การสร้างข้อมูลดำเนินการผ่านช่องทางอ่านอย่างเดียว (read-only path) ที่มีการจำกัดสิทธิ์ หน้าเว็บสาธารณะจะไม่มีการเรียกดูข้อมูลแบบสด สถานะของคลังข้อมูล ณ วันที่ 5 กรกฎาคม 2026

นี่คือฉบับพิมพ์ครั้งแรกของการสรุปผลรายครึ่งปี; ฉบับเต็มรายปีจะตามมาในเดือนมกราคม รายละเอียดรายไตรมาส: Q2 2026 ข้อมูลเศรษฐกิจมหภาคที่ใช้เปรียบเทียบในช่วงครึ่งปีนี้อยู่ใน ภาพรวมเศรษฐกิจมหภาค