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

หุ้นที่มีโอกาสเกิด Short Squeeze สัปดาห์นี้

คัดกรองหุ้นที่มีโอกาสเกิด Short squeeze โดยพิจารณาจากจำนวน Days to cover และปริมาณการถือครองสถานะ Short ร่วมกับทิศทางราคาที่ปรับตัวสูงขึ้น

การคัดกรองหุ้นที่มีโอกาสเกิด Short squeeze พิจารณาจากสองกลไกหลัก ได้แก่ การมีสถานะ Short position ในระดับสูงเมื่อเทียบกับปริมาณการซื้อขายหุ้น และราคาที่มีทิศทางขาขึ้นแล้ว หน้าเว็บนี้ใช้เกณฑ์ดังกล่าวคัดกรองจากข้อมูล Short-interest ล่าสุดที่รายงานโดยตลาดหลักทรัพย์ ซึ่งสรุปยอด ณ Jun 30, 2026 และวัดการเคลื่อนไหวของราคาในช่วงห้าวันทำการสิ้นสุด ณ Jul 22, 2026 กลไกเหล่านี้มีความคล้ายคลึงกับเหตุการณ์ squeeze ในอดีต อย่างไรก็ตาม ข้อมูลนี้ไม่ใช่การพยากรณ์ และหุ้นที่มีสถานะ Short หนาแน่นส่วนใหญ่ไม่เคยเกิด squeeze

โปรดอ่านวันที่ก่อนชื่อหุ้น ข้อมูลด้าน Short-interest ในหน้านี้มีความล่าช้ากว่าความเป็นจริงประมาณสองสัปดาห์ตามกฎระเบียบ ไม่ใช่ความผิดพลาดของระบบส่งข้อมูล เนื่องจากโบรกเกอร์ต้องรายงานสถานะ Short ต่อ FINRA เดือนละสองครั้งตามวันที่กำหนด และข้อมูลที่รวบรวมแล้วจะถูกเปิดเผยต่อสาธารณะหลังจากนั้นประมาณแปดวันทำการ ข้อมูลที่ใหม่ที่สุดที่สามารถเข้าถึงได้คือข้อมูล ณ Jun 30, 2026 ซึ่งล่าช้าไป 24 วัน ในขณะที่ข้อมูลการเคลื่อนไหวของราคาจะครอบคลุมไปจนถึง Jul 22, 2026 ข้อมูลการเคลื่อนไหวของราคาในช่วงช่องว่างดังกล่าวจะไม่สามารถตรวจพบได้ด้วยเครื่องมือคัดกรองใดๆ รวมถึงเครื่องมือนี้ด้วย ทำไมข้อมูล Short interest ถึงล่าช้ากว่าความเป็นจริงสองสัปดาห์เสมอ จะอธิบายขั้นตอนของวงจรการรายงานอย่างละเอียด

คำสั่งดึงข้อมูลข้อมูลนำเข้าทั้งหมดและจำนวนวันที่ผ่านมา
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH prints AS (
    SELECT DISTINCT settlement_date AS d
    FROM global_markets.stocks_short_interest
    ORDER BY d DESC
    LIMIT 2
),
loaded AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND 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
    GROUP BY session
    HAVING count() >= 380
),
legs AS (
    SELECT arrayJoin([
        ('Short interest, previous settlement', (SELECT min(d) FROM prints)),
        ('Short interest, latest settlement', (SELECT max(d) FROM prints)),
        ('Price tape, last fully loaded session', (SELECT max(session) FROM loaded))]) AS row
)
SELECT formatDateTime(row.2, '%b %e, %Y') AS as_of_date,
       row.1 AS leg,
       dateDiff('day', row.2, today()) AS age_days
FROM legs

ข้อมูลการสรุปยอดสองครั้งล่าสุดล่าช้าไป 39 และ 24 วัน ซึ่งเป็นผลจากวงจรการนับยอดเดือนละสองครั้งรวมกับระยะเวลาในการรวบรวมข้อมูล ส่วนข้อมูลราคาล่าช้าไป 2 วัน ซึ่งเป็นความล่าช้าจากการนำเข้าข้อมูลในคลังข้อมูล (warehouse ingest lag) ไม่ใช่จากกฎระเบียบ ข้อมูลทั้งสองส่วนมีกรอบเวลาที่กำหนดไว้ ดังนั้นหากระบบส่งข้อมูลหยุดชะงัก หน้าเว็บนี้จะแสดงข้อมูลเดิมแทนที่จะเผยแพร่ข้อมูลเก่าภายใต้หัวข้อข่าวใหม่

รายชื่อหุ้นที่มีโอกาสเกิด Short squeeze: ข้อมูลปัจจุบัน

ทุกรายชื่อด้านล่างผ่านเกณฑ์เดียวกัน ได้แก่ ปริมาณการซื้อขายเฉลี่ยต่อวันต้องมีห้าล้านหุ้น มีจำนวน Days to cover ตั้งแต่ห้าวันขึ้นไป และมีราคาปรับตัวขึ้นในช่วงห้าวันล่าสุดที่สิ้นสุด ณ Jul 22, 2026 โดยรายชื่อ 31 ผ่านเกณฑ์ทั้งหมด และนี่คือรายชื่อ 12 อันดับที่มีสถานะ Short หนาแน่นที่สุด Days to cover คือจำนวนหุ้นที่ถูกขายชอร์ตหารด้วยปริมาณการซื้อขายเฉลี่ยต่อวัน ซึ่งเป็นจำนวนวันที่ต้องใช้ปริมาณการซื้อขายทั้งหมดเพื่อซื้อหุ้นกลับคืนมาเพื่อปิดสถานะ

คำสั่งดึงข้อมูลกลไกรูปแบบ Squeeze: หุ้นที่มีสถานะ Short หนาแน่นในกลุ่มหุ้นที่มีสภาพคล่องสูง พร้อมราคาที่ปรับตัวขึ้น
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH latest AS (
    SELECT max(settlement_date) AS d FROM global_markets.stocks_short_interest
),
sessions AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND 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
    GROUP BY session
    HAVING count() >= 380
    ORDER BY session DESC
    LIMIT 6
),
crowded AS (
    SELECT ticker, days_to_cover, short_interest
    FROM global_markets.stocks_short_interest
    WHERE settlement_date = (SELECT d FROM latest)
      AND avg_daily_volume >= 5000000
      AND days_to_cover >= 5
      AND ticker NOT IN ('SPCX')
      AND ticker NOT IN ('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() - 60 AND today())
),
tape AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMax(close, window_start) AS rth_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN (SELECT ticker FROM crowded)
      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT session FROM sessions)
      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
    GROUP BY ticker, session
),
moves AS (
    SELECT ticker,
           round((argMax(rth_close, session) / argMin(rth_close, session) - 1) * 100, 1) AS return_5d_pct
    FROM tape
    GROUP BY ticker
    HAVING count() = 6 AND return_5d_pct > 0
)
SELECT c.ticker AS ticker,
       round(c.days_to_cover, 1) AS days_to_cover,
       round(c.short_interest / 1e6, 1) AS shares_short_m,
       m.return_5d_pct AS return_5d_pct
FROM crowded c
INNER JOIN moves m ON m.ticker = c.ticker
ORDER BY c.days_to_cover DESC, c.ticker
LIMIT 12

หุ้นที่มีสถานะ Short หนาแน่นที่สุดในรายการนี้คือ MPT โดยมีค่า Days to cover อยู่ที่ 16.9 วัน จากจำนวนหุ้นที่ถูกขายชอร์ต 138.1 ล้านหุ้น และราคาปรับตัวขึ้น 2.8% ในช่วงห้าวันล่าสุดที่สิ้นสุด ณ Jul 22, 2026 แถวสุดท้ายที่แสดงคือค่า Days to cover เท่ากับ 6.4 วัน ซึ่งเป็นจุดสิ้นสุดของการแสดงผลไม่ใช่ระดับล่างสุดของรายการ การจัดลำดับนี้ใช้ความหนาแน่นของสถานะ Short เป็นเกณฑ์แทนที่จะใช้ขนาดของสถานะ สำหรับการจัดลำดับตามขนาด สามารถดู หุ้นที่มีการขายชอร์ตมากที่สุดในขณะนี้ ซึ่งแสดงผลตารางเปรียบเทียบทั้งสองแบบควบคู่กัน

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

กฎเกณฑ์ และสิ่งที่แต่ละกฎจะคัดออก

การคัดกรองคือการแสดงความเห็นโดยใช้ตัวเลขประกอบ ดังนั้นข้อมูลจึงแสดงไว้ดังนี้

คำสั่งดึงข้อมูลกระบวนการคัดกรองจากไฟล์ Settlement ทั้งหมดจนถึงรายการที่ผ่านการคัดกรองทีละเงื่อนไข
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH latest AS (
    SELECT max(settlement_date) AS d FROM global_markets.stocks_short_interest
),
sessions AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND 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
    GROUP BY session
    HAVING count() >= 380
    ORDER BY session DESC
    LIMIT 6
),
reported AS (
    SELECT ticker, days_to_cover, avg_daily_volume
    FROM global_markets.stocks_short_interest
    WHERE settlement_date = (SELECT d FROM latest)
),
liquid AS (
    SELECT ticker, days_to_cover
    FROM reported
    WHERE avg_daily_volume >= 5000000
      AND days_to_cover IS NOT NULL
      AND ticker NOT IN ('SPCX')
      AND ticker NOT IN ('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() - 60 AND today())
),
crowded AS (
    SELECT ticker FROM liquid WHERE days_to_cover >= 5
),
tape AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMax(close, window_start) AS rth_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN (SELECT ticker FROM crowded)
      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT session FROM sessions)
      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
    GROUP BY ticker, session
),
rising AS (
    SELECT ticker,
           round((argMax(rth_close, session) / argMin(rth_close, session) - 1) * 100, 1) AS return_5d_pct
    FROM tape
    GROUP BY ticker
    HAVING count() = 6 AND return_5d_pct > 0
),
tally AS (
    SELECT (SELECT count() FROM reported) AS all_names,
           (SELECT count() FROM liquid) AS liquid_names,
           (SELECT count() FROM crowded) AS crowded_names,
           (SELECT count() FROM rising) AS rising_names
)
SELECT step.1 AS label, step.2 AS names
FROM (
    SELECT arrayJoin([
        ('Every name in the settlement file', all_names),
        ('Liquid: five million shares a day, no leveraged funds', liquid_names),
        ('Crowded: five or more days to cover', crowded_names),
        ('Rising: a positive move over the price window', rising_names)]) AS step
    FROM tally
)

ไฟล์ Jun 30, 2026 ประกอบด้วยหลักทรัพย์ 22207 โดยเกณฑ์สภาพคล่องและรายการยกเว้นจะคัดออกจนเหลือ 883 จากนั้นเกณฑ์ความหนาแน่นของคำสั่งซื้อขายจะลดจำนวนลงเหลือ 96 และเกณฑ์ราคาที่พุ่งสูงขึ้นจะคัดออกจนเหลือ 31 การกำหนดเกณฑ์แต่ละอย่างคือการตัดสินใจ ซึ่งการตัดสินใจที่ต่างกันจะทำให้ได้รายการที่ต่างกัน ด้วยเหตุนี้ กฎเกณฑ์จึงต้องระบุไว้ในเนื้อหาหลักแทนที่จะเป็นเพียงหมายเหตุท้ายหน้า

สัดส่วนการขายชอร์ตของแต่ละบริษัท

ข้อมูลที่คนส่วนใหญ่ต้องการคือสัดส่วนการขายชอร์ตเมื่อเทียบกับจำนวนหุ้นที่หมุนเวียนในตลาด (float) แต่ข้อมูลชุดนี้ไม่มีระบุไว้ ข้อมูลจากตลาดหลักทรัพย์รายงานเพียงจำนวนหุ้นที่ถูกขายชอร์ตและปริมาณการซื้อขายเฉลี่ยต่อวัน โดยไม่ได้ระบุจำนวนหุ้นรวมไว้ ข้อมูลที่สามารถคำนวณได้คือสถานะการขายชอร์ตเมื่อเทียบกับจำนวนหุ้นจดทะเบียนทั้งหมด (total shares outstanding) โดยคำนวณจากมูลค่าตลาดของแต่ละบริษัทหารด้วยราคาหุ้น

คำสั่งดึงข้อมูลการจัดอันดับหุ้นที่ผ่านการคัดกรองตาม Short Interest เทียบกับจำนวนหุ้นจดทะเบียน (ไม่ใช่ Float)
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH latest AS (
    SELECT max(settlement_date) AS d FROM global_markets.stocks_short_interest
),
sessions AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND 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
    GROUP BY session
    HAVING count() >= 380
    ORDER BY session DESC
    LIMIT 6
),
crowded AS (
    SELECT ticker, days_to_cover, short_interest
    FROM global_markets.stocks_short_interest
    WHERE settlement_date = (SELECT d FROM latest)
      AND avg_daily_volume >= 5000000
      AND days_to_cover >= 5
      AND ticker NOT IN ('SPCX')
      AND ticker NOT IN ('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() - 60 AND today())
),
tape AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMax(close, window_start) AS rth_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN (SELECT ticker FROM crowded)
      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT session FROM sessions)
      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
    GROUP BY ticker, session
),
rising AS (
    SELECT ticker,
           round((argMax(rth_close, session) / argMin(rth_close, session) - 1) * 100, 1) AS return_5d_pct
    FROM tape
    GROUP BY ticker
    HAVING count() = 6 AND return_5d_pct > 0
),
share_count AS (
    SELECT ticker, market_cap / price AS shares_out
    FROM global_markets.stocks_ratios
    WHERE date = (SELECT max(date) FROM global_markets.stocks_ratios)
      AND market_cap > 0
      AND price > 0
)
SELECT c.ticker AS ticker,
       round(100.0 * c.short_interest / s.shares_out, 1) AS si_pct_shares_out,
       round(c.short_interest / 1e6, 1) AS shares_short_m,
       round(s.shares_out / 1e6, 0) AS shares_out_m,
       round(c.days_to_cover, 1) AS days_to_cover
FROM crowded c
INNER JOIN rising r ON r.ticker = c.ticker
INNER JOIN share_count s ON s.ticker = c.ticker
ORDER BY si_pct_shares_out DESC, c.ticker
LIMIT 10

KSS มีสัดส่วนการขายชอร์ตสูงสุดที่ 26.3% ของจำนวนหุ้นจดทะเบียน: คิดเป็น 29.9 ล้านหุ้น จากจำนวนหุ้นที่มีอยู่ทั้งหมด 113 ล้านหุ้น แถวของ 10 คือค่าที่สูงที่สุดในกลุ่มรายชื่อที่ผ่านการคัดกรองและมีการระบุจำนวนหุ้นไว้ และค่าสุดท้ายยังคงอยู่ที่ 15.5% โปรดอ่านค่าในคอลัมน์นี้ในฐานะค่าขั้นต่ำเท่านั้น และห้ามอ่านเป็นจำนวนหุ้นที่หมุนเวียนในตลาด (float) Float จะนับเฉพาะหุ้นที่มีการเปลี่ยนมือจริง โดยหักหุ้นที่ถือโดยบุคคลภายในและหุ้นที่ถูกล็อกไว้ (locked-up holdings) ออกแล้ว เนื่องจาก float เป็นตัวหารที่มีค่าน้อยกว่า ดังนั้นเปอร์เซ็นต์การขายชอร์ตเมื่อเทียบกับ float ที่แท้จริงจึงสูงกว่าทุกตัวเลขที่แสดงไว้ ทั้งนี้ค่าที่สูงกว่านั้นขึ้นอยู่กับโครงสร้างการถือหุ้นของแต่ละบริษัท ซึ่งฐานข้อมูลนี้ไม่ได้จัดเก็บไว้

การสะสมสถานะ Short กำลังเพิ่มขึ้นหรือลดลง?

ข้อมูลชุดหนึ่งเปรียบเสมือนภาพนิ่ง ข้อมูลชุดเดียวกันนี้ถูกจัดเก็บย้อนหลังไปหลายปี ดังนั้นคำถามที่ตลาดกำลังสงสัยจึงมีคำตอบเชิงข้อมูลรองรับ

คำสั่งดึงข้อมูลแนวโน้มความหนาแน่นของสถานะในหุ้นที่มีสภาพคล่องสูงที่มี Days to Cover ตั้งแต่ 5+ และ 10+ วัน โดยพิจารณาตามรอบ Settlement
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH dates AS (
    SELECT DISTINCT settlement_date AS d
    FROM global_markets.stocks_short_interest
    ORDER BY d DESC
    LIMIT 12
)
SELECT toString(settlement_date) AS settlement_date,
       countIf(days_to_cover >= 5) AS names_5plus_dtc,
       countIf(days_to_cover >= 10) AS names_10plus_dtc,
       round(quantileExact(0.5)(days_to_cover), 2) AS median_dtc_liquid
FROM global_markets.stocks_short_interest
WHERE settlement_date IN (SELECT d FROM dates)
  AND avg_daily_volume >= 5000000
  AND days_to_cover IS NOT NULL
  AND ticker NOT IN ('SPCX')
  AND ticker NOT IN ('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')
GROUP BY settlement_date
ORDER BY settlement_date

จากการชำระราคาในช่วง 12 จำนวนหุ้นที่มีสภาพคล่องสูงซึ่งมีค่า days to cover ตั้งแต่ห้าวันขึ้นไป เปลี่ยนจาก 58 เป็น 96 ทั้งนี้ ส่วนปลายของการกระจายตัวที่พบได้ยากยังคงมีความหนาแน่นน้อยมาก โดยมีหุ้นจำนวน 5 ที่มีค่า days to cover ตั้งแต่สิบวันขึ้นไปในการรายงานล่าสุด ค่ามัธยฐานของหุ้นที่มีสภาพคล่องอยู่ที่ 1.87 วัน ซึ่งเป็นเหตุผลที่ทำให้เกณฑ์ห้าวันมีความสำคัญมากกว่าการกำหนดขึ้นลอยๆ หน้า หุ้นที่มีค่า days-to-cover สูงที่สุด จะติดตามข้อมูลในส่วนปลายสุดนั้นโดยเฉพาะ

สิ่งที่มักจะเกิดขึ้นตามมา

หน้าจอแสดงผลลักษณะนี้สร้างขึ้นได้ง่ายและอาจตีความผิดพลาดได้ง่ายเช่นกัน ดังนั้นจึงเป็นการนำหน้าจอเดิมมาประมวลผลย้อนหลัง โดยใช้ระยะเวลาห่างจากไฟล์ข้อมูลเท่ากัน สำหรับทุกรายการ Settlement ในรอบหนึ่งปีที่ผ่านมา ให้คัดเลือกรายชื่อที่ผ่านเกณฑ์ Crowding Gate ในรายการนั้นๆ และมีราคาปรับตัวขึ้นในช่วง 6 เซสชันที่สิ้นสุดลงในอีก 20 วันปฏิทินถัดไป (ซึ่งเป็นจุดที่หน้าจอนี้แสดงผลอยู่ในปัจจุบัน) จากนั้นจึงวัดผลการดำเนินงานของแต่ละรายชื่อในช่วง 30 วันปฏิทินถัดไป

คำสั่งดึงข้อมูลผลลัพธ์ย้อนหลังของหุ้นที่ผ่านการคัดกรอง โดยพิจารณาจากผลตอบแทนในช่วง 30 วันถัดไป
SQL เบื้องหลังตัวเลขแต่ละตัว
WITH screened AS (
    SELECT settlement_date, ticker
    FROM global_markets.stocks_short_interest
    WHERE settlement_date >= today() - 400
      AND settlement_date <= today() - 55
      AND avg_daily_volume >= 5000000
      AND days_to_cover >= 5
      AND ticker NOT IN ('SPCX')
      AND ticker NOT IN ('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')
),
split_hits AS (
    SELECT s.settlement_date AS sd, s.ticker AS tkr
    FROM screened s
    INNER JOIN global_markets.stocks_splits sp ON sp.ticker = s.ticker
    WHERE sp.execution_date > s.settlement_date + 11
      AND sp.execution_date <= s.settlement_date + 50
),
daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMax(close, window_start) AS rth_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN (SELECT DISTINCT ticker FROM screened)
      AND window_start >= now() - INTERVAL 400 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
    GROUP BY ticker, session
),
paired AS (
    SELECT s.settlement_date AS sd,
           s.ticker AS tkr,
           (argMaxIf(d.rth_close, d.session, d.session <= s.settlement_date + 20)
            / argMinIf(d.rth_close, d.session, d.session <= s.settlement_date + 20) - 1) * 100 AS prior_pct,
           (argMaxIf(d.rth_close, d.session, d.session >= s.settlement_date + 20)
            / argMinIf(d.rth_close, d.session, d.session >= s.settlement_date + 20) - 1) * 100 AS next_pct
    FROM screened s
    INNER JOIN daily d ON d.ticker = s.ticker
    WHERE d.session > s.settlement_date + 11
      AND d.session <= s.settlement_date + 50
    GROUP BY sd, tkr
    HAVING countIf(d.session <= s.settlement_date + 20) >= 4
       AND countIf(d.session >= s.settlement_date + 20) >= 15
),
outcomes AS (
    SELECT multiIf(next_pct < -20, 1,
                   next_pct < -10, 2,
                   next_pct < 0, 3,
                   next_pct < 10, 4,
                   next_pct < 20, 5, 6) AS bucket,
           multiIf(next_pct < -20, 'Fell more than 20%',
                   next_pct < -10, 'Fell 10% to 20%',
                   next_pct < 0, 'Fell 0% to 10%',
                   next_pct < 10, 'Rose 0% to 10%',
                   next_pct < 20, 'Rose 10% to 20%', 'Rose more than 20%') AS move_over_30_days
    FROM paired
    WHERE prior_pct > 0
      AND (sd, tkr) NOT IN (SELECT sd, tkr FROM split_hits)
),
tallied AS (
    SELECT bucket, move_over_30_days, count() AS name_count
    FROM outcomes
    GROUP BY bucket, move_over_30_days
)
SELECT move_over_30_days,
       name_count,
       round(100.0 * sum(name_count) OVER (ORDER BY bucket) / sum(name_count) OVER (), 1) AS cumulative_share_pct
FROM tallied
ORDER BY bucket

51.7% ของรายการชื่อและ Settlement เหล่านั้นมีราคาลดลงในอีก 30 วันต่อมา ซึ่งมีค่าใกล้เคียงกับการโยนเหรียญหัวก้อย และนี่คือข้อสรุปที่แท้จริงของหน้านี้: ฝั่ง Short sellers มักจะคาดการณ์ได้ถูกต้อง และสภาวะ Crowded-plus-rising เป็นเพียงการระบุรูปแบบของสถานการณ์มากกว่าจะเป็นความได้เปรียบในการเทรด ส่วนปลายของกราฟ (Tails) คือจุดที่จะแสดงสัญญาณ Squeeze ซึ่งทั้งสองด้านมีจำนวนน้อยมาก โดยมี 68 ของรายการที่มีราคาลดลงมากกว่าหนึ่งในห้า และ 73 มีราคาเพิ่มขึ้นมากกว่าหนึ่งในห้า ซึ่งเป็นกลุ่มที่จะเกิด Squeeze ของจริง ส่วน 87.8% ของกลุ่มตัวอย่างไม่สามารถไปถึงจุดนั้นได้

ให้พิจารณาแผงข้อมูลนี้ในฐานะการกระจายตัวของข้อมูล ไม่ใช่ผลลัพธ์จากการเทรด ข้อมูลนี้ไม่ได้คำนวณต้นทุน ค่าธรรมเนียมการยืมหุ้น และการกำหนดขนาดสถานะ (Position sizing) และให้ค่าน้ำหนักกับทุกรายชื่อที่ถูกระบุไว้เท่ากัน ทั้งสองช่วงเวลาถูกกำหนดไว้ที่ 20 วันปฏิทินหลังจากวัน Settlement แต่ละรายการ ซึ่งเป็นระยะเวลาห่างเท่ากับที่หน้านี้ใช้ ดังนั้นทุกรายชื่อที่ถูกระบุจึงอ้างอิงจากราคาที่ผู้อ่านสามารถมองเห็นได้จริง ทั้งนี้ ข้อมูลการ Settlement ในระยะเวลาหนึ่งปีถือเป็นกลุ่มตัวอย่างขนาดเล็ก

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

กฎเกณฑ์และข้อยกเว้นทั้งหมดที่อยู่เบื้องหลังตัวเลขข้างต้น

  • ข้อมูล Short-interest รายงานโดยตลาดหลักทรัพย์และจัดทำขึ้นเดือนละสองครั้ง ข้อมูลที่ใช้ในที่นี้คือข้อมูลสรุป ณ วันที่ Jun 30, 2026 ซึ่งผ่านมาแล้ว 24 วัน ในสหรัฐอเมริกาไม่มีการเปิดเผยตัวเลข Short interest รายวัน มีเพียงการประมาณการจากผู้ให้บริการข้อมูลที่คำนวณจากข้อมูลการให้ยืมหลักทรัพย์
  • เกณฑ์ขั้นต่ำด้านสภาพคล่อง: ปริมาณการซื้อขายเฉลี่ยต่อวันต้องมีอย่างน้อยห้าล้านหุ้น ตามที่รายงานในไฟล์เดียวกัน หากไม่มีเกณฑ์นี้ รายชื่อจะเต็มไปด้วยหุ้น Microcap ซึ่งค่า Days-to-cover ที่สูงมากนั้นเป็นเพียงผลลัพธ์จากปริมาณการซื้อขายที่ต่ำจนเกือบเป็นศูนย์
  • เกณฑ์ความหนาแน่นของสถานะ (Crowding threshold): ต้องมีค่า Days-to-cover ตั้งแต่ห้าวันขึ้นไป ซึ่งสูงกว่าค่ามัธยฐานของหุ้นที่มีสภาพคล่องที่แสดงไว้ข้างต้นอย่างมาก
  • Momentum leg: คือการเปลี่ยนแปลงระหว่างราคาปิดของหกเซสชันปกติที่สมบูรณ์ล่าสุด ซึ่งคิดเป็นผลตอบแทนแบบห้าเซสชัน เซสชันจะถูกนำมาคำนวณได้ก็ต่อเมื่อข้อมูลราคาหลักมีแท่งกราฟรายนาทีครบหนึ่งวันเต็มเท่านั้น หากเซสชันใดข้อมูลยังส่งมาไม่ครบ จะถูกระงับไว้แทนการนำข้อมูลที่ไม่สมบูรณ์มาคำนวณ ดังนั้นช่วงเวลาที่ใช้คำนวณอาจล่าช้ากว่าปฏิทินไปหนึ่งเซสชันแม้ว่าเซสชันนั้นจะปิดตลาดแล้วก็ตาม โดยราคาที่ใช้คือราคาปิดของเซสชันปกติ
  • การจำกัดช่วงเวลาของข้อมูลทั้งสองส่วน แผงควบคุมด้านบนจะเก็บข้อมูลอายุของข้อมูลแต่ละชุดเป็นจำนวนวัน และมีการกำหนดขอบเขตความสมเหตุสมผลไว้ หากข้อมูลสรุป ณ วันที่ settlement เก่ากว่าหนึ่งเดือน หรือข้อมูลราคาล่าช้ากว่าระยะเวลาการรับข้อมูลปกติ ระบบจะระงับการแสดงผลหน้านี้เพื่อตรวจสอบ แทนที่จะแสดงวันที่ที่ล้าสมัยภายใต้หัวข้อข่าวที่ดูเป็นปัจจุบัน
  • ข้อยกเว้น Leveraged และ Inverse ETF จะถูกคัดออกจากการคำนวณในทุกแผงควบคุม (เนื่องจาก Short interest ของกองทุนเหล่านี้ส่วนใหญ่เป็นเพียงการทำ Hedging) รวมถึงสัญลักษณ์หุ้นที่มีความคลุมเครือซึ่งผู้ให้บริการข้อมูลใช้ซ้ำกันในสองบริษัท สำหรับแผงควบคุมที่วัดการเคลื่อนที่ของราคา จะคัดชื่อหุ้นที่มีการแตกหุ้น (Stock split) ภายในช่วงเวลาที่วัดผลออก เนื่องจากเหตุการณ์ดังกล่าวทำให้เกิดการเคลื่อนที่ของราคาที่ผิดปกติ ในการทดสอบย้อนหลัง (Backtest) การทดสอบจะรันตามรอบการ settlement ดังนั้นการแตกหุ้นในเดือนหนึ่งจะไม่ส่งผลให้ข้อมูลของหุ้นตัวนั้นหายไปในเดือนอื่นๆ
  • กองทุนจะถูกจัดรวมอยู่ในไฟล์นี้พร้อมกับบริษัททั่วไป พันธบัตรหรือ Index ETF อาจมีสถานะ Short ขนาดใหญ่ ซึ่งเกิดจากกลไกการสร้างและไถ่ถอนหน่วยลงทุน (Creation-and-redemption) มากกว่าการที่นักลงทุนต้องการเดิมพันสวนทางกับกองทุนนั้น
  • ไม่มีข้อมูล Free float และจำนวนหุ้นทั้งหมดในไฟล์นี้ และไม่มีข้อมูล Open interest ของ Options ในระบบ ข้อมูลจำนวนหุ้นที่ออกจำหน่าย (Shares-outstanding) ในตารางด้านบนมาจากตารางข้อมูลปัจจัยพื้นฐานแยกต่างหาก ดังนั้นหุ้นที่ไม่มีมูลค่าตลาด (Market value) ที่ประกาศไว้จะถูกคัดออกจากแผงควบคุมนั้น
  • ข้อมูลทั้งหมดนี้ไม่ใช่การคาดการณ์หรือคำแนะนำ ข้อมูลนี้เป็นการอธิบายสภาวะที่สามารถวัดผลได้ พร้อมกับแผงควบคุมแสดงผลลัพธ์ที่เกี่ยวข้อง

FAQ

วิธีการค้นหาหุ้นที่มีโอกาสเกิด short squeeze

คัดกรองจากข้อมูล short-interest ที่รายงานโดยตลาดหลักทรัพย์ โดยเลือกหุ้นที่มีสถานะ short position ขนาดใหญ่เมื่อเทียบกับปริมาณการซื้อขายรายวัน (daily volume) เลือกเฉพาะหุ้นที่มีสภาพคล่องเพียงพอต่อการซื้อขาย จากนั้นตรวจสอบว่าราคาหุ้นกำลังอยู่ในช่วงขาขึ้นหรือไม่ การคัดกรองจากไฟล์ short-interest ของ Jun 30, 2026 นี้ ใช้เกณฑ์คือจำนวนวันที่ต้องใช้ในการซื้อคืน (days to cover) ตั้งแต่ห้าวันขึ้นไป, ปริมาณการซื้อขายเฉลี่ยต่อวันอยู่ที่ห้าล้านหุ้น และราคาปรับตัวขึ้นในช่วงห้าวันล่าสุด ซึ่งทำให้เหลือหุ้นเพียง 31 ตัว

อัตราส่วน short interest ระดับใดที่ทำให้เกิด squeeze

ไม่มีตัวเลขตายตัว และการระบุตัวเลขใดตัวเลขหนึ่งเป็นเพียงการคาดเดา เนื่องจาก squeeze สามารถเกิดขึ้นได้จากระดับข้อมูลที่หลากหลาย และบ่อยครั้งที่ไม่มีอะไรเกิดขึ้นเลย จากข้อมูลการชำระราคา (settlement prints) ตลอดหนึ่งปีที่ผ่านมา พบว่า 51.7% ของหุ้นที่ผ่านเกณฑ์การคัดกรองนี้ มีราคาต่ำลงในอีก 30 วันต่อมา ดังนั้น short interest ที่สูงจึงเป็นเพียงเงื่อนไขเบื้องต้น แต่ไม่ใช่ตัวกระตุ้นให้เกิด squeeze

ข้อมูล short interest มีความล้าสมัยเพียงใด

ข้อมูลการชำระราคาล่าสุดในระบบนี้คือวันที่ Jun 30, 2026 ซึ่งผ่านมาแล้ว 24 วัน และข้อมูลราคาครอบคลุมถึงวันที่ Jul 22, 2026 ช่องว่างของเวลาดังกล่าวเกิดจากรอบการรายงานข้อมูล ไม่ใช่ข้อมูลที่ล้าสมัย เนื่องจากมีการนับสถานะสองครั้งต่อเดือน และจะเผยแพร่หลังจากวันชำระราคาประมาณแปดวันทำการ ดังนั้นข้อมูล short-interest ทุกแห่งจึงเป็นข้อมูลย้อนหลังหลายสัปดาห์เมื่อถูกนำมาใช้งาน

หุ้นตัวใดที่มีการ short มากที่สุดในขณะนี้

คุณสามารถดูอันดับหุ้นที่ถูก short มากที่สุดแบบไม่คัดกรอง ทั้งแบบ days to cover และแบบจำนวนหุ้นที่ถูก short ทั้งหมดได้ที่ หน้าหุ้นที่มีการ short มากที่สุด ส่วนหน้านี้จะตอบคำถามที่เฉพาะเจาะจงกว่า โดยพิจารณาจากรายชื่อในไฟล์ Jun 30, 2026 ที่มีราคาปรับตัวขึ้นด้วย ซึ่งหุ้นที่มีการถือครองสถานะ short หนาแน่นที่สุดคือ MPT โดยมี days to cover อยู่ที่ 16.9 วัน ซึ่งถือเป็นหุ้นที่โดดเด่นจากการคัดกรองนี้ ไม่ใช่หุ้นที่ถูก short มากที่สุดในตลาด


ทุกแผงข้อมูลคือการดึงข้อมูลผ่านคำสั่ง SQL ที่มีการบันทึกเวอร์ชันไว้จากไฟล์ที่รายงานโดยตลาดหลักทรัพย์ คุณสามารถขยายคำสั่ง SQL ใต้ตารางใดก็ได้ หรือรันการคัดกรองด้วยเกณฑ์ของคุณเองบน Strasmore terminal