Stocks at 52-Week Highs and Lows
How far the whole screen sits below its 52-week highranking ·
2026-08-25 · 6×4
Stocks at 52-week lows, ordered by year-to-date returnranking ·
2026-08-25 · 9×3
Where five broad-market ETFs sit inside their own 52-week rangeranking ·
2026-08-25 · 5×4
Stocks at 52-week highs, ordered by year-to-date returnranking ·
2026-08-25 · 12×3
New 52-week highs against new lows, daily, over the past six weeksseries ·
2026-08-25 · 31×4
How far the whole screen sits below its 52-week high
How far the whole screen sits below its 52-week high
| bucket | stocks | share_pct | median_ytd_pct |
|---|---|---|---|
| At the high (under 1%) | 29 | 6.2 | 31.9 |
| 1% to 5% below | 61 | 13.1 | 27.8 |
| 5% to 10% below | 78 | 16.8 | 15.3 |
| 10% to 20% below | 105 | 22.6 | 5.4 |
| 20% to 35% below | 95 | 20.5 | -2.7 |
| More than 35% below | 96 | 20.7 | -9.3 |
the exact SQL behind every number
WITH universe AS (
SELECT ticker
FROM global_markets.delayed_stocks_minute_aggs
WHERE 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
AND ticker IN (SELECT arrayJoin(tickers) FROM global_markets.stocks_income_statements
WHERE period_end >= today() - 400)
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')
AND ticker NOT IN (SELECT ticker FROM global_markets.stocks_splits
WHERE execution_date BETWEEN today() - 460 AND today())
GROUP BY ticker
HAVING sum(toFloat64(close) * toFloat64(volume)) >= 2000000000
),
last_session AS (
SELECT max(date) AS d FROM global_markets.stocks_daily_aggs
WHERE ticker = 'SPY' AND date >= today() - 12 AND date < today()
),
daily AS (
SELECT ticker, date AS dt, toFloat64(close) AS c
FROM global_markets.stocks_daily_aggs
WHERE date < today()
AND ticker IN (SELECT ticker FROM universe)
AND date > (SELECT d FROM last_session) - 365
),
ranged AS (
SELECT ticker,
argMax(c, dt) AS last_close,
max(c) AS hi,
min(c) AS lo,
argMaxIf(c, dt, dt <= toDate('2025-12-31')) AS base_close,
count() AS n_sessions,
min(dt) AS first_dt,
max(dt) AS last_dt
FROM daily
GROUP BY ticker
HAVING n_sessions >= 200
AND countIf(dt <= toDate('2025-12-31')) > 0
AND last_dt = (SELECT d FROM last_session)
AND first_dt <= (SELECT d FROM last_session) - 350
)
SELECT multiIf(p < 1, 'At the high (under 1%)',
p < 5, '1% to 5% below',
p < 10, '5% to 10% below',
p < 20, '10% to 20% below',
p < 35, '20% to 35% below',
'More than 35% below') AS bucket,
count() AS stocks,
round(100.0 * count() / sum(count()) OVER (), 1) AS share_pct,
round(quantileExact(0.5)(ytd), 1) AS median_ytd_pct
FROM (
SELECT (1 - last_close / hi) * 100 AS p,
(last_close / base_close - 1) * 100 AS ytd,
multiIf(p < 1, 0, p < 5, 1, p < 10, 2, p < 20, 3, p < 35, 4, 5) AS ord
FROM ranged
)
GROUP BY bucket, ord
ORDER BY ord
More from this analysisStocks at 52-Week Highs and Lows
Stocks at 52-week highs, ordered by year-to-date return
ranking 12×3
→
Stocks at 52-week lows, ordered by year-to-date return
ranking 9×3
→
Where five broad-market ETFs sit inside their own 52-week range
ranking 5×4
→
New 52-week highs against new lows, daily, over the past six weeks
series 31×4
→
See all 2,170 queries →