Stock volatility screening
Low-Volatility Stock Screener: Comparable Risk Measures
A low volatility stock screener needs separate checks for ATR% and return volatility. Use the same daily timeframe and sample length, exclude illiquid stocks, then inspect overnight gaps. A quiet price history is not a limit on future losses.
Choose the measure before setting a threshold
ATR is a price range, while return volatility is a standard deviation. Dividing ATR by price permits percentage comparisons; it does not turn ATR into return volatility. Neither measure describes direction or caps the size of a loss.
| Field | Calculation | Use | Limit |
|---|---|---|---|
| ATR 14 % | 100 × Wilder ATR(14) / current close | Compare trading ranges across different share prices. | Includes observed gaps but does not predict the next gap. Requires a positive close and a warmed-up ATR. |
| Historical Volatility 20 | 100 × standard deviation of 20 log returns | Compare daily return dispersion on the same daily timeframe. | Pineify reports per-bar, not annualized, values. Twenty returns need at least 21 valid closes. |
| Historical Volatility 60 | Return dispersion over a longer, 60-bar window | Check whether a quiet recent month differs from the longer sample. | A longer window reacts more slowly. Do not compare a 20-bar value for one stock with a 60-bar value for another. |
| Bollinger Bandwidth | Band separation relative to the middle band | Review price compression alongside ATR% and return volatility. | A narrow band does not reveal breakout direction, institutional activity, or the timing of expansion. |
TradingView's generic Screener Volatility fields use their own range formulas. Do not substitute a field labeled Volatility for ATR% or historical return volatility without checking its definition.
Worked example: four stocks, two volatility tests
These are hypothetical daily observations for USD-listed common stocks, not recommendations or live quotes. The example requires price at least $10, 20-day average volume at least 500,000 shares, ATR(14) no more than 1.5% of close, and daily HV20 no more than 1.0%. Each threshold is inclusive and illustrative; choose limits for your market and intended order size.
| Stock | Close | ATR(14) | ATR% | Daily HV20 | Average shares/day | Decision |
|---|---|---|---|---|---|---|
| A | $50.00 | $0.50 | 1.00% | 0.80% | 1,200,000 | Keep for review |
| B | $10.00 | $0.20 | 2.00% | 0.70% | 2,000,000 | Reject: ATR% |
| C | $100.00 | $0.80 | 0.80% | 1.10% | 900,000 | Reject: return volatility |
| D | $20.00 | $0.10 | 0.50% | 0.30% | 20,000 | Reject: liquidity |
Normalize the range
Stock B has a smaller dollar ATR than A, but 100 × $0.20 / $10 = 2.00%, versus 100 × $0.50 / $50 = 1.00%. B fails the ATR% test even though its return volatility passes.
Keep the return sample explicit
For a reproducible HV20 example, take ten daily log returns of +0.008 and ten of −0.008. Their mean is zero; population standard deviation is √(20 × 0.008² / 20) = 0.008, so daily HV20 is 0.80%. Using a sample denominator of 19 would instead give about 0.821%.
With an explicit 252-trading-day convention, 0.80% × √252 ≈ 12.70% annualized. Do not compare that annualized value with Pineify's 0.80% daily field. The square-root convention is a scaling assumption, not a forecast.
Low measured volatility can still precede a 10% gap
Suppose stock A closes at $50 with ATR(14) of $0.50 and daily HV20 of 0.80%. After unexpected news, its next open is $45, with a high of $45.50 and a low of $44.50. The opening loss is ($45 / $50 − 1) × 100 = −10%, despite passing yesterday's screen.
That session's true range is max($1.00, $4.50, $5.50) = $5.50, because true range includes distance from the previous close. Assuming a warmed-up Wilder ATR, the next ATR(14) is (13 × $0.50 + $5.50) / 14 ≈ $0.8571. If the session closes at $45, ATR% becomes about 1.90%. The risk measure rises after the event.
A sell stop at $49 does not guarantee a $49 fill when the market opens at $45. A stop-limit order can remain unfilled instead. Review earnings dates, spreads, position size, and concentration separately from historical volatility.
Build and audit the review list in Pineify
- Choose a defined stock universe, exchange, and quote currency. Confirm symbol mappings and market coverage rather than assuming every listed stock is included.
- Set the collection to 1D and check every row's timeframe. Add Close Price, Volume SMA 20, ATR 14 %, Historical Volatility 20, and, if useful, Historical Volatility 60.
- Sort a volatility column ascending, then apply the separate price, liquidity, and second-volatility checks to each candidate. The table supplies sortable fields; it does not make this example a saved, automatic compound filter.
- Use the displayed Updated time to check when the snapshot was fetched. The active visible collection has a 60-second refresh schedule, which does not guarantee exchange data latency or a completed daily candle. Compare completed daily bars for a stable end-of-day screen.
- Reject missing or insufficient-history readings rather than treating them as zero. Check for recent listings, missing bars, splits, and inconsistent price adjustments. Require at least 21 closes for HV20 and 61 for HV60; ATR also needs adequate warm-up history.
- Open each shortlisted symbol in TradingView. Match the exchange, session, daily timeframe, and indicator settings; inspect gaps and spreads. Average share volume is only a liquidity proxy, so also consider price × average volume and your order size.
For a custom conjunction, a different lookback, or closed-bar-only output that the public fields do not provide, describe the rule to the Pine Script AI Coding Agent. Ask for a finite-symbol TradingView script, review the generated calculations, and test its data requests and missing-data behavior. A script has request limits and is not an unrestricted whole-market scan.
Frequently asked questions
What does a low volatility stock screener measure?
It ranks or selects stocks by a defined measure of past price variation. ATR% measures true range relative to price; historical return volatility measures dispersion of returns. Fix the market, daily timeframe, lookback, and liquidity requirements before comparing stocks.
Is Pineify Historical Volatility 20 annualized?
No. The Market Screener field reports per-bar standard deviation of 20 log returns as a percentage. On a daily timeframe it is daily return volatility. A daily reading of 0.8% becomes about 12.70% only if you explicitly apply the square-root-of-252 annualization convention; the screener field itself stays 0.8%.
Does low ATR% mean a stock is safe?
No. Low ATR% describes recent trading ranges. Earnings, financing problems, market closures, and thin liquidity can produce a gap much larger than those ranges. A stop order does not guarantee execution at the stop price.
Can the same screener find high volatility stocks?
Yes. Sort the same ATR% or historical volatility column in descending order while keeping the universe, timeframe, and sample length unchanged. High measured volatility does not establish a trade direction or imply that options are overpriced.
Why can a quiet-looking stock fail the liquidity check?
A rarely traded stock may have repeated closing prices and a low calculated return standard deviation while its spread is wide. Review average volume, available quotes, and missing bars before treating a low reading as useful evidence.
Definitions and source checks
- TradingView: ATR and true range
- TradingView: historical volatility
- TradingView: Screener Volatility field formulas
- SEC Investor.gov: stop and stop-limit order risks
- TradingView: Pine Script data request limits
Definitions and Pineify field behavior checked October 20, 2026. Examples are hypothetical and educational, not investment advice. Historical volatility does not guarantee future losses, gains, or execution prices.