diff options
-rw-r--r-- | openbb_platform/core/openbb_core/provider/standard_models/options_chains.py | 2 | ||||
-rw-r--r-- | openbb_platform/providers/cboe/openbb_cboe/models/options_chains.py | 69 |
2 files changed, 55 insertions, 16 deletions
diff --git a/openbb_platform/core/openbb_core/provider/standard_models/options_chains.py b/openbb_platform/core/openbb_core/provider/standard_models/options_chains.py index 231945419ed..6a23f687f5d 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/options_chains.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/options_chains.py @@ -21,8 +21,8 @@ class OptionsChainsQueryParams(QueryParams): symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", "")) - @classmethod @field_validator("symbol", mode="before", check_fields=False) + @classmethod def to_upper(cls, v: str) -> str: """Return the symbol in uppercase.""" return v.upper() diff --git a/openbb_platform/providers/cboe/openbb_cboe/models/options_chains.py b/openbb_platform/providers/cboe/openbb_cboe/models/options_chains.py index 1f83a7cb99a..280130e8bf8 100644 --- a/openbb_platform/providers/cboe/openbb_cboe/models/options_chains.py +++ b/openbb_platform/providers/cboe/openbb_cboe/models/options_chains.py @@ -10,6 +10,7 @@ from openbb_cboe.utils.helpers import ( get_company_directory, get_index_directory, ) +from openbb_core.provider.abstract.annotated_result import AnnotatedResult from openbb_core.provider.abstract.fetcher import Fetcher from openbb_core.provider.standard_models.options_chains import ( OptionsChainsData, @@ -62,10 +63,9 @@ class CboeOptionsChainsFetcher( query: CboeOptionsChainsQueryParams, credentials: Optional[Dict[str, str]], **kwargs: Any, - ) -> List[Dict]: - """Return the raw data from the Cboe endpoint""" - - symbol = query.symbol.replace("^", "").split(",")[0] + ) -> Dict: + """Return the raw data from the Cboe endpoint.""" + symbol = query.symbol.replace("^", "").split(",")[0].upper() INDEXES = await get_index_directory(use_cache=query.use_cache) SYMBOLS = await get_company_directory(use_cache=query.use_cache) INDEXES = INDEXES.set_index("index_symbol") @@ -78,21 +78,57 @@ class CboeOptionsChainsFetcher( if symbol in TICKER_EXCEPTIONS or symbol in INDEXES.index else f"https://cdn.cboe.com/api/global/delayed_quotes/options/{symbol}.json" ) - - return await amake_request(quotes_url) + results = await amake_request(quotes_url) + return results # type: ignore @staticmethod def transform_data( query: CboeOptionsChainsQueryParams, - data: List[Dict], + data: Dict, **kwargs: Any, - ) -> List[CboeOptionsChainsData]: - """Transform the data to the standard format""" - + ) -> AnnotatedResult[List[CboeOptionsChainsData]]: + """Transform the data to the standard format.""" if not data: raise EmptyDataError() + results_metadata = {} + options = data.get("data", {}).pop("options", []) + change_percent = data["data"].get("percent_change") + iv30_percent = data["data"].get("iv30_change_percent") + if change_percent: + change_percent = change_percent / 100 + if iv30_percent: + iv30_percent = iv30_percent / 100 + last_timestamp = data["data"].get("last_trade_time") + if last_timestamp: + last_timestamp = to_datetime( + last_timestamp, format="%Y-%m-%dT%H:%M:%S" + ).strftime("%Y-%m-%d %H:%M:%S") + results_metadata.update( + { + "symbol": data["data"].get("symbol"), + "security_type": data["data"].get("security_type"), + "bid": data["data"].get("bid"), + "bid_size": data["data"].get("bid_size"), + "ask": data["data"].get("ask"), + "ask_size": data["data"].get("ask_size"), + "open": data["data"].get("open"), + "high": data["data"].get("high"), + "low": data["data"].get("low"), + "close": data["data"].get("close"), + "volume": data["data"].get("volume"), + "current_price": data["data"].get("current_price"), + "prev_close": data["data"].get("prev_day_close"), + "change": data["data"].get("price_change"), + "change_percent": change_percent, + "iv30": data["data"].get("iv30"), + "iv30_change": data["data"].get("iv30_change"), + "iv30_change_percent": iv30_percent, + "last_tick": data["data"].get("tick"), + "last_trade_timestamp": last_timestamp, + } + ) - options_df = DataFrame.from_records(data["data"]["options"]) + options_df = DataFrame.from_records(options) options_df = options_df.rename( columns={ @@ -152,7 +188,10 @@ class CboeOptionsChainsFetcher( quotes["prev_close"] = round(quotes["prev_close"], 2) quotes["change_percent"] = round(quotes["change_percent"] / 100, 4) - return [ - CboeOptionsChainsData.model_validate(d) - for d in quotes.reset_index().to_dict("records") - ] + return AnnotatedResult( + result=[ + CboeOptionsChainsData.model_validate(d) + for d in quotes.reset_index().to_dict("records") + ], + metadata=results_metadata, + ) |