--- title: Option Chain sidebar_position: 4 --- import Tabs from "@theme/Tabs"; import TabItem from "@theme/TabItem"; Retrieve a complete or filtered options chain for a given underlying symbol. Both real-time and historical requests are possible. ## Making Requests Use the `chain()` method on the `options` resource to fetch options chain data. The method supports multiple output formats: | Output Format | Return Type | Description | |---------------|-------------|-------------| | **DATAFRAME** | `pandas.DataFrame` or `polars.DataFrame` | Returns a DataFrame with options chain data indexed by optionSymbol (default). | | **INTERNAL** | `OptionsChain` or `OptionsChainHumanReadable` | Returns an OptionsChain object containing lists of option data. When `use_human_readable=True`, returns an OptionsChainHumanReadable object with capitalized field names. | | **JSON** | `dict` | Returns the raw JSON response as a dictionary. | | **CSV** | `str` | Writes CSV data to file and returns the filename string. | ## chain ```python def chain( symbol: str, *, expiration: str = None, date: str | datetime.datetime = None, from_date: str | datetime.datetime = None, to_date: str | datetime.datetime = None, strike: float = None, side: str = None, dte: int = None, delta: float = None, range: str = None, strike_limit: int = None, min_bid: float = None, max_bid: float = None, min_ask: float = None, max_ask: float = None, min_open_interest: int = None, min_volume: int = None, max_bid_ask_spread: float = None, max_bid_ask_spread_pct: float = None, monthly: bool = None, weekly: bool = None, quarterly: bool = None, nonstandard: bool = None, am: bool = None, pm: bool = None, month: int = None, year: int = None, output_format: OutputFormat = OutputFormat.DATAFRAME, date_format: DateFormat = None, columns: list[str] = None, add_headers: bool = None, use_human_readable: bool = False, mode: Mode = None, filename: str | Path = None, ) -> OptionsChain | OptionsChainHumanReadable | dict | str | MarketDataClientErrorResult ``` Fetches the options chain for a given symbol with extensive filtering options. The `symbol` parameter can be passed as the first positional argument or as a keyword argument. All other parameters must be keyword-only. #### Parameters - `symbol` (str) The underlying stock symbol for which to fetch the options chain. - `expiration` (str, optional) Filter by expiration date. Can be a date string or "all" to get all expirations. - `date` (str | datetime.datetime, optional) Historical date for the options chain data. - `from_date` (str | datetime.datetime, optional) Start date for the date range. - `to_date` (str | datetime.datetime, optional) End date for the date range. - `strike` (float, optional) Filter by strike price. - `side` (str, optional) Filter by option side: "call" or "put". - `dte` (int, optional) Days to expiration. Requests an expiration date based on the number of days from the present date. - `delta` (float, optional) Filter by Delta value. - `range` (str, optional) Filter by strike range: "itm" (In The Money), "otm" (Out of The Money), "atm" (At The Money). - `strike_limit` (int, optional) Maximum number of strike prices to include in the option chain. - `min_open_interest` (int, optional) Minimum open interest for options to be included. - `min_bid` (float, optional) Minimum bid price for options to be included. Uses API alias `minBid`. - `max_bid` (float, optional) Maximum bid price for options to be included. Uses API alias `maxBid`. - `min_ask` (float, optional) Minimum ask price for options to be included. Uses API alias `minAsk`. - `max_ask` (float, optional) Maximum ask price for options to be included. Uses API alias `maxAsk`. - `min_volume` (int, optional) Minimum volume for options to be included. - `max_bid_ask_spread` (float, optional) Maximum bid-ask spread for options to be included. - `max_bid_ask_spread_pct` (float, optional) Maximum bid-ask spread percentage for options to be included. - `monthly` (bool, optional) Include or exclude monthly option expirations. - `weekly` (bool, optional) Include or exclude weekly option expirations. - `quarterly` (bool, optional) Include or exclude quarterly option expirations. - `nonstandard` (bool, optional) Include or exclude non-standard option expirations. - `am` (bool, optional) Whether to include A.M. expirations. - `pm` (bool, optional) Whether to include P.M. expirations. - `month` (int, optional) Filter by specific month (1-12). - `year` (int, optional) Filter by specific year. - `output_format` ([OutputFormat](/sdk/py/settings#output-format), optional) The format of the returned data. Defaults to `OutputFormat.DATAFRAME`. See [Settings](/sdk/py/settings) for details. - `date_format` ([DateFormat](/sdk/py/settings#date-format), optional) The date format to use in the response. Defaults to `DateFormat.UNIX`. See [Settings](/sdk/py/settings) for details. - [`columns`](/sdk/py/settings#columns) (optional) Specify which columns to include in the response. See [Settings](/sdk/py/settings) for details. - [`add_headers`](/sdk/py/settings#headers) (optional) Whether to include headers in the response. See [Settings](/sdk/py/settings) for details. - [`use_human_readable`](/sdk/py/settings#human-readable) (optional) Whether to use human-readable format for values. Only applies when `output_format=OutputFormat.INTERNAL`. See [Settings](/sdk/py/settings) for details. - `mode` ([Mode](/sdk/py/settings#data-mode), optional) The data feed mode to use. See [Settings](/sdk/py/settings) for details. - `filename` (str | Path, optional) File path for CSV output (only used with `output_format=OutputFormat.CSV`). #### Returns - `OptionsChain` | `OptionsChainHumanReadable` | `dict` | `str` | `MarketDataClientErrorResult` The options chain data in the requested format, or a `MarketDataClientErrorResult` if an error occurred. #### Notes - When using `OutputFormat.DATAFRAME`, the DataFrame is indexed by the `optionSymbol` column. - When using `OutputFormat.INTERNAL`, timestamps are automatically converted to `datetime.datetime` objects. - The OptionsChain object contains lists of equal length for each field, allowing you to iterate through options by index. ```python from marketdata.client import MarketDataClient client = MarketDataClient() # Get options chain as DataFrame (default) # symbol can be passed positionally or as keyword chain = client.options.chain("AAPL") # or chain = client.options.chain(symbol="AAPL") # Filter by side and date chain = client.options.chain( "AAPL", side="call", date="2022-01-03", dte=60, strike_limit=2, range="itm" ) print(chain) ``` #### Output ``` underlying expiration side strike ... volume openInterest inTheMoney underlyingPrice optionSymbol ... AAPL220318C00175000 AAPL 2022-03-18 call 175.0 ... 1295 15232 True 182.01 AAPL220318C00180000 AAPL 2022-03-18 call 180.0 ... 4609 18299 True 182.01 ``` ```python from marketdata.client import MarketDataClient from marketdata.input_types.base import OutputFormat client = MarketDataClient() # Get options chain as internal object chain = client.options.chain( "AAPL", side="call", date="2022-01-03", dte=60, strike_limit=2, range="itm", output_format=OutputFormat.INTERNAL ) # Access option data by index print(f"Number of options: {len(chain.optionSymbol)}") print(f"First option symbol: {chain.optionSymbol[0]}") print(f"First option strike: {chain.strike[0]}") print(f"First option expiration: {chain.expiration[0]}") print(f"First option bid: {chain.bid[0]}") print(f"First option ask: {chain.ask[0]}") print(f"First option mid: {chain.mid[0]}") ``` #### Output ``` Number of options: 2 First option symbol: AAPL220318C00175000 First option strike: 175.0 First option expiration: 2022-03-18 16:00:00-04:00 First option bid: 12.95 First option ask: 13.1 First option mid: 13.02 ``` ```python from marketdata.client import MarketDataClient from marketdata.input_types.base import OutputFormat client = MarketDataClient() # Get options chain as JSON chain = client.options.chain( "AAPL", side="call", date="2022-01-03", output_format=OutputFormat.JSON ) print(chain) ``` #### Output ```json { "s": "ok", "optionSymbol": ["AAPL220318C00175000", "AAPL220318C00180000"], "underlying": ["AAPL", "AAPL"], "expiration": [1642798800, 1642798800], "side": ["call", "call"], "strike": [175, 180], "bid": [12.95, 10.0], "ask": [13.1, 10.2], "mid": [13.02, 10.1], ... } ``` ```python from marketdata.client import MarketDataClient from marketdata.input_types.base import OutputFormat from pathlib import Path client = MarketDataClient() # Get options chain as CSV csv_file = client.options.chain( "AAPL", side="call", date="2022-01-03", output_format=OutputFormat.CSV, filename=Path("chain.csv") ) print(f"CSV file saved to: {csv_file}") ``` ```python from marketdata.client import MarketDataClient from marketdata.input_types.base import OutputFormat client = MarketDataClient() # Get options chain in human-readable format chain = client.options.chain( "AAPL", side="call", date="2022-01-03", output_format=OutputFormat.INTERNAL, use_human_readable=True ) # Access option data by index print(f"Number of options: {len(chain.Symbol)}") print(f"First option symbol: {chain.Symbol[0]}") print(f"First option strike: {chain.Strike[0]}") print(f"First option expiration: {chain.Expiration_Date[0]}") print(f"First option bid: {chain.Bid[0]}") print(f"First option ask: {chain.Ask[0]}") ``` ```python from marketdata.client import MarketDataClient client = MarketDataClient() # Get filtered options chain chain = client.options.chain( "AAPL", side="call", month=2, year=2022, range="itm", strike=150, weekly=False, monthly=True, quarterly=False, nonstandard=False ) print(chain) ``` ## OptionsChain ```python @dataclass class OptionsChain: s: str optionSymbol: list[str] underlying: list[str] expiration: list[datetime.datetime] side: list[str] strike: list[float] firstTraded: list[datetime.datetime] dte: list[int] updated: list[datetime.datetime] bid: list[float] bidSize: list[int] mid: list[float] ask: list[float] askSize: list[int] last: list[float] openInterest: list[int] volume: list[int] inTheMoney: list[bool] intrinsicValue: list[float] extrinsicValue: list[float] underlyingPrice: list[float] iv: list[float] delta: list[float] gamma: list[float] theta: list[float] vega: list[float] ``` OptionsChain represents the options chain data with lists of equal length for each field. All lists have the same length, allowing you to access option data by index. #### Properties - `s` (str): Status indicator ("ok" for successful responses). - `optionSymbol` (list[str]): List of option symbols. - `underlying` (list[str]): List of underlying symbols. - `expiration` (list[datetime.datetime]): List of expiration dates (automatically converted from timestamps). - `side` (list[str]): List of option sides ("call" or "put"). - `strike` (list[float]): List of strike prices. - `firstTraded` (list[datetime.datetime]): List of first traded dates (automatically converted from timestamps). - `dte` (list[int]): List of days to expiration. - `updated` (list[datetime.datetime]): List of last update timestamps (automatically converted from timestamps). - `bid` (list[float]): List of bid prices. - `bidSize` (list[int]): List of bid sizes. - `mid` (list[float]): List of mid prices. - `ask` (list[float]): List of ask prices. - `askSize` (list[int]): List of ask sizes. - `last` (list[float]): List of last traded prices. - `openInterest` (list[int]): List of open interest values. - `volume` (list[int]): List of trading volumes. - `inTheMoney` (list[bool]): List indicating if options are in the money. - `intrinsicValue` (list[float]): List of intrinsic values. - `extrinsicValue` (list[float]): List of extrinsic values. - `underlyingPrice` (list[float]): List of underlying prices. - `iv` (list[float]): List of implied volatilities. - `delta` (list[float]): List of Delta values. - `gamma` (list[float]): List of Gamma values. - `theta` (list[float]): List of Theta values. - `vega` (list[float]): List of Vega values. #### Notes - All lists have the same length, allowing you to access option data by index (e.g., `chain.optionSymbol[0]`, `chain.strike[0]`, etc.). - Timestamp fields (`expiration`, `firstTraded`, `updated`) are automatically converted to `datetime.datetime` objects. - The `OptionsChainHumanReadable` variant uses capitalized field names with underscores (e.g., `Expiration_Date` instead of `expiration`). ## OptionsChainHumanReadable ```python @dataclass class OptionsChainHumanReadable: Symbol: list[str] Underlying: list[str] Expiration_Date: list[datetime.datetime] Side: list[str] Strike: list[float] First_Traded: list[datetime.datetime] Days_To_Expiration: list[int] Date: list[datetime.datetime] Bid: list[float] Bid_Size: list[int] Mid: list[float] Ask: list[float] Ask_Size: list[int] Last: list[float] Open_Interest: list[int] Volume: list[int] In_The_Money: list[bool] Intrinsic_Value: list[float] Extrinsic_Value: list[float] Underlying_Price: list[float] IV: list[float] Delta: list[float] Gamma: list[float] Theta: list[float] Vega: list[float] ``` OptionsChainHumanReadable represents the options chain data in human-readable format with capitalized field names and formatted values. All lists have the same length, allowing you to access option data by index. #### Properties - `Symbol` (list[str]): List of option symbols. - `Underlying` (list[str]): List of underlying symbols. - `Expiration_Date` (list[datetime.datetime]): List of expiration dates (automatically converted from timestamps). - `Option_Side` (list[str]): List of option sides ("call" or "put"). - `Strike` (list[float | int]): List of strike prices. - `First_Traded` (list[datetime.datetime]): List of first traded dates (automatically converted from timestamps). - `Days_To_Expiration` (list[int]): List of days to expiration. - `Date` (list[datetime.datetime]): List of last update timestamps (automatically converted from timestamps). - `Bid` (list[float]): List of bid prices. - `Bid_Size` (list[int]): List of bid sizes. - `Mid` (list[float]): List of mid prices. - `Ask` (list[float]): List of ask prices. - `Ask_Size` (list[int]): List of ask sizes. - `Last` (list[float]): List of last traded prices. - `Open_Interest` (list[int]): List of open interest values. - `Volume` (list[int]): List of trading volumes. - `In_The_Money` (list[bool]): List indicating if options are in the money. - `Intrinsic_Value` (list[float]): List of intrinsic values. - `Extrinsic_Value` (list[float]): List of extrinsic values. - `Underlying_Price` (list[float]): List of underlying prices. - `IV` (list[float]): List of implied volatilities. - `Delta` (list[float]): List of Delta values. - `Gamma` (list[float]): List of Gamma values. - `Theta` (list[float]): List of Theta values. - `Vega` (list[float]): List of Vega values. #### Notes - All lists have the same length, allowing you to access option data by index (e.g., `chain.Symbol[0]`, `chain.Strike[0]`, etc.). - Timestamp fields (`Expiration_Date`, `First_Traded`, `Date`) are automatically converted to `datetime.datetime` objects. - Field names use capitalized format with underscores (e.g., `Expiration_Date` instead of `expiration`, `Option_Side` instead of `side`, `Bid_Size` instead of `bidSize`).