Short Squeeze Stocks to Watch This Week
Find short squeeze stocks screened by days to cover, shares short and rising price, with each threshold and measured odds clearly shown.
Short squeeze stocks dey pass through two main checks: short position wey big compared with how much the stock dey trade, plus price wey don already dey rise. This page run that screen on the latest exchange-reported short-interest file, settled Aug 14, 2026, and measure the price leg across the five sessions ending Sep 3, 2026. These na mechanics wey resemble past squeezes. Nothing here be forecast, and most stocks wey get heavy short interest no go squeeze.
Read the dates before the names. The short-interest side of this page don old by weeks because regulation require am, no be because feed get problem: brokers dey report their short positions to FINRA two times every month on scheduled settlement dates, and the compiled file become public roughly eight business days later. The freshest print wey anybody fit access carry date Aug 14, 2026, 22 days ago, while the price leg run through Sep 3, 2026. Anything wey happen for the short side inside that gap no dey visible to any screener, including this one. Why short interest data dey always two weeks old explain the reporting cycle step by step.
| as of date | leg | age days |
|---|---|---|
| Jul 31, 2026 | Short interest, previous settlement | 36 |
| Aug 14, 2026 | Short interest, latest settlement | 22 |
| Sep 3, 2026 | Price tape, last fully loaded session | 2 |
The exact SQL behind every number
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 legsThe two settlement prints dey 36 and 22 days ago. That na the twice-monthly counting cycle plus the compilation lag. The price tape dey 2 days behind, and that one na warehouse ingest lag, no be regulation. Both ages get bounds, so if feed stop updating, this page go hold instead of republishing old date with fresh headline.
Short squeeze stocks list: the current screen
Every name below pass through the same checks for the same file: five million shares average daily volume, five or more days to cover, plus positive move across the five sessions wey end for Sep 3, 2026. 36 names pass all the checks, and the 12 wey get the biggest crowd dey show here. Days to cover na shares sold short divided by average daily volume: how many full days of the stock entire tape the short side need to buy back its position.
| ticker | days to cover | shares short m | return 5d pct |
|---|---|---|---|
| ENB | 9.8 | 69.8 | 1.2 |
| MRNA | 9.2 | 52.8 | 4.3 |
| CNQ | 8.4 | 57.6 | 2.7 |
| FOXA | 8.1 | 45.3 | 0.8 |
| AUR | 7.6 | 174.9 | 11.1 |
| GOSS | 7.4 | 86.8 | 2.9 |
| SAN | 7.3 | 107.7 | 3.4 |
| STLA | 7.1 | 130.7 | 3.8 |
| AVTR | 6.9 | 52.2 | 4 |
| SBET | 6.9 | 39 | 1.1 |
| INFY | 6.8 | 130.3 | 1.7 |
| ACI | 6.7 | 51.7 | 3 |
The exact SQL behind every number
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 12The name wey get the biggest crowd here, ENB, show 9.8 days to cover from 69.8 million shares sold short, and e rise 1.2% across the five sessions wey end for Sep 3, 2026. The last row wey show na 6.7 days to cover. Na where the display cut, no be where the screen floor dey. Ranking na by crowding, no be by size. So, moderate position for thinly traded tape fit rank above much bigger position for busy tape. For size ranking, the most shorted stocks right now dey show both leaderboards side by side.
The rising-price check get mechanical reason. Squeeze na forced buying by short sellers wey dey close their positions. To close short position mean say dem need buy the stock back. This only start after price don move against the position. How a short squeeze works, using GameStop 2021 records, show the sequence with numbers.
Di rules, plus wetin each one dey remove
A screen na opinion wey get numbers join am, so na here the field dey narrow.
| label | names |
|---|---|
| Every name in the settlement file | 22480 |
| Liquid: five million shares a day, no leveraged funds | 697 |
| Crowded: five or more days to cover | 87 |
| Rising: a positive move over the price window | 36 |
The exact SQL behind every number
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
)The Aug 14, 2026 file carry 22480 securities. Liquidity floor and exclusion list reduce am to 697, crowding threshold cut am reach 87, while rising-price gate leave 36. Each threshold na choice, and different choice go produce different list. Na why di rules dey for page, instead of hiding dem for footnote.
E company shares wey people sell short reach how much
The figure wey most people dey look for na short interest as percentage of float, but this data no get am. The exchange file report shares short and average daily volume, but e no get any share count. Wetin we fit derive na the position measured against total shares outstanding. We calculate each company’s market value divide by its share price.
RIG na the top figure, cutting at 24.1% of shares outstanding sold short: 268.9 million shares against 1117 million shares wey dey exist. The 10 rows wey show na the highest readings among the screened names wey get published share count, and the last one still read 10.8%. Treat that column as a floor, never as the float number. Float na only the shares wey genuinely change hands; e remove insider stakes and other locked-up holdings. Float na the smaller denominator, so the real percentage of float sold short higher pass every figure wey show here. How much higher depend on each company’s ownership, and this warehouse no carry that information.
Short crowding dey build up or dey fade?
One print na frozen picture. The same file dey go back many years, so market-wide question get answer from data.
| settlement date | names 5plus dtc | names 10plus dtc | median dtc liquid |
|---|---|---|---|
| 2026-02-27 | 54 | 5 | 1.83 |
| 2026-03-13 | 58 | 7 | 1.54 |
| 2026-03-31 | 73 | 9 | 1.62 |
| 2026-04-15 | 69 | 6 | 1.75 |
| 2026-04-30 | 82 | 11 | 1.85 |
| 2026-05-15 | 83 | 8 | 2.02 |
| 2026-05-29 | 84 | 4 | 1.88 |
| 2026-06-15 | 97 | 12 | 1.8 |
| 2026-06-30 | 96 | 5 | 1.87 |
| 2026-07-15 | 103 | 6 | 2.27 |
| 2026-07-31 | 92 | 3 | 2.15 |
| 2026-08-14 | 88 | 8 | 2.16 |
The exact SQL behind every number
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_dateAcross the 12 settlements wey dem show, number of liquid names wey get five or more days to cover move from 54 to 88. The rare end of the distribution remain much thinner: 8 names get ten or more days to cover for the latest print. The median liquid name dey read 2.16 days. Na this one make five-day threshold meaningful, instead of arbitrary. Stocks wey get the highest days-to-cover page dey track this extreme tail separately.
Wetín usually happen next
Screens like this easy to build and easy to over-read, so make we run the same screen backward, for the same offset from the file. For every settlement print for the past year, take the names wey pass the crowding gate on that print and dey rise through the six sessions ending twenty calendar days later, wey na where this page dey today. Then measure wetin each one do over the next 30 calendar days.
| move over 30 days | name count | cumulative share pct |
|---|---|---|
| Fell more than 20% | 72 | 11.5 |
| Fell 10% to 20% | 97 | 27 |
| Fell 0% to 10% | 158 | 52.2 |
| Rose 0% to 10% | 165 | 78.5 |
| Rose 10% to 20% | 61 | 88.2 |
| Rose more than 20% | 74 | 100 |
The exact SQL behind every number
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 bucket52.2% of those name-and-settlement observations trade lower 30 days later. That dey close to coin flip, and na the honest headline for this page: short sellers dey often get am right, while crowded-plus-rising describe a setup, no be an edge. Na for the tails squeeze for show, and both tails thin. 72 observations fall by more than one-fifth; 74 gain by more than one-fifth, wey be the bucket where genuine squeeze for land. 88.2% of the sample no ever reach there.
Treat that panel as distribution, no be trading result. E no include costs, borrow fees or position sizing, and e give every flagged name the same weight. Both legs anchor twenty calendar days after each settlement date, the same offset wey this page dey use, so every flagged name dey rest on prices wey reader fit don see. One year of settlements na short sample.
How dem dey measure am
Every rule and exclusion wey dey behind the figures above.
- Exchange dey report the short-interest file, and dem dey publish am two times every month. The print wey we use here settle Aug 14, 2026, 22 days ago. US no get daily disclosed short interest figure; na vendor estimates dey available, and dem dey model am from securities-lending data.
- Liquidity floor: five million shares average daily volume, as the same file report am. Without this floor, microcaps go full the list, because their very high days-to-cover reading na result of almost zero volume.
- Crowding threshold: five or more days to cover, wey dey well above the liquid median wey show above.
- Momentum leg: na the change between the closing prices for the last six fully loaded regular sessions, meaning say na five-session return. Session go enter the window only after benchmark tape carry complete minute bars for the whole day. If session still dey enter the feed, we hold am back instead of measuring am half complete. Because of this, the window fit end one session behind the calendar even when that session don close. The prices na regular-session closes.
- Both dates get limits. The panel for top dey store how many days each input don old, and those ages get sanity bounds. If settlement print don pass one month, or price tape dey further behind than normal ingest lag, we hold this page for review instead of publishing stale date under fresh headline.
- Exclusions. We remove leveraged and inverse exchange-traded funds from every panel, because their short interest mostly come from hedging activity. We also remove one ambiguous symbol wey vendor feeds don reuse for two companies. Panels wey dey measure price move also remove one name wey stock split happen inside the panel’s own measurement window, because split fit fake a large move. For the backtest, we run this test for each settlement. So, split for one month no go remove the name’s observations from other months.
- Funds dey inside this file together with operating companies. Bond or index ETF fit carry large short position wey come from creation-and-redemption plumbing, instead of person betting against am.
- This file no get float or share count, and warehouse no get options open interest anywhere. The shares-outstanding column above come from separate fundamentals table, so any name wey no get published market value go drop out of that panel.
- Nothing for here be prediction or recommendation. E describe conditions wey dem fit measure, together with the outcome panel.
FAQ
How you dey find short squeeze candidates?
Screen the exchange-reported short-interest file for position wey big compared with the stock daily volume. Keep only names wey liquid enough to trade. Then check whether the price dey already rise. This screen of the Aug 14, 2026 short-interest file uses five or more days to cover, five million shares of average daily volume, and positive five-session move. E leave 36 names.
Which short interest percentage fit cause squeeze?
No magic number dey, and anybody wey quote one dey guess. Squeezes don start from readings across the whole range. But most times, nothing happen at all: across one year of past settlement prints, 52.2% of the names wey this screen for flag were lower 30 days later. High short interest na precondition, never the trigger.
How old short interest data be?
The newest settlement for this file get date Aug 14, 2026. E happen 22 days ago, while the price data run reach Sep 3, 2026. That gap na the reporting cycle, no be stale feed. Dem count positions two times every month and publish the data roughly eight business days after each settlement date. So, every short-interest figure anywhere don already be weeks old when e arrive.
Which stocks dem short pass right now?
The unfiltered leaderboards dey for the most shorted stocks page. One rank by days to cover, and the other rank by raw shares short. This page answer a narrower question: among the names for the Aug 14, 2026 file wey price dey also rise, the most crowded one na ENB at 9.8 days to cover. That one na screen leader, no be the market stock wey dem short pass.
Every panel na stored, versioned query over the exchange-reported file. Expand the SQL under any table, or run the screen with your own thresholds on the Strasmore terminal.