{"slug":"52-week-highs-and-lows","qid":"lows","label":"Stocks at 52-week lows, ordered by year-to-date return","post_title":"Stocks at 52-Week Highs and Lows","post_url":"/blog/52-week-highs-and-lows#q-lows","columns":["ticker","close","ytd_return_pct"],"rows":[{"ticker":"TTD","close":13.27,"ytd_return_pct":-65},{"ticker":"APP","close":298.59,"ytd_return_pct":-55.7},{"ticker":"QXO","close":13.41,"ytd_return_pct":-30.5},{"ticker":"NRG","close":111.78,"ytd_return_pct":-29.8},{"ticker":"TLN","close":305.54,"ytd_return_pct":-18.5},{"ticker":"VST","close":135.66,"ytd_return_pct":-15.9},{"ticker":"LHX","close":262.83,"ytd_return_pct":-10.5},{"ticker":"DKS","close":179.33,"ytd_return_pct":-9.4},{"ticker":"CMS","close":68.42,"ytd_return_pct":-2.2}],"shape":"ranking","sql":"WITH universe AS (\n    SELECT ticker\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE window_start >= now() - INTERVAL 20 DAY\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 570\n      AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960\n      AND ticker IN (SELECT arrayJoin(tickers) FROM global_markets.stocks_income_statements\n                     WHERE period_end >= today() - 400)\n      AND ticker NOT IN ('SPCX','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() - 460 AND today())\n    GROUP BY ticker\n    HAVING sum(toFloat64(close) * toFloat64(volume)) >= 2000000000\n),\nlast_session AS (\n    SELECT max(date) AS d FROM global_markets.stocks_daily_aggs\n    WHERE ticker = 'SPY' AND date >= today() - 12 AND date < today()\n),\ndaily AS (\n    SELECT ticker, date AS dt, toFloat64(close) AS c\n    FROM global_markets.stocks_daily_aggs\n    WHERE date < today()\n      AND ticker IN (SELECT ticker FROM universe)\n      AND date > (SELECT d FROM last_session) - 365\n),\nranged AS (\n    SELECT ticker,\n           argMax(c, dt) AS last_close,\n           max(c) AS hi,\n           min(c) AS lo,\n           argMaxIf(c, dt, dt <= toDate('2025-12-31')) AS base_close,\n           count() AS n_sessions,\n           min(dt) AS first_dt,\n           max(dt) AS last_dt\n    FROM daily\n    GROUP BY ticker\n    HAVING n_sessions >= 200\n       AND countIf(dt <= toDate('2025-12-31')) > 0\n       AND last_dt = (SELECT d FROM last_session)\n       AND first_dt <= (SELECT d FROM last_session) - 350\n)\nSELECT ticker,\n       round(last_close, 2) AS close,\n       round((last_close / base_close - 1) * 100, 1) AS ytd_return_pct\nFROM ranged\nWHERE last_close <= lo * 1.01\nORDER BY ytd_return_pct ASC, ticker ASC\nLIMIT 12","computed_at":"2026-08-25T13:16:08.707370+00:00","elapsed":4.435186069}