{"slug":"short-squeeze-candidates","qid":"screen_funnel","label":"From the whole settlement file down to the screened list, one rule at a time","post_title":"Short Squeeze Candidates This Week","post_url":"/blog/short-squeeze-candidates#q-screen_funnel","columns":["label","names"],"rows":[{"label":"Every name in the settlement file","names":22339},{"label":"Liquid: five million shares a day, no leveraged funds","names":663},{"label":"Crowded: five or more days to cover","names":90},{"label":"Rising: a positive move over the price window","names":55}],"shape":"ranking","sql":"WITH latest AS (\n    SELECT max(settlement_date) AS d FROM global_markets.stocks_short_interest\n),\nsessions AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS session\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND window_start >= now() - INTERVAL 20 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 session\n    HAVING count() >= 380\n    ORDER BY session DESC\n    LIMIT 6\n),\nreported AS (\n    SELECT ticker, days_to_cover, avg_daily_volume\n    FROM global_markets.stocks_short_interest\n    WHERE settlement_date = (SELECT d FROM latest)\n),\nliquid AS (\n    SELECT ticker, days_to_cover\n    FROM reported\n    WHERE avg_daily_volume >= 5000000\n      AND days_to_cover IS NOT NULL\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      AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits\n                         WHERE execution_date BETWEEN today() - 60 AND today())\n),\ncrowded AS (\n    SELECT ticker FROM liquid WHERE days_to_cover >= 5\n),\ntape 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 ticker FROM crowded)\n      AND toDate(toTimeZone(window_start, 'America/New_York')) IN (SELECT session FROM sessions)\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),\nrising AS (\n    SELECT ticker,\n           round((argMax(rth_close, session) / argMin(rth_close, session) - 1) * 100, 1) AS return_5d_pct\n    FROM tape\n    GROUP BY ticker\n    HAVING count() = 6 AND return_5d_pct > 0\n),\ntally AS (\n    SELECT (SELECT count() FROM reported) AS all_names,\n           (SELECT count() FROM liquid) AS liquid_names,\n           (SELECT count() FROM crowded) AS crowded_names,\n           (SELECT count() FROM rising) AS rising_names\n)\nSELECT step.1 AS label, step.2 AS names\nFROM (\n    SELECT arrayJoin([\n        ('Every name in the settlement file', all_names),\n        ('Liquid: five million shares a day, no leveraged funds', liquid_names),\n        ('Crowded: five or more days to cover', crowded_names),\n        ('Rising: a positive move over the price window', rising_names)]) AS step\n    FROM tally\n)","computed_at":"2026-08-24T13:16:27.372615+00:00","elapsed":0.795654215}