Every past screened name, by what it did over the next 30 days
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-10-08, from Short Squeeze Candidates This Week.
| move_over_30_days | name_count | cumulative_share_pct |
|---|---|---|
| Fell more than 20% | 82 | 11.2 |
| Fell 10% to 20% | 121 | 27.7 |
| Fell 0% to 10% | 192 | 53.9 |
| Rose 0% to 10% | 191 | 79.9 |
| Rose 10% to 20% | 71 | 89.6 |
| Rose more than 20% | 76 | 100 |
- Rows × columns
- 6 × 3
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
move_over_30_days |
text | 6 distinct values | |
name_count |
number | 71 to 192 | count |
cumulative_share_pct |
number | 11.2 to 100 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
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
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.