Strasmore Research
Learn Matt ConnorBy Matt Connor · data as of August 15, 2026 · refreshed weekly

Low P/E Stocks Near 52-Week Lows

Low P/E stocks near 52-week lows: the exact screen, the distance-to-low ranking, and honest data on how often these names keep printing new lows afterwards.

Low P/E stocks near 52-week lows sit where two very different screens cross: a low trailing earnings multiple, and a price parked near the bottom of its own one-year range. The screen below states both conditions as numbers you can copy, ranks the survivors by distance to the low, and shows the query under every panel. One warning up front: a list built this way collects falling knives at least as often as bargains, and a later section walks through the arithmetic behind it.

What counts as near a 52-week low

A 52-week low is the lowest price a stock has printed over the trailing year. Distance to the low turns that into a percentage: last close divided by the 52-week low, minus one. A stock closing at 55 against a 52-week low of 50 sits 10% above its low. That arithmetic is the entire ranking, and our 52-week highs and lows guide covers the band itself in more detail.

The P/E ratio, price divided by trailing twelve-month earnings per share, comes from the daily ratios table stocks_ratios, the same source behind our highest dividend yield stocks screen. The price band comes from stocks_daily_aggs, one row per stock per session.

Four dials define the screen, and each one is arbitrary until it is written down:

  • distance to the 52-week low at or under 10%
  • trailing P/E above zero and at or under 15
  • market cap at or above $10 billion
  • average daily volume at or above 1,000,000 shares

The last two keep the list to names with a real market on both sides. A $40 million company trading 20,000 shares a day can print any multiple it likes.

QueryLarge caps on a trailing P/E under 15, within 10% of a 52-week low
The exact SQL behind every number
WITH ratios AS
(
    SELECT
        ticker,
        argMax(price_to_earnings, date) AS pe,
        argMax(market_cap, date)        AS mcap,
        argMax(average_volume, date)    AS adv
    FROM global_markets.stocks_ratios
    WHERE date >= today() - 14
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
),
band AS
(
    SELECT
        ticker,
        min(low)            AS low_52w,
        argMax(close, date) AS last_close
    FROM global_markets.stocks_daily_aggs
    WHERE date >= today() - 372
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
)
SELECT
    b.ticker                                                             AS ticker,
    round(toFloat64(b.last_close) / toFloat64(b.low_52w) * 100 - 100, 1) AS pct_above_low,
    round(r.pe, 1)                                                       AS pe_ratio
FROM band AS b
INNER JOIN ratios AS r ON r.ticker = b.ticker
WHERE r.mcap >= 10000000000
  AND r.adv >= 1000000
  AND r.pe > 0
  AND r.pe <= 15
  AND b.low_52w > 0
  AND toFloat64(b.last_close) / toFloat64(b.low_52w) <= 1.10
ORDER BY pct_above_low ASC, b.ticker ASC
LIMIT 15
Run this yourself

The panel lists the 6 names closest to their lows under those dials, capped at fifteen rows. VICI sits nearest its own floor at 2.3% above the lowest price it printed in the past year, on a trailing multiple of 10.5. At the other end of the panel, BRK.B sits 9.7% above its low.

How to rank the list

Sorting is the step most screens skip. Ranking by P/E puts the cheapest-looking multiple on top and hides where the price sits. Ranking by distance to the low puts the names nearest a fresh low on top and hides what they cost. The panel sorts ascending on distance and carries the multiple in the next column, which keeps both facts in one row. Ties break alphabetically, a detail that matters when several names round to the same decimal.

Reproducing it takes four inputs: a daily close series covering a full trailing year, a trailing EPS figure, a share count for market cap, and an average volume. Everything after that is subtraction and division.

How many names pass depends on where the dials sit

Move one dial and the size of the list changes. The panel below holds the market cap and liquidity floors fixed, walks the distance band from 5% out to 30%, and counts the qualifying names at two P/E ceilings.

QueryQualifying large caps as the distance band and the P/E ceiling widen
The exact SQL behind every number
WITH ratios AS
(
    SELECT
        ticker,
        argMax(price_to_earnings, date) AS pe,
        argMax(market_cap, date)        AS mcap,
        argMax(average_volume, date)    AS adv
    FROM global_markets.stocks_ratios
    WHERE date >= today() - 14
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
),
band AS
(
    SELECT
        ticker,
        min(low)            AS low_52w,
        argMax(close, date) AS last_close
    FROM global_markets.stocks_daily_aggs
    WHERE date >= today() - 372
      AND ticker NOT IN ('SPCX')
    GROUP BY ticker
),
universe AS
(
    SELECT
        b.ticker                                                   AS ticker,
        toFloat64(b.last_close) / toFloat64(b.low_52w) * 100 - 100 AS pct_above_low,
        r.pe                                                       AS pe
    FROM band AS b
    INNER JOIN ratios AS r ON r.ticker = b.ticker
    WHERE r.mcap >= 10000000000
      AND r.adv >= 1000000
      AND r.pe > 0
      AND b.low_52w > 0
)
SELECT
    concat('within ', toString(cutoff), '%')      AS distance_band,
    countIf(pct_above_low <= cutoff AND pe <= 15) AS names_pe_under_15,
    countIf(pct_above_low <= cutoff AND pe <= 25) AS names_pe_under_25
FROM
(
    SELECT
        pct_above_low,
        pe,
        arrayJoin([5, 10, 15, 20, 25, 30]) AS cutoff
    FROM universe
)
GROUP BY cutoff
ORDER BY cutoff
Run this yourself

At the dials of the first panel, a 10% band and a ceiling of 15, 7 large caps qualify in total. Tighten the band to 5% and 1 remain. Widen it to 30% and the count reaches 43, while lifting the ceiling to 25 at that same width gives 137. No setting here is objectively correct. They are dials, and the honest way to publish a screen is to say where they were left.

A 52-week low is a moving floor

The low itself moves. It is a rolling measurement, so an old low ages out of the window as the calendar advances and the floor steps up on a day when nothing happened to the stock at all. Tracking one name month by month makes that visible. The panel below follows KO, a household large cap, against the lowest price of its trailing twelve months.

QueryKO month-end close against its trailing 12-month low
The exact SQL behind every number
SELECT
    formatDateTime(m, '%Y-%m')                                             AS month,
    round(toFloat64(month_close), 2)                                       AS close_price,
    round(toFloat64(trailing_low), 2)                                      AS trailing_12m_low,
    round(toFloat64(month_close) / toFloat64(trailing_low) * 100 - 100, 1) AS pct_above_low
FROM
(
    SELECT
        m,
        month_close,
        min(month_low) OVER (ORDER BY m ASC ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) AS trailing_low
    FROM
    (
        SELECT
            toStartOfMonth(date) AS m,
            argMax(close, date)  AS month_close,
            min(low)             AS month_low
        FROM global_markets.stocks_daily_aggs
        WHERE ticker = 'KO'
          AND date >= today() - 1100
        GROUP BY m
    )
)
WHERE m >= toStartOfMonth(today() - 400)
ORDER BY m
Run this yourself

As of 2026-08, KO closed at $87.71 against a trailing twelve-month low of $65.35, a distance of 34.2%. The gap between the two price lines is the quantity this screen measures. Where the low line steps up while the close line stays flat, the measured distance shrinks with no move in the stock.

Why the screen collects falling knives

The mechanism is arithmetic. The E in a P/E is trailing and updates four times a year, when the company reports. The P updates every second the market is open. A price sliding through a quarter, against an earnings figure fixed until the next report, prints a lower multiple week after week on its own. The multiple looks cheapest at the moment price has travelled furthest from the last filed number. When the next report brings earnings down, the multiple re-expands at the new lower price, and nothing was ever cheap. That pattern has a name: a value trap.

Cyclicals invert the same measurement. An automaker or a homebuilder tends to show its lowest trailing P/E at the peak of its earnings cycle, when trailing EPS sits at a high water mark, and its highest at the trough.

Measuring that pattern means rebuilding the screen as of a past date and then following every name that passed it, which needs a trailing multiple for each ticker as it stood on that past date rather than only the latest one. The stocks_ratios rows behind the panels above are read at their most recent date per ticker, and this page states the mechanism without attaching a follow-through number it cannot show you the query for. One cohort from one starting date would be a single observation in any case: start it in a different month and the numbers move. The list carries no claim about what any price does next.

What a low P/E leaves out

  • Which earnings. Trailing EPS includes one-time items, asset sales, and legal settlements. A single fat quarter holds a multiple down for a year after the cash is gone.
  • Sector context. Banks, insurers, automakers, and refiners carry structurally lower multiples than software companies, and one ceiling applied across all of them fills a list with the same few industries.
  • The balance sheet. A P/E ignores debt. Two companies on the same multiple with very different leverage are not at the same price.
  • Losses. A company with negative earnings has no meaningful P/E and never appears here. Absence from the list is not a verdict.

Two neighbouring lists read well next to this one. The biggest stock movers this month shows which names travelled furthest over the past month, and the lowest volatility stocks shows the opposite temperament.

Data notes and definitions
  • Prices come from stocks_daily_aggs, one row per stock per session. The 52-week low is the minimum of the daily low column over the trailing 372 calendar days.
  • The multiple, market cap, and average volume come from stocks_ratios, read as the most recent row per ticker.
  • A split or a large special distribution inside the window moves a raw price band, which is worth checking on any name that had one during the trailing year.
  • The screen requires a positive trailing multiple, so loss-making companies never appear on it.

FAQ

What does it mean when a stock is near its 52-week low?

It means the current price sits close to the lowest price the stock traded at over the past year. Distance to the low is last close divided by the 52-week low, minus one, read as a percentage.

What P/E counts as low?

There is no fixed line. Screens commonly cap the trailing multiple at 15, or at 10 for a stricter cut, and multiples differ enough by industry that a single ceiling across the whole market fills a list with the same few sectors.

Is a low P/E stock near its 52-week low a good buy?

No screen answers that, and this page does not either. The two conditions describe the past: what the market pays per dollar of already-reported earnings, and where the price sits inside its own one-year range. Neither one describes what comes next.

What is a value trap?

A value trap is a stock that looks cheap on a trailing multiple and keeps falling. Earnings per share updates quarterly while price updates continuously, so a falling price against a fixed trailing E prints a steadily lower multiple, and the next report can reset that multiple higher at the lower price.


Every panel here ships with the query that produced it. Open one, change the P/E ceiling or the distance band, and the list rebuilds on your own dials on the Strasmore terminal.

#screens#52-week lows#valuation#value investing#p/e ratio