Stocks at 52-Week Highs and Lows
See which stocks closed at a 52-week high and which sit at 52-week lows, screened from the exchange tape, with the count of each as a breadth reading.
A 52-week high is the highest price a stock has closed at over the past year, and a 52-week low is the lowest. On the last completed session, Jul 21, 2026, 26 stocks on this screen closed at or within 1% of a 52-week high and 7 closed at or within 1% of a 52-week low. The screen covers large, liquid US operating companies and rebuilds from the exchange tape.
Stocks at 52-week highs
The high list's strongest year-to-date gainers appear below, up to twelve of them. Each finished the session at or within 1% of its highest close of the trailing 52 weeks.
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(toDate(et)) AS d
FROM (
SELECT toTimeZone(window_start, 'America/New_York') AS et
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
),
daily AS (
SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
FROM (
SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 375 DAY
AND ticker IN (SELECT ticker FROM universe)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
GROUP BY ticker, dt
HAVING nbars >= 20 AND dt > (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 ticker,
round(last_close, 2) AS close,
round((last_close / base_close - 1) * 100, 1) AS ytd_return_pct
FROM ranged
WHERE last_close >= hi * 0.99
ORDER BY ytd_return_pct DESC, ticker ASC
LIMIT 12DAVE sits at the top at 99.6% for the year, closing at $439.18. On this list the close is the 52-week high to within 1%, by construction, so the price column doubles as the level being tested. DINO follows at 99% and MPC at 96.6%. At the far end of the table ROKU reads 33% for the year.
That spread is the point. A 52-week high describes where a price sits inside its own one-year range, nothing more. A stock that fell hard last summer and clawed its way back wears the same label as one that never stopped climbing.
Stocks at 52-week lows
The same screen, reversed. These names closed at or within 1% of their lowest close of the trailing 52 weeks, ordered from the weakest year-to-date reading, up to twelve of 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(toDate(et)) AS d
FROM (
SELECT toTimeZone(window_start, 'America/New_York') AS et
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
),
daily AS (
SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
FROM (
SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 375 DAY
AND ticker IN (SELECT ticker FROM universe)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
GROUP BY ticker, dt
HAVING nbars >= 20 AND dt > (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 ticker,
round(last_close, 2) AS close,
round((last_close / base_close - 1) * 100, 1) AS ytd_return_pct
FROM ranged
WHERE last_close <= lo * 1.01
ORDER BY ytd_return_pct ASC, ticker ASC
LIMIT 12PNR carries the weakest year-to-date reading on the list at -41%, closing at $61.48, its own 52-week closing low to within 1%. CPRT is next at -30.6%.
A 52-week low is a position in a price range, not a verdict on a business. Profitable companies drift onto this list through long quiet stretches, and so do companies in real difficulty. The closing price alone does not separate them. For the market-wide version of the same question, see how markets recover from crashes.
What the high and low counts say about market breadth
Breadth measures how many stocks take part in a move rather than how far the index travelled. The count of new highs against new lows is one of the oldest breadth readings there is, and on this page it is the number worth watching.
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(toDate(et)) AS d
FROM (
SELECT toTimeZone(window_start, 'America/New_York') AS et
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
),
daily AS (
SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
FROM (
SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 425 DAY
AND ticker IN (SELECT ticker FROM universe)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
GROUP BY ticker, dt
HAVING nbars >= 20 AND dt <= (SELECT d FROM last_session)
),
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 dtOn Jul 21, 2026 the screen held 26 names at or near a 52-week high against 7 at or near a low, a net reading of 19. Six weeks earlier, on Jun 9, 2026, the same screen read 35 highs and 3 lows.
Across the 29 sessions charted, both counts swing hard from day to day, so the level on any single session matters less than the drift over weeks. An index holding steady while the high count thins out is a narrower market than the index alone suggests. A tape where the low count swells is the setting behind buying when others are fearful, which we tested against news sentiment.
How far the rest of the market sits from its own high
Highs and lows are the two ends of a distribution; most stocks live in the middle. This panel sorts the whole screen by distance below its 52-week high and reports the median year-to-date return in each band.
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(toDate(et)) AS d
FROM (
SELECT toTimeZone(window_start, 'America/New_York') AS et
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
),
daily AS (
SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
FROM (
SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 375 DAY
AND ticker IN (SELECT ticker FROM universe)
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
GROUP BY ticker, dt
HAVING nbars >= 20 AND dt > (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 ord5.3% of the screen, 26 names, closed within 1% of a 52-week high. At the other end, 17% closed more than 35% below one. The median year-to-date return in the top band is 32.8%; in the bottom band it is -28.9%, and the chart draws the shape between them.
That gradient is closer to arithmetic than to a discovery: a stock near its 52-week high has, by construction, spent much of the year going up. The panel earns its place on scale: how unusual the extremes are, and how much of the market sits a long way from its own best price. Holding one of those names in size is the exposure measured in the real risk of one stock.
Where the market itself sits in its 52-week range
A single stock at a high reads differently against a market near its own high than against one well off it. The five broad-market ETFs below are measured exactly as the stocks above.
The exact SQL behind every number
WITH last_session AS (
SELECT max(toDate(et)) AS d
FROM (
SELECT toTimeZone(window_start, 'America/New_York') AS et
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY' AND window_start >= now() - INTERVAL 12 DAY
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 955
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
),
daily AS (
SELECT ticker, toDate(et) AS dt, argMax(c, et) AS c, count() AS nbars
FROM (
SELECT ticker, toTimeZone(window_start, 'America/New_York') AS et, toFloat64(close) AS c
FROM global_markets.delayed_stocks_minute_aggs
WHERE window_start >= now() - INTERVAL 375 DAY
AND ticker IN ('SPY', 'QQQ', 'DIA', 'IWM', 'RSP')
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) >= 930
AND toHour(toTimeZone(window_start, 'America/New_York')) * 60 + toMinute(toTimeZone(window_start, 'America/New_York')) < 960
)
GROUP BY ticker, dt
HAVING nbars >= 20
AND dt > (SELECT d FROM last_session) - 365
AND dt <= (SELECT d FROM last_session)
),
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(ticker = 'SPY', 'S&P 500 (SPY)',
ticker = 'QQQ', 'Nasdaq 100 (QQQ)',
ticker = 'DIA', 'Dow 30 (DIA)',
ticker = 'RSP', 'S&P 500 equal weight (RSP)',
'Russell 2000 (IWM)') AS label,
round((1 - last_close / hi) * 100, 2) AS pct_below_high,
round((last_close / lo - 1) * 100, 1) AS pct_above_low,
round((last_close / base_close - 1) * 100, 1) AS ytd_return_pct
FROM ranged
ORDER BY pct_below_high ASCS&P 500 equal weight (RSP) closed 1.08% below its 52-week high, the closest of the five, and 17.2% above its 52-week low. Nasdaq 100 (QQQ) sits furthest from its high at 4.98%. Year to date the two read 11.1% and 15.4%.
The gap between an equal-weighted and a cap-weighted version of the same index is a breadth reading in its own right. When the equal-weighted line sits nearer its high, the average member is outrunning the largest members. When the cap-weighted line is nearer, a handful of very big companies are carrying the index. Neither arrangement forecasts anything, and stepping out of the market during the wrong stretch carries the cost set out in missing the market's best days.
How this is measured
Every figure on this page comes from minute bars on the US exchange tape, aggregated into daily closing prices. The rules, in full:
- The universe. US-listed operating companies only, identified by a company income statement filed with the SEC for a period ending inside the past 400 days, so ETFs and funds stay off both lists. Leveraged and inverse ETFs are excluded by name as well, belt and braces.
- Liquidity floor. A stock must have traded at least $2 billion over the past 20 calendar days. Once weekends and holidays come out, that window holds a dozen or so sessions, so the bar works out near $150 million a session. It keeps the lists to names a reader could actually deal in and stops a thin tape from manufacturing an extreme.
- Splits are excluded, not adjusted. Any ticker with a stock split executed in the past 460 days is dropped from the screen. The window runs past a full year on purpose, wide enough to cover the oldest prices the breadth chart below reaches back to. This is the single most likely way a page like this publishes something false: a 1-for-20 reverse split multiplies the quoted price twentyfold with no trading behind it, and an unadjusted screen would report a spectacular new 52-week high. A forward split does the mirror image and fakes a 52-week low.
- Closing prices, not intraday extremes. The high and the low are measured on closes. A stock can trade through its 52-week high during the day, close below it, and never appear here. Screens built on intraday prints report larger counts.
- The session must be complete. A day's close is the last minute bar between 15:30 and 16:00 New York time. A session still loading has no bars in that half hour, so it cannot enter the calculation, and the in-progress session never does. Early-close holiday sessions drop out for the same reason. The date stamped above is the last session that passed the test, so it may sit a day or two behind the calendar.
- A full year of history. A stock needs at least 200 sessions inside the 52-week window and a first session at least 350 days back. A company that listed three months ago cannot print a 52-week high here.
- The 1% band. "At a 52-week high" means the close sits at or within 1% of the highest close in the trailing 52 weeks, and the low list mirrors it. Year-to-date returns are measured from the final close of 2025.
FAQ
Is buying at a 52-week high a good idea?
There is no general answer, and nothing here is advice. What this page can show is backward-looking: stocks within 1% of a 52-week high carry a median year-to-date return of 32.8%, against -28.9% for stocks more than 35% below their high. That describes the year behind those stocks, not the year ahead. The label marks a position in a price range, not a valuation.
What does it mean when a stock hits a 52-week low?
It means the stock closed lower than at any point in the previous 52 weeks. On Jul 21, 2026 that applied to 7 names on this screen. A low can accompany a deteriorating business or a long drift in a profitable one, and the price by itself does not tell you which.
How many stocks are at 52-week highs right now?
As of the close on Jul 21, 2026, 26 stocks on this screen closed at or within 1% of a 52-week high, against 7 at or within 1% of a 52-week low. The screen holds large, liquid US operating companies clearing a $2 billion turnover floor over the past 20 calendar days, so these counts run smaller than an all-listings screen would report.
How is a 52-week high calculated?
Take every closing price over the trailing 52 weeks and find the largest. If the latest close equals it, the stock has set a 52-week closing high. This page also counts any stock within 1% of that level, and drops any ticker with a split in the past 460 days, since a split changes the quoted price without changing what a holding is worth.
Every panel above stores the SQL behind it. Open the query under any table to audit the screen, or run it on the Strasmore terminal. For the week's largest moves rather than the year's extremes, see the biggest stock gainers and losers this week.