STRASMORE/EXPLORE 2,170 QUERIES

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.

as of series 31×4read in context →
New 52-week highs against new lows, daily, over the past six weeks — 31 rows by 4 columns, computed from US exchange, SIP and OPRA data.
dateat_52w_highat_52w_lownet_highs
Jul 13, 202632824
Jul 14, 202629524
Jul 15, 202626917
Jul 16, 202637631
Jul 17, 202632824
Jul 20, 202618108
Jul 21, 202623716
Jul 22, 2026221111
Jul 23, 202621201
Jul 24, 2026321220
Jul 27, 202634133
Jul 28, 202645243
Jul 29, 2026301416
Jul 30, 202623518
Jul 31, 202617512
Aug 3, 202620119
Aug 4, 202641140
Aug 5, 202644341
Aug 6, 202633429
Aug 7, 202637334
Aug 10, 202647542
Aug 11, 202642438
Aug 12, 202645837
Aug 13, 202646244
Aug 14, 202637334
Aug 17, 202628523
Aug 18, 202630723
Aug 19, 202629029
Aug 20, 20261789
Aug 21, 202633528
Aug 24, 202629920
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
Formats
JSON · CSV · the SQL below

What each column holds

Column definitions for New 52-week highs against new lows, daily, over the past six weeks, derived from the stored result.
ColumnTypeRangeNotes
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 →