{"slug":"short-squeeze-candidates","qid":"screen_outcomes","label":"Every past screened name, by what it did over the next 30 days","post_title":"Short Squeeze Candidates This Week","post_url":"/blog/short-squeeze-candidates#q-screen_outcomes","columns":["move_over_30_days","name_count","cumulative_share_pct"],"rows":[{"move_over_30_days":"Fell more than 20%","name_count":72,"cumulative_share_pct":11.1},{"move_over_30_days":"Fell 10% to 20%","name_count":97,"cumulative_share_pct":26.1},{"move_over_30_days":"Fell 0% to 10%","name_count":168,"cumulative_share_pct":52.1},{"move_over_30_days":"Rose 0% to 10%","name_count":171,"cumulative_share_pct":78.5},{"move_over_30_days":"Rose 10% to 20%","name_count":62,"cumulative_share_pct":88.1},{"move_over_30_days":"Rose more than 20%","name_count":77,"cumulative_share_pct":100}],"shape":"ranking","sql":"WITH screened AS (\n    SELECT settlement_date, ticker\n    FROM global_markets.stocks_short_interest\n    WHERE settlement_date >= today() - 400\n      AND settlement_date <= today() - 55\n      AND avg_daily_volume >= 5000000\n      AND days_to_cover >= 5\n      AND ticker NOT IN ('SPCX')\n      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')\n),\nsplit_hits AS (\n    SELECT s.settlement_date AS sd, s.ticker AS tkr\n    FROM screened s\n    INNER JOIN global_markets.stocks_splits sp ON sp.ticker = s.ticker\n    WHERE sp.execution_date > s.settlement_date + 11\n      AND sp.execution_date <= s.settlement_date + 50\n),\ndaily AS (\n    SELECT ticker,\n           toDate(toTimeZone(window_start, 'America/New_York')) AS session,\n           argMax(close, window_start) AS rth_close\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN (SELECT DISTINCT ticker FROM screened)\n      AND window_start >= now() - INTERVAL 400 DAY\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60\n        + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60\n        + toMinute(toTimeZone(window_start, 'America/New_York')) < 960\n    GROUP BY ticker, session\n),\npaired AS (\n    SELECT s.settlement_date AS sd,\n           s.ticker AS tkr,\n           (argMaxIf(d.rth_close, d.session, d.session <= s.settlement_date + 20)\n            / argMinIf(d.rth_close, d.session, d.session <= s.settlement_date + 20) - 1) * 100 AS prior_pct,\n           (argMaxIf(d.rth_close, d.session, d.session >= s.settlement_date + 20)\n            / argMinIf(d.rth_close, d.session, d.session >= s.settlement_date + 20) - 1) * 100 AS next_pct\n    FROM screened s\n    INNER JOIN daily d ON d.ticker = s.ticker\n    WHERE d.session > s.settlement_date + 11\n      AND d.session <= s.settlement_date + 50\n    GROUP BY sd, tkr\n    HAVING countIf(d.session <= s.settlement_date + 20) >= 4\n       AND countIf(d.session >= s.settlement_date + 20) >= 15\n),\noutcomes AS (\n    SELECT multiIf(next_pct < -20, 1,\n                   next_pct < -10, 2,\n                   next_pct < 0, 3,\n                   next_pct < 10, 4,\n                   next_pct < 20, 5, 6) AS bucket,\n           multiIf(next_pct < -20, 'Fell more than 20%',\n                   next_pct < -10, 'Fell 10% to 20%',\n                   next_pct < 0, 'Fell 0% to 10%',\n                   next_pct < 10, 'Rose 0% to 10%',\n                   next_pct < 20, 'Rose 10% to 20%', 'Rose more than 20%') AS move_over_30_days\n    FROM paired\n    WHERE prior_pct > 0\n      AND (sd, tkr) NOT IN (SELECT sd, tkr FROM split_hits)\n),\ntallied AS (\n    SELECT bucket, move_over_30_days, count() AS name_count\n    FROM outcomes\n    GROUP BY bucket, move_over_30_days\n)\nSELECT move_over_30_days,\n       name_count,\n       round(100.0 * sum(name_count) OVER (ORDER BY bucket) / sum(name_count) OVER (), 1) AS cumulative_share_pct\nFROM tallied\nORDER BY bucket","computed_at":"2026-08-24T13:17:43.684133+00:00","elapsed":72.966696083}