STRASMORE/EXPLORE 3,256 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-10-08, from Stocks at 52-Week Highs and Lows.

as of series 30×4read in context →
New 52-week highs against new lows, daily, over the past six weeks — 30 rows by 4 columns, computed from US exchange, SIP and OPRA data.
dateat_52w_highat_52w_lownet_highs
Aug 26, 202635629
Aug 27, 2026351223
Aug 28, 202622814
Aug 31, 202619136
Sep 1, 202621174
Sep 2, 2026301218
Sep 3, 202636927
Sep 4, 202616106
Sep 8, 20261418-4
Sep 9, 20261831-13
Sep 10, 20261631-15
Sep 11, 202622202
Sep 14, 202622220
Sep 15, 20263340-7
Sep 16, 20261536-21
Sep 17, 202632311
Sep 18, 20261545-30
Sep 21, 20262934-5
Sep 22, 202629263
Sep 23, 20262643-17
Sep 24, 20263151-20
Sep 25, 20262040-20
Sep 28, 20262050-30
Sep 29, 20262247-25
Sep 30, 20261859-41
Oct 1, 20261845-27
Oct 2, 20262548-23
Oct 5, 202639327
Oct 6, 202624159
Oct 7, 20261930-11
Rows × columns
30 × 4
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 text 30 distinct values (Aug 26, 2026, Aug 27, 2026, Aug 28, 2026…)
at_52w_high number 14 to 39 US dollars
at_52w_low number 6 to 59 US dollars
net_highs number -41 to 29

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.

Run it yourself

This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.

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
⌘/Ctrl + Enter

Work with this data in your AI assistant

Opens ready to query, with this page's data. Free, no account.

More from this analysisStocks at 52-Week Highs and Lows
Stocks at 52-week lows, ordered by year-to-date return ranking 12×3 → Stocks at 52-week highs, ordered by year-to-date return ranking 12×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 114×4 → See all 3,256 queries →