summaryrefslogtreecommitdiffstats
path: root/openbb_platform/providers/yfinance/openbb_yfinance/models/options_chains.py
diff options
context:
space:
mode:
Diffstat (limited to 'openbb_platform/providers/yfinance/openbb_yfinance/models/options_chains.py')
-rw-r--r--openbb_platform/providers/yfinance/openbb_yfinance/models/options_chains.py29
1 files changed, 17 insertions, 12 deletions
diff --git a/openbb_platform/providers/yfinance/openbb_yfinance/models/options_chains.py b/openbb_platform/providers/yfinance/openbb_yfinance/models/options_chains.py
index 62651b94c84..ba4a09fd051 100644
--- a/openbb_platform/providers/yfinance/openbb_yfinance/models/options_chains.py
+++ b/openbb_platform/providers/yfinance/openbb_yfinance/models/options_chains.py
@@ -28,24 +28,21 @@ class YFinanceOptionsChainsData(OptionsChainsData):
__alias_dict__ = {
"contract_symbol": "contractSymbol",
- "last_trade_timestamp": "lastTradeDate",
+ "last_trade_time": "lastTradeDate",
"last_trade_price": "lastPrice",
"change_percent": "percentChange",
"open_interest": "openInterest",
"implied_volatility": "impliedVolatility",
"in_the_money": "inTheMoney",
}
- dte: Optional[int] = Field(
- default=None,
- description="Days to expiration.",
- )
+
in_the_money: Optional[bool] = Field(
default=None,
description="Whether the option is in the money.",
)
- last_trade_timestamp: Optional[datetime] = Field(
+ currency: Optional[str] = Field(
default=None,
- description="Timestamp for when the option was last traded.",
+ description="Currency of the option.",
)
@@ -67,6 +64,7 @@ class YFinanceOptionsChainsFetcher(
) -> Dict:
"""Extract the raw data from YFinance."""
symbol = query.symbol.upper()
+ symbol = "^" + symbol if symbol in ["VIX", "RUT", "SPX", "NDX"] else symbol
ticker = yf.Ticker(symbol)
expirations = list(ticker.options)
if not expirations or len(expirations) == 0:
@@ -107,7 +105,9 @@ class YFinanceOptionsChainsFetcher(
}
tz = timezone(underlying_output.get("exchange_tz", "UTC"))
- async def get_chain(ticker, expiration, tz):
+ underlying_price = underlying_output.get("last_price")
+
+ async def get_chain(ticker, expiration, tz, underlying_price):
"""Get the data for one expiration."""
exp = datetime.strptime(expiration, "%Y-%m-%d").date()
now = datetime.now().date()
@@ -124,18 +124,23 @@ class YFinanceOptionsChainsFetcher(
.sort_index()
.reset_index()
)
+ chain = chain.drop(columns=["contractSize"])
chain["dte"] = dte
+ if underlying_price is not None:
+ chain["underlying_price"] = underlying_price
+ chain["underlying_symbol"] = symbol
chain["percentChange"] = chain["percentChange"] / 100
- for col in ["currency", "contractSize"]:
- if col in chain.columns:
- chain = chain.drop(col, axis=1)
+
if len(chain) > 0:
chains_output.extend(
chain.fillna("N/A").replace("N/A", None).to_dict("records")
)
await asyncio.gather(
- *[get_chain(ticker, expiration, tz) for expiration in expirations]
+ *[
+ get_chain(ticker, expiration, tz, underlying_price)
+ for expiration in expirations
+ ]
)
if not chains_output: