Choppiness index filter: what 38.2 and 61.8 tell you, what they miss
The choppiness index labels the last 14 bars as trending (below 38.2) or ranging (above 61.8), but it only confirms a regime after it has started. Use it as a permission filter on a trend rule, never as a signal on its own, and test the lookback and thresholds as a region of neighbouring values.
By Soren Huang · Published · updated · Editorial policy
Contents
- Can the choppiness index tell a trending market from a ranging one?
- How is the choppiness index calculated, and why does it run from 0 to 100?
- How do you read CHOP, and which value means ranging?
- How is the choppiness index different from ADX?
- How do you use the choppiness index to filter a trend rule?
- How much lag does CHOP have, and how sensitive is the 14-bar setting?
- What did a Choppiness Index rule do on NQ daily bars?
- Frequently asked questions
- References
Can the choppiness index tell a trending market from a ranging one?
The choppiness index can tell a trending stretch from a ranging one, but only after the fact: it reads the last 14 bars and labels them, so it confirms a regime several bars after it began. That makes it a useful permission filter on a trend rule and a poor stand-alone signal. Test it as a filter, with its thresholds as a region.
The choppiness index (CHOP) is an indicator that measures how much of the price travel inside a lookback window went sideways rather than in one direction, on a scale from 0 to 100. Think of a delivery van's odometer against the straight-line distance from depot to customer. If the van drove 50 kilometres to deliver 45 kilometres away, the trip was efficient: that is a trend. If it drove 50 kilometres and ended up 5 kilometres from the depot, it spent the day circling: that is a range. CHOP is the odometer divided by the straight-line distance, squeezed onto a fixed scale.
The odometer only tells you about the trip already driven. In the same way, CHOP describes bars that have closed. It is accurate about the past and late about the present. That is why CHOP earns its place as a gate on another rule, not as the rule itself.
How is the choppiness index calculated, and why does it run from 0 to 100?
CHOP compares the total bar-by-bar movement over 14 bars with the net distance those 14 bars covered, and a logarithm pins the result between 0 and 100. The formula behind it:
CHOP = 100 × log(sum of true ranges over n bars ÷ (highest high − lowest low over n bars)) ÷ log(n)
Here n is the lookback, 14 by default. The true range of a bar is its high minus its low, extended to include any gap from the previous close; it is the same building block as the ATR. Highest high minus lowest low is the total span of the window. The ratio inside the log is the odometer divided by the straight-line distance. When every bar moves in the same direction, the sum of true ranges is only a little larger than the span, the ratio is near 1, and the log of 1 is 0, so CHOP sits near 0. When bars zigzag inside a box, the sum of true ranges can approach n times the span; the log of n divided by the log of n is 1, so CHOP approaches 100. Dividing by log(n) is what keeps the scale the same whether the lookback is 7 or 28.
Hypothetical example
Fourteen bars with a true range of 20 points each give a sum of 280 points. In a trending stretch the window spans 250 points from lowest low to highest high: 280 ÷ 250 = 1.12, log of 1.12 is about 0.05, divided by log of 14 (about 1.15) gives about 0.04, so CHOP is about 4. In a ranging stretch the same 280 points of travel span only 40 points: 280 ÷ 40 = 7, log of 7 is about 0.85, divided by 1.15 gives about 0.74, so CHOP is about 74. Same total movement, very different reading.
How do you read CHOP, and which value means ranging?
A CHOP value above 61.8 means the market has been ranging, a value below 38.2 means it has been trending, and the band between them is undecided. The two levels are the same ratios traders draw as retracement levels, and the reasoning behind them is covered in how to draw, use and backtest a Fibonacci retracement. For a filter, their origin matters less than one fact: they are default levels, not measured ones, so you will test neighbours later.
| CHOP zone | What the window looked like | What a trend filter does |
|---|---|---|
| Below 38.2 | Price travelled mostly in one direction | Trend rule is allowed to enter |
| 38.2 to 61.8 | Mixed: a slow drift or a range that is loosening | The rule must state in advance whether this zone allows entries |
| Above 61.8 | Price travelled a lot but went nowhere | Trend entries blocked |
The middle zone is where most of the decision lives, because many bars land there. A rule that says only "block above 61.8" lets the whole middle through; a rule that says only "allow below 38.2" blocks it. Both are valid rules, but they are different rules, and a backtest of one says nothing about the other. Write down which one you are testing before the first run.
How is the choppiness index different from ADX?
CHOP measures how inefficient the price path was and reads a trend as a low value; ADX measures the strength of directional movement and reads a trend as a high value. The ADX (average directional index) is Wilder's (1978) smoothed ratio of upward to downward directional movement, and like CHOP it carries no direction of its own. The two usually agree on a strong, clean trend. They often disagree on a slow drift: a market that creeps higher with small bars and few pullbacks gives CHOP a low value, because the path was efficient, while ADX may stay modest, because the directional moves were small. Both belong to the same family of tools described in which technical analysis tools and indicators you can actually test, and neither replaces the other.
| Property | CHOP | ADX |
|---|---|---|
| What it measures | How sideways the price path was | Strength of directional movement |
| Scale | Bounded 0 to 100 by its log formula | Bounded 0 to 100 because DX is a ratio of directional moves |
| Direction | None | None |
| Reads a trend as | Low value | High value |
| Reacts to a new trend | Delayed by its lookback window | Delayed by its smoothing; which turns first is measured in the lag test, not assumed |
| Typical filter use | Block entries above 61.8 | Allow entries above a level such as 25 |
On a chart the difference is easy to see at a breakout. As the first trending bars enter the window, CHOP falls from the ranging zone toward 38.2 while ADX climbs from a low level toward 25. Which line gets to its threshold first depends on the lookback and smoothing you chose, so measure it on your own data instead of assuming it.
How do you use the choppiness index to filter a trend rule?
Attach CHOP as a permission layer to a trend rule you already have, allow entries only when CHOP is below a chosen level, leave the exit rule alone, and judge the filtered run against the unfiltered one on trade count, average trade after costs and drawdown. Net profit alone misleads here, because a filter almost always removes trades, and fewer trades usually means less total profit even when each trade got better.
- Run the trend rule alone. Record the number of trades, the average trade after commission and slippage, and the maximum drawdown.
- Add the condition. Entry is permitted only when CHOP at the signal bar is below the chosen level. Exits do not change.
- Run again with identical settings. Same costs, same session, same next-bar execution.
- Compare the two runs. Fewer trades, a higher average trade and a smaller drawdown together mean the filter removed bad trades. Fewer trades with the same average trade means it removed trades at random.
- Repeat with neighbours. Levels 35, 40 and 45, lookbacks 10, 14 and 20. If only one pair looks good, you found a point, not a region.
Hypothetical example
Unfiltered breakout rule: 300 trades, average trade after costs $40, net $12,000, max drawdown $12,000. With "enter only when CHOP is below 45": 170 trades, average trade $65, net $11,050, max drawdown $8,500. Net profit fell, yet the filter earned its place: each trade is worth more and the worst stretch is a third shallower. A rule judged on net profit alone would have rejected it.
Steps 3 and 4 only mean something when both runs pay the same costs; when you compare the two in AlphaPrime (Valynox), the backtesting charges every candidate the same fees, slippage and next-bar fills, so the gap between the filtered and unfiltered results is the filter and nothing else. The same five steps work for any permission layer. A volatility-based gate such as the one tested in a KAMA range filter for intrabar scalping goes through the identical comparison, and so does a positioning gate built from the Commitment of Traders report tested as a rule.
How much lag does CHOP have, and how sensitive is the 14-bar setting?
CHOP crosses 38.2 only after a trend has occupied a good share of its window, so with a 14-bar lookback the first permitted entry comes several bars after the breakout bar, and changing the lookback moves both that delay and the share of bars that count as trending. The reason is mechanical: the sum of true ranges and the window span both include every bar in the window, so one breakout bar among 13 ranging bars barely moves the ratio. A shorter lookback turns earlier but flips back more often inside a range; a longer one is steadier and later. There is no free setting, only a trade between speed and false permissions.
| Lookback | First cross below 38.2 after a breakout | False crosses inside a range | Share of bars labelled trending |
|---|---|---|---|
| 7 | Earliest | Most | Largest |
| 14 | Middle | Middle | Middle |
| 28 | Latest | Fewest | Smallest |
Because lookback and threshold pull against each other, test them together as a grid and look for a plateau: a block of neighbouring settings whose results all look alike. Pardo (2008) describes this as the difference between a robust parameter region and an isolated peak that describes one stretch of history. A CHOP filter that works at lookback 14 with level 40 but not at 12 with 40 or 14 with 45 is a peak. Record the pass count you require across the grid before you run it, so the decision is not made by feel afterwards.
What did a Choppiness Index rule do on NQ daily bars?
A stand-in rule that used CHOP as its only entry and exit, with no stop, no target and no other filter, is one candidate kept after the fact out of 1,024 the search tried on NQ daily bars, and its numbers show how the indicator behaves on that data rather than what it earns. The run tested a Choppiness Index rule alone on E-mini Nasdaq-100 daily bars from 2019-01-02 to 2025-06-30, long and short, one contract, with $20 commission and $10 slippage per trade. It did not test the filter use this article is about. AlphaPrime kept this candidate out of the 1,024 for its return against its drawdown, and picking the survivor after the fact flatters it: Bailey et al. (2014) show that the best result from a large search is inflated by the search itself. Nothing here says the indicator earned that money or that a reader can expect it.
Source: AlphaPrime product engine (CPU), run 2026-10-31. NQ daily bars, 2019-01-02 to 2025-06-30, long and short, 1 contract, $20 commission and $10 slippage per trade.
| Number | Result |
|---|---|
| Net profit (closed trades) | $221,050 |
| Max drawdown | $75,190 |
| Trades | 45 |
| Win rate | 64.44% |
| Profit factor | 2.354 |
| Average trade | $4,912.22 |
| Time in market | 56.75% |
Two numbers in the box deserve the most attention. First, 45 trades across six and a half years is a small sample; a per-trade average built from 45 trades can move a long way if a handful of trades change, as the uncertainty formula in the in-sample article shows. Second, the max drawdown of $75,190 sits against a net profit of $221,050: roughly a third of the whole result was given back in the worst stretch, on a single contract, with no stop. That is the cost of a rule with only a lookback and a threshold to protect it.


The useful next step is the grid from the previous section. Rerun this stand-in rule with lookbacks 10, 14 and 20 and thresholds 35, 40 and 45 on the same NQ daily data, with the same costs, and lay the nine results side by side. If most of the grid looks like the kept candidate, the indicator describes something stable on daily NQ bars and is worth attaching as a permission layer to a breakout rule you already trust. If only the kept pair looks good, you have found a point, and the filter test should start from a different level.
Frequently asked questions
How do you read the choppiness index?
Read it against two levels. A CHOP value below 38.2 means the last 14 bars travelled mostly in one direction, so the market has been trending. A value above 61.8 means price moved a lot but ended near where it started, so the market has been ranging. The band between 38.2 and 61.8 is undecided, and a rule that uses CHOP must say in advance what it does there.
What CHOP value means the market is ranging?
By the default thresholds, CHOP above 61.8 means ranging. The value rises when the sum of bar-by-bar true ranges is many times larger than the window's net high-to-low span, which is what a zigzag inside a box produces. The level is a default, not a measured fact about your market, so test 55, 60 and 65 as well before you rely on it.
Can I use the choppiness index instead of ADX?
They measure different things, so one does not replace the other. CHOP measures how inefficient the price path was and reads a trend as a low value; ADX measures the strength of directional movement and reads a trend as a high value. They tend to agree on strong trends and disagree on slow drifts. If you want to know which one turns first on your data, measure it in a lag test rather than assuming it.
Can the choppiness index be a trading strategy on its own?
It can be coded as one, and the NQ daily run in this article did exactly that as a stand-in, but it is a weak design. CHOP only confirms a regime after the regime has filled its lookback window, so an entry taken on a CHOP cross arrives late and an exit on the opposite cross arrives late too. Its stronger use is as a permission layer: a breakout or trend rule provides the entry and exit, and CHOP decides whether that entry is allowed.
References
- Wilder, J. W. (1978). New Concepts in Technical Trading Systems. Trend Research.
- Pardo, R. (2008). The Evaluation and Optimization of Trading Strategies (2nd ed.). John Wiley & Sons.
- Bailey, D. H., Borwein, J., López de Prado, M., & Zhu, Q. J. (2014). Pseudo-Mathematics and Financial Charlatanism: The Effects of Backtest Overfitting on Out-of-Sample Performance. Notices of the American Mathematical Society, 61(5), 458–471.

