Télécharger les données de positionnement CFTC sur les contrats à terme
Résumé
Le document explique comment récupérer les données hebdomadaires CFTC du rapport Commitments of Traders pour certains contrats à terme et enregistrer l’historique de chaque produit dans un fichier Parquet. Les rapports COT présentent les positions du mardi et sont publiés le vendredi ; les catégories de traders varient selon qu’il s’agit de contrats financiers ou de matières premières. Les données obtenues comprennent les dates des rapports, l’intérêt ouvert et les positions longues, courtes et nettes, qui peuvent servir à créer des variables de positionnement ou de sentiment dans un processus de recherche sur les contrats à terme.
L’outil de téléchargement permet de choisir les produits et une plage d’années, ou d’utiliser la liste de produits configurée et la plage de dates par défaut. Il valide les codes produits demandés, consigne les produits pour lesquels aucune donnée n’a été renvoyée et signale les échecs de récupération. Il s’agit d’un guide opérationnel, et non d’une analyse des performances des signaux COT : il ne fournit aucun backtest, aucune preuve prédictive ni aucune règle pour interpréter les variations de position. Les observations COT sont hebdomadaires et constituent des instantanés ; le document n’établit donc ni leur actualité ni leur utilité pour une stratégie de trading particulière.
Idées clés
- Les rapports CFTC fournissent des instantanés hebdomadaires des positions sur les contrats à terme ; les catégories de traders dépendent du marché et du type de rapport.
- Les données de sortie consignent l’intérêt ouvert ainsi que les positions longues, courtes et nettes par catégorie de traders et par date de rapport.
- Les utilisateurs peuvent choisir les produits et les années ; les échecs de récupération et les résultats vides sont signalés séparément.
- Le document décrit la récupération et le stockage des données, mais ne vérifie pas si les variables COT prédisent les rendements.
Étiquettes
Texte intégral
# cot_download.py
```py
#!/usr/bin/env python3
"""Download CFTC Commitment of Traders (COT) data.
CFTC publishes weekly COT reports (Tuesday snapshot, released Friday) showing
futures positioning broken down by trader type (dealers, asset managers,
leveraged money for financial futures; commercials, managed money for
commodities). The data is free and useful for sentiment/positioning features.
This downloader uses ``ml4t.data.cot.COTFetcher`` — which wraps the
``cot_reports`` library — to fetch per-product panels and writes one parquet
per product to ``$ML4T_DATA_PATH/futures/positioning/cot/{product}.parquet``. The
``load_cot()`` loader in ``data/futures/loader.py`` consumes these files.
Output layout under ``$ML4T_DATA_PATH/futures/positioning/cot/``::
{PRODUCT}.parquet one parquet per product code (e.g., ES.parquet)
Schema (columns vary by report type but include):
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
<trader>_long long positions per trader category
<trader>_short short positions per trader category
<trader>_net computed long − short per category
Usage::
# Default: all products in PRODUCT_MAPPINGS, 2020–current year
python data/futures/positioning/cot_download.py
# Restrict to a subset
python data/futures/positioning/cot_download.py --products ES,NQ,CL,GC
# Wider year range
python data/futures/positioning/cot_download.py --start-year 2010 --end-year 2024
# Override output root
python data/futures/positioning/cot_download.py --data-path /tmp/ml4t-data
"""
from __future__ import annotations
import argparse
from pathlib import Path
from ml4t.data.cot import PRODUCT_MAPPINGS, COTConfig, COTFetcher
from utils.downloading import resolve_data_dir
def main() -> int:
parser = argparse.ArgumentParser(
description="Download CFTC Commitment of Traders data",
formatter_class=argparse.RawDescriptionHelpFormatter,
)
parser.add_argument(
"--products",
type=str,
default=None,
help=(
"Comma-separated product codes (default: all in PRODUCT_MAPPINGS). "
f"Available: {', '.join(sorted(PRODUCT_MAPPINGS.keys()))}"
),
)
parser.add_argument(
"--start-year",
type=int,
default=2020,
help="First calendar year to fetch (default: 2020)",
)
parser.add_argument(
"--end-year",
type=int,
default=None,
help="Last calendar year to fetch (default: current year)",
)
parser.add_argument(
"--data-path",
type=Path,
default=None,
help="Override output root (default: $ML4T_DATA_PATH)",
)
args = parser.parse_args()
if args.products:
products = [p.strip().upper() for p in args.products.split(",") if p.strip()]
unknown = [p for p in products if p not in PRODUCT_MAPPINGS]
if unknown:
print(f"ERROR: unknown product code(s): {', '.join(unknown)}")
print(f"Available: {', '.join(sorted(PRODUCT_MAPPINGS.keys()))}")
return 1
else:
products = sorted(PRODUCT_MAPPINGS.keys())
data_path = resolve_data_dir(args.data_path)
output_dir = data_path / "futures" / "positioning" / "cot"
output_dir.mkdir(parents=True, exist_ok=True)
config = COTConfig(
products=products,
start_year=args.start_year,
end_year=args.end_year,
storage_path=output_dir,
)
fetcher = COTFetcher(config)
print()
print(f"Output: {output_dir}")
print(f"Years: {config.start_year}–{config.end_year}")
print(f"Products: {len(products)} ({', '.join(products)})")
print()
written = 0
empty = 0
failed: list[str] = []
for i, product in enumerate(products, 1):
print(f" [{i}/{len(products)}] {product}…", end="", flush=True)
try:
df = fetcher.fetch_product(product)
except Exception as e:
failed.append(product)
print(f" FAILED ({e})")
continue
if df.is_empty():
empty += 1
print(" no rows returned")
continue
out_path = output_dir / f"{product}.parquet"
df.write_parquet(out_path)
written += 1
print(f" {len(df):,} rows → {out_path.name}")
print()
print(f"Wrote: {written} parquet(s)")
if empty:
print(f"Empty: {empty} product(s) returned no rows")
if failed:
print(f"Failed: {len(failed)} — {', '.join(failed)}")
return 1
return 0
if __name__ == "__main__":
raise SystemExit(main())
```Reproduit dans son intégralité avec attribution, conformément à la licence de la source. Licence: MIT
Ce résumé a été rédigé par l’agent de recherche de Stratmill à partir de la source originale ; il n’en est pas une copie.