New 52-week highs against new lows, daily, over the past six weeks
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-08-25, from Stocks at 52-Week Highs and Lows.
| date | at_52w_high | at_52w_low | net_highs |
|---|---|---|---|
| Jul 13, 2026 | 32 | 8 | 24 |
| Jul 14, 2026 | 29 | 5 | 24 |
| Jul 15, 2026 | 26 | 9 | 17 |
| Jul 16, 2026 | 37 | 6 | 31 |
| Jul 17, 2026 | 32 | 8 | 24 |
| Jul 20, 2026 | 18 | 10 | 8 |
| Jul 21, 2026 | 23 | 7 | 16 |
| Jul 22, 2026 | 22 | 11 | 11 |
| Jul 23, 2026 | 21 | 20 | 1 |
| Jul 24, 2026 | 32 | 12 | 20 |
| Jul 27, 2026 | 34 | 1 | 33 |
| Jul 28, 2026 | 45 | 2 | 43 |
| Jul 29, 2026 | 30 | 14 | 16 |
| Jul 30, 2026 | 23 | 5 | 18 |
| Jul 31, 2026 | 17 | 5 | 12 |
| Aug 3, 2026 | 20 | 1 | 19 |
| Aug 4, 2026 | 41 | 1 | 40 |
| Aug 5, 2026 | 44 | 3 | 41 |
| Aug 6, 2026 | 33 | 4 | 29 |
| Aug 7, 2026 | 37 | 3 | 34 |
| Aug 10, 2026 | 47 | 5 | 42 |
| Aug 11, 2026 | 42 | 4 | 38 |
| Aug 12, 2026 | 45 | 8 | 37 |
| Aug 13, 2026 | 46 | 2 | 44 |
| Aug 14, 2026 | 37 | 3 | 34 |
| Aug 17, 2026 | 28 | 5 | 23 |
| Aug 18, 2026 | 30 | 7 | 23 |
| Aug 19, 2026 | 29 | 0 | 29 |
| Aug 20, 2026 | 17 | 8 | 9 |
| Aug 21, 2026 | 33 | 5 | 28 |
| Aug 24, 2026 | 29 | 9 | 20 |
- Rows × columns
- 31 × 4
- Period covered
- to
- 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 |
|---|---|---|---|
date |
date | Aug 10, 20 to Jul 31, 20 | |
at_52w_high |
number | 17 to 47 | US dollars |
at_52w_low |
number | 0 to 20 | US dollars |
net_highs |
number | 1 to 44 |
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.
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)
AND date >= (SELECT d FROM last_session) - 425
),
rolled AS (
SELECT ticker, dt, c,
max(c) OVER w AS hi,
min(c) OVER w AS lo,
count() OVER w AS n_sessions,
min(dt) OVER (PARTITION BY ticker) AS first_dt
FROM daily
WINDOW w AS (PARTITION BY ticker ORDER BY dt RANGE BETWEEN 364 PRECEDING AND CURRENT ROW)
)
SELECT formatDateTime(dt, '%b %e, %Y') AS date,
countIf(c >= hi * 0.99) AS at_52w_high,
countIf(c <= lo * 1.01) AS at_52w_low,
countIf(c >= hi * 0.99) - countIf(c <= lo * 1.01) AS net_highs
FROM rolled
WHERE n_sessions >= 200
AND first_dt <= dt - 350
AND dt > (SELECT d FROM last_session) - 43
GROUP BY dt
ORDER BY dt
Run your own version of this
The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.
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
→
How far the whole screen sits below its 52-week high
ranking 6×4
→
Where five broad-market ETFs sit inside their own 52-week range
ranking 5×4
→
The S&P 500's underwater curve: worst drawdown from a prior high, by month
series 127×2
→
Growth of $100: a calm name (KO), the market (SPY), a wild name (NVDA), weekly
series 115×4
→
See all 2,170 queries →