2.8 KiB
Futures Positioning: CFTC Commitment of Traders
Weekly positioning snapshots (Tuesday; released Friday at 3:30 PM ET) for CME / ICE / CBOT futures, broken down by trader category. Free and public domain. Used in Ch4 NB 10 for sentiment/positioning features and in Ch8 / Ch16 for futures strategy inputs.
Dataset
| Report type | Trader categories | Products |
|---|---|---|
| TFF (Traders in Financial Futures) | Dealers, Asset Managers, Leveraged Money | Financial futures (ES, NQ, 6E, ZN, …) |
| Disaggregated | Commercials, Managed Money, Swap Dealers | Commodity futures (CL, GC, ZC, …) |
Product mapping + report-type dispatch live in the ml4t.data.cot library
(ml4t.data.cot.PRODUCT_MAPPINGS). The downloader here wraps that library
and persists one parquet per product to the local data store.
Download
# Default: all products in PRODUCT_MAPPINGS, 2020 through current year
uv run python data/futures/positioning/cot_download.py
# Subset of products + longer history
uv run python data/futures/positioning/cot_download.py --products ES,NQ,CL,GC --start-year 2010
# Override output root
uv run python data/futures/positioning/cot_download.py --data-path /tmp/ml4t-data
Directory Layout
$ML4T_DATA_PATH/futures/positioning/cot/
└── {PRODUCT}.parquet # one parquet per product code (e.g., ES.parquet)
Schema
Columns vary by report type but always include:
| Column | Notes |
|---|---|
product |
Exchange product code (ES, CL, GC, …) |
report_type |
CFTC report that produced the row |
report_date |
Tuesday snapshot date |
open_interest |
Total open interest |
Per-trader long/short/net columns by report type:
- Financial (TFF):
dealer_long/short/net,asset_mgr_long/short/net,lev_money_long/short/net - Commodity (disaggregated):
commercial_long/short/net,managed_money_long/short/net,swap_long/short/net
Loading
from data import load_cot, list_cot_products
# Everything available locally
df = load_cot()
# Subset + date filter
df = load_cot(products=["ES", "NQ"], start_date="2020-01-01", end_date="2024-12-31")
# Enumerate what's been downloaded
list_cot_products() # -> ['CL', 'ES', 'GC', 'NQ', ...]
load_cot() uses diagonal_relaxed concat so financial and commodity
products can be combined in one frame despite their different schemas.
Release Lag
CFTC publishes reports Friday at 3:30 PM ET; the snapshot is as-of Tuesday of the same week (3-day lag). For daily-bar backtests a conservative +6 calendar-day availability lag from Tuesday is standard.
Consumers
- Ch4 NB 10 — positioning analysis, z-scores, contrarian signals
- Ch8 — futures_features.py (positioning feature family)
- Ch16 — futures strategies using CoT signals