Strasmore Research
สรุปภาวะตลาด Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-07-24 · data as of July 24, 2026 · refreshed weekly

หุ้นที่ทำจุดสูงสุดและจุดต่ำสุดในรอบ 52 สัปดาห์

ตรวจสอบรายชื่อหุ้นที่ปิดตลาดที่ระดับราคา 52-week high และ 52-week low จากข้อมูล exchange tape เพื่อใช้เป็นดัชนีชี้วัดความแข็งแกร่งของตลาด

ราคา 52-week high คือราคาปิดที่สูงที่สุดของหุ้นในช่วงหนึ่งปีที่ผ่านมา และ 52-week low คือราคาปิดที่ต่ำที่สุด ในการซื้อขายรอบล่าสุด Jul 21, 2026, 26 หุ้นในรายการนี้ปิดที่ระดับราคาหรือภายในช่วง 1% ของ 52-week high และ 7 ปิดที่ระดับราคาหรือภายในช่วง 1% ของ 52-week low ข้อมูลนี้ครอบคลุมบริษัทจดทะเบียนขนาดใหญ่ที่มีสภาพคล่องสูงในสหรัฐฯ โดยอ้างอิงข้อมูลจาก exchange tape

หุ้นที่ทำจุดสูงสุดใหม่ในรอบ 52 สัปดาห์

รายการหุ้นที่มีผลตอบแทนสูงสุดตั้งแต่ต้นปีจนถึงปัจจุบันแสดงอยู่ด้านล่าง โดยมีหุ้นสูงสุดสิบสองตัว หุ้นเหล่านี้ปิดตลาดที่ระดับราคาหรือห่างจากระดับราคาปิดสูงสุดในรอบ 52 สัปดาห์ที่ผ่านมาไม่เกิน 1

คำสั่งดึงข้อมูลหุ้นที่ทำจุดสูงสุดใหม่ในรอบ 52 สัปดาห์ เรียงตามผลตอบแทน YTD
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH universe AS (
    SELECT ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= now() - INTERVAL 20 DAY
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
      AND ticker IN (SELECT arrayJoin(tickers) FROM global_markets.stocks_income_statements
                     WHERE period_end >= today() - 400)
      AND ticker NOT IN ('SPCX','KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                         WHERE execution_date BETWEEN today() - 460 AND today())
    GROUP BY ticker
    HAVING sum(toFloat64(close) * toFloat64(volume)) >= 2000000000
),
last_session AS (
    SELECT max(toDate(et)) AS d
    FROM (
        SELECT toTimeZone(window_start, 'America/New_York') AS et
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
),
daily AS (
    SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
    FROM (
        SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= now() - INTERVAL 375 DAY
          AND ticker IN (SELECT ticker FROM universe)
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
    GROUP BY ticker, dt
    HAVING nbars >= 20 AND dt > (SELECT d FROM last_session) - 365
),
ranged AS (
    SELECT ticker,
           argMax(c, dt) AS last_close,
           max(c) AS hi,
           min(c) AS lo,
           argMaxIf(c, dt, dt <= toDate('2025-12-31')) AS base_close,
           count() AS n_sessions,
           min(dt) AS first_dt,
           max(dt) AS last_dt
    FROM daily
    GROUP BY ticker
    HAVING n_sessions >= 200
       AND countIf(dt <= toDate('2025-12-31')) > 0
       AND last_dt = (SELECT d FROM last_session)
       AND first_dt <= (SELECT d FROM last_session) - 350
)
SELECT ticker,
       round(last_close, 2) AS close,
       round((last_close / base_close - 1) * 100, 1) AS ytd_return_pct
FROM ranged
WHERE last_close >= hi * 0.99
ORDER BY ytd_return_pct DESC, ticker ASC
LIMIT 12

DAVE มีผลตอบแทนสูงสุดในปีนี้ที่ 99.6% โดยปิดที่ $439.18 สำหรับรายการนี้ ราคาปิดจะอยู่ในระดับสูงสุดในรอบ 52 สัปดาห์โดยห่างไม่เกิน 1% ตามเงื่อนไขการคัดเลือก ดังนั้นคอลัมน์ราคาจึงเป็นทั้งราคาปิดและระดับราคาที่กำลังทดสอบด้วย ถัดมาคือ DINO ที่ระดับ 99% และ MPC ที่ระดับ 96.6% ส่วนหุ้นลำดับสุดท้ายในตารางคือ ROKU ซึ่งมีผลตอบแทนในปีนี้อยู่ที่ 33%

ประเด็นสำคัญคือส่วนต่างดังกล่าว การทำจุดสูงสุดในรอบ 52 สัปดาห์เป็นเพียงการระบุว่าราคาปัจจุบันอยู่ในตำแหน่งใดเมื่อเทียบกับกรอบราคาในรอบหนึ่งปีเท่านั้น หุ้นที่ราคาตกลงอย่างหนักเมื่อฤดูร้อนที่ผ่านมาแล้วค่อยๆ ฟื้นตัวกลับมา จะถูกจัดอยู่ในกลุ่มเดียวกับหุ้นที่มีราคาปรับตัวขึ้นอย่างต่อเนื่องโดยไม่หยุดพัก

หุ้นที่ราคาต่ำสุดในรอบ 52 สัปดาห์

ข้อมูลชุดเดิมแต่แสดงผลในทิศทางตรงกันข้าม รายชื่อเหล่านี้ปิดตลาดที่ระดับราคาต่ำสุดในรอบ 52 สัปดาห์ หรือห่างจากจุดต่ำสุดไม่เกิน 1% โดยเรียงลำดับจากผลตอบแทนตั้งแต่ต้นปี (year-to-date) ที่แย่ที่สุด จำนวนทั้งหมดสิบสองบริษัท

คำสั่งดึงข้อมูลหุ้นที่ทำจุดต่ำสุดใหม่ในรอบ 52 สัปดาห์ เรียงตามผลตอบแทน YTD
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH universe AS (
    SELECT ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= now() - INTERVAL 20 DAY
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
      AND ticker IN (SELECT arrayJoin(tickers) FROM global_markets.stocks_income_statements
                     WHERE period_end >= today() - 400)
      AND ticker NOT IN ('SPCX','KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                         WHERE execution_date BETWEEN today() - 460 AND today())
    GROUP BY ticker
    HAVING sum(toFloat64(close) * toFloat64(volume)) >= 2000000000
),
last_session AS (
    SELECT max(toDate(et)) AS d
    FROM (
        SELECT toTimeZone(window_start, 'America/New_York') AS et
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
),
daily AS (
    SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
    FROM (
        SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= now() - INTERVAL 375 DAY
          AND ticker IN (SELECT ticker FROM universe)
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
    GROUP BY ticker, dt
    HAVING nbars >= 20 AND dt > (SELECT d FROM last_session) - 365
),
ranged AS (
    SELECT ticker,
           argMax(c, dt) AS last_close,
           max(c) AS hi,
           min(c) AS lo,
           argMaxIf(c, dt, dt <= toDate('2025-12-31')) AS base_close,
           count() AS n_sessions,
           min(dt) AS first_dt,
           max(dt) AS last_dt
    FROM daily
    GROUP BY ticker
    HAVING n_sessions >= 200
       AND countIf(dt <= toDate('2025-12-31')) > 0
       AND last_dt = (SELECT d FROM last_session)
       AND first_dt <= (SELECT d FROM last_session) - 350
)
SELECT ticker,
       round(last_close, 2) AS close,
       round((last_close / base_close - 1) * 100, 1) AS ytd_return_pct
FROM ranged
WHERE last_close <= lo * 1.01
ORDER BY ytd_return_pct ASC, ticker ASC
LIMIT 12

PNR มีผลตอบแทนตั้งแต่ต้นปีที่แย่ที่สุดในรายการที่ -41% โดยปิดที่ $61.48 ซึ่งเป็นระดับราคาปิดต่ำสุดในรอบ 52 สัปดาห์ (ห่างจากจุดต่ำสุดไม่เกิน 1%) ตามมาด้วย CPRT ที่ระดับ -30.6%

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

ความหมายของจำนวนหุ้นที่ทำจุดสูงสุดและจุดต่ำสุดต่อความกว้างของตลาด

ความกว้างของตลาด (Breadth) เป็นการวัดจำนวนหุ้นที่มีส่วนร่วมในการเคลื่อนที่ของราคา แทนที่จะวัดเพียงระยะทางที่ดัชนีเคลื่อนที่ไป การเปรียบเทียบจำนวนหุ้นที่ทำจุดสูงสุดใหม่เทียบกับจุดต่ำสุดใหม่เป็นหนึ่งในตัวบ่งชี้ความกว้างของตลาดที่เก่าแก่ที่สุด และในหน้านี้คือตัวเลขที่ควรเฝ้าติดตาม

คำสั่งดึงข้อมูลจำนวนหุ้นที่ทำจุดสูงสุดใหม่เทียบกับจุดต่ำสุดใหม่ รายวัน ในช่วง 6 สัปดาห์ที่ผ่านมา
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH universe AS (
    SELECT ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= now() - INTERVAL 20 DAY
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
      AND ticker IN (SELECT arrayJoin(tickers) FROM global_markets.stocks_income_statements
                     WHERE period_end >= today() - 400)
      AND ticker NOT IN ('SPCX','KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                         WHERE execution_date BETWEEN today() - 460 AND today())
    GROUP BY ticker
    HAVING sum(toFloat64(close) * toFloat64(volume)) >= 2000000000
),
last_session AS (
    SELECT max(toDate(et)) AS d
    FROM (
        SELECT toTimeZone(window_start, 'America/New_York') AS et
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
),
daily AS (
    SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
    FROM (
        SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= now() - INTERVAL 425 DAY
          AND ticker IN (SELECT ticker FROM universe)
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
    GROUP BY ticker, dt
    HAVING nbars >= 20 AND dt <= (SELECT d FROM last_session)
),
rolled AS (
    SELECT ticker, dt, c,
           max(c) OVER w AS hi,
           min(c) OVER w AS lo,
           count() OVER w AS n_sessions,
           min(dt) OVER (PARTITION BY ticker) AS first_dt
    FROM daily
    WINDOW w AS (PARTITION BY ticker ORDER BY dt RANGE BETWEEN 364 PRECEDING AND CURRENT ROW)
)
SELECT formatDateTime(dt, '%b %e, %Y') AS date,
       countIf(c >= hi * 0.99) AS at_52w_high,
       countIf(c <= lo * 1.01) AS at_52w_low,
       countIf(c >= hi * 0.99) - countIf(c <= lo * 1.01) AS net_highs
FROM rolled
WHERE n_sessions >= 200
  AND first_dt <= dt - 350
  AND dt > (SELECT d FROM last_session) - 43
GROUP BY dt
ORDER BY dt

ใน Jul 21, 2026 มีหุ้นจำนวน 26 ที่มีราคาอยู่ที่หรือใกล้ระดับสูงสุดในรอบ 52 สัปดาห์ เทียบกับหุ้นจำนวน 7 ที่มีราคาอยู่ที่หรือใกล้ระดับต่ำสุด โดยมีค่าสุทธิอยู่ที่ 19 เมื่อหกสัปดาห์ก่อนหน้า ในวันที่ Jun 9, 2026 ข้อมูลจากหน้าจอเดียวกันระบุว่ามีหุ้นทำจุดสูงสุด 35 ราย และทำจุดต่ำสุด 3 ราย

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

ระยะห่างของตลาดส่วนใหญ่จากจุดสูงสุดของตนเอง

จุดสูงสุดและจุดต่ำสุดคือสองปลายของการกระจายตัว โดยหุ้นส่วนใหญ่จะเคลื่อนไหวอยู่ตรงกลาง แผงข้อมูลนี้จัดเรียงหุ้นทั้งหมดตามระยะห่างจากจุดสูงสุดในรอบ 52 สัปดาห์ และรายงานค่ามัธยฐานของผลตอบแทนตั้งแต่ต้นปีจนถึงปัจจุบัน (year-to-date) ในแต่ละช่วง

คำสั่งดึงข้อมูลระยะห่างของตลาดโดยรวมจากจุดสูงสุดในรอบ 52 สัปดาห์
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH universe AS (
    SELECT ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE window_start >= now() - INTERVAL 20 DAY
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570
      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
      AND ticker IN (SELECT arrayJoin(tickers) FROM global_markets.stocks_income_statements
                     WHERE period_end >= today() - 400)
      AND ticker NOT IN ('SPCX','KORU','SOXL','SOXS','TQQQ','SQQQ','NVDL','NVDS','NVD','TSLL','TSLQ','TSLZ','SPXL','SPXS','UPRO','SPXU','LABU','LABD','FAS','FAZ','TNA','TZA','YINN','YANG','UDOW','SDOW','BOIL','KOLD','UCO','SCO','USD','SSO','SDS','QLD','QID','ERX','ERY','DRN','DRV','CURE','SOXY','MUU','SNXX','UVXY','SVXY','UVIX','SVIX','BULZ','WEBL','WEBS','DPST','DRIP','GUSH','AGQ','ZSL','BITX','ETHU','MSTX','MSTU','CONL','DUST','JNUG','JDST','NUGT')
      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
                         WHERE execution_date BETWEEN today() - 460 AND today())
    GROUP BY ticker
    HAVING sum(toFloat64(close) * toFloat64(volume)) >= 2000000000
),
last_session AS (
    SELECT max(toDate(et)) AS d
    FROM (
        SELECT toTimeZone(window_start, 'America/New_York') AS et
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
),
daily AS (
    SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
    FROM (
        SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= now() - INTERVAL 375 DAY
          AND ticker IN (SELECT ticker FROM universe)
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
    GROUP BY ticker, dt
    HAVING nbars >= 20 AND dt > (SELECT d FROM last_session) - 365
),
ranged AS (
    SELECT ticker,
           argMax(c, dt) AS last_close,
           max(c) AS hi,
           min(c) AS lo,
           argMaxIf(c, dt, dt <= toDate('2025-12-31')) AS base_close,
           count() AS n_sessions,
           min(dt) AS first_dt,
           max(dt) AS last_dt
    FROM daily
    GROUP BY ticker
    HAVING n_sessions >= 200
       AND countIf(dt <= toDate('2025-12-31')) > 0
       AND last_dt = (SELECT d FROM last_session)
       AND first_dt <= (SELECT d FROM last_session) - 350
)
SELECT multiIf(p < 1, 'At the high (under 1%)',
               p < 5, '1% to 5% below',
               p < 10, '5% to 10% below',
               p < 20, '10% to 20% below',
               p < 35, '20% to 35% below',
               'More than 35% below') AS bucket,
       count() AS stocks,
       round(100.0 * count() / sum(count()) OVER (), 1) AS share_pct,
       round(quantileExact(0.5)(ytd), 1) AS median_ytd_pct
FROM (
    SELECT (1 - last_close / hi) * 100 AS p,
           (last_close / base_close - 1) * 100 AS ytd,
           multiIf(p < 1, 0, p < 5, 1, p < 10, 2, p < 20, 3, p < 35, 4, 5) AS ord
    FROM ranged
)
GROUP BY bucket, ord
ORDER BY ord

5.3% ของหุ้นทั้งหมด หรือจำนวน 26 ชื่อ ปิดตลาดในระดับที่ห่างจากจุดสูงสุดในรอบ 52 สัปดาห์ไม่เกิน 1% ในขณะที่อีกด้านหนึ่ง มีหุ้นจำนวน 17% ที่ปิดตลาดต่ำกว่าจุดสูงสุดมากกว่า 35% โดยค่ามัธยฐานของผลตอบแทนตั้งแต่ต้นปีจนถึงปัจจุบันในกลุ่มบนสุดคือ 32.8% และในกลุ่มล่างสุดคือ -28.9% ซึ่งกราฟแสดงให้เห็นถึงลักษณะความแตกต่างระหว่างสองกลุ่มนี้

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

ตำแหน่งของตลาดเมื่อเทียบกับกรอบราคาในรอบ 52 สัปดาห์

ราคาหุ้นรายตัวที่อยู่ในระดับสูงจะมีนัยสำคัญต่างกัน เมื่อเทียบกับตลาดที่อยู่ใกล้ระดับสูงสุด กับตลาดที่อยู่ห่างจากระดับสูงสุดมาก โดย ETF ทั้งห้าดัชนีหลักด้านล่างนี้ มีวิธีการวัดผลเช่นเดียวกับหุ้นที่กล่าวถึงข้างต้น

คำสั่งดึงข้อมูลตำแหน่งของ 5 ETFs ตลาดกว้างภายในกรอบ 52 สัปดาห์ของตนเอง
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH last_session AS (
    SELECT max(toDate(et)) AS d
    FROM (
        SELECT toTimeZone(window_start, 'America/New_York') AS et
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
),
daily AS (
    SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
    FROM (
        SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
        FROM global_markets.delayed_stocks_minute_aggs
        WHERE window_start >= now() - INTERVAL 375 DAY
          AND ticker IN ('SPY', 'QQQ', 'DIA', 'IWM', 'RSP')
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
          AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
    )
    GROUP BY ticker, dt
    HAVING nbars >= 20
       AND dt > (SELECT d FROM last_session) - 365
       AND dt <= (SELECT d FROM last_session)
),
ranged AS (
    SELECT ticker,
           argMax(c, dt) AS last_close,
           max(c) AS hi,
           min(c) AS lo,
           argMaxIf(c, dt, dt <= toDate('2025-12-31')) AS base_close,
           count() AS n_sessions,
           min(dt) AS first_dt,
           max(dt) AS last_dt
    FROM daily
    GROUP BY ticker
    HAVING n_sessions >= 200
       AND countIf(dt <= toDate('2025-12-31')) > 0
       AND last_dt = (SELECT d FROM last_session)
       AND first_dt <= (SELECT d FROM last_session) - 350
)
SELECT multiIf(ticker = 'SPY', 'S&P 500 (SPY)',
               ticker = 'QQQ', 'Nasdaq 100 (QQQ)',
               ticker = 'DIA', 'Dow 30 (DIA)',
               ticker = 'RSP', 'S&P 500 equal weight (RSP)',
               'Russell 2000 (IWM)') AS label,
       round((1 - last_close / hi) * 100, 2) AS pct_below_high,
       round((last_close / lo - 1) * 100, 1) AS pct_above_low,
       round((last_close / base_close - 1) * 100, 1) AS ytd_return_pct
FROM ranged
ORDER BY pct_below_high ASC

S&P 500 equal weight (RSP) ปิดตลาดที่ระดับ 1.08% ต่ำกว่าจุดสูงสุดในรอบ 52 สัปดาห์ ซึ่งถือว่าใกล้เคียงที่สุดในบรรดาห้าดัชนี และอยู่เหนือจุดต่ำสุดในรอบ 52 สัปดาห์ที่ระดับ 17.2% ส่วน Nasdaq 100 (QQQ) อยู่ห่างจากจุดสูงสุดมากที่สุดที่ระดับ 4.98% โดยผลตอบแทนตั้งแต่ต้นปีจนถึงปัจจุบัน (Year to date) ของทั้งสองดัชนีอยู่ที่ระดับ 11.1% และ 15.4%

ส่วนต่างระหว่างดัชนีแบบถ่วงน้ำหนักเท่ากัน (equal-weighted) และดัชนีแบบถ่วงน้ำหนักตามมูลค่าตลาด (cap-weighted) ของดัชนีเดียวกัน สามารถใช้เป็นตัวบ่งชี้ความกว้างของตลาด (breadth reading) ได้ หากเส้นถ่วงน้ำหนักเท่ากันอยู่ใกล้ระดับสูงสุด แสดงว่าหุ้นโดยเฉลี่ยกำลังทำผลงานได้ดีกว่าหุ้นที่มีมูลค่าตลาดขนาดใหญ่ แต่หากเส้นถ่วงน้ำหนักตามมูลค่าตลาดอยู่ใกล้ระดับสูงสุด แสดงว่ามีบริษัทขนาดใหญ่เพียงไม่กี่แห่งที่ช่วยพยุงดัชนีไว้ อย่างไรก็ตาม รูปแบบเหล่านี้ไม่ได้ใช้เพื่อการพยากรณ์ และการออกจากตลาดในช่วงเวลาที่ไม่เหมาะสมอาจทำให้เกิดต้นทุนจากการ พลาดโอกาสในช่วงที่ตลาดทำกำไรสูงสุด

วิธีการวัดผล

ข้อมูลทุกตัวในหน้านี้มาจากแท่งราคา (minute bars) ของตลาดหลักทรัพย์ในสหรัฐฯ ซึ่งนำมาประมวลผลรวมกันเป็นราคาปิดรายวัน โดยมีกฎเกณฑ์ฉบับเต็มดังนี้:

  • ขอบเขตข้อมูล. ใช้เฉพาะบริษัทที่จดทะเบียนในสหรัฐฯ ที่มีการดำเนินงานจริง โดยพิจารณาจากงบกำไรขาดทุนที่ยื่นต่อ SEC สำหรับงวดที่สิ้นสุดภายใน 400 วันที่ผ่านมา ดังนั้น ETF และกองทุนต่างๆ จึงไม่ถูกรวมอยู่ในทั้งสองรายการ นอกจากนี้เรายังยกเว้น Leveraged ETF และ Inverse ETF โดยเฉพาะเพื่อความแม่นยำสูงสุด
  • เกณฑ์สภาพคล่องขั้นต่ำ. หุ้นต้องมีมูลค่าการซื้อขายอย่างน้อย 2 พันล้านดอลลาร์ในช่วง 20 วันปฏิทินที่ผ่านมา เมื่อหักวันเสาร์-อาทิตย์และวันหยุดออกแล้ว ช่วงเวลาดังกล่าวจะเหลือประมาณ 12 วันทำการ ซึ่งคิดเป็นมูลค่าเฉลี่ยประมาณ 150 ล้านดอลลาร์ต่อหนึ่งเซสชัน เกณฑ์นี้ช่วยให้รายชื่อหุ้นเป็นกลุ่มที่นักลงทุนสามารถซื้อขายได้จริง และป้องกันไม่ให้สภาพคล่องที่ต่ำเกินไปทำให้เกิดค่าที่ผิดปกติ
  • ไม่ปรับปรุงราคาจากการแตกหุ้น. หุ้นตัวใดที่มีการแตกหุ้น (stock split) ภายใน 460 วันที่ผ่านมาจะถูกคัดออกจากการแสดงผล ช่วงเวลาดังกล่าวถูกกำหนดให้ครอบคลุมมากกว่าหนึ่งปีเพื่อให้ครอบคลุมถึงราคาที่เก่าที่สุดในแผนภูมิความกว้าง (breadth chart) ด้านล่าง นี่คือสาเหตุหลักที่อาจทำให้ข้อมูลผิดพลาด หากมีการทำ reverse split ในอัตราส่วน 1 ต่อ 20 ราคาที่แสดงจะเพิ่มขึ้น 20 เท่าโดยไม่มีการซื้อขายรองรับ ซึ่งหน้าจอที่ไม่ได้ปรับปรุงราคาจะรายงานว่าเป็นจุดสูงสุดใหม่ในรอบ 52 สัปดาห์ ในขณะที่ forward split จะให้ผลในทางตรงกันข้ามและทำให้เกิดจุดต่ำสุดใหม่ในรอบ 52 สัปดาห์แบบปลอมๆ
  • ใช้ราคาปิด ไม่ใช่ราคาสูงสุดหรือต่ำสุดระหว่างวัน. การวัดค่าสูงสุดและต่ำสุดจะใช้ราคาปิดเป็นเกณฑ์ หุ้นอาจมีการซื้อขายทะลุจุดสูงสุดในรอบ 52 สัปดาห์ระหว่างวัน แต่หากราคาปิดต่ำกว่าจุดนั้น หุ้นตัวนั้นจะไม่ปรากฏในรายการนี้ การใช้ข้อมูลราคาระหว่างวันจะทำให้จำนวนหุ้นที่ปรากฏมีจำนวนมากกว่าความเป็นจริง
  • ต้องเป็นเซสชันที่เสร็จสมบูรณ์. ราคาปิดของวันคือแท่งราคาล่าสุดระหว่างเวลา 15:30 ถึง 16:00 น. ตามเวลาของนิวยอร์ก เซสชันที่ยังโหลดข้อมูลไม่เสร็จจะไม่มีแท่งราคาในช่วงครึ่งชั่วโมงดังกล่าว จึงไม่สามารถนำมาคำนวณได้ รวมถึงเซสชันที่กำลังดำเนินอยู่ด้วย เช่นเดียวกับเซสชันในวันหยุดที่มีการปิดตลาดเร็ว วันที่ที่ระบุไว้ด้านบนคือเซสชันล่าสุดที่ผ่านเกณฑ์ทดสอบ ดังนั้นข้อมูลอาจล่าช้ากว่าวันที่ปัจจุบันประมาณหนึ่งถึงสองวัน
  • ประวัติข้อมูลครบหนึ่งปี. หุ้นต้องมีจำนวนเซสชันอย่างน้อย 200 เซสชันภายในช่วง 52 สัปดาห์ และเซสชันแรกต้องย้อนหลังไปอย่างน้อย 350 วัน บริษัทที่เพิ่งจดทะเบียนเมื่อสามเดือนก่อนจะไม่สามารถแสดงจุดสูงสุดในรอบ 52 สัปดาห์ในหน้านี้ได้
  • เกณฑ์ส่วนต่าง 1%. คำว่า "อยู่ที่จุดสูงสุดในรอบ 52 สัปดาห์" หมายถึงราคาปิดอยู่ที่จุดสูงสุดหรืออยู่ในช่วง 1% ของราคาปิดที่สูงที่สุดในช่วง 52 สัปดาห์ที่ผ่านมา และรายการราคาต่ำสุดจะใช้เกณฑ์เดียวกัน ส่วนผลตอบแทนตั้งแต่ต้นปี (Year-to-date) จะวัดจากราคาปิดสุดท้ายของปี 2025

คำถามที่พบบ่อย

การซื้อหุ้นที่ราคาสูงสุดในรอบ 52 สัปดาห์เป็นความคิดที่ดีหรือไม่?

ไม่มีคำตอบที่ตายตัว และข้อมูลนี้ไม่ใช่คำแนะนำในการลงทุน ข้อมูลในหน้านี้เป็นการแสดงผลย้อนหลัง โดยหุ้นที่มีราคาใกล้เคียงกับระดับสูงสุดในรอบ 52 สัปดาห์ภายใน 1% มีค่ามัธยฐานของผลตอบแทนตั้งแต่ต้นปีจนถึงปัจจุบันอยู่ที่ 32.8% เมื่อเทียบกับ -28.9% สำหรับหุ้นที่มีราคาต่ำกว่าระดับสูงสุดมากกว่า 35% ข้อมูลนี้แสดงถึงผลการดำเนินงานในปีที่ผ่านมา ไม่ใช่ปีที่กำลังจะมาถึง การใช้เกณฑ์นี้เป็นการระบุตำแหน่งของราคาในช่วงหนึ่ง ไม่ใช่การระบุมูลค่าพื้นฐาน

การที่หุ้นแตะระดับต่ำสุดในรอบ 52 สัปดาห์หมายความว่าอย่างไร?

หมายความว่าราคาปิดของหุ้นนั้นต่ำกว่าราคาปิด ณ จุดใดก็ตามในช่วง 52 สัปดาห์ที่ผ่านมา โดยใน Jul 21, 2026 มีหุ้นจำนวน 7 รายการในหน้าจอนี้ที่เข้าเงื่อนไขดังกล่าว ราคาที่ลดลงอาจเกิดจากธุรกิจที่แย่ลง หรืออาจเกิดจากการปรับตัวลงอย่างต่อเนื่องของธุรกิจที่มีกำไร ซึ่งราคาเพียงอย่างเดียวไม่สามารถบอกความแตกต่างนี้ได้

ปัจจุบันมีหุ้นกี่ตัวที่ราคาอยู่ที่ระดับสูงสุดในรอบ 52 สัปดาห์?

ณ ราคาปิดเมื่อวันที่ Jul 21, 2026 มีหุ้นจำนวน 26 รายการในหน้าจอนี้ที่ปิดที่ระดับสูงสุดในรอบ 52 สัปดาห์หรือภายใน 1% ของระดับดังกล่าว เทียบกับหุ้นจำนวน 7 รายการที่ปิดที่ระดับต่ำสุดในรอบ 52 สัปดาห์หรือภายใน 1% ของระดับดังกล่าว ข้อมูลในหน้าจอนี้คัดกรองเฉพาะบริษัทจดทะเบียนขนาดใหญ่ที่มีสภาพคล่องสูงในสหรัฐฯ โดยมีมูลค่าการซื้อขายขั้นต่ำ 2 พันล้านดอลลาร์ในช่วง 20 วันปฏิทินที่ผ่านมา ดังนั้นจำนวนหุ้นเหล่านี้จึงน้อยกว่าการรายงานผลจากหน้าจอที่รวมหุ้นทุกหลักทรัพย์ในตลาด

วิธีการคำนวณราคาสูงสุดในรอบ 52 สัปดาห์ทำอย่างไร?

ให้นำราคาปิดทุกครั้งในช่วง 52 สัปดาห์ที่ผ่านมามาพิจารณาและเลือกราคาที่สูงที่สุด หากราคาปิดล่าสุดเท่ากับราคานั้น แสดงว่าหุ้นตัวนั้นทำราคาปิดสูงสุดในรอบ 52 สัปดาห์ นอกจากนี้ หน้านี้ยังนับรวมหุ้นที่มีราคาอยู่ในระดับ 1% จากระดับดังกล่าว และจะตัดหุ้นที่มีการแตกหุ้น (split) ในช่วง 460 วันที่ผ่านมาออก เนื่องจากราคาหุ้นจะเปลี่ยนไปโดยที่มูลค่าของสินทรัพย์ที่ถือครองยังคงเท่าเดิม


ทุกแผงข้อมูลด้านบนมีการจัดเก็บคำสั่ง SQL ไว้ หากต้องการตรวจสอบที่มาของข้อมูลในหน้าจอนี้ สามารถเปิดคำสั่ง query ภายใต้ตารางใดก็ได้ หรือรันคำสั่งบน terminal ของ Strasmore สำหรับข้อมูลหุ้นที่มีการเปลี่ยนแปลงสูงสุดในสัปดาห์แทนที่จะเป็นค่าสูงสุดหรือต่ำสุดในรอบปี สามารถดูได้ที่ หุ้นที่มีผลตอบแทนบวกและลบมากที่สุดในสัปดาห์นี้

#52-week high#52-week low#market breadth#stock screener#market data