VALYNOXSTRATEGY RESEARCH TECHNOLOGY
AlphaPrimeAlphaPrime
ACADEMY / Indicators and signals

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 · Published · updated · Editorial policy

Contents
  1. Can the choppiness index tell a trending market from a ranging one?
  2. How is the choppiness index calculated, and why does it run from 0 to 100?
  3. How do you read CHOP, and which value means ranging?
  4. How is the choppiness index different from ADX?
  5. How do you use the choppiness index to filter a trend rule?
  6. How much lag does CHOP have, and how sensitive is the 14-bar setting?
  7. What did a Choppiness Index rule do on NQ daily bars?
  8. Frequently asked questions
  9. References

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.

Two hypothetical 14-bar windows with the same bar-by-bar travel. In the trending one the span is almost as long as the travel, so CHOP reads about 4. In the ranging one the span is a small part of the travel, so CHOP reads about 74. Same travel, different span 14 bars each, hypothetical Trending CHOP ≈ 4 Travel Span Ranging CHOP ≈ 74 Travel Span Big travel, small span: high CHOP. So: CHOP grades the path taken.
Why a trend reads low and a range reads high: the bar-by-bar travel is compared with the net distance covered over the same window.

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 zoneWhat the window looked likeWhat a trend filter does
Below 38.2Price travelled mostly in one directionTrend rule is allowed to enter
38.2 to 61.8Mixed: a slow drift or a range that is looseningThe rule must state in advance whether this zone allows entries
Above 61.8Price travelled a lot but went nowhereTrend 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.

The three zones of the CHOP scale. Above 61.8 the market is ranging and trend entries are blocked. Between 38.2 and 61.8 it is undecided and the rule must say what to do. Below 38.2 it is trending and entries are allowed. A CHOP line moves down through all three zones. The middle zone needs a rule Default levels: 38.2 and 61.8 61.8–100 38.2–61.8 0–38.2 Ranging Entries blocked Undecided Rule must say Trending Entries allowed CHOP Many bars land in the middle. So: decide its rule before testing.
The three zones of the CHOP scale and what a trend filter does in each. The middle zone needs a written rule.

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.

PropertyCHOPADX
What it measuresHow sideways the price path wasStrength of directional movement
ScaleBounded 0 to 100 by its log formulaBounded 0 to 100 because DX is a ratio of directional moves
DirectionNoneNone
Reads a trend asLow valueHigh value
Reacts to a new trendDelayed by its lookback windowDelayed by its smoothing; which turns first is measured in the lag test, not assumed
Typical filter useBlock entries above 61.8Allow entries above a level such as 25
Two scales from low to high: CHOP places a trend at the low end, below 38.2, while ADX places the same trend at the high end, above 25, so the two indicators read one trend from opposite ends. Same trend, opposite reading Where a trend sits on each scale CHOP Trend ADX Trend Low High They measure different things. So: never swap one for the other.
CHOP and ADX measure different things and read a trend in opposite directions.

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.

Illustration of a breakout after a sideways stretch: in the price panel the line turns upward at the breakout bar, the CHOP line below falls toward 38.2 and the ADX line rises toward 25 over the same bars. CHOP falls, ADX rises Same breakout, illustration Price CHOP ADX Breakout 38.2 25 Same move, opposite directions. So: measure which turns first.
During a breakout CHOP falls while ADX rises: the same move, read from opposite ends of the scale.

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.

  1. Run the trend rule alone. Record the number of trades, the average trade after commission and slippage, and the maximum drawdown.
  2. Add the condition. Entry is permitted only when CHOP at the signal bar is below the chosen level. Exits do not change.
  3. Run again with identical settings. Same costs, same session, same next-bar execution.
  4. 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.
  5. 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.
Illustration of the same trend rule run alone and with a CHOP gate, same exits and costs: alone it takes ten trades, half of them losers; gated it skips four of the losers and keeps the winners, so it has fewer but better trades. The gate should remove losers Same exits, same costs, illustration Alone Gated Win Loss Removed A pass: fewer, better trades. So: never judge on net profit alone.
The order of steps for adding CHOP as a permission layer and judging whether it helped.

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.

LookbackFirst cross below 38.2 after a breakoutFalse crosses inside a rangeShare of bars labelled trending
7EarliestMostLargest
14MiddleMiddleMiddle
28LatestFewestSmallest
Illustration of when CHOP is below 38.2 for lookbacks of 7, 14 and 28 bars: during the range the 7-bar line dips below three times, the 14-bar line once and the 28-bar line not at all; after the breakout the 7-bar line confirms the trend first, the 14-bar line next and the 28-bar line last. Short lookback: early, jumpy Time below 38.2, illustration Range Trend 7 bars 14 bars 28 bars none False dip Trend found Speed costs false permissions. So: test lookbacks as a grid.
A shorter lookback crosses the trend threshold earlier but flips back more often; a longer one is steadier but later.

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.

NumberResult
Net profit (closed trades)$221,050
Max drawdown$75,190
Trades45
Win rate64.44%
Profit factor2.354
Average trade$4,912.22
Time in market56.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.

Read the trade count against the length of the period, then the max drawdown next to the net result. This is one survivor chosen after the fact out of many tried, not a forecast.
Read the trade count against the length of the period, then the max drawdown next to the net result. This is one survivor chosen after the fact out of many tried, not a forecast. NQ · daily · 2019-01-02 to 2025-06-30 · CPU engine backtest
Check whether the gain came from a few stretches or from the whole period, where the deepest drawdown sits, and how the out-of-sample stretch compares with the rest of the curve.
Check whether the gain came from a few stretches or from the whole period, where the deepest drawdown sits, and how the out-of-sample stretch compares with the rest of the curve. NQ · daily · 2019-01-02 to 2025-06-30 · CPU engine backtest

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.