ครึ่งแรกของปี 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 ได้
ผลลัพธ์ครึ่งปี
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 จากนั้นจึงนำผลตอบแทนช่วงครึ่งปีนี้ไปจัดลำดับเทียบกับช่วงเวลาอื่นๆ ข้อมูลรายนาทีที่เก่าที่สุดได้รับการตรวจสอบแล้วตามระเบียบวิธีวิจัยด้านล่าง โดยช่วงครึ่งปีแรกที่สมบูรณ์ช่วงแรกที่มีในฐานข้อมูลคือช่วงที่ระบุไว้ในรายการ
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 ASCSQL เบื้องหลังตัวเลขแต่ละตัว
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 ASC8.8% ของ SPY อยู่ในลำดับที่ 6 จาก 23 ของช่วงครึ่งปีแรกทั้งหมดตั้งแต่ 2004 (ลำดับที่ 1 คือดีที่สุด) ซึ่งอยู่ในกลุ่มหนึ่งในสามอันดับแรก แต่ยังไม่ใช่สถิติสูงสุด ส่วน 18.7% ของ QQQ อยู่ในลำดับที่ 3 จาก 16 ของช่วงครึ่งปีแรกที่เทียบเคียงกันได้ — โดยชุดข้อมูลของ QQQ มีระยะเวลาสั้นกว่า เนื่องจากกองทุนมีการใช้ชื่อย่อหลักทรัพย์อื่นในช่วงเวลาหนึ่ง — และปีที่มีจำนวนวันทำการในช่วงครึ่งปีแรกน้อยกว่าหนึ่งร้อยวันจะถูกคัดออกโดยเกณฑ์การนับจำนวนวันทำการที่แสดงในตาราง เพื่อให้เห็นรายการที่ถูกคัดออกอย่างชัดเจน
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS y,
ticker,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions,
round((argMax(toFloat64(close), window_start) / argMin(toFloat64(open), window_start) - 1) * 100, 1) AS h1_return_pct
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('DIA', 'IWM')
AND window_start >= toDateTime('2003-01-01 00:00:00')
AND window_start < toDateTime('2026-07-01 00:00:00')
AND toMonth(toTimeZone(window_start, 'America/New_York')) <= 6
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY y, ticker
HAVING sessions >= 100
ORDER BY y ASC, ticker ASCSQL เบื้องหลังตัวเลขแต่ละตัว
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 เกณฑ์การคำนวณคือ: ราคาเปิดถึงราคาปิดในช่วงเวลาทำการปกติภายในแต่ละครึ่งปีตามปฏิทิน โดยใช้การคำนวณแบบเดียวกันในทุกปี และกำหนดเพดานสูงสุดไว้ที่จุดสิ้นสุดของช่วงเวลานี้ เพื่อป้องกันไม่ให้ชุดข้อมูลเปรียบเทียบขยายตัวขึ้นโดยไม่ทราบสาเหตุเมื่อมีการเพิ่มข้อมูลของปีต่อๆ ไปในภายหลัง
รายเดือน
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 ปี แทบไม่มีการเปลี่ยนแปลง คณะทำงานได้แสดงรายละเอียดของเส้นอัตราผลตอบแทนทั้งหมด โดยเปรียบเทียบระหว่างต้นงวดกับสิ้นงวด
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) คือการที่ทุกช่วงอายุเคลื่อนที่ไปในทิศทางเดียวกัน แต่ในครึ่งปีนี้เป็นการเคลื่อนที่บริเวณช่วงกลางของเส้นอัตราผลตอบแทน โดยที่ปลายทั้งสองด้านถูกตรึงไว้ กล่าวคือ อัตราดอกเบี้ยระยะสั้นเคลื่อนไหวใกล้เคียงกับนโยบายการเงิน และอัตราดอกเบี้ยระยะยาวแทบไม่มีการปรับราคาใหม่
ผลกระทบต่อความชันของเส้นอัตราผลตอบแทน
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 การวิเคราะห์ว่าเส้นอัตราผลตอบแทนที่แบนลงจะ "บ่งบอก" ถึงสิ่งที่จะเกิดขึ้นต่อไปหรือไม่นั้นเป็นการคาดการณ์ และตารางนี้ไม่ได้จัดทำข้อมูลเพื่อการคาดการณ์
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 จากการตรวจสอบเพียงครั้งเดียว
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 เซสชันในครึ่งปี
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 การสแกนหุ้นขาขึ้นทั่วทั้งตลาดในช่วงหกเดือนเพียงอย่างเดียวมีจำนวนเกินขีดจำกัดที่หน้าเว็บนี้จะแสดงผลได้ ดังนั้นจึงมีการเปิดเผยข้อจำกัดดังกล่าวไว้ที่นี่แทนที่จะใช้วิธีการตัดข้อมูลออกโดยไม่แจ้งให้ทราบ
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 ในเดือนมิถุนายน คือสัญญาที่ซื้อขายในวันเดียวกับที่หมดอายุ
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-01-01 00:00:00')
AND window_start < toDateTime('2026-02-01 00:00:00')SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-02-01 00:00:00')
AND window_start < toDateTime('2026-03-01 00:00:00')SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-03-01 00:00:00')
AND window_start < toDateTime('2026-04-01 00:00:00')SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-04-01 00:00:00')
AND window_start < toDateTime('2026-05-01 00:00:00')SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-05-01 00:00:00')
AND window_start < toDateTime('2026-06-01 00:00:00')SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT round(sum(toFloat64(volume)) / 1e6, 1) AS contracts_mm,
round(100.0 * sumIf(toFloat64(volume), toDateOrNull(concat('20', substring(ticker, length(ticker) - 14, 6))) = toDate(toTimeZone(window_start, 'America/New_York'))) / sum(toFloat64(volume)), 1) AS zero_dte_pct,
uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) AS sessions
FROM global_markets.options_minute_aggs
WHERE window_start >= toDateTime('2026-06-01 00:00:00')
AND window_start < toDateTime('2026-07-01 00:00:00')ต้นทุนในการซื้อขายจากการสุ่มตัวอย่างรายเดือน
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT toDate(toTimeZone(sip_timestamp, 'America/New_York')) AS session,
round(quantileDeterministicIf(0.5)((toFloat64(ask_price) - toFloat64(bid_price)) / ((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, toUInt64(toUnixTimestamp64Micro(sip_timestamp)), bid_price > 0 AND ask_price >= bid_price), 3) AS med_spread_bps,
round(count() / 1e6, 2) AS quote_updates_m,
countIf(NOT (bid_price > 0 AND ask_price > 0 AND ask_price >= bid_price)) AS invalid_dropped
FROM global_markets.cache_stocks_quotes
WHERE ticker = 'SPY'
AND ((sip_timestamp >= toDateTime64('2026-01-14 14:30:00', 9) AND sip_timestamp < toDateTime64('2026-01-14 21:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-02-11 14:30:00', 9) AND sip_timestamp < toDateTime64('2026-02-11 21:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-03-11 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-03-11 20:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-04-15 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-04-15 20:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-05-13 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-05-13 20:00:00', 9))
OR (sip_timestamp >= toDateTime64('2026-06-10 13:30:00', 9) AND sip_timestamp < toDateTime64('2026-06-10 20:00:00', 9)))
GROUP BY session
ORDER BY session ASCค่ามัธยฐานของ spread ที่เสนอซื้อขายของ SPY ในวันพุธที่สองของทุกเดือน: อยู่ที่ 0.145 bps ในกลุ่มตัวอย่างเดือนมกราคม, 0.144 ในเดือนกุมภาพันธ์ และเพิ่มขึ้นเป็นประมาณสองเท่าในช่วงกลุ่มตัวอย่างฤดูใบไม้ผลิ ส่วนในเดือนมิถุนายนอยู่ที่ 0.409 bps ซึ่งเป็นค่าที่กว้างที่สุดในบรรดาทั้งหกเดือน ทั้งนี้ Basis ที่เปิดเผยคือ ข้อมูลเหล่านี้เป็นค่ามัธยฐานจากการสุ่มตัวอย่างเพียงเซสชันเดียว (วันพุธที่สองของแต่ละเดือน) ไม่ใช่ค่ามัธยฐานตลอดทั้งเดือน เนื่องจากขอบเขตการสืบค้นข้อมูลราคาตลอดทั้งหกเดือนนั้นเกินกว่างบประมาณการสืบค้นของหน้านี้ วันที่ที่ใช้สุ่มตัวอย่างแสดงอยู่ในตาราง และมีการนับรวมราคาที่ไม่ถูกต้องไว้ในนั้นด้วยโดยไม่มีการตัดออกโดยไม่แจ้งให้ทราบ
รายชื่อที่โดดเด่นในครึ่งปี
เป็นการวัดความโดดเด่นเชิงปริมาณ ไม่ใช่การคัดเลือกโดยบรรณาธิการ: รายชื่อด้านล่างคือกลุ่มที่มีมูลค่าการซื้อขายสูงสุดในไตรมาส ซึ่งคำนวณใหม่เพื่อให้หน้านี้มีข้อมูลอ้างอิงในตัว และแต่ละชื่อที่ทำกำไรสูงจะเชื่อมโยงไปยังบทวิเคราะห์เชิงลึก
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 8MU มีปริมาณการซื้อขายสูงกว่า SPY ตลอดช่วงไตรมาสที่สอง ($2047.5 พันล้านดอลลาร์ เทียบกับ $2032 พันล้านดอลลาร์) — ซึ่งเป็นข้อมูลชุดเดียวกับที่ สรุปภาพรวม Q2 ระบุไว้ สำหรับหุ้นรายตัวหกตัวในกลุ่มผู้นำนี้ ในช่วงครึ่งปี:
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT ticker,
round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
/ argMinIf(toFloat64(open), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS h1_return_pct,
round((argMaxIf(toFloat64(close), window_start, (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959)
/ argMinIf(toFloat64(open), window_start, window_start >= toDateTime('2026-04-01 00:00:00') AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) - 1) * 100, 1) AS q2_return_pct,
round(sumIf(toFloat64(close) * toFloat64(volume), (toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959) / 1e9, 1) AS h1_dollar_bn
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('MU', 'NVDA', 'TSLA', 'SNDK', 'AMD', 'INTC')
AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')
GROUP BY ticker
ORDER BY tickerกลุ่มอุตสาหกรรมหน่วยความจำและเซมิคอนดักเตอร์ครองตลาดในครึ่งปีนี้: SNDK ให้ผลตอบแทน 830.1% ในรอบหกเดือน, MU ให้ผลตอบแทน 290% — วิเคราะห์รายละเอียดรายวันของเดือนมิถุนายนได้ที่นี่ — และ INTC ให้ผลตอบแทน 269.3% ส่วน NVDA ซึ่งเป็นหุ้นที่มีปริมาณการซื้อขายสูงสุดในกลุ่มที่ $3287.9 พันล้านดอลลาร์ในช่วงครึ่งปี ให้ผลตอบแทน 5.2% — ซึ่งเป็นเลขหลักเดียวในขณะที่หุ้นกลุ่มหน่วยความจำมีกำไรเพิ่มขึ้นหลายเท่าตัว; บทวิเคราะห์เชิงลึกประจำเดือนมิถุนายน จะแสดงความแตกต่างนี้แยกตามรอบการซื้อขาย ส่วน TSLA เป็นหุ้นตัวเดียวในกลุ่มที่ติดลบที่ -8.2% สำหรับหุ้นขนาดใหญ่ในเดือนมิถุนายนที่มีการซื้อขายภายใต้สัญลักษณ์เดิมนั้น ถูกยกเว้นจากการสแกนกลุ่มผู้นำเพื่อรอการตรวจสอบสถานะนิติบุคคล — รายงานสรุปรายเดือนแรกของหุ้นตัวนี้ เกณฑ์การคัดเลือก: กลุ่มผู้นำถูกเลือกโดยใช้ปริมาณการซื้อขายดอลลาร์ในช่วงเวลาทำการปกติของ Q2 (ตามการสแกนด้านบน); คอลัมน์ผลตอบแทนคือผลตอบแทนของครึ่งปี โดยคำนวณจากราคาเปิดช่วงเวลาทำการปกติแรกสุดจนถึงราคาปิดช่วงเวลาทำการปกติสุดท้าย
คลื่นการทำ IPO ในครึ่งปีนี้ รายเดือน
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT toString(toStartOfMonth(listing_date)) AS m, count() AS listings
FROM global_markets.stocks_ipos
WHERE listing_date >= toDate('2026-01-01') AND listing_date <= toDate('2026-06-30')
GROUP BY m
ORDER BY mปริมาณการจดทะเบียนหุ้นใหม่มีความหนาแน่นในช่วงต้นและไม่สม่ำเสมอ โดยเดือนกุมภาพันธ์เป็นเดือนที่มีการจดทะเบียนสูงสุดที่ 47 ราย และเดือนมีนาคมมีปริมาณน้อยที่สุดที่ 17 ส่วนการจดทะเบียนครั้งใหญ่ในเดือนมิถุนายนซึ่งเป็นที่รู้จักกันดีนั้น เกิดขึ้นในเดือนที่มีปริมาณการจดทะเบียนปกติ (35 ราย)
ปฏิทินครึ่งปี
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
(SELECT count() FROM global_markets.stocks_dividends WHERE ex_dividend_date >= toDate('2026-01-01') AND ex_dividend_date <= toDate('2026-06-30')) AS ex_div_events,
(SELECT count() FROM global_markets.stocks_splits WHERE execution_date >= toDate('2026-01-01') AND execution_date <= toDate('2026-06-30')) AS splits,
(SELECT count() FROM global_markets.stocks_ipos WHERE listing_date >= toDate('2026-01-01') AND listing_date <= toDate('2026-06-30')) AS ipos,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date >= toDate('2026-01-01') AND filing_date <= toDate('2026-06-30')) AS h1_filings,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-03-31')) AS filings_mar31,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-04-30')) AS filings_apr30,
(SELECT uniqExact(accession_number) FROM global_markets.stocks_sec_edgar_index WHERE filing_date = toDate('2026-06-30')) AS filings_jun30มีบริษัทจำนวน 205 แห่งเข้าจดทะเบียนในตลาดในช่วงครึ่งปีนี้ ซึ่งเป็นกระแสการเข้าจดทะเบียนที่มีการเปิดตัวครั้งใหญ่ที่สุดในเดือนมิถุนายน โดยมี บทความสรุปรายละเอียดรายบริษัท ควบคู่ไปกับการแตกหุ้นจำนวน 830 ครั้ง และเหตุการณ์จ่ายเงินปันผลแบบ ex-dividend จำนวน 28356 ครั้ง หากพิจารณาในเชิงเปรียบเทียบ จะพบว่ามีบริษัทจดทะเบียนใหม่มากกว่าหนึ่งแห่งต่อหนึ่งวันทำการตลอดช่วงครึ่งปี ข้อมูลการยื่นแบบแสดงรายการข้อมูลทั้งหมดมีข้อควรระวังสามประการ: ดัชนี SEC มีข้อมูลเกือบเป็นศูนย์ในทุกวันสิ้นเดือนของครึ่งปีที่วันสุดท้ายของเดือนเป็นวันทำการ (พบการยื่นแบบ 55 ในวันที่ 31 มีนาคม, 34 ในวันที่ 30 เมษายน และ 31 ในวันที่ 30 มิถุนายน เมื่อเทียบกับข้อมูลหลายพันรายการในวันข้างเคียง) ดังนั้นจำนวนการยื่นแบบในช่วงครึ่งปีจึงอาจต่ำกว่าความเป็นจริงจนกว่าระบบจะดึงข้อมูลย้อนหลังมาเติมเต็ม — ช่องว่างช่วงสิ้นเดือนมีหมายเหตุประกอบการวินิจฉัย
รายงานสรุปผลการซื้อขาย
SQL เบื้องหลังตัวเลขแต่ละตัว
SELECT
(SELECT uniqExact(toDate(toTimeZone(window_start, 'America/New_York'))) FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= toDateTime('2026-01-01 00:00:00') AND window_start < toDateTime('2026-07-01 00:00:00')) AS h1_sessionsหมายเหตุข้อมูล
รายละเอียดหมายเหตุข้อมูลทั้งหมด
- ข้อมูล Short interest สิ้นสุด ณ วันชำระราคา 15 มิถุนายน ตามข้อมูลที่มี ณ ขณะที่สร้างรายงาน (อยู่ระหว่างรอข้อมูลสรุปสิ้นเดือนมิถุนายน — รายละเอียดฉบับเต็มอยู่ใน สรุปเดือนมิถุนายน; บทความนี้จะแสดงข้อมูลใหม่เมื่อข้อมูลดังกล่าวพร้อม)
- วันสิ้นเดือนที่มีการยื่นเอกสารสำหรับปี 2026 จำนวนสามวันมีข้อมูลเกือบว่างเปล่า (31 มีนาคม, 30 เมษายน, 30 มิถุนายน — ทุกวันสิ้นเดือนของครึ่งปีที่มีวันสุดท้ายของเดือนเป็นวันธรรมดา); ข้อมูลถูกเปิดเผยรวมกับจำนวนที่นับได้ และระบุสาเหตุไว้ใน หมายเหตุช่องว่างข้อมูลสิ้นเดือน เนื่องจากวันสิ้นเดือนของปีก่อนหน้ามีการยื่นเอกสารหลายพันรายการ ดังนั้นนี่จึงเป็นช่องว่างของข้อมูลในระบบ ไม่ใช่ช่วงวันหยุดการยื่นเอกสาร
- ขอบเขตของ 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 ข้อมูลเศรษฐกิจมหภาคที่ใช้เปรียบเทียบในช่วงครึ่งปีนี้อยู่ใน ภาพรวมเศรษฐกิจมหภาค