Guide
COT report explained: how to read the Commitments of Traders
This guide has the COT report explained from first principles: who has to report to the CFTC, when the numbers are published, what each trader category means, and how to compute net positioning and read open interest, with a worked gold example.
What the COT report is
The Commitments of Traders (COT) report is a weekly snapshot of who holds what in US futures markets, published by the Commodity Futures Trading Commission (CFTC). For each futures market it shows open interest broken down by trader category, so you can see how commercials, speculators and small traders are positioned. Having the COT report explained properly matters because the raw files are dense: once you know the structure, each row answers a simple question — who is long, who is short, and by how much.
FinzData serves the legacy, disaggregated, Traders in Financial Futures (TFF) and supplemental reports across 950+ futures markets, with history since 1986, via the API and the Python client.
Who has to report
The CFTC sets a reporting level for each futures market — a position size above which a trader must file daily position reports with the commission. Clearing members, futures commission merchants and foreign brokers report the positions of accounts they carry; individual traders above the reporting level are then classified by the CFTC into categories such as commercial or non-commercial based on their stated business activity.
- Positions below the reporting level are aggregated into the "non-reportable" bucket, often used as a proxy for small retail traders.
- Reporting levels vary by market and are adjusted over time, so the non-reportable share is not directly comparable across decades.
- Every reported position is counted on both sides: total longs always equal total shorts in a futures market.
Release timing
Positions are recorded as of the close on Tuesday and published on Friday at 3:30pm Eastern Time. When a federal holiday falls in the week, publication is delayed — typically to the following Monday. The three-day lag means the data describes where traders were, not where they are now; treat it as a positioning map, not a live feed.
The categories in each report
The legacy report splits open interest into three groups. Commercials are hedgers — firms that use the underlying commodity or instrument in their business. Non-commercials are large speculators, mostly funds. Non-reportables are the small-trader residual. The disaggregated report (physical commodities) splits commercials into producer/merchant/processor/user and swap dealers, and non-commercials into managed money and other reportables. The TFF report does the equivalent for financial futures with dealer/intermediary, asset manager/institutional, leveraged funds and other reportables. The supplemental report adds commodity index traders for selected agricultural markets.
Net positioning and open interest
The most-used derived series is net positioning: long contracts minus short contracts for a given category. Open interest is the total number of outstanding contracts. Rising open interest with rising managed-money net longs tells a different story than the same price move on falling open interest. A common normalisation is the COT index, which scales the current net position against its range over a lookback window — see the COT index guide.
Worked example: gold (COMEX)
The table below uses illustrative round numbers for a single week of the disaggregated gold report. They are not real data.
| Category | Long | Short | Net |
|---|---|---|---|
| Producer/Merchant | 40,000 | 190,000 | −150,000 |
| Swap dealers | 90,000 | 40,000 | +50,000 |
| Managed money | 180,000 | 60,000 | +120,000 |
| Other reportables | 50,000 | 70,000 | −20,000 |
| Non-reportable | 40,000 | 40,000 | 0 |
Reading it (illustrative): managed money is net long 120k contracts while producers are net short 150k — the classic spec-versus-hedger split. Total longs and shorts each sum to 400k, as they must.
Pulling the data in Python
import finzdata as yf
c = yf.Client()
# Disaggregated COT for COMEX gold, weekly rows since 1986
df = c.cot(report="disaggregated", market="GOLD")
print(df.tail())
# Managed money net position
mm_net = df["mm_long"] - df["mm_short"]
print(mm_net.tail())Frequently asked questions
What is the COT report in simple terms?
It is a weekly CFTC publication showing how many futures contracts each category of trader — hedgers, large speculators and small traders — holds long and short in each US futures market.
When is the COT report released?
Every Friday at 3:30pm Eastern Time, showing positions as of the previous Tuesday's close. Publication is delayed, usually to Monday, when a federal holiday falls during the week.
What is the difference between commercial and non-commercial traders?
Commercials use the futures market to hedge an underlying business exposure (producers, merchants, processors, users). Non-commercials are large speculators such as funds that trade for profit rather than hedging.
What does open interest tell you in the COT report?
Open interest is the total number of outstanding contracts. Combined with net positioning it shows whether a category is adding or reducing exposure, and whether a price move is backed by new positions or short covering.
How far back does COT data go?
The CFTC publishes legacy COT history back to 1986. FinzData serves all four report types across 950+ futures markets with history since 1986, weekly.
Is the COT report a trading signal?
It is a positioning map with a three-day lag, not a live feed. Most analysts use it as context or as one input among several, often normalised as a COT index, rather than as a standalone timing signal.