COT Percentile and Z-Score: Measure Positioning Extremes and Changes
Macro Research / Statistical Context for COT · MR03
COT Percentile and Z-Score: Measure Positioning Extremes and Changes
A COT percentile is a relative rank showing where the current value sits in its past range; a z-score shows how many standard deviations it lies from the mean — and the two are not the same thing. Instead of stopping at “large” or “small,” you read a COT net position in the context of 52-week, 3-year, 5-year and 10-year history, using two different rulers: rank and dispersion.
- Understand the formulas and roles of the percentile rank, min-max COT Index and z-score
- Grasp why the same current value shifts position across 52-week, 3-year and 10-year windows
- See in a distribution graphic how one outlier distorts the mean and standard deviation
- Try an educational percentile and z-score explorer with switchable lookback windows
Conclusion
Answer: a COT percentile and z-score are different — rank versus dispersion
The starting point for a COT percentile is refusing to conflate two rulers. A percentile rank is a relative rank: it tells you what share of the same series’ past observations sits at or below the current net position. A z-score is a dispersion-based distance: it tells you how many standard deviations (σ) the current value lies from the window mean. A rank is largely insensitive to the shape of the distribution, but it never shows the actual distance from the mean. A z-score measures that distance, but it becomes unstable when the mean and standard deviation are distorted by outliers or a small sample.
On top of that, the “COT Index” widely used in practice is, in most cases, not a percentile rank but a min-max scaling that linearly maps the window minimum to 0 and the maximum to 100. The names sound alike, but the formulas differ, so the same current value produces different numbers. This article keeps the three apart — percentile rank, min-max COT Index and z-score — computes them on one coherent fictional time series, and follows how the position moves as you change the window. How to read COT reporting categories and the net position itself is covered in the guide to reading the COT report (CFTC positioning and open interest); this article handles the next stage of putting those values into statistical context. For the flow of the whole cluster, start from the complete macro analysis guide.
Definitions
Three rulers: percentile rank, min-max COT Index and z-score
First, pin the terms down with formulas. Below, x is the current net position and the set of interest is the observations lined up over the chosen window. Naming the exact formula used — rather than lumping everything together as “the percentile” — is what prevents the mismatches that follow.
The character of the three is organized in the comparison table below. It is not a question of which is correct; they simply measure different things. A rank is robust to outliers but flattens the shape of the distribution. A min-max index is easily pulled by extreme endpoints, and a z-score depends on the stability of the mean and standard deviation.
| Aspect | Percentile rank | Min-max COT Index | Z-score |
|---|---|---|---|
| Measures | Relative rank | Position within the range | Distance from the mean |
| Unit | % | 0–100 | σ (number of standard deviations) |
| Robustness to outliers | High | Low (sensitive to endpoints) | Low (mean and SD move) |
| Distribution shape | Information is lost | Information is lost | Tends to assume normality |
| Best used for | Ranking skewed series | Intuitive 0–100 display | Quantifying distance and cross-market comparison |
The easiest pair to confuse is the first two. The phrase “COT Index” means different things in different sources: sometimes a percentile rank, sometimes the min-max form above. In the fictional example that follows, over 52 weeks the min-max form is 94.4% while the percentile rank is 92.3% — they do not match. Always confirm from the label which number you are looking at.
Z-score
Computing a z-score, and handling zero variance, small samples and skew
A z-score is the current value minus the window mean, divided by the window standard deviation. The unit is σ, so “+1.22σ,” for example, means the value sits 1.22 standard deviations above the mean. Positive is above the mean, negative is below, and the sign itself carries the direction.
A z-score comes with assumptions and pitfalls, though. When the standard deviation is zero — every value in the window is identical — the denominator is zero and it cannot be computed. In that case the value is treated as “—” so that no division by zero is produced. When the sample is too small, both the mean and the standard deviation are unstable and the confidence interval around the z-score widens. When the distribution is badly skewed, it departs from the symmetric, normal shape a z-score implicitly tends to assume, so the same σ can mean something different. In addition, the value shifts slightly depending on whether the standard deviation is computed on a population basis (divide by N) or a sample basis (divide by N−1), so state which you used. This article’s fictional example and explorer are standardized on the population basis (divide by N).
Windows
Why the same current value shifts position across 52-week, 3-year and 10-year windows
Both a percentile and a z-score change with the window you use as the baseline. This is not a calculation error; it is because the population being compared changes. A short 52-week window sensitively reflects recent positioning, while widening to 3, 5 or 10 years brings in a longer context that includes past large swings and changes in market structure and size. For a series whose scale has grown structurally, an old low level is smaller than today’s “normal” and pushes down the bottom of the long-run range.
The figure below shows the same current value, +48,000 contracts, moving to a relatively lower position within the range as the window widens. The numbers are a fictional educational example; only the 52-week value is actually computed from the fictional time series introduced later, while the 3-year and longer figures are illustrative summary statistics representing long-run swings.
| Window | Min | Max | Min–max | Mean | Std dev | Z-score |
|---|---|---|---|---|---|---|
| 52 weeks | −20,000 | 52,000 | 94.4% | 22,154 | 21,140 | 1.22 |
| 3 years | −60,000 | 70,000 | 83.1% | 18,000 | 30,000 | 1.00 |
| 5 years | −85,000 | 95,000 | 73.9% | 12,000 | 42,000 | 0.86 |
| 10 years | −120,000 | 140,000 | 64.6% | 5,000 | 55,000 | 0.78 |
Positioning that looks “quite extreme” over 52 weeks (94.4%, +1.22σ) settles down to “somewhat high” over 10 years (64.6%, +0.78σ). Against the 52-week and 3-year views available in the free version, the 5-year, 10-year and all-history percentiles and z-scores require a longer history. When you want to nail down the long-run placement, Pro’s scope — which handles full history and long-run measures — comes into view. For applying the same idea of window comparison to yield-curve and rate levels, the guide to reading Treasury yields and the yield curve is a useful companion.
Window design
Rolling versus expanding windows, level versus change, and the OI ratio
There are two ways to take the window. A rolling window moves a fixed width along, as in “the last 52 weeks,” while an expanding window fixes the start and widens as observations accumulate. A rolling window tracks the recent environment, but the position can jump when an old extreme drops off the edge of the window. An expanding window preserves long-run consistency, but it carries the hazard of treating a distant, different environment on equal terms with today. Either way, the premise is to state the window width, minimum sample size, endpoint handling and missing-data treatment.
Another key distinction is level versus change. A percentile or z-score is a matter of level — where you are now. The 1-, 4-, 13- and 26-week changes, by contrast, are a matter of momentum — how much things moved — which is separate information. A mismatch, such as a high level that is nonetheless falling lately, only becomes visible when level and change sit on the same screen. Furthermore, turning raw contracts (level) into a ratio by dividing by total open interest adjusts for changes in market size and eases long-run comparison for series whose scale has shifted greatly. But because a ratio depends on the denominator definition, separate the labels so it is not confused with raw contracts.
- Rolling versus expanding window: responsiveness or long-run consistency. Choose by purpose and write down the window width and minimum sample.
- Level versus change: percentile and z are level; the 1/4/13/26-week differences are momentum. Do not mix them.
- Contracts versus OI ratio: a ratio helps adjust for scale. Watch for changes in the denominator definition.
Outliers
One outlier moves the mean, the standard deviation and the z-score
The weakness of the z-score is that the mean and standard deviation are pulled by outliers. A single extreme observation swells the denominator (the standard deviation), so the z-score of the same value shrinks — and can even flip sign. The figure below shows what happens when one outlier of 40 thousand contracts is added to a small fictional sample of weekly net values (unit: thousand contracts).
This exposes the hazard of mechanically thresholding a z-score as “extreme once it exceeds ±2.” Unless you decide how outliers are handled (exclude them, switch to robust statistics, or leave them in) and report the sample size and denominator definition, you must not let the σ number stand on its own. The principle of showing the sample size and denominator definition for correlations and z-scores applies here just the same.
Worked example
Computing by window on one coherent fictional time series
From here on, we reuse a single fictional weekly net-position time series (52 weeks, unit: contracts) all the way through. The values step gently upward from −20,000 to +52,000; the most recent (current value) is +48,000 contracts, one week earlier it was +47,000 and four weeks earlier +49,000. As a premise, this is fictional educational data — not real market values, forecasts or trade recommendations. The standard deviation is computed on a population basis (divide by N).
Computing the min-max position, percentile rank, mean, standard deviation, z-score, 1-week change and 4-week change for this same series over three rolling windows — the last 13, 26 and 52 weeks — gives the following. The longer the window, the more it includes older, lower levels, so the position and z-score rise for the same current value.
| Measure | 13 weeks | 26 weeks | 52 weeks |
|---|---|---|---|
| Observations | 13 | 26 | 52 |
| Min (contracts) | 41,000 | 24,000 | −20,000 |
| Max (contracts) | 52,000 | 52,000 | 52,000 |
| Mean (contracts) | 46,769 | 40,269 | 22,154 |
| Std dev (contracts) | 3,092 | 7,823 | 21,140 |
| Min–max position | 63.6% | 85.7% | 94.4% |
| Percentile rank | 69.2% | 84.6% | 92.3% |
| Z-score (σ) | +0.40 | +0.99 | +1.22 |
| 1-week change (contracts) | +1,000 | +1,000 | +1,000 |
| 4-week change (contracts) | −1,000 | −1,000 | −1,000 |
What stands out is that over 13 weeks the current value is only “a little above the mean” (+0.40σ, min-max 63.6%). Because the last 13 weeks have been flat at high levels, it does not stand out within that stretch. Yet widening to 52 weeks includes the early negative territory, so it becomes “quite high” (+1.22σ, 94.4%). The same number can look either “normal” or “extreme” depending solely on the window — this is the biggest reason not to conclude anything from a percentile or z-score over a single window. Note too that the 1-week change is +1,000 contracts (a slight rise) while the 4-week change is −1,000 (a slight fall), so even the sign of momentum disagrees across horizons. Placing level and change in the same table makes this mismatch visible at a glance.
The min-max position, percentile, z-score and changes in Table 3 can all be checked on public COT data in the SG Group Macro Research Workbench. The free view offers 52-week and 3-year percentiles for major markets; Pro extends to full history, 5-year/10-year/all-history percentiles, z-scores and 1/4/13/26-week change rankings, so you can view the same current value through several rulers.
Change ranking
Change rankings and heatmaps: level and momentum on one sheet
A heatmap lining up changes by window is convenient when viewing several markets at once. Placing the 1-, 4-, 13- and 26-week changes next to the 52-week percentile (level) reveals combinations such as “high level but slowing momentum” or “low level but falling fast.” Below is a fictional educational example of four markets. Alongside color, the sign (▲▼) and the numbers are shown together, so meaning is never carried by color alone.
| Market | 1w | 4w | 13w | 26w | 52w level |
|---|---|---|---|---|---|
| Fictional Market A | ▲ +1,000 | ▼ −1,000 | ▲ +6,000 | ▲ +19,000 | 92% High |
| Fictional Market B | ▼ −2,500 | ▼ −8,000 | ▼ −15,000 | ▼ −22,000 | 18% Low |
| Fictional Market C | ▲ +3,200 | ▲ +9,500 | ▲ +12,000 | ▲ +5,000 | 61% Mid |
| Fictional Market D | ▲ +800 | ▲ +1,200 | ▼ −4,000 | ▲ +2,000 | 47% Mid |
A heatmap is useful for cross-sectional comparison on a common scale, but it also risks hiding mismatches in data quality, category definitions and coverage periods. If markets differ in reporting category or length of history, the same “92%” does not mean the same thing. The idea of testing an apparent link between markets with time-shifted correlation is covered in the lead-lag analysis article, and relating FX to rate differentials in the interest rate differentials and FX article. In both, the common point is that “looking alike side by side” and “being related” are different things.
Interactive
Percentile and z-score explorer (educational)
The tool below uses the fictional 52-week series above and lets you switch the window (13, 26 or 52 weeks) and the current value to compute the min-max position, percentile rank, mean, standard deviation, z-score, 1-week change and 4-week change. Input is processed only in your browser and is neither sent nor saved anywhere. First, the defaults (current value 48,000 contracts, 52 weeks) match the 52-week column of Table 3. Swap in different numbers to confirm how the position and z-score move. You can also see how zero standard deviation, too few observations, and a current value outside the range are handled.
Results for a current value of +48,000 contracts over the last 52 weeks. This is a gauge of relative position only; it does not imply bullish/bearish or a trade direction.
Limits
Limits of interpretation: an extreme does not promise a reversal
Finally, here are the leaps to avoid with percentiles and z-scores. First, an extreme position does not indicate the timing of a reversal. A 92% or a z of +2 only says the present is relatively high; when, or whether, it returns to the mean is a separate question. It is not unusual for an extreme to persist and stretch further. Second, correlation does not prove causation. Even if positioning and price appeared to move together in the past, that is neither causation nor a guarantee of the future. Third, nonstationarity — if market size or structure changes fundamentally, the past range and mean cease to be a valid baseline for the present. The longer the percentile window, the more it carries this “the past and the present are different environments” problem.
So rather than leaping from a single statistic to a price direction, always pair it with a disconfirming condition (what data would show this read is wrong) and additional checks (agreement across other windows, other series, and level versus change). Even where you are tempted to talk about correlation, as with gold or oil, the same footing applies — spelling out conditions and limits — as in the article on gold and real yields, the macro regime analysis article that handles regime comparison and look-ahead bias, and the macro scenario analysis article.
Checklist
Practical checklist and steps in the workbench
Here are the checks for using a COT percentile and z-score in practice. Prioritize making the assumptions and limits explicit over the precision of the numbers.
- Did you state the formula used (percentile rank, min-max COT Index or z-score)?
- Did you avoid a single window and place 52-week, 3-year and, where possible, 5-year and 10-year side by side?
- Did you report the standard-deviation denominator (population N or sample N−1) and the sample size?
- Did you check outliers, missing data, zero standard deviation and out-of-range values?
- Did you view level (percentile, z) and change (1/4/13/26 weeks) separately?
- Are you keeping raw contracts and the OI ratio distinct?
- Did you avoid short-circuiting an extreme into a reversal or trade direction (did you prepare a disconfirming condition)?
The flow for actually checking this on public COT data is roughly as follows. First, pick the target market in the free basic view and get a sense of the current level from the 52-week and 3-year percentiles. Then, once you need long-run placement, z-scores, multi-window change rankings or multi-market heatmaps, move to Pro’s scope, which handles full history and long-run measures. The overall picture of the work is in the complete macro analysis guide, and the English learning articles are collected in the article index. For related verification skills, robustness thinking is in the TradingView backtesting and robustness guide, real trading costs in the trading cost calculation guide, and grasping size in the FX and CFD lot-size calculation guide.
Try first to see how far the free view takes you. COT for major markets plus 52-week and 3-year percentiles are available free. Once you find yourself wanting long history, z-scores, change rankings and heatmaps, comparing the scope on the plans page is enough. There is no need to assume Pro from the start.
FAQ
Frequently asked questions
What is a COT percentile?
Are a COT Index and a percentile rank the same?
How is a COT z-score calculated?
Should I use a 52-week or a 3-year window?
Does a z-score above 2 predict a reversal?
Should positioning be normalized by open interest?
What does a COT change ranking show?
What does Pro add beyond the free version?
References
References
These are the primary sources referenced in this article. Please confirm definitions, categories and publication methods against each institution’s latest text.
- U.S. CFTC — Commitments of Traders: https://www.cftc.gov/MarketReports/CommitmentsofTraders/index.htm (source data for positioning and net positions, and the publication schedule)
- U.S. CFTC — COT Explanatory Notes: https://www.cftc.gov/MarketReports/CommitmentsofTraders/ExplanatoryNotes/index.htm (definitions of reporting categories and aggregation methods)
Disclaimer
This article is for education and information, to mechanically organize, visualize and contextualize public COT data or data loaded within your browser. It does not buy, sell, hold, enter or exit any currency, commodity, Treasury, gold, oil or index, does not forecast prices, does not guarantee profit, and does not provide individual investment advice. Every number, time series and four-market example shown is fictional educational data and does not represent real market values, performance or user counts. A percentile, z-score, COT Index and change ranking are only a statistical organization of relative position or momentum; correlation is not causation, and an extreme does not guarantee the timing of a reversal. Public data can be delayed, revised or missing. A percentile or standard deviation changes with the window, the denominator definition and whether seasonal adjustment is applied. The Macro Research Workbench organizes and visualizes public macro data and on-device data; providing lot, margin, trading-cost, spread, swap, profit-and-loss or trade-signal outputs is largely outside its scope. SG Group’s features, free scope and pricing can change. Please confirm the latest details on each service page and the plans page, along with the terms of use for the primary sources.

