Low P/E stocks near 52-week lows
Low P/E stocks wey dey near 52-week lows: see the exact screen, distance-to-low ranking, and how often dem keep printing new lows after.
Low P/E stocks wey dey near 52-week lows dey where two very different screens cross: low trailing earnings multiple, plus price wey dey near the bottom of its own one-year range. The screen below write both conditions as numbers wey you fit copy, rank the names wey pass by how far dem dey from the low, and show the query under every panel. Make we warn you first: list wey dem build this way fit collect falling knives as often as e fit collect bargains, and later section explain the arithmetic behind am.
Wetin count as near a 52-week low
52-week low na the lowest price wey stock don print for the trailing year. Distance to the low turn am to percentage: last close divided by 52-week low, minus one. If stock close at 55 while 52-week low na 50, e dey 10% above the low. Na this arithmetic complete the ranking, and our 52-week highs and lows guide explain the band in more detail.
P/E ratio, wey be price divided by trailing twelve-month earnings per share, come from daily ratios table stocks_ratios, the same source wey our highest dividend yield stocks screen dey use. Price band come from stocks_daily_aggs, with one row for each stock and trading session.
Four dials define the screen, and each one na arbitrary until person write am down:
- distance to the 52-week low at or below 10%
- trailing P/E above zero and at or below 15
- market cap at or above $10 billion
- average daily volume at or above 1,000,000 shares
The last two keep the list on names wey get real market for both sides. Company wey worth $40 million and dey trade 20,000 shares per day fit print any multiple wey e like.
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 15The panel list the 6 names wey dey closest to their lows under those dials, with maximum of fifteen rows. VICI dey closest to its own floor, at 2.3% above the lowest price wey e print for the past year, with trailing multiple of 10.5. For the other end of the panel, BRK.B dey 9.7% above its low.
How to rank the list
Sorting na the step wey most screens dey skip. If you rank by P/E, the multiple wey look cheapest go dey on top, but you no go see where the price dey. If you rank by distance to the low, names wey dey closest to fresh low go dey on top, but you no go see wetin dem cost. The panel sort from lowest distance upward and carry the multiple for the next column, so both facts dey the same row. If two names tie, alphabetic order break the tie. This matter when several names round to the same decimal.
To reproduce am, you need four inputs: daily close series wey cover full trailing year, trailing EPS figure, share count for market cap, and average volume. Everything after that na subtraction and division.
How many names pass depend on where the dials dey
If you move one dial, the list size go change. The panel below keep market cap and liquidity floors fixed, move the distance band from 5% reach 30%, and count the names wey qualify under two P/E ceilings.
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 cutoffWith the first panel dials, 10% band and ceiling of 15, 7 large caps qualify altogether. If you tighten the band to 5%, 1 remain. If you widen am to 30%, the count reach 43. If you raise the ceiling to 25 at that same width, the count give 137. No setting here objectively correct. Dem na dials, and the honest way to publish screen na to state where you leave dem.
A 52-week low na moving floor
The low itself dey move. E na rolling measurement, so old low go age out of the window as calendar dey move, and the floor fit step up on a day wey nothing happen to the stock. If you track one name month by month, you go see am. The panel below follow KO, one household large cap, against the lowest price for its trailing twelve months.
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 mAs of 2026-08, KO close at $87.71 against trailing twelve-month low of $65.35, giving distance of 34.2%. The gap between the two price lines na the quantity wey this screen measure. Where the low line step up while close line remain flat, the measured distance go shrink even though the stock no move.
Why the screen dey collect falling knives
The mechanism na arithmetic. The E for P/E na trailing, and e dey update four times per year when company report. The P dey update every second wey market open. If price dey slide through one quarter while earnings figure remain fixed until the next report, the stock go print lower multiple week after week by itself. The multiple go look cheapest when price don move farthest from the last filed number. When next report bring earnings down, the multiple go expand again at the new lower price, and nothing ever cheap. That pattern get name: value trap.
Cyclicals reverse the same measurement. Automaker or homebuilder normally show lowest trailing P/E at the peak of earnings cycle, when trailing EPS dey high, and highest P/E at the trough.
To measure that pattern, you need rebuild the screen as of past date and then follow every name wey pass am. That one need trailing multiple for each ticker as e stand on that past date, not only the latest one. The stocks_ratios rows behind the panels above dey read at their most recent date per ticker, and this page explain the mechanism without adding follow-through number wey e no fit show you the query for. One cohort from one starting date still na only one observation: if you start am for another month, the numbers go change. The list no claim anything about wetin any price go do next.
Wetin low P/E no show
- Which earnings. Trailing EPS include one-time items, asset sales, and legal settlements. One unusually large quarter fit keep multiple low for one year after the cash don finish.
- Sector context. Banks, insurers, automakers, and refiners get structurally lower multiples than software companies. One ceiling across all of dem fit fill the list with the same few industries.
- The balance sheet. P/E no account for debt. Two companies with the same multiple but very different leverage no dey at the same price.
- Losses. Company wey get negative earnings no get meaningful P/E, so e no go appear here. If name no dey the list, that one no be verdict.
Two nearby lists fit read well beside this one. The biggest stock movers this month show which names travel farthest over the past month, while the lowest volatility stocks show the opposite temperament.
Data notes and definitions
- Prices come from
stocks_daily_aggs, with one row for each stock and trading session. The 52-week low na 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. - Split or large special distribution inside the window fit move raw price band, so check any name wey get one during the trailing year.
- The screen require positive trailing multiple, so companies wey dey make loss no go appear.
FAQ
Wetin e mean when stock dey near its 52-week low?
E mean say current price dey close to the lowest price wey stock trade for the past year. Distance to the low na last close divided by 52-week low, minus one, read as percentage.
Which P/E count as low?
No fixed line dey. Screens commonly cap trailing multiple at 15, or at 10 for stricter cut. Multiples differ enough by industry, so one ceiling across the whole market fit fill the list with the same few sectors.
Low P/E stock wey dey near 52-week low na good buy?
No screen fit answer that one, and this page no answer am too. The two conditions describe the past: wetin market dey pay for each dollar of earnings wey company don already report, and where price dey inside its own one-year range. Neither one describe wetin go happen next.
Wetin be value trap?
Value trap na stock wey look cheap on trailing multiple but continue to fall. Earnings per share dey update quarterly, while price dey update continuously. So when price dey fall against fixed trailing E, the multiple go steadily lower, and next report fit reset the multiple higher at the lower price.
Every panel here come with the query wey produce am. Open one, change the P/E ceiling or distance band, and the list go rebuild on your own dials for the Strasmore terminal.