Use current and historical options data
Choose a current chain, one-contract quote, historical chain, historical price, or historical Greek.
Start by deciding what one row or cell should represent. MarketXLS uses different functions for a current option chain, one exact contract, and a historical snapshot.
Choose the task
| Task | Windows desktop | Microsoft 365 |
|---|---|---|
| Create one contract symbol | =OptionSymbol("AAPL",DATE(2026,9,18),"C",250) | =mxls.OptionSymbol("AAPL",DATE(2026,9,18),"C",250) |
| Stream one contract's last price | =QM_Stream_Last(A2) | =mxls.QM_Stream_Last(A2) |
| Request one contract's current bid | =QM_Bid(A2) | =mxls.QM_Bid(A2) |
| Return a current chain | =QM_GetOptionChain("AAPL") | =mxls.QM_GetOptionChain("AAPL") |
| Return contracts with nonzero volume | =QM_GetOptionChainActive("AAPL") | =mxls.QM_GetOptionChainActive("AAPL") |
| Return a historical chain | =OPT_HistoricalOptionChain("AAPL",DATE(2026,8,14)) | =mxls.OPT_HistoricalOptionChain("AAPL",DATE(2026,8,14)) |
| Return one contract's historical bid | =Bid_Historical(A2,DATE(2026,8,14)) | =mxls.Bid_Historical(A2,DATE(2026,8,14)) |
| Return one contract's historical delta | =OPT_DeltaHistorical(A2,DATE(2026,8,14)) | =mxls.OPT_DeltaHistorical(A2,DATE(2026,8,14)) |
In these examples, cell A2 contains the exact option symbol. Create it with Create and convert option symbols or copy it from a returned chain.
Retrieve a current option chain
Use the smallest chain that fits your task:
| Function family | What it requests |
|---|---|
QM_GetOptionChain | Current non-expired contracts across all moneyness levels |
QM_GetOptionChainActive | Contracts with zero volume excluded |
QM_GetOptionChainAtTheMoney | At-the-money contracts |
QM_GetOptionChainInTheMoney | In-the-money contracts |
QM_GetOptionChainOutOfTheMoney | Out-of-the-money contracts |
QM_GetOptionChainWeeklies | Weekly expirations |
QM_GetOptionChainMonthlies | Standard monthly expirations |
QM_GetOptionChainQuarterlies | Quarterly expirations |
QM_GetOptionChainNearTerm | Near-term expirations |
On Microsoft 365, add mxls. to each function name.
QM_GetOptionChainActive doesn't mean “every currently listed contract.” It sends a request that excludes zero-volume contracts. If a valid contract is missing from the active chain, try the full QM_GetOptionChain result.
Chain functions return a table. Enter the formula in an empty area with room for the result. If Excel returns #SPILL!, clear the cells that block the table and try again.
Build an expiration and strike sequence
Use these formulas when you build or extend a workbook around selected contracts:
ExpirationNext(symbol,number_of_expirations)returns an expiration by its offset.StrikeNext(symbol,number_of_strikes,expiration_date)returns a strike by its offset. Use a negative offset for lower strikes and a positive offset for higher strikes.
For example, =StrikeNext($B$1,-9) keeps the underlying in B1 fixed while a template extends a lower-strike row. On Microsoft 365, use =mxls.StrikeNext($B$1,-9).
Don't drag a hard-coded option symbol and expect its strike digits to change. Build the strike or expiration in a separate cell, then pass it to OptionSymbol.
Capture a current option-chain template with instructional cells and safe example symbols. Don't use customer positions.
/images/docs/shared/template-workbook.webp
Request one current contract
Use a streaming formula when you need live ticks. Use an on-demand formula when you need a value only when the cell recalculates.
| Result | Streaming | On demand |
|---|---|---|
| Last | QM_Stream_Last(option_symbol) | QM_Last(option_symbol) |
| Bid | QM_Stream_Bid(option_symbol) | QM_Bid(option_symbol) |
| Ask | QM_Stream_Ask(option_symbol) | QM_Ask(option_symbol) |
| Implied volatility | QM_Stream_ImpliedVolatility(option_symbol) | Use the matching option metric in the formula reference |
Add mxls. on Microsoft 365. Streaming requires an active QuoteMedia connection and consumes one live symbol subscription for each unique option contract. A large chain can therefore use many more subscriptions than a stock watchlist with the same number of underlyings.
Request historical options data
Historical options questions fall into three groups:
- Use
OPT_HistoricalOptionChain(underlying,date)for the available chain on one past date. - Use
Bid_HistoricalorAsk_Historicalwith an exact option symbol for one contract's past bid or ask. - Use
OPT_DeltaHistorical,OPT_GammaHistorical,OPT_ImpliedVolatilityHistorical,OPT_ThetaHistorical,OPT_VegaHistorical, orOPT_RhoHistoricalfor one contract's past Greek.
The Microsoft 365 add-in also provides QuoteMedia-sourced QM_Bid_Historical and QM_Ask_Historical. These are separate from the MarketXLS-sourced Bid_Historical and Ask_Historical functions. Don't compare the two providers without also comparing the date, timestamp, and field definition.
QuoteMedia historical functions return NA for a weekend, market holiday, date before the contract was listed, or another date with no trading session. They don't automatically roll the request back to the previous trading day.
Use a date cell instead of typing a locale-dependent date as text. For example, prefer DATE(2026,8,14) or a cell that Excel recognizes as a date.
Understand zero, NA, and settlement
A numeric 0 is a valid bid, ask, volume, or change. It isn't the same as NA.
NA means that the function didn't receive a usable value. Common options causes include:
- A typo in the underlying or option root
- An expiration, strike, or call/put combination that doesn't identify a listed contract
- A historical date with no trading session or no stored contract data
- An expired contract used with a live streaming formula
- Missing options entitlement or incomplete exchange agreements
- A metric that the provider doesn't publish for that contract
AM- and PM-settled index options are distinct listed contracts. OptionSymbol doesn't select settlement with a separate argument. Retrieve the chain, match the exact root and expiration, and then use the returned contract symbol. Don't substitute the current index level for the contract's official settlement value.
Troubleshoot missing or unexpected values
- Test the same function with a liquid, current option from the full chain.
- Compare the exact root, expiration, type, and strike with the returned chain.
- For streaming, confirm that streaming is on and test
QM_Stream_Last("MSFT")or itsmxls.equivalent. - If stock quotes work but every option fails, check the options entitlement and exchange agreements.
- If only a historical date fails, try a confirmed trading day and verify that the contract existed then.
- If a quote differs from a broker, compare bid, ask, last, timestamp, market session, and whether either source is delayed.
Read Fix QuoteMedia real-time data for connection and entitlement checks. Read Fix stale, delayed, or unexpected data before reporting a price difference.