This is some deepresearch I asked GPT to collect for me. I’m trying to figure out how to identify “in play” markets programmatically from a large pool of markets. I’m thinking IV rank and NATR might find markets that are moving or are likely to move.
Understanding ATR and IV Rank
Average True Range (ATR): ATR is a technical indicator that measures market volatility. It is calculated from the true range of price moves (accounting for daily highs, lows, and gaps) and typically averaged over 14 days (Average True Range (ATR) Stock Screener – ATR Strategy Backtest). A higher ATR value means the stock has larger price fluctuations on average, which traders often interpret as greater intraday volatility (Average True Range (ATR) Stock Screener – ATR Strategy Backtest). For example, a stock with an ATR of $2 tends to move about $2 per day on average, indicating potential for significant intraday price swings. Traders may favor stocks with high ATR to capture bigger moves (Average True Range (ATR) Stock Screener – ATR Strategy Backtest).
Implied Volatility Rank (IV Rank): IV Rank gauges current option-implied volatility relative to its range over the past year (Stock IV Rank and IV Percentile – Barchart.com). Essentially, it tells you if today’s implied volatility is high or low compared to the stock’s own 52-week history. An IV Rank of 100% means the current IV is at its highest level of the past year, while 0% means it’s at the lowest level (Stock IV Rank and IV Percentile – Barchart.com). High IV Rank suggests options prices are “expensive” (implied volatility is elevated), often because the market anticipates a big move (for instance, ahead of earnings or news) (Stock IV Rank and IV Percentile – Barchart.com). In practical terms, traders see elevated IV as the market expecting large future price movements (Stock IV Rank and IV Percentile – Barchart.com). A commonly used benchmark: IV Rank above ~50% is considered high relative volatility (options are expensive), whereas below 50% is low (Implied Volatility (IV) Rank & Percentile Explained | tastylive). For example, if a stock’s one-year IV range is 20%–70% and current IV is 60%, the IV Rank is 80% (high on the range) (Implied Volatility (IV) Rank & Percentile Explained | tastylive) (Implied Volatility (IV) Rank & Percentile Explained | tastylive). Combining high ATR and high IV Rank points to stocks that have been volatile and are expected to continue being volatile, ideal for strong intraday moves.
Using Stock Screeners Supporting ATR and IV Rank
1. Broker Platform Scanners (Thinkorswim, etc.): Many trading platforms allow custom scans for technical and volatility criteria. For instance, TD Ameritrade’s Thinkorswim (TOS) has a Stock Hacker scanner where you can add a study filter for ATR and another for implied volatility percentile (equivalent to IV Rank). TOS’s scanner is very flexible – traders note it’s “a beast for day trading” due to its ability to scan intraday and use custom indicators (What finviz filters should i use for screening? : r/RealDayTrading). How to set up on TOS: In the Scan tab, add a Study Filter for Average True Range (e.g. ATR(14) > X) and another study for IV Percentile (e.g. IV Percentile > Y%). You can also add stock volume filters. Running the scan will return stocks meeting both high ATR and high IV percentile criteria in real-time. Tip: TOS may not have a built-in “IV Rank” by name, but IV Percentile is available and serves a similar purpose (you could also script a custom IV Rank if needed (Scan for IV Rank? : r/thinkorswim – Reddit)).
2. Finviz (for ATR) plus Manual IV Rank Check: Finviz.com is a free stock screener that supports ATR filtering, although it doesn’t provide options data like IV Rank. On Finviz’s screener, under Technical filters, you can set “Average True Range” greater than a value (Finviz lets you filter stocks with ATR above or below a selected threshold (Stock Picking on Finviz: Technical Analysis for Traders)). For example, you might screen for ATR > 1 to find stocks moving more than $1 per day. Finviz will output a list of tickers meeting the ATR criterion (Stock Picking on Finviz: Technical Analysis for Traders). From there, you would need to identify which of these have high IV Rank. You could cross-reference those tickers on an options-focused site (such as Barchart or broker platform) to check their current IV Rank. This approach is somewhat manual, but Finviz is a quick way to narrow down a volatile-stock list using ATR. (Finviz also allows filtering by relative volatility measures like “Volatility % (Week/Month)” and even Beta for volatility, but not IV Rank.)
3. Barchart.com Screener/Lists: Barchart provides web tools and lists for options volatility. They have a dedicated IV Rank & Percentile page listing stocks with their current IV Rank and IV Percentile (Stock IV Rank and IV Percentile – Barchart.com). You can sort this list to find highest IV Rank stocks. While Barchart’s stock screener doesn’t directly include IV Rank as a filter in the free version, you can use their options screener or simply grab the high-IVRank names and then check their ATR. If you create a (free) account on Barchart, you can customize views or download data; for example, add ATR as a column in a custom view if available. This helps filter the high IV Rank list by ATR. Barchart’s data can show you, say, stocks with IV Rank > 90%, then you can cross-check ATR values (perhaps using another tool or by looking at the stock’s technicals). The site explicitly notes that elevated IV (high IV Rank) often precedes large price moves (Stock IV Rank and IV Percentile – Barchart.com), so combining that with a high ATR filter zeroes in on very volatile candidates.
4. Option-Specific Screeners (Option Samurai, Market Chameleon): Some specialized screeners geared toward options traders let you filter by both technical and volatility metrics in one place. Option Samurai (a paid service with free trial) is one such tool – it allows scanning for setups with criteria like “ATR greater than X and IV Rank above Y,” along with option liquidity filters (ATR Option Trading Strategies: Ultimate Guide for Trading Options with ATR – Option Samurai Blog). According to Option Samurai’s documentation, you can “limit results to have more than X amount of ATR and a high IV rank” (ATR Option Trading Strategies: Ultimate Guide for Trading Options with ATR – Option Samurai Blog), which is exactly what we need. These platforms often include additional filters (e.g. option volume, open interest, earnings date) and let you save custom screens. Market Chameleon is another site that offers volatility screens – for example, it has an Implied Volatility Rankings report (Option Implied Volatility Rankings Report – Market Chameleon) that shows stocks with elevated IV (organized by percentile rank). You might use such a report to find high-IV names and then apply an ATR filter elsewhere. Some of these advanced screeners are subscription-based, but they save time by providing IV metrics and stock volatility metrics together.
5. Other Screeners/Tools: If you have access to other platforms, look for anything that lets you combine technical filters (for ATR or volatility) with options data. For example, TradingView’s screener doesn’t natively support IV Rank, but creative users share PineScripts that compute IV metrics (Options SCREENER [Lite] – IVRank, IVx, Deltas, Exp.move, Skew) – still, implementing that for a broad scan is complex. Some brokerage scanners (Interactive Brokers, Schwab’s StreetSmart Edge) allow scanning for implied volatility or IV percentile as well. Interactive Brokers (IB) has a market scanner where you can filter for high implied volatility percent (though ATR filter may not be built-in – you might instead filter for high historical volatility or price range). Trade-Ideas is a stock scanner focusing on intraday moves; it can filter by volatility indicators (like range, gaps, etc.), but for IV Rank you’d likely integrate an external data feed. In summary, using a broker’s scanning tool (like TOS) or an options-oriented screener service is the most straightforward way to get both criteria in one search. Otherwise, using one screener for ATR and another for IV data (and cross-filtering results) is a workable alternative.
APIs for ATR and IV Rank Data
If you want to programmatically filter stocks, you’ll need data sources for both ATR and IV Rank (or the raw data to compute them).
- Stock Price Data for ATR: ATR can be calculated from standard price data (Open/High/Low/Close). Many free APIs provide historical price data. For example:
- Yahoo Finance API (unofficial) – using Python’s
yfinancelibrary, you can download daily OHLC data for stocks. ATR isn’t given directly, but you can compute it easily from the data. - Alpha Vantage – offers a free API (with API key) that even has a built-in technical indicator endpoint for ATR. You can request ATR values over a time series for a given symbol and time period (Vantagex.TechnicalIndicators – HexDocs).
- Finnhub – provides financial data via API; it has endpoints for technical indicators as well (ATR, historical candles) and also option chain data. Finnhub’s free tier is limited, but ATR calculations would be straightforward after pulling daily candles.
- Polygon.io, Tiingo, TwelveData – these are other data providers (Polygon and Tiingo have free tiers/trials) where you can get daily price data. Polygon even provides aggregate indicators for volatility (e.g., historical volatility) but not a direct “ATR of last 14 days” – you’d calculate that client-side.
- Yahoo Finance API (unofficial) – using Python’s
- Implied Volatility / IV Rank Data: IV Rank is not as readily available from free APIs. It usually requires options data or a specialized data source:
- Broker/Platform APIs: Some broker APIs might expose implied volatility metrics. For instance, the TD Ameritrade API can retrieve option chains for a stock (giving implied volatilities for each option contract), though it doesn’t directly return “IV Rank.” Interactive Brokers API can stream implied vol for options or provide historical IV via their volatility feed, but you would still need to derive the rank from history. If you already use Thinkorswim, note that exporting or using its data in Python is non-trivial (TOS doesn’t have a simple external API for scanning results).
- Free/Public Options Data: Yahoo Finance (via
yfinance) can fetch option chains including animpliedVolatilityfield for each strike. While this gives the current IVs (for various strikes/expirations), you would need to decide on a representative IV metric (e.g. ATM IV for nearest expiry or a 30-day IV) to use for comparison. To get IV Rank, you’d have to gather this IV metric over the past year to find its min/max. That means regularly storing historical implied vol data, since Yahoo won’t give you a “52-week high IV” directly. - Paid Data Services: There are data providers that specialize in options metrics. Barchart’s API (subscription) can provide implied volatility data and possibly IV Percentile/Rank for symbols. Quandl (Nasdaq Data Link) had a historical options volatility dataset (IV values, IV percentiles) at around $100/month (IV Rank data in Python : r/algotrading). Services like iVolatility, OptionMetrics, or ORATS offer comprehensive options data (including implied volatilities and calculations like IV rank), but these are generally paid services aimed at advanced traders or institutions. If you’re open to paid options, these services can save you the effort of manual calculation. (One user noted that Quandl’s volatility data was end-of-day only, updated after market close (IV Rank data in Python : r/algotrading). If you need intraday updates to IV Rank, a real-time feed or broker platform is required.)
- Alternative Approach – Compute IV Rank Yourself: If you prefer a DIY route and have access to option price data, you can calculate IV rank. Choose a specific IV measure (for example, 30-day at-the-money IV). Each day, record that IV. After 252 trading days, you’ll have a year’s history; compute the 52-week high and low of that IV. Then for the current IV:
IV_Rank = (Current IV – 52-week low IV) / (52-week high IV – 52-week low IV) * 100%.
This gives the percentile rank of current IV between the year’s extremes (Stock IV Rank and IV Percentile – Barchart.com). You can update this daily or weekly. Keep in mind that implied vol can change quickly, so if you calculate IV Rank from yesterday’s data, it may lag intraday changes (IV Rank data in Python : r/algotrading). But for most swing-trading or overnight scans, end-of-day IV Rank is sufficient.
Key point: Accessing real-time IV Rank for free is difficult – typically you either use a broker’s scanning tool or pay for data (IV Rank data in Python : r/algotrading). A compromise is to use free data to calculate it yourself with some coding, as described, though it requires maintaining historical data.
Python-Based Solution Outline
Using Python, you can create your own screener to filter stocks by ATR and IV Rank. Here’s a high-level step-by-step approach:
- Define Universe of Stocks: Decide what set of stocks you want to scan. Common choices are stocks in a major index (S&P 500, Nasdaq 100, etc.), or all optionable stocks above certain volume/market-cap. You might start with a list of tickers from an index or use an API to get all tickers that have options. For example, use
yfinanceor an exchange listing to get tickers. - Fetch Price Data & Compute ATR: For each stock, get historical price data (at least the past 20–60 days to calculate a 14-day ATR, or 1 year if you plan to compute normalized ATR% over a year). Using a library like pandas_ta or TA-Lib in Python makes calculating ATR easy – e.g.,
pandas_ta.atr(high, low, close, length=14)will add an ATR column. Calculate the latest ATR value. You may also compute a normalized ATR (ATR as a percentage of current price) to compare volatility relative to stock price (Normalized Average True Range (NATR) Stock Screener). This helps set a uniform threshold (e.g. ATR > 5% of price). - Fetch Current IV and Historical IV Data: For each stock, you’ll need at least two things – the current implied volatility (or something analogous) and the historical extremes of that volatility to gauge IV Rank. A simple method: use
yfinanceto get the option chain for the nearest expiration and find an at-the-money option’s implied volatility. For example:import yfinance as yfticker = yf.Ticker("XYZ")chain = ticker.option_chain(ticker.options[0])# first expirationcalls = chain.callsatm_call = calls.iloc[(calls['strike'] - current_price).abs().argsort()[:1]]current_iv = float(atm_call['impliedVolatility'])
This yields an approximate current IV for the stock (ATM IV). Next, to get IV Rank, you need the 52-week high and low of such IV. You could retrieve options data at regular intervals (say weekly or monthly) for the past year and store the highest and lowest IV. If you haven’t collected historical IV, another approach is to use a historical volatility percentile as a proxy: for instance, compare the stock’s current IV to its historical volatility (realized volatility). (Some traders use 20-day historical volatility as a stand-in to gauge if implied vol is unusually high relative to recent realized vol (ATR Implied Volatility Chart Aptargroup – Market Chameleon), though this isn’t the same as IV Rank). Ideally, use actual IV history for accuracy. - Apply Thresholds: With ATR and IV Rank (or current IV vs. range) in hand, filter the list. For example, select stocks where:
ATR > 1(orNormalized ATR > 3%of price) – choose a level that signifies high volatility. If you prefer relative measure, an ATR >, say, 4% of the stock’s price is quite volatile; in absolute terms, some day traders use ATR > $0.50 or $1 as a cutoff for intraday trading (What finviz filters should i use for screening? : r/RealDayTrading).IV_Rank > 50%(or > 70% for a stricter filter) – this ensures current implied vol is on the higher end of its yearly range, meaning options market expects continued big moves. Often, IV Rank above 50% is considered “elevated” (Implied Volatility (IV) Rank & Percentile Explained | tastylive), and above 80–90% would be “extremely high”. You might start with a threshold around 50–60% to get a reasonable list, then tighten it to the top percentile if needed.- Liquidity filters: Also enforce
AvgVolume > X(e.g. 1,000,000 shares) orMarketCap > Y(to exclude micro-caps). High ATR + high IV can occur in tiny stocks, but those may be too illiquid or risky. It’s wise to require a robust trading volume. For instance, one suggestion is using average volume over 1M shares as a starting filter for day trading stocks (What finviz filters should i use for screening? : r/RealDayTrading). This ensures the stocks are liquid enough to enter/exit and that the options (if trading options) have decent open interest. You can fetch average volume or use the latest volume as a proxy (many APIs provide a 10-day or 30-day average volume).
- Review and Output Results: The final list from your Python script will be stocks that meet both conditions (plus any additional filters). You might output them with their ATR, ATR%, and IV Rank values for comparison. Ensure to double-check special cases – e.g., if a stock has high ATR but no options (no IV Rank available), it should be excluded. Typically, restricting to “optionable stocks” or using an existing list like the S&P500 inherently means each has options and thus an IV Rank.
Additional tips: You can refine the results further by adding criteria such as price range (e.g. ignore stocks under $5 to avoid penny stocks) or sector (if you want to diversify). It’s also useful to run the screener regularly since the set of high ATR & high IV Rank stocks can change as volatility regimes shift (earnings season, market news, etc.). Some traders will update their scans daily or weekly. If using a Python approach, consider scheduling your script to run after market close each day, so you have an updated list for the next trading day.
Setting Thresholds for “High” ATR and IV Rank
Choosing the right cut-off values for “high” depends on how many candidates you want and your risk tolerance. Here are some guidelines:
- ATR Threshold: If using absolute ATR, many day traders prefer stocks with ATR above $0.50–$1.00. Stocks moving less than 25 cents a day aren’t usually attractive for intraday trading (What finviz filters should i use for screening? : r/RealDayTrading). An ATR above $1 (especially if the stock is not extremely expensive) indicates good intraday movement. If you use Normalized ATR (ATR/price), you might set ATR > 3% of price as a benchmark for high volatility. For example, a $100 stock with ATR 3 (3%) or a $20 stock with ATR 0.6 (3%) have comparable volatility relative to their price. You can adjust this – 5% would be very high volatility for most established stocks. It’s often useful to experiment: start with a modest threshold to get a broad list, then raise it to focus on the top volatility tier. Also, consider using a 14-day ATR (standard) – too short a period might capture only a temporary spike, too long might smooth out recent volatility.
- IV Rank Threshold: Common practice is to consider IV Rank > 50% as “high IV” environment (Implied Volatility (IV) Rank & Percentile Explained | tastylive), since implied volatility is greater than half its range over the year. For truly exceptional volatility, you might look for IV Rank > 80% or even > 90% (meaning the stock’s current implied vol is in the top 10–20% of its yearly range). These often coincide with upcoming events or market stress. If you’re scanning for intraday opportunities, IV Rank >= 50–60% is a reasonable starting filter to find stocks with elevated expectations of movement. You can always tighten it to focus on the highest IV Rank names if the initial list is too long. Keep in mind that IV Rank by itself doesn’t tell the absolute level of IV – a low-vol stock could have an IV jump from 5% to 10% (doubling) and get a high IV Rank, but 10% IV is still low in absolute terms. So you might combine IV Rank with an absolute IV level or price movement filter. In practice, if ATR is high, the absolute volatility is already there.
- Liquidity and Other Filters: As mentioned, ensure volume is sufficient – e.g., average volume > 1 million shares (What finviz filters should i use for screening? : r/RealDayTrading). High IV often comes with high option volume, but not always, so checking stock volume and optionally option open interest is wise. You could also require market cap above a certain level (to exclude very small companies). These filters help avoid situations where a stock’s ATR is high but it’s hard to trade or the spreads are wide. You may also exclude leveraged ETFs or products unless you intentionally want those (they can have high ATR/IV but behave differently than single stocks).
Step-by-Step Implementation Summary
Bringing it all together, here’s a condensed step-by-step guide to set up a screening tool for high ATR & high IV Rank stocks:
- Determine Criteria: Decide what “high ATR” and “high IV Rank” mean for you. For example: ATR(14) > 1.0 (or > 4% of stock price) and IV Rank > 50%. Also decide on additional filters like Average Volume > 1M, Price > $10, Market Cap > $500M, etc., to ensure quality of results.
- Choose a Screening Method: You have two main approaches: using an existing screener or building your own.
- If using an existing stock screener: Set the ATR filter to your threshold. For instance, on Finviz select Technical -> Average True Range -> Over 1 to get stocks with ATR > $1 (Stock Picking on Finviz: Technical Analysis for Traders). Then, take that list and find which ones have IV Rank above 50% (using a resource like Barchart’s IV Rank list or a broker platform). Alternatively, use a platform like Thinkorswim’s scanner to input both conditions directly and scan the market. On TOS, add “IV Percentile” filter > 50 and “ATR” filter > 1; plus add “Average Volume” > 1000000, then run the scan in “All Stocks” or your chosen list – the result will directly give you matching tickers.
- If using a programmatic/Python approach: Write a script to retrieve data and filter it. Use APIs to get stock data (for ATR) and either an API or stored data for IV. Compute the metrics and apply the criteria in code. This approach is more involved but allows full customization and automation.
- Set Up Data Retrieval: For a coding solution, set up your data sources: e.g., use
yfinanceto download 1-year of daily data for each stock (for ATR calculation and maybe to compute realized volatility). For IV, decide if you will use an API or your own historical calculations. If using a paid API (like Barchart), integrate its endpoint to fetch IV Rank or implied vol data directly. If calculating manually, use the method described earlier to get current IV and track history. - Calculate Indicators: Compute ATR from price data (most libraries will do this in one line once data is loaded). Fetch or calculate the current IV Rank. If you can’t get IV Rank directly, compute it from historical IV data or use IV Percentile if available. Ensure your calculations align with your definitions (14-day ATR, 52-week IV Rank, etc.).
- Apply Filters and Generate List: Filter out stocks that don’t meet the thresholds you set. Also filter out anything missing data (e.g., no options = no IV Rank). The outcome is a list of tickers (and you may include their ATR and IV stats for your reference).
- Incorporate Quality Checks: From the filtered list, make sure each candidate has adequate liquidity. If your initial criteria included volume and market cap, you’ve likely handled this. It’s a good practice to quickly sanity-check the results – e.g., ensure they truly have high volatility. At times, a stock might have a high ATR due to a one-off event; you may want to double-check news or whether the volatility is ongoing. Similarly, extremely high IV Rank might occur right before an earnings release – which might be exactly what you want, but be aware such IV will drop right after the event.
- Utilize the Results: You can now focus your intraday trading on these candidates. High ATR stocks tend to have wider intraday ranges to profit from, and high IV Rank suggests that options strategies (like selling premium) might be viable if that’s of interest – though as a day trader you might just use the volatility indication to trade the stock or use options for short-term plays.
- Repeat and Refine: Volatile stocks can change, so update your screen regularly. You might schedule your Python script to run daily after market close, or simply revisit your screener settings on your platform each day. Refine thresholds as needed – for example, if you consistently get too many results, raise the bar (ATR > 2, IV Rank > 70%). If you get too few, consider lowering slightly or expanding your universe.
By following these steps, you set up a robust screening process to identify stocks with both high ATR and high IV Rank, providing a focused watchlist of instruments likely to experience strong intraday moves. This saves you from scanning hundreds of tickers manually and ensures you’re looking at the most volatile opportunities the market is offering. Always remember to manage risk: high volatility stocks can yield big moves in your favor and against you, so plan position sizes and stops accordingly (ATR can even help inform stop-loss distances (Average True Range (ATR) Stock Screener – ATR Strategy Backtest)).
Sources: High ATR definition and usage (Average True Range (ATR) Stock Screener – ATR Strategy Backtest); Finviz ATR filter (Stock Picking on Finviz: Technical Analysis for Traders); trader ATR threshold example (What finviz filters should i use for screening? : r/RealDayTrading); IV Rank definition and usage (Stock IV Rank and IV Percentile – Barchart.com) (Stock IV Rank and IV Percentile – Barchart.com); Tastytrade on IV Rank > 50% (Implied Volatility (IV) Rank & Percentile Explained | tastylive); Option Samurai on scanning ATR + IV Rank (ATR Option Trading Strategies: Ultimate Guide for Trading Options with ATR – Option Samurai Blog); Volume/liquidity considerations (What finviz filters should i use for screening? : r/RealDayTrading); difficulty of obtaining IV Rank data via API (IV Rank data in Python : r/algotrading).




Leave a comment