Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor ·

How to Read the COT Report: Columns Explained

How to read the COT report: what every column means across the legacy, disaggregated and TFF tables, plus the net position math and its two real limits.

Learning how to read the COT report starts with its shape: the Commitments of Traders report is a weekly count of open futures positions sorted by the kind of trader holding them, published by the Commodity Futures Trading Commission. Every cell is a number of contracts, never a price and never a forecast. This page assumes you know the schedule, covered in when the COT report is released, and works through the columns, the net position math, and the two limits worth saying out loud.

What the COT report actually counts

Every figure is a contract count, assembled from the position reports that clearing members and exchanges file with the CFTC. An account enters only above a reportable level, set separately for each market, and everything below lands in one residual bucket. Three mechanics cause most of the confusion:

  • Long and short are reported separately, and both are gross. A firm holding 4,000 long and 3,000 short appears in both columns, not as a net of 1,000.
  • Spreading is its own column for the speculative categories: equal and offsetting long and short positions in the same market, counted once.
  • Open interest is the total contracts outstanding that date. Longs across all categories sum to it, and shorts sum to it as well.

The legacy report: commercial, non-commercial, non-reportable

The oldest format, and still the most quoted. It sorts reportable traders into two classes and sweeps the rest into a third.

  • Commercial: an account that has told the CFTC it uses the market to hedge an underlying business exposure. A grain elevator, a refiner, a bank hedging a swap book.
  • Non-commercial: a reportable account with no such hedging claim. Large speculators and managed futures programs sit here.
  • Non-reportable: everyone under the threshold, derived as a residual of open interest minus the reportable long and short totals rather than collected directly.

The classification is self-declared on a filed form, and a firm with both a hedging desk and a speculative desk is filed under its predominant activity.

The disaggregated report: four categories instead of two

For physical commodities the CFTC also publishes a disaggregated version, splitting the old commercial bucket in two and the old non-commercial bucket in two.

  • Producer, merchant, processor, user: the physical-market participants hedging inventory or production.
  • Swap dealer: a dealer whose futures position offsets swaps written with clients, who may be hedgers or speculators, so this line is mixed flow through one counterparty.
  • Managed money: commodity trading advisors, pool operators and hedge funds trading for clients, the closest thing the report has to a trend-follower line.
  • Other reportables: large accounts fitting none of the above.

The TFF report: categories for financial futures

For Treasuries, equity indices and currencies, the Traders in Financial Futures report uses a fourth vocabulary:

  • Dealer/intermediary: the sell side, banks and dealers who typically take the other side of client flow rather than express a view.
  • Asset manager/institutional: pension funds, insurers, mutual funds and endowments.
  • Leveraged funds: hedge funds and CTAs, the line most people mean by "the funds are short."
  • Other reportables: large reportable accounts outside the first three.

TFF is a different partition of the same open interest, not a second opinion on the legacy table, so its lines will not map one to one onto commercial and non-commercial.

How to compute a net position from the COT report

The net itself is simple: long minus short, inside one category. Spreading sits outside both sides by construction, and across a full report the category nets sum to zero, since every long contract has a short facing it.

The raw net is where readings go wrong. A net of 200,000 contracts means one thing against 800,000 open interest and something else against 4 million. The repair is division: net over open interest gives the share that category holds, comparable across time and across contracts.

CFTC positioning is not in the panels here, so the same arithmetic runs below on data you can pull yourself. The block counts AAPL call and put contracts each month, then expresses the difference twice, once raw and once as a share of the month's total, the move behind how the put/call ratio is calculated.

QueryNet calls minus puts on AAPL, raw contracts and as a share of volume
The exact SQL behind every number
SELECT
    toString(month_start)                       AS month,
    formatDateTime(month_start, '%b %Y')        AS month_label,
    round(call_volume / 1000, 0)                AS call_contracts_thousands,
    round(put_volume / 1000, 0)                 AS put_contracts_thousands,
    round((call_volume - put_volume) / 1000, 0) AS net_contracts_thousands,
    round(100 * (call_volume - put_volume) / total_volume, 1) AS net_share_pct
FROM
(
    SELECT
        toStartOfMonth(date)                        AS month_start,
        sumIf(volume, option_type IN ('call', 'C')) AS call_volume,
        sumIf(volume, option_type IN ('put', 'P'))  AS put_volume,
        sum(volume)                                 AS total_volume
    FROM global_markets.options_greeks
    WHERE underlying_symbol = 'AAPL'
      AND date >= '2024-01-01'
      AND date <  '2026-07-01'
      AND iv_converged = 1
      AND volume > 0
    GROUP BY month_start
)
ORDER BY month_start
Run this yourself

In Jan 2024 the net measured 3294 thousand contracts, or 18.9% of that month's total volume. By Jun 2026 the net read 4671 thousand, at 27.7%. Across all 30 months the raw net rises and falls with how busy the market was, while the share strips that activity out, exactly as a COT net does against open interest.

Why a percentile is more honest than a raw net

Once the net is a share, the second step is history. A category holding 12% of open interest is high or low only against that market's own record. The standard framing is a percentile over a multi-year lookback: the fraction of past observations at or below the current reading.

US equities carry their own positioning tape. FINRA short interest data reports shares sold short twice a month, and days to cover divides that count by average daily volume, the same normalizing move that net over open interest performs. The panel below pins six household names to their latest reading, then ranks each inside its own five years.

QueryLatest days to cover, and where it sits in five years of the same name's history
The exact SQL behind every number
WITH history AS
(
    SELECT
        ticker,
        settlement_date,
        max(toFloat64(days_to_cover))  AS dtc,
        max(toFloat64(short_interest)) AS si
    FROM global_markets.stocks_short_interest
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'KO', 'XOM', 'JNJ')
      AND settlement_date >= today() - 1825
      AND days_to_cover > 0
    GROUP BY ticker, settlement_date
),
latest AS
(
    SELECT
        ticker,
        argMax(dtc, settlement_date)   AS latest_dtc,
        argMax(si, settlement_date)    AS latest_si,
        toString(max(settlement_date)) AS snapshot_label
    FROM history
    GROUP BY ticker
)
SELECT
    l.ticker                                                 AS symbol,
    l.snapshot_label                                         AS snapshot_label,
    round(l.latest_si / 1e6, 1)                              AS short_interest_millions,
    round(l.latest_dtc, 2)                                   AS days_to_cover_ratio,
    round(100 * countIf(h.dtc <= l.latest_dtc) / count(), 0) AS percentile_5y_pct
FROM history AS h
INNER JOIN latest AS l ON h.ticker = l.ticker
GROUP BY l.ticker, l.snapshot_label, l.latest_si, l.latest_dtc
ORDER BY percentile_5y_pct DESC
Run this yourself

The highest of the six, NVDA, sits at the 100th percentile of its own five-year range with 2.47 days to cover. The lowest, XOM, sits at the 76th. The raw shares-short column reads 324.1 million against 42.7 million, and that column tracks company size more than positioning, which is why it cannot be compared across names. Neither can a COT net across contracts.

The percentile also moves under a flat raw number, and the reverse. Tracing one name over three years makes that visible.

QueryAAPL days to cover and its rank inside the three-year window
The exact SQL behind every number
WITH history AS
(
    SELECT
        settlement_date               AS d,
        max(toFloat64(days_to_cover)) AS dtc
    FROM global_markets.stocks_short_interest
    WHERE ticker = 'AAPL'
      AND settlement_date >= '2023-07-01'
      AND settlement_date <  '2026-07-01'
      AND days_to_cover > 0
    GROUP BY settlement_date
)
SELECT
    toString(a.d)                                     AS settlement_date,
    formatDateTime(a.d, '%b %e, %Y')                  AS as_of_label,
    round(a.dtc, 2)                                   AS days_to_cover_ratio,
    round(100 * countIf(b.dtc <= a.dtc) / count(), 0) AS window_percentile_pct
FROM history AS a
CROSS JOIN history AS b
GROUP BY a.d, a.dtc
ORDER BY a.d
Run this yourself

Across 72 twice-monthly readings the ratio stays inside a narrow band while the percentile line covers most of the 0 to 100 range. The last reading, on Jun 30, 2026, measured 1.73 days to cover, or the 17th percentile of the window.

The two limits, stated plainly

The snapshot is Tuesday's and reaches you Friday

Positions are as of Tuesday's close and the report goes out Friday afternoon, so what it describes is three sessions old on arrival, and a category that reversed on Wednesday shows the old picture. The panel below measures how far SPY travelled from each Tuesday close to the Friday close that followed.

QuerySPY move from Tuesday close to Friday close, the age of a COT snapshot
The exact SQL behind every number
WITH spy AS
(
    SELECT
        date,
        toFloat64(close) AS close_px
    FROM global_markets.stocks_daily_aggs
    WHERE ticker = 'SPY'
      AND date >= '2016-01-01'
      AND date <  '2026-07-01'
)
SELECT
    toString(toYear(tue.date)) AS year,
    count()                    AS session_pair_count,
    round(quantileDeterministic(0.5)(abs(fri.close_px / tue.close_px - 1) * 100,
          toUInt64(toUnixTimestamp(tue.date))), 2) AS median_gap_move_pct,
    round(quantileDeterministic(0.9)(abs(fri.close_px / tue.close_px - 1) * 100,
          toUInt64(toUnixTimestamp(tue.date))), 2) AS p90_gap_move_pct
FROM spy AS tue
INNER JOIN spy AS fri ON fri.date = tue.date + 3
WHERE toDayOfWeek(tue.date) = 2
GROUP BY year
ORDER BY year
Run this yourself

In 2016, across 51 Tuesday-to-Friday pairs, the median absolute move measured 0.88% and the worst tenth of gaps covered at least 2.2%. In 2026 the median measured 1.26%. Equity index futures track that tape closely, so a Friday COT reading describes a market that has already moved. Positioning data describes last Tuesday, not now.

"The commercials are always right" is folklore

In many physical markets the commercial category is structurally short, since producers hedge output they already own. A net that is negative in almost every week of a decade is a feature of the classification, not a track record. Turning any COT category into a claim requires a stated horizon, a stated threshold, a sample that includes the periods where it failed, and an honest count of how many thresholds were tried first. The same discipline applies to every crowd-positioning gauge, including the one examined in is a high put/call ratio bullish.

Reading the raw CFTC file yourself

None of this needs a paid divergence indicator. The CFTC posts each week's report on its own Commitments of Traders page, in short and long format, in futures-only and futures-and-options-combined variants, as comma-delimited text alongside history archives running back to 1986. Two habits keep a spreadsheet honest: pick one variant and stay in it, since futures-only and combined numbers differ for the same week, and compute the percentile on the share rather than the raw net.

FAQ

What do commercial and non-commercial mean in the COT report?

Commercial traders have told the CFTC they use the market to hedge a business exposure, such as a producer hedging output or a bank hedging a swap book. Non-commercial traders are reportable accounts without that hedging claim, mostly large speculators and managed futures programs. The label is self-declared.

Is the COT report delayed?

Yes. Positions are captured at Tuesday's close and published Friday afternoon, so the data is three sessions old when it reaches you.

Is there a COT report for stocks?

Not for individual shares. The nearest equivalents are twice-monthly short interest filings and the monthly FINRA margin debt statistics, both arriving on a lag and both reading better as a percentile than a raw total.


Every panel here ships with the SQL that produced it. Open one, swap the ticker, and the same arithmetic runs on any name, on the Strasmore terminal.