Guide

COT index: formula, lookbacks and caveats

The COT index converts a raw net-position number into a 0-100 percentile-style reading against its own history, making positioning comparable across markets and regimes. This page gives the formula, the standard lookback windows, how to read extremes, and pandas code that computes the COT index from FinzData rows.

Get a free API key See pricing Download free samples

The formula

The COT index is a stochastic-style normalisation of net positioning:

COT index = (current net − min net over lookback) / (max net over lookback − min net over lookback) × 100

A reading of 100 means the current net position is the most long it has been in the lookback window; 0 means the most short. Because it uses each market's own range, the COT index is comparable across markets with very different contract sizes and open interest.

Typical lookback windows

Three lookbacks are common in the literature and in practitioner tools:

  • 26 weeks — roughly six months; responsive, picks up tactical swings in positioning.
  • 52 weeks — one year; the most widely used default, balancing responsiveness and stability.
  • 156 weeks — three years; slow-moving, suited to identifying structural extremes in positioning.

Shorter windows reach 0 and 100 more often; longer windows make extremes rarer but more meaningful. Many analysts track 52 and 156 together.

Reading extremes

Readings above 80 or below 20 are usually treated as extreme. For categories like managed money, an extreme net-long reading means speculators are crowded on the long side relative to their own history; for commercials (who are structurally short in many physical markets), the interpretation is mirrored. The COT index is most informative when you compare the same category across time, not different categories against each other.

Caveats

  • Positioning can stay extreme for weeks or months. A reading of 95 can go to 99 and stay there; the index says nothing about when it will revert.
  • The COT index is not a timing signal on its own. It measures crowding, not direction, and works best as context alongside price, volatility and macro data.
  • The index is range-based, so a single outlier week stretches the denominator and compresses every other reading. Some analysts winsorise or use percentile ranks instead.
  • Structural change (new participants, changing open interest) can make old ranges unrepresentative.

Computing it in pandas

The code below pulls weekly COT rows from FinzData — each row has a date column and a spec_net column (speculator net position) — and computes the 52-week COT index with a rolling window. FinzData also serves a pre-computed 0-100 COT index if you prefer to skip the rolling calculation.

Code: COT index from c.cot rows

import finzdata as yf
import pandas as pd

c = yf.Client()

# Weekly COT rows with columns: date, spec_net, ...
df = c.cot(report="disaggregated", market="GOLD")
df = df.sort_values("date").reset_index(drop=True)

def cot_index(net: pd.Series, lookback: int = 52) -> pd.Series:
    lo = net.rolling(lookback, min_periods=lookback).min()
    hi = net.rolling(lookback, min_periods=lookback).max()
    return (net - lo) / (hi - lo) * 100

df["cot_index_52"] = cot_index(df["spec_net"], 52)
df["cot_index_156"] = cot_index(df["spec_net"], 156)
print(df[["date", "spec_net", "cot_index_52", "cot_index_156"]].tail())

Frequently asked questions

What is the COT index?

A 0-100 normalisation of a trader category's net futures position against its own range over a lookback window: (current net − min net) / (max net − min net) × 100. 100 is the most net-long in the window, 0 the most net-short.

What lookback should I use for the COT index?

52 weeks is the common default. 26 weeks is more responsive to tactical shifts; 156 weeks (three years) highlights rarer, structural extremes. Many analysts track more than one window.

How do you interpret a COT index of 90 or above?

The category's net position is near the top of its historical range — crowded positioning. It is a warning about one-sidedness, not a prediction: readings can stay extreme for extended periods.

Is the COT index a buy or sell signal?

No. It measures how extreme positioning is relative to history, not when it will revert. It is best used as context alongside price action and other data, not as a standalone timing tool.

Does FinzData provide a pre-computed COT index?

Yes. FinzData computes a 0-100 COT index alongside the raw legacy, disaggregated, TFF and supplemental reports across 950+ futures markets with history since 1986.