52-Week Highs and Volume: Which Stocks Can a Screener Rule Out?
Buying near a 52-week high feels uncomfortable for an obvious reason: what if the apparent breakout immediately reverses? Adding volume or relative volume (RVOL) cannot tell me which stock will trap buyers. It helps with an earlier decision: with dozens of names near their yearly highs, which are worth spending time on first?
One name might be close to its high but trade very little. Another might attract heavy volume while remaining far below its high. My approach is to narrow the list by price position, add an absolute-volume filter, then inspect relative volume and liquidity before doing deeper research. In the interface I examined, the two filters actually applied were 52W High and Volume. RVOL was visible as a separate Relative Volume column for the next round of inspection; I did not apply or validate a numeric RVOL cutoff in that run.
Screening is a way to allocate research time, not a buy signal.
Two filters remove different kinds of uncertainty
A 52-week high gives the current price a historical reference. Trading near that level suggests relative price strength over the previous year. It does not establish that a breakout is valid, that resistance has disappeared, or that the price will continue higher.
Even the phrase “near the high” needs a definition. Finviz’s screener help discusses period highs and percentage-distance filters. “Within 5% of the high” can be calculated precisely as a study rule. That does not mean entering the number 10 in some other screener’s 52W High field represents a 10% distance.
Volume addresses a different concern. A stock with very little trading activity may require additional work on bid-ask spreads, available order-book depth, and whether a position could realistically be entered or exited. A good-looking chart does not guarantee execution at the intended price.
I think of that as a research cost. Every thinly traded candidate adds another liquidity question to investigate. Investor.gov’s explanation of liquidity focuses on whether an asset can be sold without significantly affecting its price. Higher share volume can make a name worth examining, but it cannot, by itself, prove depth or a tight spread.
Filtering on volume alone is no better as a complete strategy: heavy selling can produce high volume too. The useful first pass is an intersection, not a combined score that magically creates a higher win rate.
Six fictional stocks, four near highs, two after volume
To make that intersection checkable without redistributing market quotes, I invented six stocks: S1 through S6. Each has an assumed price, 52-week high, and daily share volume. First, keep prices at least 95% of their assumed yearly high. Next, require at least one million shares of assumed volume.
Both thresholds are mine, chosen for this fictional example. They are not a statement about a production screener’s field definitions or units.
// Entirely fictional records; volume units are illustrative.
const stocks = [
["S1", 96, 100, 600000],
["S2", 49, 50, 1800000],
["S3", 190, 200, 900000],
["S4", 9.8, 10, 2400000],
["S5", 80, 100, 1600000],
["S6", 60, 100, 2200000],
];
// [identifier, assumed current price, assumed 52-week high, assumed daily volume]
const nearHigh = stocks.filter(([, price, high]) => price / high >= 0.95);
const candidates = nearHigh.filter(([, , , volume]) => volume >= 1000000);
console.log(stocks.length, nearHigh.length, candidates.length); // 6 4 2
console.log(candidates.map(([id]) => id)); // ["S2", "S4"]
The output is 6, 4, 2, with S2 and S4 remaining. You can verify the logic without running a backtest.
| Stage | Fictional stocks remaining | Why others leave |
|---|---|---|
| Starting set: 6 | S1, S2, S3, S4, S5, S6 | — |
| At least 95% of high: 4 | S1, S2, S3, S4 | S5 and S6 are farther from their highs |
| Add one-million-share gate: 2 | S2, S4 | S1 and S3 are below the volume gate |
S3 is worth examining. Its invented price of 190 against a high of 200 puts it exactly at the 95% boundary. Its invented volume is 900,000 shares, only 100,000 below the second cutoff. The code excludes S3 without hesitation. That does not make S3 a worse stock, or even a less interesting research subject.
This is the price of a coarse screen: shorter lists can hide useful borderline cases. If I only have time for a handful of charts, I may accept that tradeoff. If I am studying unusual activity among small-float stocks, I might retain S3 on a separate “near the threshold” watchlist. The cutoff allocates attention; it does not grade the business.
Volume needs context as well. At a hypothetical price of 10 yuan, one million shares correspond to roughly 10 million yuan in turnover if priced uniformly; at 100 yuan, roughly 100 million. These are illustrations of units, not observed trade values. Neither tells me what the order book will absorb. Turnover, turnover rate, and bid-ask spread can matter more than the same share-count threshold applied everywhere.
What happened when I tried the two filters in a screener
A toy array is easy to reason about. In an actual interface, the first question is whether both conditions were truly applied or whether I merely changed the order of visible rows.
I used the NuvexLens screener, a tool I help maintain, to inspect the workflow. The useful detail is modest: adding a second condition kept the first filter chip visible, and the candidate summary narrowed. That is more convenient than exporting two separate lists and manually intersecting them, but it is not proof of a special backend algorithm.
In one US-market Overview observation, both Volume and Relative Volume columns appeared, and a 52W High filter entry was visible. Seeing an RVOL column does not establish that an RVOL threshold was active. I am not reproducing the live quotes from that screen.
The actual two-chip observation came from a separate CN-market session. Through Add New Filter I added 52W High > 10 and then Volume > 1000000. Both condition chips were visible together, and the displayed candidate count narrowed. This establishes what the UI displayed at those moments. It is not a historical backtest, a frozen universe, or an inspection of the underlying data engine. The CN filter observation and US Overview column check must not be treated as one market snapshot.
When reviewing a multistep screen, I now check whether the first price chip remains, whether the second volume condition was added using the filter editor rather than a table menu, and whether the list was filtered instead of merely sorted.
That distinction was not hypothetical: during one review I clicked the sorting menu on the Volume column rather than the numeric filter control. Repeating the operation through Add New Filter showed both chips. Sorting changes row order; filtering changes which rows qualify. And when market scope or quote snapshots differ, even a smaller count does not prove that every resulting security is a subset of the earlier set.
There is another tempting shortcut I will not take. The fictional code uses “within 5% of the yearly high.” The observed UI field read 52W High > 10. Without verified units and field semantics, I cannot interpret that 10 as “within 10% of the high.” They are separate observations serving separate purposes.
After the list gets shorter
Even if S2 and S4 were real stocks, passing these two screens would not tell me to trade either of them. I would still ask whether today’s share volume is high relative to each stock’s own usual activity. Absolute share volume is only a coarse initial gate; comparable historical averages or RVOL help with the next question.
In general, RVOL compares current volume against an appropriate average. TradingView’s own documentation describes a method based on the previous ten periods, alongside a different comparison for the same time of day. This is a description of TradingView’s calculations, not a verified formula for the screener I inspected. I also cannot claim that an RVOL > 1.5 rule was used in this exercise.
Then comes price structure. Is the stock approaching an old high, breaking above it, or already retreating after a spike? Is there a nearby area of resistance? What about turnover value, order-book depth, spread, a possible stop, and position size? Two names satisfying identical first-pass conditions can require entirely different research.
The reproducible 6 → 4 → 2 result is a fictional illustration. The UI observation verifies visible filter chips and a change in the candidate summary, not a measured improvement in investment returns.
The sequence I want to keep is simple: narrow by price position, narrow again by trading activity, and spend the remaining time on decisions that still need human judgment. A screener may save me from opening hundreds of charts. It cannot make the final investment decision for me.
This article is for research and education, not investment advice.