Files
Danglewood 869cfed125 [Release] openbb-v5.0.0 (#7741)
* merge branch develop with main

* bump desktop version

* fix the merge

* sync Cargo.lock to desktop 2.0.0

* fix cli conftest.py

---------

Co-authored-by: deeleeramone <>
2026-09-29 10:58:44 -07:00

2028 lines
97 KiB
Python

"""CFTC Commitment of Traders Reports Model."""
from datetime import (
date as dateType,
datetime,
)
from typing import Any, Literal
from openbb_core.app.model.abstract.error import OpenBBError
from openbb_core.app.service.system_service import SystemService
from openbb_core.provider.abstract.data import Data
from openbb_core.provider.abstract.fetcher import Fetcher
from openbb_core.provider.abstract.query_params import QueryParams
from openbb_core.provider.utils.descriptions import (
DATA_DESCRIPTIONS,
QUERY_DESCRIPTIONS,
)
from openbb_core.provider.utils.errors import EmptyDataError
from pydantic import AliasChoices, Field
from openbb_cftc.utils.constants import reports_dict
api_prefix = SystemService().system_settings.api_settings.prefix
class CftcCotQueryParams(QueryParams):
"""CFTC Commitment of Traders Reports Query Parameters."""
__json_schema_extra__ = {
"code": {
"multiple_items_allowed": False,
"x-widget_config": {
"type": "endpoint",
"optionsEndpoint": f"{api_prefix}/cftc/cot_choices",
"style": {"popupWidth": 650},
},
},
"report_type": {
"multiple_items_allowed": False,
"choices": ["legacy", "disaggregated", "financial", "supplemental"],
},
"measure": {
"multiple_items_allowed": False,
"choices": [
"all",
"positions",
"changes",
"percent_of_oi",
"traders",
"concentration",
],
},
}
code: str = Field(
description="A string with the market code.",
validation_alias=AliasChoices("code", "id"),
)
start_date: dateType | None = Field(
default=None,
description=QUERY_DESCRIPTIONS.get("start_date", "")
+ " Default is the most recent report.",
)
end_date: dateType | None = Field(
default=None, description=QUERY_DESCRIPTIONS.get("end_date", "")
)
report_type: Literal["legacy", "disaggregated", "financial", "supplemental"] = (
Field(
default="legacy",
description="The type of report to retrieve.",
)
)
measure: Literal[
"all", "positions", "changes", "percent_of_oi", "traders", "concentration"
] = Field(
default="all",
description="Filter columns by measure type. Open interest is always included.",
)
futures_only: bool = Field(
default=False,
description="Returns the futures-only report. Default is False, for the combined report.",
)
limit: int | None = Field(
default=None,
description="Number of most recent reports to return. Default is all available.",
)
class CftcCotData(Data):
"""CFTC Commitment of Traders Reports Data."""
__alias_dict__ = {
"asset_manager_positions_long": "asset_mgr_positions_long",
"asset_manager_positions_short": "asset_mgr_positions_short",
"asset_manager_positions_spread": "asset_mgr_positions_spread",
"change_commercial_long_all_non_cit": "change_comm_long_all_nocit",
"change_commercial_short_all_non_cit": "change_comm_short_all_nocit",
"change_in_asset_manager_long": "change_in_asset_mgr_long",
"change_in_asset_manager_short": "change_in_asset_mgr_short",
"change_in_asset_manager_spread": "change_in_asset_mgr_spread",
"change_in_commercial_long_all": "change_in_comm_long_all",
"change_in_commercial_short_all": "change_in_comm_short_all",
"change_in_leveraged_funds_long": "change_in_lev_money_long",
"change_in_leveraged_funds_short": "change_in_lev_money_short",
"change_in_leveraged_funds_spread": "change_in_lev_money_spread",
"change_in_managed_money_long_all": "change_in_m_money_long_all",
"change_in_managed_money_short_all": "change_in_m_money_short_all",
"change_in_managed_money_spread": "change_in_m_money_spread",
"change_in_non_commercial_long_all": "change_in_noncomm_long_all",
"change_in_non_commercial_short_all": "change_in_noncomm_short_all",
"change_in_non_commercial_spread_all": "change_in_noncomm_spead_all",
"change_in_non_reportable_long_all": "change_in_nonrept_long_all",
"change_in_non_reportable_short_all": "change_in_nonrept_short_all",
"change_in_other_reportable_long": "change_in_other_rept_long",
"change_in_other_reportable_short": "change_in_other_rept_short",
"change_in_other_reportable_spread": "change_in_other_rept_spread",
"change_in_producer_merchant_long": "change_in_prod_merc_long",
"change_in_producer_merchant_short": "change_in_prod_merc_short",
"change_in_total_reportable_long_all": "change_in_tot_rept_long_all",
"change_in_total_reportable_short": "change_in_tot_rept_short",
"change_non_commercial_long_all_non_cit": "change_noncomm_long_all_nocit",
"change_non_commercial_short_all_non_cit": "change_noncomm_short_all_nocit",
"change_non_commercial_spread_all_non_cit": "change_noncomm_spead_all_nocit",
"change_non_reportable_long_all": "change_nonrept_long_all",
"change_non_reportable_short_all": "change_nonrept_short_all",
"change_total_reportable_long_all": "change_tot_rept_long_all",
"change_total_reportable_short_all": "change_tot_rept_short_all",
"commercial_positions_long_all": "comm_positions_long_all",
"commercial_positions_long_all_non_cit": "comm_positions_long_all_nocit",
"commercial_positions_long_old": "comm_positions_long_old",
"commercial_positions_long_other": "comm_positions_long_other",
"commercial_positions_short_all": "comm_positions_short_all",
"commercial_positions_short_all_non_cit": "comm_positions_short_all_nocit",
"commercial_positions_short_old": "comm_positions_short_old",
"commercial_positions_short_other": "comm_positions_short_other",
"commodity": "commodity_name",
"commodity_group": "commodity_group_name",
"commodity_subgroup": "commodity_subgroup_name",
"concentration_gross_top_4_traders_long": "conc_gross_le_4_tdr_long",
"concentration_gross_top_4_traders_long_1": "conc_gross_le_4_tdr_long_1",
"concentration_gross_top_4_traders_long_2": "conc_gross_le_4_tdr_long_2",
"concentration_gross_top_4_traders_short": "conc_gross_le_4_tdr_short",
"concentration_gross_top_4_traders_short_1": "conc_gross_le_4_tdr_short_1",
"concentration_gross_top_4_traders_short_2": "conc_gross_le_4_tdr_short_2",
"concentration_gross_top_8_traders_long": "conc_gross_le_8_tdr_long",
"concentration_gross_top_8_traders_long_1": "conc_gross_le_8_tdr_long_1",
"concentration_gross_top_8_traders_long_2": "conc_gross_le_8_tdr_long_2",
"concentration_gross_top_8_traders_short": "conc_gross_le_8_tdr_short",
"concentration_gross_top_8_traders_short_1": "conc_gross_le_8_tdr_short_1",
"concentration_gross_top_8_traders_short_2": "conc_gross_le_8_tdr_short_2",
"concentration_net_top_4_traders_long_all": "conc_net_le_4_tdr_long_all",
"concentration_net_top_4_traders_long_old": "conc_net_le_4_tdr_long_old",
"concentration_net_top_4_traders_long_other": "conc_net_le_4_tdr_long_other",
"concentration_net_top_4_traders_short_all": "conc_net_le_4_tdr_short_all",
"concentration_net_top_4_traders_short_old": "conc_net_le_4_tdr_short_old",
"concentration_net_top_4_traders_short_other": "conc_net_le_4_tdr_short_other",
"concentration_net_top_8_traders_long_all": "conc_net_le_8_tdr_long_all",
"concentration_net_top_8_traders_long_old": "conc_net_le_8_tdr_long_old",
"concentration_net_top_8_traders_long_other": "conc_net_le_8_tdr_long_other",
"concentration_net_top_8_traders_short_all": "conc_net_le_8_tdr_short_all",
"concentration_net_top_8_traders_short_old": "conc_net_le_8_tdr_short_old",
"concentration_net_top_8_traders_short_other": "conc_net_le_8_tdr_short_other",
"date": "report_date_as_yyyy_mm_dd",
"leveraged_funds_positions_long": "lev_money_positions_long",
"leveraged_funds_positions_short": "lev_money_positions_short",
"leveraged_funds_positions_spread": "lev_money_positions_spread",
"managed_money_positions_long_all": "m_money_positions_long_all",
"managed_money_positions_long_old": "m_money_positions_long_old",
"managed_money_positions_long_other": "m_money_positions_long_other",
"managed_money_positions_short_all": "m_money_positions_short_all",
"managed_money_positions_short_old": "m_money_positions_short_old",
"managed_money_positions_short_other": "m_money_positions_short_other",
"managed_money_positions_spread": "m_money_positions_spread",
"managed_money_positions_spread_1": "m_money_positions_spread_1",
"managed_money_positions_spread_2": "m_money_positions_spread_2",
"non_commercial_positions_long_all": "noncomm_positions_long_all",
"non_commercial_positions_long_all_non_cit": "ncomm_postions_long_all_nocit",
"non_commercial_positions_long_old": "noncomm_positions_long_old",
"non_commercial_positions_long_other": "noncomm_positions_long_other",
"non_commercial_positions_short_all": "noncomm_positions_short_all",
"non_commercial_positions_short_all_non_cit": "ncomm_postions_short_all_nocit",
"non_commercial_positions_short_old": "noncomm_positions_short_old",
"non_commercial_positions_short_other": "noncomm_positions_short_other",
"non_commercial_positions_spread": "noncomm_positions_spread",
"non_commercial_positions_spread_1": "noncomm_positions_spread_1",
"non_commercial_positions_spread_all": "noncomm_postions_spread_all",
"non_commercial_positions_spread_all_non_cit": "ncomm_postions_spread_all_nocit",
"non_reportable_positions_long_all": "nonrept_positions_long_all",
"non_reportable_positions_long_old": "nonrept_positions_long_old",
"non_reportable_positions_long_other": "nonrept_positions_long_other",
"non_reportable_positions_short_all": "nonrept_positions_short_all",
"non_reportable_positions_short_old": "nonrept_positions_short_old",
"non_reportable_positions_short_other": "nonrept_positions_short_other",
"other_reportable_positions_long": "other_rept_positions_long",
"other_reportable_positions_long_1": "other_rept_positions_long_1",
"other_reportable_positions_long_2": "other_rept_positions_long_2",
"other_reportable_positions_short": "other_rept_positions_short",
"other_reportable_positions_short_1": "other_rept_positions_short_1",
"other_reportable_positions_short_2": "other_rept_positions_short_2",
"other_reportable_positions_spread": "other_rept_positions_spread",
"other_reportable_positions_spread_1": "other_rept_positions_spread_1",
"other_reportable_positions_spread_2": "other_rept_positions_spread_2",
"open_interest_pct_all": "pct_of_open_interest_all",
"open_interest_pct_asset_manager_long": "pct_of_oi_asset_mgr_long",
"open_interest_pct_asset_manager_short": "pct_of_oi_asset_mgr_short",
"open_interest_pct_asset_manager_spread": "pct_of_oi_asset_mgr_spread",
"open_interest_pct_commercial_long_all": "pct_of_oi_comm_long_all",
"open_interest_pct_commercial_long_old": "pct_of_oi_comm_long_old",
"open_interest_pct_commercial_long_other": "pct_of_oi_comm_long_other",
"open_interest_pct_commercial_short_all": "pct_of_oi_comm_short_all",
"open_interest_pct_commercial_short_old": "pct_of_oi_comm_short_old",
"open_interest_pct_commercial_short_other": "pct_of_oi_comm_short_other",
"open_interest_pct_dealer_long_all": "pct_of_oi_dealer_long_all",
"open_interest_pct_dealer_short_all": "pct_of_oi_dealer_short_all",
"open_interest_pct_dealer_spread_all": "pct_of_oi_dealer_spread_all",
"open_interest_pct_leveraged_funds_long": "pct_of_oi_lev_money_long",
"open_interest_pct_leveraged_funds_short": "pct_of_oi_lev_money_short",
"open_interest_pct_leveraged_funds_spread": "pct_of_oi_lev_money_spread",
"open_interest_pct_managed_money_long_all": "pct_of_oi_m_money_long_all",
"open_interest_pct_managed_money_long_old": "pct_of_oi_m_money_long_old",
"open_interest_pct_managed_money_long_other": "pct_of_oi_m_money_long_other",
"open_interest_pct_managed_money_short_all": "pct_of_oi_m_money_short_all",
"open_interest_pct_managed_money_short_old": "pct_of_oi_m_money_short_old",
"open_interest_pct_managed_money_short_other": "pct_of_oi_m_money_short_other",
"open_interest_pct_managed_money_spread": "pct_of_oi_m_money_spread",
"open_interest_pct_managed_money_spread_1": "pct_of_oi_m_money_spread_1",
"open_interest_pct_managed_money_spread_2": "pct_of_oi_m_money_spread_2",
"open_interest_pct_non_commercial_long_all": "pct_of_oi_noncomm_long_all",
"open_interest_pct_non_commercial_long_old": "pct_of_oi_noncomm_long_old",
"open_interest_pct_non_commercial_long_other": "pct_of_oi_noncomm_long_other",
"open_interest_pct_non_commercial_short_all": "pct_of_oi_noncomm_short_all",
"open_interest_pct_non_commercial_short_old": "pct_of_oi_noncomm_short_old",
"open_interest_pct_non_commercial_short_other": "pct_of_oi_noncomm_short_other",
"open_interest_pct_non_commercial_spread": "pct_of_oi_noncomm_spread",
"open_interest_pct_non_commercial_spread_1": "pct_of_oi_noncomm_spread_1",
"open_interest_pct_non_commercial_spread_2": "pct_of_oi_noncomm_spread_2",
"open_interest_pct_non_reportable_long_all": "pct_of_oi_nonrept_long_all",
"open_interest_pct_non_reportable_long_old": "pct_of_oi_nonrept_long_old",
"open_interest_pct_non_reportable_long_other": "pct_of_oi_nonrept_long_other",
"open_interest_pct_non_reportable_short_all": "pct_of_oi_nonrept_short_all",
"open_interest_pct_non_reportable_short_old": "pct_of_oi_nonrept_short_old",
"open_interest_pct_non_reportable_short_other": "pct_of_oi_nonrept_short_other",
"open_interest_pct_other_reportable_long": "pct_of_oi_other_rept_long",
"open_interest_pct_other_reportable_long_1": "pct_of_oi_other_rept_long_1",
"open_interest_pct_other_reportable_long_2": "pct_of_oi_other_rept_long_2",
"open_interest_pct_other_reportable_short": "pct_of_oi_other_rept_short",
"open_interest_pct_other_reportable_short_1": "pct_of_oi_other_rept_short_1",
"open_interest_pct_other_reportable_short_2": "pct_of_oi_other_rept_short_2",
"open_interest_pct_other_reportable_spread": "pct_of_oi_other_rept_spread",
"open_interest_pct_other_reportable_spread_1": "pct_of_oi_other_rept_spread_1",
"open_interest_pct_other_reportable_spread_2": "pct_of_oi_other_rept_spread_2",
"open_interest_pct_producer_merchant_long": "pct_of_oi_prod_merc_long",
"open_interest_pct_producer_merchant_long_1": "pct_of_oi_prod_merc_long_1",
"open_interest_pct_producer_merchant_long_2": "pct_of_oi_prod_merc_long_2",
"open_interest_pct_producer_merchant_short": "pct_of_oi_prod_merc_short",
"open_interest_pct_producer_merchant_short_1": "pct_of_oi_prod_merc_short_1",
"open_interest_pct_producer_merchant_short_2": "pct_of_oi_prod_merc_short_2",
"open_interest_pct_swap_long_all": "pct_of_oi_swap_long_all",
"open_interest_pct_swap_long_old": "pct_of_oi_swap_long_old",
"open_interest_pct_swap_long_other": "pct_of_oi_swap_long_other",
"open_interest_pct_swap_short_all": "pct_of_oi_swap_short_all",
"open_interest_pct_swap_short_old": "pct_of_oi_swap_short_old",
"open_interest_pct_swap_short_other": "pct_of_oi_swap_short_other",
"open_interest_pct_swap_spread_all": "pct_of_oi_swap_spread_all",
"open_interest_pct_swap_spread_old": "pct_of_oi_swap_spread_old",
"open_interest_pct_swap_spread_other": "pct_of_oi_swap_spread_other",
"open_interest_pct_total_reportable_long_all": "pct_of_oi_tot_rept_long_all",
"open_interest_pct_total_reportable_long_old": "pct_of_oi_tot_rept_long_old",
"open_interest_pct_total_reportable_long_other": "pct_of_oi_tot_rept_long_other",
"open_interest_pct_total_reportable_short": "pct_of_oi_tot_rept_short",
"open_interest_pct_total_reportable_short_1": "pct_of_oi_tot_rept_short_1",
"open_interest_pct_total_reportable_short_2": "pct_of_oi_tot_rept_short_2",
"open_interest_pct_commercial_long_all_non_cit": "pct_oi_comm_long_all_nocit",
"open_interest_pct_commercial_short_all_non_cit": "pct_oi_comm_short_all_nocit",
"open_interest_pct_non_commercial_long_all_non_cit": "pct_oi_noncomm_long_all_nocit",
"open_interest_pct_non_commercial_short_all_non_cit": "pct_oi_noncomm_short_all_nocit",
"open_interest_pct_non_commercial_spread_all_non_cit": "pct_oi_noncomm_spread_all_nocit",
"open_interest_pct_non_reportable_long_all_non_cit": "pct_oi_nonrept_long_all_nocit",
"open_interest_pct_non_reportable_short_all_non_cit": "pct_oi_nonrept_short_all_nocit",
"open_interest_pct_total_reportable_long_all_non_cit": "pct_oi_tot_rept_long_all_nocit",
"open_interest_pct_total_reportable_short_all_non_cit": "pct_oi_tot_rept_short_all_nocit",
"producer_merchant_positions_long": "prod_merc_positions_long",
"producer_merchant_positions_long_1": "prod_merc_positions_long_1",
"producer_merchant_positions_long_2": "prod_merc_positions_long_2",
"producer_merchant_positions_short": "prod_merc_positions_short",
"producer_merchant_positions_short_1": "prod_merc_positions_short_1",
"producer_merchant_positions_short_2": "prod_merc_positions_short_2",
"report_week": "yyyy_report_week_ww",
"total_reportable_positions_long_all": "tot_rept_positions_long_all",
"total_reportable_positions_long_old": "tot_rept_positions_long_old",
"total_reportable_positions_long_other": "tot_rept_positions_long_other",
"total_reportable_positions_short": "tot_rept_positions_short",
"total_reportable_positions_short_1": "tot_rept_positions_short_1",
"total_reportable_positions_short_2": "tot_rept_positions_short_2",
"traders_asset_manager_long_all": "traders_asset_mgr_long_all",
"traders_asset_manager_short_all": "traders_asset_mgr_short_all",
"traders_asset_manager_spread": "traders_asset_mgr_spread",
"traders_commercial_long_all": "traders_comm_long_all",
"traders_commercial_long_all_non_cit": "traders_comm_long_all_nocit",
"traders_commercial_long_old": "traders_comm_long_old",
"traders_commercial_long_other": "traders_comm_long_other",
"traders_commercial_short_all": "traders_comm_short_all",
"traders_commercial_short_all_non_cit": "traders_comm_short_all_nocit",
"traders_commercial_short_old": "traders_comm_short_old",
"traders_commercial_short_other": "traders_comm_short_other",
"traders_leveraged_funds_long_all": "traders_lev_money_long_all",
"traders_leveraged_funds_short_all": "traders_lev_money_short_all",
"traders_leveraged_funds_spread": "traders_lev_money_spread",
"traders_managed_money_long_all": "traders_m_money_long_all",
"traders_managed_money_long_old": "traders_m_money_long_old",
"traders_managed_money_long_other": "traders_m_money_long_other",
"traders_managed_money_short_all": "traders_m_money_short_all",
"traders_managed_money_short_old": "traders_m_money_short_old",
"traders_managed_money_short_other": "traders_m_money_short_other",
"traders_managed_money_spread_all": "traders_m_money_spread_all",
"traders_managed_money_spread_old": "traders_m_money_spread_old",
"traders_managed_money_spread_other": "traders_m_money_spread_other",
"traders_non_commercial_long_all": "traders_noncomm_long_all",
"traders_non_commercial_long_all_non_cit": "traders_noncomm_long_all_nocit",
"traders_non_commercial_long_old": "traders_noncomm_long_old",
"traders_non_commercial_long_other": "traders_noncomm_long_other",
"traders_non_commercial_short_all": "traders_noncomm_short_all",
"traders_non_commercial_short_all_non_cit": "traders_noncomm_short_all_nocit",
"traders_non_commercial_short_old": "traders_noncomm_short_old",
"traders_non_commercial_short_other": "traders_noncomm_short_other",
"traders_non_commercial_spread_all": "traders_noncomm_spread_all",
"traders_non_commercial_spread_all_non_cit": "traders_noncomm_spread_all_nocit",
"traders_non_commercial_spread_old": "traders_noncomm_spead_old",
"traders_non_commercial_spread_other": "traders_noncomm_spread_other",
"traders_other_reportable_long_all": "traders_other_rept_long_all",
"traders_other_reportable_long_old": "traders_other_rept_long_old",
"traders_other_reportable_long_other": "traders_other_rept_long_other",
"traders_other_reportable_short": "traders_other_rept_short",
"traders_other_reportable_short_1": "traders_other_rept_short_1",
"traders_other_reportable_short_2": "traders_other_rept_short_2",
"traders_other_reportable_spread": "traders_other_rept_spread",
"traders_other_reportable_spread_1": "traders_other_rept_spread_1",
"traders_other_reportable_spread_2": "traders_other_rept_spread_2",
"traders_producer_merchant_long_all": "traders_prod_merc_long_all",
"traders_producer_merchant_long_old": "traders_prod_merc_long_old",
"traders_producer_merchant_long_other": "traders_prod_merc_long_other",
"traders_producer_merchant_short_all": "traders_prod_merc_short_all",
"traders_producer_merchant_short_old": "traders_prod_merc_short_old",
"traders_producer_merchant_short_other": "traders_prod_merc_short_other",
"traders_total_all": "traders_tot_all",
"traders_total_old": "traders_tot_old",
"traders_total_other": "traders_tot_other",
"traders_total_reportable_long_all": "traders_tot_rept_long_all",
"traders_total_reportable_long_all_non_cit": "traders_tot_rept_long_all_nocit",
"traders_total_reportable_long_old": "traders_tot_rept_long_old",
"traders_total_reportable_long_other": "traders_tot_rept_long_other",
"traders_total_reportable_short_all": "traders_tot_rept_short_all",
"traders_total_reportable_short_all_non_cit": "traders_tot_rept_short_all_nocit",
"traders_total_reportable_short_old": "traders_tot_rept_short_old",
"traders_total_reportable_short_other": "traders_tot_rept_short_other",
}
__alias_dict__.update(
{
"open_interest_pct_old": "pct_of_open_interest_old",
"open_interest_pct_other": "pct_of_open_interest_other",
"open_interest_pct_cit_long_all": "pct_oi_cit_long_all",
"open_interest_pct_cit_short_all": "pct_oi_cit_short_all",
}
)
date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", ""))
report_week: str | None = Field(
default=None, description="Report week for the year."
)
market_and_exchange_names: str | None = Field(
default=None, description="Market and exchange names."
)
cftc_contract_market_code: str | None = Field(
default=None,
description="CFTC contract market code.",
json_schema_extra={
"x-widget_config": {"cellDataType": "text", "formatterFn": "none"}
},
)
cftc_market_code: str | None = Field(
default=None,
description="CFTC market code.",
json_schema_extra={
"x-widget_config": {"cellDataType": "text", "formatterFn": "none"}
},
)
cftc_region_code: str | None = Field(
default=None,
description="CFTC region code.",
json_schema_extra={
"x-widget_config": {"cellDataType": "text", "formatterFn": "none"}
},
)
cftc_commodity_code: str | None = Field(
default=None,
description="CFTC commodity code.",
json_schema_extra={
"x-widget_config": {"cellDataType": "text", "formatterFn": "none"}
},
)
cftc_contract_market_code_quotes: str | None = Field(
default=None,
description="CFTC contract market code quotes.",
json_schema_extra={
"x-widget_config": {"cellDataType": "text", "formatterFn": "none"}
},
)
cftc_market_code_quotes: str | None = Field(
default=None,
description="CFTC market code quotes.",
json_schema_extra={
"x-widget_config": {"cellDataType": "text", "formatterFn": "none"}
},
)
cftc_commodity_code_quotes: str | None = Field(
default=None,
description="CFTC commodity code quotes.",
json_schema_extra={
"x-widget_config": {"cellDataType": "text", "formatterFn": "none"}
},
)
cftc_subgroup_code: str | None = Field(
default=None,
description="CFTC subgroup code.",
json_schema_extra={
"x-widget_config": {"cellDataType": "text", "formatterFn": "none"}
},
)
commodity: str | None = Field(default=None, description="Commodity.")
commodity_group: str | None = Field(
default=None, description="Commodity group name."
)
commodity_subgroup: str | None = Field(
default=None, description="Commodity subgroup name."
)
futonly_or_combined: str | None = Field(
default=None, description="If the report is futures-only or combined."
)
contract_units: str | None = Field(default=None, description="Contract units.")
contract_market_name: str | None = Field(
default=None, description="Short contract market name."
)
open_interest_all: int | None = Field(
default=None, description="Total open interest, all contracts."
)
open_interest_old: int | None = Field(
default=None,
description="Total open interest, old crop year. Legacy/Disaggregated reports.",
)
open_interest_other: int | None = Field(
default=None,
description="Total open interest, other crop year. Legacy/Disaggregated reports.",
)
non_commercial_positions_long_all: int | None = Field(
default=None,
description="Non-commercial long positions, all contracts. Legacy report.",
)
non_commercial_positions_short_all: int | None = Field(
default=None,
description="Non-commercial short positions, all contracts. Legacy report.",
)
non_commercial_positions_spread_all: int | None = Field(
default=None,
description="Non-commercial spreading positions, all contracts. Legacy report.",
)
non_commercial_positions_long_old: int | None = Field(
default=None,
description="Non-commercial long positions, old crop year. Legacy report.",
)
non_commercial_positions_short_old: int | None = Field(
default=None,
description="Non-commercial short positions, old crop year. Legacy report.",
)
non_commercial_positions_spread: int | None = Field(
default=None,
description="Non-commercial spreading positions, old crop year. Legacy report.",
)
non_commercial_positions_long_other: int | None = Field(
default=None,
description="Non-commercial long positions, other crop year. Legacy report.",
)
non_commercial_positions_short_other: int | None = Field(
default=None,
description="Non-commercial short positions, other crop year. Legacy report.",
)
non_commercial_positions_spread_1: int | None = Field(
default=None,
description="Non-commercial spreading positions, other crop year. Legacy report.",
)
commercial_positions_long_all: int | None = Field(
default=None,
description="Commercial long positions, all contracts. Legacy report.",
)
commercial_positions_short_all: int | None = Field(
default=None,
description="Commercial short positions, all contracts. Legacy report.",
)
commercial_positions_long_old: int | None = Field(
default=None,
description="Commercial long positions, old crop year. Legacy report.",
)
commercial_positions_short_old: int | None = Field(
default=None,
description="Commercial short positions, old crop year. Legacy report.",
)
commercial_positions_long_other: int | None = Field(
default=None,
description="Commercial long positions, other crop year. Legacy report.",
)
commercial_positions_short_other: int | None = Field(
default=None,
description="Commercial short positions, other crop year. Legacy report.",
)
producer_merchant_positions_long: int | None = Field(
default=None,
description="Producer/merchant long positions, all contracts. Disaggregated report.",
)
producer_merchant_positions_short: int | None = Field(
default=None,
description="Producer/merchant short positions, all contracts. Disaggregated report.",
)
producer_merchant_positions_long_1: int | None = Field(
default=None,
description="Producer/merchant long positions, old crop year. Disaggregated report.",
)
producer_merchant_positions_short_1: int | None = Field(
default=None,
description="Producer/merchant short positions, old crop year. Disaggregated report.",
)
producer_merchant_positions_long_2: int | None = Field(
default=None,
description="Producer/merchant long positions, other crop year. Disaggregated report.",
)
producer_merchant_positions_short_2: int | None = Field(
default=None,
description="Producer/merchant short positions, other crop year. Disaggregated report.",
)
swap_positions_long_all: int | None = Field(
default=None,
description="Swap dealer long positions, all contracts. Disaggregated report.",
)
swap_positions_short_all: int | None = Field(
default=None,
description="Swap dealer short positions, all contracts. Disaggregated report.",
)
swap_positions_spread_all: int | None = Field(
default=None,
description="Swap dealer spreading positions, all contracts. Disaggregated report.",
)
swap_positions_long_old: int | None = Field(
default=None,
description="Swap dealer long positions, old crop year. Disaggregated report.",
)
swap_positions_short_old: int | None = Field(
default=None,
description="Swap dealer short positions, old crop year. Disaggregated report.",
)
swap_positions_spread_old: int | None = Field(
default=None,
description="Swap dealer spreading positions, old crop year. Disaggregated report.",
)
swap_positions_long_other: int | None = Field(
default=None,
description="Swap dealer long positions, other crop year. Disaggregated report.",
)
swap_positions_short_other: int | None = Field(
default=None,
description="Swap dealer short positions, other crop year. Disaggregated report.",
)
swap_positions_spread_other: int | None = Field(
default=None,
description="Swap dealer spreading positions, other crop year. Disaggregated report.",
)
managed_money_positions_long_all: int | None = Field(
default=None,
description="Managed money long positions, all contracts. Disaggregated report.",
)
managed_money_positions_short_all: int | None = Field(
default=None,
description="Managed money short positions, all contracts. Disaggregated report.",
)
managed_money_positions_spread: int | None = Field(
default=None,
description="Managed money spreading positions, all contracts. Disaggregated report.",
)
managed_money_positions_long_old: int | None = Field(
default=None,
description="Managed money long positions, old crop year. Disaggregated report.",
)
managed_money_positions_short_old: int | None = Field(
default=None,
description="Managed money short positions, old crop year. Disaggregated report.",
)
managed_money_positions_spread_1: int | None = Field(
default=None,
description="Managed money spreading positions, old crop year. Disaggregated report.",
)
managed_money_positions_long_other: int | None = Field(
default=None,
description="Managed money long positions, other crop year. Disaggregated report.",
)
managed_money_positions_short_other: int | None = Field(
default=None,
description="Managed money short positions, other crop year. Disaggregated report.",
)
managed_money_positions_spread_2: int | None = Field(
default=None,
description="Managed money spreading positions, other crop year. Disaggregated report.",
)
dealer_positions_long_all: int | None = Field(
default=None,
description="Dealer/intermediary long positions, all contracts. TFF report.",
)
dealer_positions_short_all: int | None = Field(
default=None,
description="Dealer/intermediary short positions, all contracts. TFF report.",
)
dealer_positions_spread_all: int | None = Field(
default=None,
description="Dealer/intermediary spreading positions, all contracts. TFF report.",
)
asset_manager_positions_long: int | None = Field(
default=None,
description="Asset manager/institutional long positions, all contracts. TFF report.",
)
asset_manager_positions_short: int | None = Field(
default=None,
description="Asset manager/institutional short positions, all contracts. TFF report.",
)
asset_manager_positions_spread: int | None = Field(
default=None,
description="Asset manager/institutional spreading positions, all contracts. TFF report.",
)
leveraged_funds_positions_long: int | None = Field(
default=None,
description="Leveraged funds long positions, all contracts. TFF report.",
)
leveraged_funds_positions_short: int | None = Field(
default=None,
description="Leveraged funds short positions, all contracts. TFF report.",
)
leveraged_funds_positions_spread: int | None = Field(
default=None,
description="Leveraged funds spreading positions, all contracts. TFF report.",
)
other_reportable_positions_long: int | None = Field(
default=None,
description="Other reportable long positions, all contracts. Disaggregated/TFF reports.",
)
other_reportable_positions_short: int | None = Field(
default=None,
description="Other reportable short positions, all contracts. Disaggregated/TFF reports.",
)
other_reportable_positions_spread: int | None = Field(
default=None,
description="Other reportable spreading positions, all contracts. Disaggregated/TFF reports.",
)
other_reportable_positions_long_1: int | None = Field(
default=None,
description="Other reportable long positions, old crop year. Disaggregated report.",
)
other_reportable_positions_short_1: int | None = Field(
default=None,
description="Other reportable short positions, old crop year. Disaggregated report.",
)
other_reportable_positions_spread_1: int | None = Field(
default=None,
description="Other reportable spreading positions, old crop year. Disaggregated report.",
)
other_reportable_positions_long_2: int | None = Field(
default=None,
description="Other reportable long positions, other crop year. Disaggregated report.",
)
other_reportable_positions_short_2: int | None = Field(
default=None,
description="Other reportable short positions, other crop year. Disaggregated report.",
)
other_reportable_positions_spread_2: int | None = Field(
default=None,
description="Other reportable spreading positions, other crop year. Disaggregated report.",
)
non_commercial_positions_long_all_non_cit: int | None = Field(
default=None,
description="Non-commercial long positions excluding CIT, all contracts. Supplemental report.",
)
non_commercial_positions_short_all_non_cit: int | None = Field(
default=None,
description="Non-commercial short positions excluding CIT, all contracts. Supplemental report.",
)
non_commercial_positions_spread_all_non_cit: int | None = Field(
default=None,
description="Non-commercial spreading positions excluding CIT, all contracts. Supplemental report.",
)
commercial_positions_long_all_non_cit: int | None = Field(
default=None,
description="Commercial long positions excluding CIT, all contracts. Supplemental report.",
)
commercial_positions_short_all_non_cit: int | None = Field(
default=None,
description="Commercial short positions excluding CIT, all contracts. Supplemental report.",
)
cit_positions_long_all: int | None = Field(
default=None,
description="Commodity index trader (CIT) long positions, all contracts. Supplemental report.",
)
cit_positions_short_all: int | None = Field(
default=None,
description="Commodity index trader (CIT) short positions, all contracts. Supplemental report.",
)
total_reportable_positions_long_all: int | None = Field(
default=None, description="Total reportable long positions, all contracts."
)
total_reportable_positions_short: int | None = Field(
default=None, description="Total reportable short positions, all contracts."
)
total_reportable_positions_long_old: int | None = Field(
default=None,
description="Total reportable long positions, old crop year. Legacy/Disaggregated reports.",
)
total_reportable_positions_short_1: int | None = Field(
default=None,
description="Total reportable short positions, old crop year. Legacy/Disaggregated reports.",
)
total_reportable_positions_long_other: int | None = Field(
default=None,
description="Total reportable long positions, other crop year. Legacy/Disaggregated reports.",
)
total_reportable_positions_short_2: int | None = Field(
default=None,
description="Total reportable short positions, other crop year. Legacy/Disaggregated reports.",
)
non_reportable_positions_long_all: int | None = Field(
default=None, description="Non-reportable long positions, all contracts."
)
non_reportable_positions_short_all: int | None = Field(
default=None, description="Non-reportable short positions, all contracts."
)
non_reportable_positions_long_old: int | None = Field(
default=None,
description="Non-reportable long positions, old crop year. Legacy/Disaggregated reports.",
)
non_reportable_positions_short_old: int | None = Field(
default=None,
description="Non-reportable short positions, old crop year. Legacy/Disaggregated reports.",
)
non_reportable_positions_long_other: int | None = Field(
default=None,
description="Non-reportable long positions, other crop year. Legacy/Disaggregated reports.",
)
non_reportable_positions_short_other: int | None = Field(
default=None,
description="Non-reportable short positions, other crop year. Legacy/Disaggregated reports.",
)
change_in_open_interest_all: int | None = Field(
default=None, description="Weekly change in total open interest, all contracts."
)
change_open_interest_all: int | None = Field(
default=None,
description="Weekly change in total open interest, all contracts. Supplemental report.",
)
change_in_non_commercial_long_all: int | None = Field(
default=None,
description="Weekly change in non-commercial long positions. Legacy report.",
)
change_in_non_commercial_short_all: int | None = Field(
default=None,
description="Weekly change in non-commercial short positions. Legacy report.",
)
change_in_non_commercial_spread_all: int | None = Field(
default=None,
description="Weekly change in non-commercial spreading positions. Legacy report.",
)
change_in_commercial_long_all: int | None = Field(
default=None,
description="Weekly change in commercial long positions. Legacy report.",
)
change_in_commercial_short_all: int | None = Field(
default=None,
description="Weekly change in commercial short positions. Legacy report.",
)
change_in_producer_merchant_long: int | None = Field(
default=None,
description="Weekly change in producer/merchant long positions. Disaggregated report.",
)
change_in_producer_merchant_short: int | None = Field(
default=None,
description="Weekly change in producer/merchant short positions. Disaggregated report.",
)
change_in_swap_long_all: int | None = Field(
default=None,
description="Weekly change in swap dealer long positions. Disaggregated report.",
)
change_in_swap_short_all: int | None = Field(
default=None,
description="Weekly change in swap dealer short positions. Disaggregated report.",
)
change_in_swap_spread_all: int | None = Field(
default=None,
description="Weekly change in swap dealer spreading positions. Disaggregated report.",
)
change_in_managed_money_long_all: int | None = Field(
default=None,
description="Weekly change in managed money long positions. Disaggregated report.",
)
change_in_managed_money_short_all: int | None = Field(
default=None,
description="Weekly change in managed money short positions. Disaggregated report.",
)
change_in_managed_money_spread: int | None = Field(
default=None,
description="Weekly change in managed money spreading positions. Disaggregated report.",
)
change_in_dealer_long_all: int | None = Field(
default=None,
description="Weekly change in dealer/intermediary long positions. TFF report.",
)
change_in_dealer_short_all: int | None = Field(
default=None,
description="Weekly change in dealer/intermediary short positions. TFF report.",
)
change_in_dealer_spread_all: int | None = Field(
default=None,
description="Weekly change in dealer/intermediary spreading positions. TFF report.",
)
change_in_asset_manager_long: int | None = Field(
default=None,
description="Weekly change in asset manager/institutional long positions. TFF report.",
)
change_in_asset_manager_short: int | None = Field(
default=None,
description="Weekly change in asset manager/institutional short positions. TFF report.",
)
change_in_asset_manager_spread: int | None = Field(
default=None,
description="Weekly change in asset manager/institutional spreading positions. TFF report.",
)
change_in_leveraged_funds_long: int | None = Field(
default=None,
description="Weekly change in leveraged funds long positions. TFF report.",
)
change_in_leveraged_funds_short: int | None = Field(
default=None,
description="Weekly change in leveraged funds short positions. TFF report.",
)
change_in_leveraged_funds_spread: int | None = Field(
default=None,
description="Weekly change in leveraged funds spreading positions. TFF report.",
)
change_in_other_reportable_long: int | None = Field(
default=None,
description="Weekly change in other reportable long positions. Disaggregated/TFF reports.",
)
change_in_other_reportable_short: int | None = Field(
default=None,
description="Weekly change in other reportable short positions. Disaggregated/TFF reports.",
)
change_in_other_reportable_spread: int | None = Field(
default=None,
description="Weekly change in other reportable spreading positions. Disaggregated/TFF reports.",
)
change_non_commercial_long_all_non_cit: int | None = Field(
default=None,
description="Weekly change in non-commercial long positions excluding CIT. Supplemental report.",
)
change_non_commercial_short_all_non_cit: int | None = Field(
default=None,
description="Weekly change in non-commercial short positions excluding CIT. Supplemental report.",
)
change_non_commercial_spread_all_non_cit: int | None = Field(
default=None,
description="Weekly change in non-commercial spreading positions excluding CIT. Supplemental report.",
)
change_commercial_long_all_non_cit: int | None = Field(
default=None,
description="Weekly change in commercial long positions excluding CIT. Supplemental report.",
)
change_commercial_short_all_non_cit: int | None = Field(
default=None,
description="Weekly change in commercial short positions excluding CIT. Supplemental report.",
)
change_cit_long_all: int | None = Field(
default=None,
description="Weekly change in commodity index trader long positions. Supplemental report.",
)
change_cit_short_all: int | None = Field(
default=None,
description="Weekly change in commodity index trader short positions. Supplemental report.",
)
change_in_total_reportable_long_all: int | None = Field(
default=None, description="Weekly change in total reportable long positions."
)
change_in_total_reportable_short: int | None = Field(
default=None, description="Weekly change in total reportable short positions."
)
change_total_reportable_long_all: int | None = Field(
default=None,
description="Weekly change in total reportable long positions. Supplemental report.",
)
change_total_reportable_short_all: int | None = Field(
default=None,
description="Weekly change in total reportable short positions. Supplemental report.",
)
change_in_non_reportable_long_all: int | None = Field(
default=None, description="Weekly change in non-reportable long positions."
)
change_in_non_reportable_short_all: int | None = Field(
default=None, description="Weekly change in non-reportable short positions."
)
change_non_reportable_long_all: int | None = Field(
default=None,
description="Weekly change in non-reportable long positions. Supplemental report.",
)
change_non_reportable_short_all: int | None = Field(
default=None,
description="Weekly change in non-reportable short positions. Supplemental report.",
)
open_interest_pct_all: float | None = Field(
default=None,
description="Percent of total open interest, all contracts.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_old: float | None = Field(
default=None,
description="Percent of total open interest, old crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other: float | None = Field(
default=None,
description="Percent of total open interest, other crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_long_all: float | None = Field(
default=None,
description="Non-commercial long as percent of open interest, all contracts. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_short_all: float | None = Field(
default=None,
description="Non-commercial short as percent of open interest, all contracts. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_spread: float | None = Field(
default=None,
description="Non-commercial spreading as percent of open interest, all contracts. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_long_old: float | None = Field(
default=None,
description="Non-commercial long as percent of open interest, old crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_short_old: float | None = Field(
default=None,
description="Non-commercial short as percent of open interest, old crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_spread_1: float | None = Field(
default=None,
description="Non-commercial spreading as percent of open interest, old crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_long_other: float | None = Field(
default=None,
description="Non-commercial long as percent of open interest, other crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_short_other: float | None = Field(
default=None,
description="Non-commercial short as percent of open interest, other crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_spread_2: float | None = Field(
default=None,
description="Non-commercial spreading as percent of open interest, other crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_commercial_long_all: float | None = Field(
default=None,
description="Commercial long as percent of open interest, all contracts. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_commercial_short_all: float | None = Field(
default=None,
description="Commercial short as percent of open interest, all contracts. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_commercial_long_old: float | None = Field(
default=None,
description="Commercial long as percent of open interest, old crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_commercial_short_old: float | None = Field(
default=None,
description="Commercial short as percent of open interest, old crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_commercial_long_other: float | None = Field(
default=None,
description="Commercial long as percent of open interest, other crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_commercial_short_other: float | None = Field(
default=None,
description="Commercial short as percent of open interest, other crop year. Legacy report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_producer_merchant_long: float | None = Field(
default=None,
description="Producer/merchant long as percent of open interest, all contracts. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_producer_merchant_short: float | None = Field(
default=None,
description="Producer/merchant short as percent of open interest, all contracts. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_producer_merchant_long_1: float | None = Field(
default=None,
description="Producer/merchant long as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_producer_merchant_short_1: float | None = Field(
default=None,
description="Producer/merchant short as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_producer_merchant_long_2: float | None = Field(
default=None,
description="Producer/merchant long as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_producer_merchant_short_2: float | None = Field(
default=None,
description="Producer/merchant short as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_long_all: float | None = Field(
default=None,
description="Swap dealer long as percent of open interest, all contracts. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_short_all: float | None = Field(
default=None,
description="Swap dealer short as percent of open interest, all contracts. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_spread_all: float | None = Field(
default=None,
description="Swap dealer spreading as percent of open interest, all contracts. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_long_old: float | None = Field(
default=None,
description="Swap dealer long as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_short_old: float | None = Field(
default=None,
description="Swap dealer short as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_spread_old: float | None = Field(
default=None,
description="Swap dealer spreading as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_long_other: float | None = Field(
default=None,
description="Swap dealer long as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_short_other: float | None = Field(
default=None,
description="Swap dealer short as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_swap_spread_other: float | None = Field(
default=None,
description="Swap dealer spreading as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_long_all: float | None = Field(
default=None,
description="Managed money long as percent of open interest, all contracts. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_short_all: float | None = Field(
default=None,
description="Managed money short as percent of open interest, all contracts. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_spread: float | None = Field(
default=None,
description="Managed money spreading as percent of open interest, all contracts. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_long_old: float | None = Field(
default=None,
description="Managed money long as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_short_old: float | None = Field(
default=None,
description="Managed money short as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_spread_1: float | None = Field(
default=None,
description="Managed money spreading as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_long_other: float | None = Field(
default=None,
description="Managed money long as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_short_other: float | None = Field(
default=None,
description="Managed money short as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_managed_money_spread_2: float | None = Field(
default=None,
description="Managed money spreading as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_dealer_long_all: float | None = Field(
default=None,
description="Dealer/intermediary long as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_dealer_short_all: float | None = Field(
default=None,
description="Dealer/intermediary short as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_dealer_spread_all: float | None = Field(
default=None,
description="Dealer/intermediary spreading as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_asset_manager_long: float | None = Field(
default=None,
description="Asset manager/institutional long as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_asset_manager_short: float | None = Field(
default=None,
description="Asset manager/institutional short as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_asset_manager_spread: float | None = Field(
default=None,
description="Asset manager/institutional spreading as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_leveraged_funds_long: float | None = Field(
default=None,
description="Leveraged funds long as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_leveraged_funds_short: float | None = Field(
default=None,
description="Leveraged funds short as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_leveraged_funds_spread: float | None = Field(
default=None,
description="Leveraged funds spreading as percent of open interest, all contracts. TFF report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_long: float | None = Field(
default=None,
description="Other reportable long as percent of open interest, all contracts. Disaggregated/TFF reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_short: float | None = Field(
default=None,
description="Other reportable short as percent of open interest, all contracts. Disaggregated/TFF reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_spread: float | None = Field(
default=None,
description="Other reportable spreading as percent of open interest, all contracts. Disaggregated/TFF reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_long_1: float | None = Field(
default=None,
description="Other reportable long as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_short_1: float | None = Field(
default=None,
description="Other reportable short as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_spread_1: float | None = Field(
default=None,
description="Other reportable spreading as percent of open interest, old crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_long_2: float | None = Field(
default=None,
description="Other reportable long as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_short_2: float | None = Field(
default=None,
description="Other reportable short as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_other_reportable_spread_2: float | None = Field(
default=None,
description="Other reportable spreading as percent of open interest, other crop year. Disaggregated report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_long_all_non_cit: float | None = Field(
default=None,
description="Non-commercial long excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_short_all_non_cit: float | None = Field(
default=None,
description="Non-commercial short excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_commercial_spread_all_non_cit: float | None = Field(
default=None,
description="Non-commercial spreading excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_commercial_long_all_non_cit: float | None = Field(
default=None,
description="Commercial long excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_commercial_short_all_non_cit: float | None = Field(
default=None,
description="Commercial short excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_cit_long_all: float | None = Field(
default=None,
description="Commodity index trader long as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_cit_short_all: float | None = Field(
default=None,
description="Commodity index trader short as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_total_reportable_long_all_non_cit: float | None = Field(
default=None,
description="Total reportable long excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_total_reportable_short_all_non_cit: float | None = Field(
default=None,
description="Total reportable short excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_reportable_long_all_non_cit: float | None = Field(
default=None,
description="Non-reportable long excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_reportable_short_all_non_cit: float | None = Field(
default=None,
description="Non-reportable short excluding CIT as percent of open interest. Supplemental report.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_total_reportable_long_all: float | None = Field(
default=None,
description="Total reportable long as percent of open interest, all contracts.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_total_reportable_short: float | None = Field(
default=None,
description="Total reportable short as percent of open interest, all contracts.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_total_reportable_long_old: float | None = Field(
default=None,
description="Total reportable long as percent of open interest, old crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_total_reportable_short_1: float | None = Field(
default=None,
description="Total reportable short as percent of open interest, old crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_total_reportable_long_other: float | None = Field(
default=None,
description="Total reportable long as percent of open interest, other crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_total_reportable_short_2: float | None = Field(
default=None,
description="Total reportable short as percent of open interest, other crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_reportable_long_all: float | None = Field(
default=None,
description="Non-reportable long as percent of open interest, all contracts.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_reportable_short_all: float | None = Field(
default=None,
description="Non-reportable short as percent of open interest, all contracts.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_reportable_long_old: float | None = Field(
default=None,
description="Non-reportable long as percent of open interest, old crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_reportable_short_old: float | None = Field(
default=None,
description="Non-reportable short as percent of open interest, old crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_reportable_long_other: float | None = Field(
default=None,
description="Non-reportable long as percent of open interest, other crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
open_interest_pct_non_reportable_short_other: float | None = Field(
default=None,
description="Non-reportable short as percent of open interest, other crop year. Legacy/Disaggregated reports.",
json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100},
)
traders_total_all: int | None = Field(
default=None, description="Total number of reportable traders, all contracts."
)
traders_total_old: int | None = Field(
default=None,
description="Total number of reportable traders, old crop year. Legacy/Disaggregated reports.",
)
traders_total_other: int | None = Field(
default=None,
description="Total number of reportable traders, other crop year. Legacy/Disaggregated reports.",
)
traders_non_commercial_long_all: int | None = Field(
default=None,
description="Number of non-commercial long traders, all contracts. Legacy report.",
)
traders_non_commercial_short_all: int | None = Field(
default=None,
description="Number of non-commercial short traders, all contracts. Legacy report.",
)
traders_non_commercial_spread_all: int | None = Field(
default=None,
description="Number of non-commercial spreading traders, all contracts. Legacy report.",
)
traders_non_commercial_long_old: int | None = Field(
default=None,
description="Number of non-commercial long traders, old crop year. Legacy report.",
)
traders_non_commercial_short_old: int | None = Field(
default=None,
description="Number of non-commercial short traders, old crop year. Legacy report.",
)
traders_non_commercial_spread_old: int | None = Field(
default=None,
description="Number of non-commercial spreading traders, old crop year. Legacy report.",
)
traders_non_commercial_long_other: int | None = Field(
default=None,
description="Number of non-commercial long traders, other crop year. Legacy report.",
)
traders_non_commercial_short_other: int | None = Field(
default=None,
description="Number of non-commercial short traders, other crop year. Legacy report.",
)
traders_non_commercial_spread_other: int | None = Field(
default=None,
description="Number of non-commercial spreading traders, other crop year. Legacy report.",
)
traders_commercial_long_all: int | None = Field(
default=None,
description="Number of commercial long traders, all contracts. Legacy report.",
)
traders_commercial_short_all: int | None = Field(
default=None,
description="Number of commercial short traders, all contracts. Legacy report.",
)
traders_commercial_long_old: int | None = Field(
default=None,
description="Number of commercial long traders, old crop year. Legacy report.",
)
traders_commercial_short_old: int | None = Field(
default=None,
description="Number of commercial short traders, old crop year. Legacy report.",
)
traders_commercial_long_other: int | None = Field(
default=None,
description="Number of commercial long traders, other crop year. Legacy report.",
)
traders_commercial_short_other: int | None = Field(
default=None,
description="Number of commercial short traders, other crop year. Legacy report.",
)
traders_producer_merchant_long_all: int | None = Field(
default=None,
description="Number of producer/merchant long traders, all contracts. Disaggregated report.",
)
traders_producer_merchant_short_all: int | None = Field(
default=None,
description="Number of producer/merchant short traders, all contracts. Disaggregated report.",
)
traders_producer_merchant_long_old: int | None = Field(
default=None,
description="Number of producer/merchant long traders, old crop year. Disaggregated report.",
)
traders_producer_merchant_short_old: int | None = Field(
default=None,
description="Number of producer/merchant short traders, old crop year. Disaggregated report.",
)
traders_producer_merchant_long_other: int | None = Field(
default=None,
description="Number of producer/merchant long traders, other crop year. Disaggregated report.",
)
traders_producer_merchant_short_other: int | None = Field(
default=None,
description="Number of producer/merchant short traders, other crop year. Disaggregated report.",
)
traders_swap_long_all: int | None = Field(
default=None,
description="Number of swap dealer long traders, all contracts. Disaggregated report.",
)
traders_swap_short_all: int | None = Field(
default=None,
description="Number of swap dealer short traders, all contracts. Disaggregated report.",
)
traders_swap_spread_all: int | None = Field(
default=None,
description="Number of swap dealer spreading traders, all contracts. Disaggregated report.",
)
traders_swap_long_old: int | None = Field(
default=None,
description="Number of swap dealer long traders, old crop year. Disaggregated report.",
)
traders_swap_short_old: int | None = Field(
default=None,
description="Number of swap dealer short traders, old crop year. Disaggregated report.",
)
traders_swap_spread_old: int | None = Field(
default=None,
description="Number of swap dealer spreading traders, old crop year. Disaggregated report.",
)
traders_swap_long_other: int | None = Field(
default=None,
description="Number of swap dealer long traders, other crop year. Disaggregated report.",
)
traders_swap_short_other: int | None = Field(
default=None,
description="Number of swap dealer short traders, other crop year. Disaggregated report.",
)
traders_swap_spread_other: int | None = Field(
default=None,
description="Number of swap dealer spreading traders, other crop year. Disaggregated report.",
)
traders_managed_money_long_all: int | None = Field(
default=None,
description="Number of managed money long traders, all contracts. Disaggregated report.",
)
traders_managed_money_short_all: int | None = Field(
default=None,
description="Number of managed money short traders, all contracts. Disaggregated report.",
)
traders_managed_money_spread_all: int | None = Field(
default=None,
description="Number of managed money spreading traders, all contracts. Disaggregated report.",
)
traders_managed_money_long_old: int | None = Field(
default=None,
description="Number of managed money long traders, old crop year. Disaggregated report.",
)
traders_managed_money_short_old: int | None = Field(
default=None,
description="Number of managed money short traders, old crop year. Disaggregated report.",
)
traders_managed_money_spread_old: int | None = Field(
default=None,
description="Number of managed money spreading traders, old crop year. Disaggregated report.",
)
traders_managed_money_long_other: int | None = Field(
default=None,
description="Number of managed money long traders, other crop year. Disaggregated report.",
)
traders_managed_money_short_other: int | None = Field(
default=None,
description="Number of managed money short traders, other crop year. Disaggregated report.",
)
traders_managed_money_spread_other: int | None = Field(
default=None,
description="Number of managed money spreading traders, other crop year. Disaggregated report.",
)
traders_dealer_long_all: int | None = Field(
default=None,
description="Number of dealer/intermediary long traders, all contracts. TFF report.",
)
traders_dealer_short_all: int | None = Field(
default=None,
description="Number of dealer/intermediary short traders, all contracts. TFF report.",
)
traders_dealer_spread_all: int | None = Field(
default=None,
description="Number of dealer/intermediary spreading traders, all contracts. TFF report.",
)
traders_asset_manager_long_all: int | None = Field(
default=None,
description="Number of asset manager/institutional long traders, all contracts. TFF report.",
)
traders_asset_manager_short_all: int | None = Field(
default=None,
description="Number of asset manager/institutional short traders, all contracts. TFF report.",
)
traders_asset_manager_spread: int | None = Field(
default=None,
description="Number of asset manager/institutional spreading traders, all contracts. TFF report.",
)
traders_leveraged_funds_long_all: int | None = Field(
default=None,
description="Number of leveraged funds long traders, all contracts. TFF report.",
)
traders_leveraged_funds_short_all: int | None = Field(
default=None,
description="Number of leveraged funds short traders, all contracts. TFF report.",
)
traders_leveraged_funds_spread: int | None = Field(
default=None,
description="Number of leveraged funds spreading traders, all contracts. TFF report.",
)
traders_other_reportable_long_all: int | None = Field(
default=None,
description="Number of other reportable long traders, all contracts. Disaggregated/TFF reports.",
)
traders_other_reportable_short: int | None = Field(
default=None,
description="Number of other reportable short traders, all contracts. Disaggregated/TFF reports.",
)
traders_other_reportable_spread: int | None = Field(
default=None,
description="Number of other reportable spreading traders, all contracts. Disaggregated report.",
)
traders_other_reportable_long_old: int | None = Field(
default=None,
description="Number of other reportable long traders, old crop year. Disaggregated report.",
)
traders_other_reportable_short_1: int | None = Field(
default=None,
description="Number of other reportable short traders, old crop year. Disaggregated report.",
)
traders_other_reportable_spread_1: int | None = Field(
default=None,
description="Number of other reportable spreading traders, old crop year. Disaggregated report.",
)
traders_other_reportable_long_other: int | None = Field(
default=None,
description="Number of other reportable long traders, other crop year. Disaggregated report.",
)
traders_other_reportable_short_2: int | None = Field(
default=None,
description="Number of other reportable short traders, other crop year. Disaggregated report.",
)
traders_other_reportable_spread_2: int | None = Field(
default=None,
description="Number of other reportable spreading traders, other crop year. Disaggregated report.",
)
traders_non_commercial_long_all_non_cit: int | None = Field(
default=None,
description="Number of non-commercial long traders excluding CIT. Supplemental report.",
)
traders_non_commercial_short_all_non_cit: int | None = Field(
default=None,
description="Number of non-commercial short traders excluding CIT. Supplemental report.",
)
traders_non_commercial_spread_all_non_cit: int | None = Field(
default=None,
description="Number of non-commercial spreading traders excluding CIT. Supplemental report.",
)
traders_commercial_long_all_non_cit: int | None = Field(
default=None,
description="Number of commercial long traders excluding CIT. Supplemental report.",
)
traders_commercial_short_all_non_cit: int | None = Field(
default=None,
description="Number of commercial short traders excluding CIT. Supplemental report.",
)
traders_cit_long_all: int | None = Field(
default=None,
description="Number of commodity index trader long traders. Supplemental report.",
)
traders_cit_short_all: int | None = Field(
default=None,
description="Number of commodity index trader short traders. Supplemental report.",
)
traders_total_reportable_long_all_non_cit: int | None = Field(
default=None,
description="Total reportable long traders excluding CIT. Supplemental report.",
)
traders_total_reportable_short_all_non_cit: int | None = Field(
default=None,
description="Total reportable short traders excluding CIT. Supplemental report.",
)
traders_total_reportable_long_all: int | None = Field(
default=None,
description="Total number of reportable long traders, all contracts.",
)
traders_total_reportable_short_all: int | None = Field(
default=None,
description="Total number of reportable short traders, all contracts.",
)
traders_total_reportable_long_old: int | None = Field(
default=None,
description="Total number of reportable long traders, old crop year. Legacy/Disaggregated reports.",
)
traders_total_reportable_short_old: int | None = Field(
default=None,
description="Total number of reportable short traders, old crop year. Legacy/Disaggregated reports.",
)
traders_total_reportable_long_other: int | None = Field(
default=None,
description="Total number of reportable long traders, other crop year. Legacy/Disaggregated reports.",
)
traders_total_reportable_short_other: int | None = Field(
default=None,
description="Total number of reportable short traders, other crop year. Legacy/Disaggregated reports.",
)
concentration_gross_top_4_traders_long: float | None = Field(
default=None,
description="Gross long position concentration of top 4 traders, all contracts.",
)
concentration_gross_top_4_traders_short: float | None = Field(
default=None,
description="Gross short position concentration of top 4 traders, all contracts.",
)
concentration_gross_top_8_traders_long: float | None = Field(
default=None,
description="Gross long position concentration of top 8 traders, all contracts.",
)
concentration_gross_top_8_traders_short: float | None = Field(
default=None,
description="Gross short position concentration of top 8 traders, all contracts.",
)
concentration_net_top_4_traders_long_all: float | None = Field(
default=None,
description="Net long position concentration of top 4 traders, all contracts.",
)
concentration_net_top_4_traders_short_all: float | None = Field(
default=None,
description="Net short position concentration of top 4 traders, all contracts.",
)
concentration_net_top_8_traders_long_all: float | None = Field(
default=None,
description="Net long position concentration of top 8 traders, all contracts.",
)
concentration_net_top_8_traders_short_all: float | None = Field(
default=None,
description="Net short position concentration of top 8 traders, all contracts.",
)
concentration_gross_top_4_traders_long_1: float | None = Field(
default=None,
description="Gross long position concentration of top 4 traders, old crop year. Legacy/Disaggregated reports.",
)
concentration_gross_top_4_traders_short_1: float | None = Field(
default=None,
description="Gross short position concentration of top 4 traders, old crop year. Legacy/Disaggregated reports.",
)
concentration_gross_top_8_traders_long_1: float | None = Field(
default=None,
description="Gross long position concentration of top 8 traders, old crop year. Legacy/Disaggregated reports.",
)
concentration_gross_top_8_traders_short_1: float | None = Field(
default=None,
description="Gross short position concentration of top 8 traders, old crop year. Legacy/Disaggregated reports.",
)
concentration_net_top_4_traders_long_old: float | None = Field(
default=None,
description="Net long position concentration of top 4 traders, old crop year. Legacy/Disaggregated reports.",
)
concentration_net_top_4_traders_short_old: float | None = Field(
default=None,
description="Net short position concentration of top 4 traders, old crop year. Legacy/Disaggregated reports.",
)
concentration_net_top_8_traders_long_old: float | None = Field(
default=None,
description="Net long position concentration of top 8 traders, old crop year. Legacy/Disaggregated reports.",
)
concentration_net_top_8_traders_short_old: float | None = Field(
default=None,
description="Net short position concentration of top 8 traders, old crop year. Legacy/Disaggregated reports.",
)
concentration_gross_top_4_traders_long_2: float | None = Field(
default=None,
description="Gross long position concentration of top 4 traders, other crop year. Legacy/Disaggregated reports.",
)
concentration_gross_top_4_traders_short_2: float | None = Field(
default=None,
description="Gross short position concentration of top 4 traders, other crop year. Legacy/Disaggregated reports.",
)
concentration_gross_top_8_traders_long_2: float | None = Field(
default=None,
description="Gross long position concentration of top 8 traders, other crop year. Legacy/Disaggregated reports.",
)
concentration_gross_top_8_traders_short_2: float | None = Field(
default=None,
description="Gross short position concentration of top 8 traders, other crop year. Legacy/Disaggregated reports.",
)
concentration_net_top_4_traders_long_other: float | None = Field(
default=None,
description="Net long position concentration of top 4 traders, other crop year. Legacy/Disaggregated reports.",
)
concentration_net_top_4_traders_short_other: float | None = Field(
default=None,
description="Net short position concentration of top 4 traders, other crop year. Legacy/Disaggregated reports.",
)
concentration_net_top_8_traders_long_other: float | None = Field(
default=None,
description="Net long position concentration of top 8 traders, other crop year. Legacy/Disaggregated reports.",
)
concentration_net_top_8_traders_short_other: float | None = Field(
default=None,
description="Net short position concentration of top 8 traders, other crop year. Legacy/Disaggregated reports.",
)
class CftcCotFetcher(Fetcher[CftcCotQueryParams, list[CftcCotData]]):
"""CFTC Commitment of Traders Reports Fetcher."""
require_credentials = False
@staticmethod
def transform_query(params: dict[str, Any]) -> CftcCotQueryParams:
"""Transform query parameters."""
return CftcCotQueryParams(**params)
@staticmethod
async def aextract_data(
query: CftcCotQueryParams,
credentials: dict[str, str] | None,
**kwargs: Any,
) -> list[dict]:
"""Extract the data from the CFTC API."""
import os
from datetime import timedelta
from openbb_core.provider.utils.helpers import amake_request
from openbb_cftc.utils.helpers import socrata_json
app_token = (
credentials.get("cftc_app_token")
if credentials
else os.getenv("CFTC_APP_TOKEN") or ""
)
today = datetime.now()
_id = "" if query.code == "all" else query.code
if _id.startswith("CFTC_"):
_id = _id[5:]
is_code = _id and _id[:3].isdigit()
_start = (
"1995-01-01"
if is_code
else (
(today - timedelta(days=(today.weekday() - 1) % 7)).strftime("%Y-%m-%d")
)
)
start_date = (
query.start_date.strftime("%Y-%m-%d") if query.start_date else _start
)
end_date = (
query.end_date.strftime("%Y-%m-%d")
if query.end_date
else f"{today.year}-12-31"
)
date_range = (
f"$where=Report_Date_as_YYYY_MM_DD between '{start_date}' AND '{end_date}'"
)
report_type = query.report_type.replace("financial", "tff")
if query.futures_only is True and report_type != "supplemental":
report_type += "_futures_only"
elif query.futures_only is False and report_type != "supplemental":
report_type += "_combined"
if not is_code and _id:
_id = f"%{_id}%"
_id = _id.replace("+", "%2B").replace("&", "%26")
base_url = f"https://publicreporting.cftc.gov/resource/{reports_dict[report_type]}.json?$limit=1000000&{date_range}"
order = "&$order=Report_Date_as_YYYY_MM_DD ASC"
url = (
(
f"{base_url}"
f" AND (UPPER(contract_market_name) like UPPER('{_id}') "
f"OR UPPER(commodity) like UPPER('{_id}') "
f"OR UPPER(cftc_contract_market_code) like UPPER('{_id}') "
f"OR UPPER(commodity_group_name) like UPPER('{_id}') "
f"OR UPPER(commodity_subgroup_name) like UPPER('{_id}'))"
)
if _id
else base_url
)
url = f"{url}{order}"
from openbb_cftc.utils import store
cached = store.get_response(url)
if cached is not None:
return cached
request_url = f"{url}&$$app_token={app_token}" if app_token else url
try:
response = await amake_request(
request_url, response_callback=socrata_json, **kwargs
)
except OpenBBError as error:
raise error from error
if not response or not isinstance(response, list):
raise EmptyDataError(f"No data found for {_id.replace('%', '')}.")
store.put_response(url, response)
return response
@staticmethod
def transform_data(
query: CftcCotQueryParams,
data: list[dict],
**kwargs: Any,
) -> list[CftcCotData]:
"""Transform and validate the data."""
response = data.copy()
string_cols = [
"market_and_exchange_names",
"cftc_contract_market_code",
"cftc_market_code",
"cftc_region_code",
"cftc_commodity_code",
"cftc_contract_market_code_quotes",
"cftc_market_code_quotes",
"cftc_commodity_code_quotes",
"cftc_subgroup_code",
"commodity_group_name",
"commodity",
"commodity_name",
"commodity_subgroup_name",
"contract_units",
"yyyy_report_week_ww",
"id",
"futonly_or_combined",
]
results: list[CftcCotData] = []
for values in response:
new_values: dict = {}
for key, value in values.items():
if key == "report_date_as_yyyy_mm_dd" and value:
new_values["report_date_as_yyyy_mm_dd"] = value.split("T")[0]
elif key in string_cols and value:
v = str(value)
if key == "contract_units":
v = v.strip("()")
new_values[key.lower()] = v
elif key.lower().startswith("pct_") and value:
new_values[key.lower().replace("__", "_")] = float(value) / 100
elif key.lower().startswith("conc_") and value:
new_values[key.lower().replace("__", "_")] = float(value)
elif value:
try:
new_values[key.lower().replace("__", "_")] = int(value)
except ValueError:
new_values[key.lower().replace("__", "_")] = value
if new_values:
results.append(CftcCotData.model_validate(new_values))
if results:
dup_fields: set[str] = set()
sample = results[0].model_dump()
for fname in list(sample):
base: str | None = None
if fname.endswith("_old") or fname.endswith("_other"):
base = fname.rsplit("_", 1)[0] + "_all"
elif fname.endswith("_1") or fname.endswith("_2"):
base = fname[:-2]
if base is None or base not in sample:
continue
pairs = [
(getattr(r, base, None), getattr(r, fname, None)) for r in results
]
paired = [(a, b) for a, b in pairs if a is not None and b is not None]
if paired and all(a == b for a, b in paired):
dup_fields.add(fname)
if dup_fields:
for r in results:
for col in dup_fields:
object.__setattr__(r, col, None)
measure = query.measure
if measure != "all" and results:
_metadata = {
"market_and_exchange_names",
"cftc_contract_market_code",
"cftc_market_code",
"cftc_region_code",
"cftc_commodity_code",
"cftc_contract_market_code_quotes",
"cftc_market_code_quotes",
"cftc_commodity_code_quotes",
"cftc_subgroup_code",
"commodity",
"commodity_group",
"commodity_subgroup",
"futonly_or_combined",
"contract_units",
"contract_market_name",
"report_week",
"id",
}
measure_prefixes = {
"changes": "change_",
"percent_of_oi": "open_interest_pct_",
"traders": "traders_",
"concentration": "concentration_",
}
def _keep(field_name: str) -> bool:
if field_name in ("date", "open_interest_all"):
return True
if field_name in _metadata:
return False
if measure == "positions":
return not any(
field_name.startswith(p) for p in measure_prefixes.values()
)
return field_name.startswith(measure_prefixes[measure])
keep_fields = {
f
for r in results
for f, v in r.model_dump().items()
if _keep(f) and v is not None and v != 0
}
keep_fields.add("date")
keep_fields.add("open_interest_all")
filtered: list[CftcCotData] = []
for r in results:
d = {k: v for k, v in r.model_dump().items() if k in keep_fields}
filtered.append(CftcCotData.model_validate(d))
results = filtered
results.sort(key=lambda r: r.date)
if query.limit is not None and query.limit > 0:
results = results[-query.limit :]
return results