Short Squeeze Candidates This Week
Short squeeze stocks screened on days to cover, shares short and a rising price, with every threshold stated in plain English and the measured odds beside it.
Short squeeze stocks get screened on two mechanics: a short position that is large relative to how much the stock trades, and a price that is already rising. This page runs that screen on the latest exchange-reported short-interest file, settled Jun 30, 2026, and measures the price leg across the five sessions ending Jul 21, 2026. These are mechanics that resemble past squeezes. Nothing here is a forecast, and most heavily shorted stocks never squeeze.
Read the dates before the names. The short-interest half of this page is weeks old by regulation, not by any fault in the feed: brokers report their short positions to FINRA twice a month on scheduled settlement dates, and the compiled file becomes public roughly eight business days later. The freshest print available to anyone is dated Jun 30, 2026, 23 days back, while the price leg runs through Jul 21, 2026. Whatever the short side did inside that gap is invisible to every screener, this one included. Why short interest data is always two weeks old walks the reporting cycle step by step.
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 sit 38 and 23 days back, which is the twice-monthly counting cycle plus the compilation lag. The price tape is 2 days behind, and that one is warehouse ingest lag rather than regulation. Both ages carry bounds, so a feed that stalls holds this page rather than republishing an old date under a fresh headline.
Short squeeze stocks list: the current screen
Every name below cleared the same gates on the same file: five million shares of average daily volume, five or more days to cover, and a positive move across the five sessions ending Jul 21, 2026. 36 names cleared all of that, and the 12 most crowded of them are shown here. Days to cover is shares sold short divided by average daily volume: how many full days of the stock's entire tape the short side would need in order to buy its position back.
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 most crowded name here, MPT, shows 16.9 days to cover out of 138.1 million shares sold short, and it rose 5.4% across the five sessions ending Jul 21, 2026. The last row shown reads 6.5 days to cover, which is where the display is cut rather than where the screen's floor sits. Ranking is by crowding rather than by size, so a moderate position on a thin tape outranks a much larger one on a busy tape. For the size ranking, the most shorted stocks right now runs both leaderboards side by side.
The rising-price gate has a mechanical reason. A squeeze is forced buying by short sellers closing out, and closing a short means buying the stock back, which only starts once the price has moved against the position. How a short squeeze works, traced through GameStop's 2021 records, shows the sequence in numbers.
The rules, and what each one removes
A screen is an opinion with numbers attached, so here is where the field goes.
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 Jun 30, 2026 file carries 22207 securities. The liquidity floor and the exclusion list leave 885, the crowding threshold cuts that to 96, and the rising-price gate leaves 36. Each threshold is a choice, and a different choice produces a different list. That is why the rules sit on the page rather than in a footnote.
How much of each company is sold short
The figure most people search for is short interest as a percent of float, and it is not in this data. The exchange file reports shares short and average daily volume, with no share count of any kind. What can be derived is the position measured against total shares outstanding, taking each company's market value divided by its share price.
KSS tops that cut at 26.3% of shares outstanding sold short: 29.9 million shares against 113 million shares in existence. The 10 rows shown are the largest readings among the screened names carrying a published share count, and the last of them still reads 15.5%. Read that column as a floor and never as the float number. Float counts only the shares that genuinely change hands, stripping out insider stakes and other locked-up holdings. Float is the smaller denominator, so the true percentage of float sold short is higher than every figure shown. How much higher depends on each company's ownership, which this warehouse does not carry.
Is short crowding building or fading?
One print is a frozen frame. The same file goes back years, so the market-wide question has a data answer.
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 shown, the count of liquid names at five or more days to cover moved from 58 to 96. The rare end of the distribution stays much thinner: 5 names sat at ten or more days to cover at the latest print. The median liquid name reads 1.87 days, which is what makes a five-day threshold meaningful rather than arbitrary. The highest days-to-cover stocks page tracks that extreme tail on its own.
What has usually happened next
Screens like this are easy to build and easy to over-read, so here is the same screen run backward, at the same offset from the file. For every settlement print in the past year, take the names that cleared the crowding gate on that print and were rising over the six sessions ending twenty calendar days later, which is where this page sits today, then measure what each one did over the following 30 calendar days.
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 bucket51.7% of those name-and-settlement observations traded lower 30 days later. That is close to a coin flip, and it is the honest headline of this page: short sellers are frequently right, and crowded-plus-rising describes a setup rather than an edge. The tails are where a squeeze would show up, and both of them are thin. 68 observations fell by more than a fifth; 73 gained by more than a fifth, the bucket a genuine squeeze would land in. 87.8% of the sample never got there.
Treat that panel as a distribution, not as a trading result. It ignores costs, borrow fees and position sizing, and it weights every flagged name identically. Both legs are anchored twenty calendar days after each settlement date, the same offset this page uses, so every flagged name rests on prices a reader could have seen. A year of settlements is a short sample.
How this is measured
Every rule and exclusion behind the numbers above.
- The short-interest file is exchange-reported and twice monthly. The print used here settled Jun 30, 2026, 23 days ago. There is no daily disclosed short interest number in the US, only vendor estimates modelled from securities-lending data.
- Liquidity floor: five million shares of average daily volume, as reported in the same file. Without it the list fills with microcaps whose enormous days-to-cover reading is an artifact of near-zero volume.
- Crowding threshold: five or more days to cover, well above the liquid median shown above.
- Momentum leg: the change between the closing prices of the last six fully loaded regular sessions, which is a five-session return. A session enters the window only once the benchmark tape carries a full day of minute bars for it. A session that is still arriving in the feed is held back rather than measured half formed, so the window can end one session behind the calendar even when that session has closed. Prices are regular-session closes.
- Both dates are bounded. The panel at the top stores the age of each input in days, and those ages carry sanity bounds. A settlement print older than a month, or a price tape further behind than the normal ingest lag, holds this page for review rather than publishing a stale date under a fresh headline.
- Exclusions. Leveraged and inverse exchange-traded funds are dropped from every panel (their short interest is largely a hedging artifact), along with one ambiguous symbol that vendor feeds have reused across two companies. Panels that measure a price move also drop a name whose stock split lands inside that panel's own measurement window, since a split fakes a large move. In the backtest that test runs per settlement, so a split in one month never removes a name's observations from the other months.
- Funds sit in this file alongside operating companies. A bond or index ETF can carry a large short position that comes from creation-and-redemption plumbing rather than from anyone betting against it.
- No float and no share count in this file, and no options open interest anywhere in the warehouse. The shares-outstanding column above comes from a separate fundamentals table, so a name without a published market value drops out of that panel.
- Nothing here is a prediction or a recommendation. It describes measurable conditions, with the outcome panel attached.
FAQ
How do you find short squeeze candidates?
Screen the exchange-reported short-interest file for a position that is large relative to the stock's daily volume, keep only names liquid enough to trade, then check whether the price is already rising. This screen of the Jun 30, 2026 short-interest file uses five or more days to cover, five million shares of average daily volume, and a positive five-session move, which left 36 names.
What short interest percentage causes a squeeze?
There is no magic number, and anyone quoting one is guessing. Squeezes have started from readings all over the range, and far more often nothing happens at all: across a year of past settlement prints, 51.7% of the names this screen would have flagged were lower 30 days later. High short interest is a precondition, never a trigger.
How old is short interest data?
The newest settlement on file here is dated Jun 30, 2026, 23 days back, and the price data runs through Jul 21, 2026. That gap is the reporting cycle rather than a stale feed: positions are counted twice a month and published roughly eight business days after each settlement date, so every short-interest figure anywhere is weeks old on arrival.
Which stocks are the most shorted right now?
The unfiltered leaderboards, one by days to cover and one by raw shares short, sit on the most shorted stocks page. This page answers a narrower question: among the names on the Jun 30, 2026 file whose price is also rising, the most crowded is MPT at 16.9 days to cover, which is a screen leader rather than the market's most shorted stock.
Every panel is a 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.