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.
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.
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 DESCThe 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.
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.dAcross 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.
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 yearIn 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.