COTexplorer/app/api/models.py
Greg 37f8eac932 Initial commit: CFTC COT Explorer
FastAPI application that ingests CFTC Commitments of Traders data into SQLite
and exposes it via a REST API with analytics endpoints (screener, percentile rank,
concentration). Includes CLI for historical and weekly data ingestion, Docker setup,
and a frontend.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 11:23:00 +01:00

131 lines
2.9 KiB
Python

from typing import Optional
from pydantic import BaseModel
class CommodityMeta(BaseModel):
cftc_code: str
name: str
exchange: str
exchange_abbr: str
contract_unit: Optional[str]
first_date: Optional[str]
last_date: Optional[str]
week_count: int
class ExchangeInfo(BaseModel):
exchange_abbr: str
exchange: str
commodity_count: int
class PositionPoint(BaseModel):
report_date: str
open_interest: Optional[int]
noncomm_long: Optional[int]
noncomm_short: Optional[int]
noncomm_spreading: Optional[int]
noncomm_net: Optional[int]
comm_long: Optional[int]
comm_short: Optional[int]
comm_net: Optional[int]
nonrept_long: Optional[int]
nonrept_short: Optional[int]
nonrept_net: Optional[int]
chg_open_interest: Optional[int]
chg_noncomm_long: Optional[int]
chg_noncomm_short: Optional[int]
chg_comm_long: Optional[int]
chg_comm_short: Optional[int]
pct_noncomm_long: Optional[float]
pct_noncomm_short: Optional[float]
pct_comm_long: Optional[float]
pct_comm_short: Optional[float]
traders_total: Optional[int]
traders_noncomm_long: Optional[int]
traders_noncomm_short: Optional[int]
traders_comm_long: Optional[int]
traders_comm_short: Optional[int]
class HistoryResponse(BaseModel):
commodity: CommodityMeta
row_type: str
data: list[PositionPoint]
class LatestRowData(BaseModel):
row_type: str
positions: PositionPoint
concentration: Optional[dict]
class LatestResponse(BaseModel):
commodity: CommodityMeta
report_date: str
rows: list[LatestRowData]
class ExtremePoint(BaseModel):
value: Optional[float]
date: Optional[str]
class ExtremesResponse(BaseModel):
cftc_code: str
commodity: str
noncomm_net: dict
open_interest: dict
comm_net: dict
class ScreenerRow(BaseModel):
cftc_code: str
commodity: str
exchange: str
latest_date: str
noncomm_net: Optional[int]
open_interest: Optional[int]
pct_rank: Optional[float]
chg_noncomm_long: Optional[int]
chg_noncomm_short: Optional[int]
class ComparePoint(BaseModel):
report_date: str
value: Optional[float]
class CompareResponse(BaseModel):
metric: str
commodities: list[CommodityMeta]
series: dict[str, list[ComparePoint]]
class PercentileResponse(BaseModel):
cftc_code: str
commodity: str
current_net: Optional[int]
percentile: Optional[float]
z_score: Optional[float]
lookback_weeks: int
period_min: Optional[int]
period_max: Optional[int]
class ReportDateInfo(BaseModel):
date: str
commodity_count: int
class ReportSnapshotRow(BaseModel):
cftc_code: str
commodity: str
exchange: str
open_interest: Optional[int]
noncomm_net: Optional[int]
comm_net: Optional[int]
pct_noncomm_long: Optional[float]
pct_noncomm_short: Optional[float]
traders_total: Optional[int]