How to Read Option Chain Columns
Option chain na table wey show strike and expiration for one stock. See wetin bid, ask, volume, implied volatility and delta columns mean. We go use SPY on July 15, 2026 as example.
Option chain na di table wey broker dey show for one stock or fund: every expiration wey dem list, every strike price, and one row of live numbers for di call and di put for each strike. To read am na just to know wetin every column dey measure and how di two coordinates, expiration and strike, dey locate one contract inside di grid. This page dey show one real chain column by column, using di S&P 500 tracker SPY on July 15, 2026 as di example wey we go use.
Wetin be option chain?
Every option wey dem list, dem sabi am with four things: the symbol of wetin dem dey trade, the date wey e go expire, the strike price, and whether e be call or put. The chain na that definition wey dem arrange for layout. One selector for top dey pick the expiration. Strikes den dey run for middle of screen, calls dey for one side and puts dey for the other side. If you pick one expiration, you dey read one flat part of the grid: one row for each strike, one set of quote columns for each side.
The columns themselves dey describe that one contract, no be the stock wey dem dey trade. One single underlying fit get plenty expirations and hundreds of strikes, so the full chain for one stock wey plenty pipo dey trade go get thousands of rows. Brokers dey hide most of dem by default and open near the money, the area wey the strike dey close to the current share price.
Wey We Dey Read One Expiration, Strike By Strike
Dis na real example: SPY calls and puts wey go expire August 21, 2026, wey dem price on July 15 close, for di strikes wey dey close to di share price.
The exact SQL behind every number
SELECT toString(toUInt32(strike_price)) AS strike,
round(any(underlying_close), 2) AS underlying_price,
round(maxIf(option_close, option_type = 'C'), 2) AS call_last,
round(maxIf(option_close, option_type = 'P'), 2) AS put_last,
round(maxIf(delta, option_type = 'C'), 2) AS call_delta,
round(minIf(delta, option_type = 'P'), 2) AS put_delta
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = toDate('2026-07-15')
AND expiration_date = toDate('2026-08-21')
AND strike_price BETWEEN 735 AND 770
AND toUInt32(strike_price) % 5 = 0
AND iv_converged
GROUP BY strike_price
HAVING countIf(option_type = 'C') > 0 AND countIf(option_type = 'P') > 0
ORDER BY strike_priceTwo tins show up straight away. Call prices dey fall as strike dey rise, from $28.82 for $735 strike to $6.1 for $770: di right to buy for lower price dey valuable pass. Put prices dey move di oda way for di same eight rows, from $6.07 go up to $19.16. Di two ladders dey cross near di share price of $754.68, and di strike wey di call and di put trade closest together na im be di money.
Di delta columns dey explain dat geometry for different unit. Delta na di change for option price for $1 change for di underlying, and e dey work as rough gauge of how likely contract go finish for money. For $735 strike di call dey read 0.73 and di put dey read -0.26. For $770 strike di call don fall to 0.34. One call and one put for di same row always get deltas wey dey roughly one apart for magnitude, one property of two contracts wey dey cover opposite halves of di same distribution. Di rest of dis sensitivity columns dey for di option greeks explained.
Wetin be bid, wetin be ask, and why dem no be one price
Di chain dey show two prices for every contract. Bid na di highest price wey buyer wan pay now. Ask na di lowest price wey seller go accept. Di space between dem na di spread. If you place market order to buy, e go use di ask price, and if you place market order to sell, e go use di bid price. So, di spread na real money wey you go pay when you enter and when you exit. Di "last" price wey chain show fit be minutes old and e fit be anywhere relative to di current quote.
Spreads no dey same for di whole chain. Below, we show di median bid and ask wey dem quote for di same expiration across seven call strikes, wey dem measure for di normal trading session on July 15, 2026.
The exact SQL behind every number
SELECT concat('$', toString(toUInt32(toFloat64(toUInt32OrZero(substring(ticker, length(ticker) - 7, 8))) / 1000)), ' call') AS strike,
round(quantileDeterministic(0.5)(toFloat64(bid_price), toUInt64(sip_timestamp)), 2) AS median_bid,
round(quantileDeterministic(0.5)(toFloat64(ask_price), toUInt64(sip_timestamp)), 2) AS median_ask,
round(100 * quantileDeterministic(0.5)(toFloat64(ask_price - bid_price), toUInt64(sip_timestamp)), 1) AS median_spread_cents,
toUInt64(count()) AS quotes_recorded
FROM global_markets.cache_options_quotes
WHERE ticker IN ('O:SPY260821C00740000', 'O:SPY260821C00750000', 'O:SPY260821C00760000',
'O:SPY260821C00770000', 'O:SPY260821C00780000', 'O:SPY260821C00800000',
'O:SPY260821C00820000')
AND sip_timestamp >= '2026-07-15 13:30:00'
AND sip_timestamp < '2026-07-15 20:00:00'
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker
ORDER BY toUInt32OrZero(substring(ticker, length(ticker) - 7, 8))Di strike wey dey deep inside di money for top of di panel quote median spread of 12 cents against bid of $24.18. Di strike wey dey far outside di money for bottom quote 1 cent against bid of $0.12. For normal money terms, di cheap contract get di tighter spread. But as part of im own price, e wide pass, and dat part na wetin round trip really cost. How dem take set up di two-sided quote wey dey work na we explain am for di bid ask spread. Di same panel show how di other side of spreads move: di strikes wey dey busy near di money record well over hundred thousand quote updates for di session, di ones wey dey far get few thousand.
Volume and open interest
Two columns dey count activity, and people dey confuse dem always. Volume na contracts wey dem trade for current session, and e dey reset to zero every night. Open interest na contracts wey still dey open from last session, so e dey update once a day and e show accumulated positioning, no be today's flow. Some strike fit show plenty volume but almost no open interest, wey dey happen when traders open and close for same day.
The exact SQL behind every number
SELECT toString(toUInt32(strike_price)) AS strike,
toUInt64(sumIf(volume, option_type = 'C')) AS call_volume,
toUInt64(sumIf(volume, option_type = 'P')) AS put_volume
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = toDate('2026-07-15')
AND expiration_date = toDate('2026-08-21')
AND strike_price BETWEEN 735 AND 770
AND toUInt32(strike_price) % 5 = 0
AND iv_converged
GROUP BY strike_price
HAVING countIf(option_type = 'C') > 0 AND countIf(option_type = 'P') > 0
ORDER BY strike_priceVolume dey cluster. For these eight strikes, call side run from 81 contracts for the lowest strike go up to 4547 for the highest strike, and put side lean the other way. Round numbers and strikes wey dey close to share price dey take most of the flow, and strike wey dey two or three steps away fit carry small part of am. Where a chain row show wide spread, thin volume for the same row dey usually sit beside am. Volume versus open interest measure the whole tape on this point.
Implied volatility, strike by strike
Di implied volatility column dey change di price of one contract into one percentage wey dey for one year: di volatility number wey go make one pricing model show di price wey dem write. E just dey restate price, e no dey forecast anything. Contracts wey dey on di same underlying and same expiration usually get different implied volatilities for different strikes, and when you plot di column against strike, e go show di shape wey dem dey call di smile, or di skew.
The exact SQL behind every number
SELECT toString(toUInt32(strike_price)) AS strike,
round(100 * avg(implied_volatility), 1) AS implied_vol_pct,
round(100 * (strike_price / any(underlying_close) - 1), 1) AS strike_vs_spot_pct
FROM global_markets.options_greeks
WHERE underlying_symbol = 'SPY'
AND date = toDate('2026-07-15')
AND expiration_date = toDate('2026-08-21')
AND strike_price BETWEEN 640 AND 840
AND toUInt32(strike_price) % 20 = 0
AND iv_converged
AND implied_volatility BETWEEN 0.02 AND 3
GROUP BY strike_price
ORDER BY strike_priceDi curve no dey straight. Di strike wey low pass for di panel dey -15.2% from di share price and dem price am at 23.6%, di middle of di range dey far lower, and di top strike dey turn back up to 12.8%. For index options, di downside wing usually dey price above di upside wing, dis one dey always happen, e no be just for one day. Two things dey follow for anybody wey dey read di column. One single "IV" number wey dem quote for one stock na average for one surface wey no dey straight, and comparing implied volatility between two strikes only make sense when you know how far dem be from di share price. Implied volatility dey explain di measure and volatility skew dey show di shape.
How same-day chain dey different
Chains for contracts wey go expire same session, the 0DTE contracts, dey look like any other chain but dem dey behave different for one way: everything for dem dey move faster. Time value dey finish for hours instead of months, delta dey shake hard as share price cross strike, and the strike grid usually dey finer near the money. The way one day's tape dey look show how much of the activity now dey there.
The exact SQL behind every number
WITH dateDiff('day', toDate('2026-07-15'), toDate(concat('20', substring(ticker, length(ticker) - 14, 2), '-', substring(ticker, length(ticker) - 12, 2), '-', substring(ticker, length(ticker) - 10, 2)))) AS dte
SELECT multiIf(dte = 0, 'same day (0DTE)', dte <= 7, '1-7 days', dte <= 30, '8-30 days',
dte <= 90, '31-90 days', 'over 90 days') AS expires_in,
round(sum(volume) / 1e6, 2) AS contracts_m,
round(100 * toFloat64(sum(volume)) / (SELECT toFloat64(sum(volume))
FROM global_markets.options_minute_aggs
WHERE window_start >= '2026-07-15 00:00:00' AND window_start < '2026-07-16 00:00:00'
AND substring(ticker, 3, length(ticker) - 17) = 'SPY'), 1) AS pct_of_spy_volume,
toUInt64(uniqExact(ticker)) AS distinct_contracts
FROM global_markets.options_minute_aggs
WHERE window_start >= '2026-07-15 00:00:00'
AND window_start < '2026-07-16 00:00:00'
AND substring(ticker, 3, length(ticker) - 17) = 'SPY'
AND dte >= 0
GROUP BY expires_in
ORDER BY min(dte)Contracts wey go expire same afternoon take 66.9% of SPY option volume on July 15, 2026, 8.48 million contracts wey spread over just 170 different strikes. Everything wey dated beyond ninety days take 0.8% of the volume while listing 1502 different contracts. That shape dey worth carrying into any chain wey you open: the widest part of the grid dey hold the least trading, and the narrow same-day slice dey hold most of am. Zero day options dey cover that slice on its own terms.
How To Read One Row From Start To Finish
Make we take the $755 strike from the first table, with SPY for $754.68. The call wey dem trade last na $14.03 and the put na $11.52. This one na the closest pair for the slice, and e show say this na the at-the-money row. The call delta of 0.54 say if SPY move $1, that call go move about 0.54 dollars. The put for the same row get delta of -0.46 for the same $1 move, but for the other side.
One contract dey cover 100 shares. So if a chain dey quote $14.03, e dey quote per share. The contract go cost like 100 times that amount before dem collect commission. The multiplier na the thing wey people most times dey misunderstand for a chain. Everything wey dey for the row talk about the same contract from different side: the spread na wetin e go cost to do the transaction, the volume na how many people dey with you, the implied volatility na the assumption about volatility wey dey inside the price. Call options and put options explain how the payoff work for every row.
FAQ
Wetin the columns for option chain dey show?
Strike and expiration na wetin identify the contract. Bid and ask na the live two-sided quote, last na the price of the trade wey just happen, volume na how many trades happen today, and open interest na how many positions still dey from before. Implied volatility na the price wey dem convert to percentage for one year, and the greeks columns show how e dey change with share price, time, and volatility.
Wetin be the difference between volume and open interest?
Volume na how many contracts dem trade today, and e dey start from zero every morning. Open interest na how many contracts still dey open after yesterday don finish, so e be one day old and e dey change only when people open or close position, not when dem just pass am for hand.
Why two strikes for the same expiration get different implied volatilities?
Options for different strikes dey cover different parts of where the price fit go for future, and market dey price those parts differently. For the SPY example wey we show before, the lowest strike for the panel dey price near 23.6% while the middle part of the range dey below am, the curve wey traders dey call the smile or the skew.
Wetin delta of 0.50 for option chain mean?
Delta of 0.50 mean say the contract price go change about 50 cents when the share price change $1, and dem dey usually use am as rough idea of the chance say the contract go finish inside money. Delta dey near 0.50 for calls wey strike dey close to the current share price and e dey go down to zero for strikes wey far.
The price for option chain dey talk about one share or one contract?
The price wey dem show na per share. One normal US equity option dey cover 100 shares, so one contract wey dem quote as $2.00 go cost like $200 plus money for charges. Chains almost never show that multiplier.
Every figure wey you see here come from query wey dem save and check for version over the options tape. You fit expand any panel to read the SQL, or you fit pull the same chain yourself on the Strasmore terminal.