Best Stocks for Day Trading Options (Ranked)
Which stocks are best for day trading options? The most liquid names ranked by 20-session contract volume, with spread, 30-day IV and daily expiration data.
The best stocks for day trading options are the ones whose contracts are cheapest to get into and out of: heavy contract volume and quotes a few cents wide, ideally with an expiration listed for every weekday. Measured that way, the answer is short and stable. A handful of index ETFs (SPY, QQQ and IWM) plus a few mega-cap stocks do most of the volume on any given day, and the ranked table below shows the current snapshot with the numbers that matter.
Which stocks are best for day trading options? The ranked table
An option's underlying is the stock or ETF the contract settles against. Contract volume counts every option contract that traded on that underlying, calls and puts across every strike and expiration. The table ranks stock and ETF underlyings by average daily contract volume over the last 20 sessions (four trading weeks) and adds two columns a day trader reads next. Expirations in the next two weeks is expiration density: the number of distinct expiration dates listed within 14 days of the latest session. The 30-day IV column is implied volatility, the annualized move the option prices imply, averaged over near-the-money contracts (strikes within 3% of the stock price) with 20 to 45 days left.
| symbol | avg_daily_contracts_millions | expirations_next_2_weeks | atm_30d_iv_pct |
|---|---|---|---|
| SPY | 3.16 | 10 | 12.9 |
| NVDA | 2.33 | 6 | 31 |
| QQQ | 2.15 | 10 | 17.9 |
| TSLA | 1.49 | 6 | 43.1 |
| AAPL | 0.99 | 6 | 24.6 |
| IWM | 0.97 | 10 | 17.7 |
| IBIT | 0.79 | 6 | 34.2 |
| TLT | 0.71 | 6 | 11.1 |
| INTC | 0.63 | 6 | 68.6 |
| AMZN | 0.57 | 6 | 31.8 |
| MU | 0.54 | 5 | 59.5 |
| META | 0.46 | 6 | 39.8 |
| GLD | 0.45 | 10 | 23.2 |
| MSTR | 0.42 | 2 | 65.9 |
| EWZ | 0.42 | 3 | 45.6 |
The exact SQL behind every number
WITH
(
SELECT max(date)
FROM global_markets.options_greeks
WHERE date >= today() - 40
) AS last_session
SELECT
underlying_symbol AS symbol,
round(sum(volume) / countDistinct(date) / 1e6, 2) AS avg_daily_contracts_millions,
countDistinctIf(expiration_date,
date = last_session
AND expiration_date <= last_session + 14) AS expirations_next_2_weeks,
round(avgIf(implied_volatility,
date = last_session
AND iv_converged = 1
AND underlying_close > 0
AND days_to_expiry BETWEEN 20 AND 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.03) * 100, 1) AS atm_30d_iv_pct
FROM global_markets.options_greeks
WHERE date IN
(
SELECT date
FROM global_markets.options_greeks
WHERE date >= today() - 40
GROUP BY date
ORDER BY date DESC
LIMIT 20
)
AND volume > 0
AND underlying_symbol NOT IN ('SPCX')
AND underlying_symbol IN
(
SELECT DISTINCT ticker
FROM global_markets.stocks_daily_aggs
WHERE date >= today() - 40
)
GROUP BY underlying_symbol
HAVING countIf(date = last_session
AND iv_converged = 1
AND underlying_close > 0
AND days_to_expiry BETWEEN 20 AND 45
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.03) > 0
ORDER BY sum(volume) DESC
LIMIT 15As of the latest session, SPY tops the ranking at 3.16 million contracts a day, followed by NVDA at 2.33 million and QQQ at 2.15 million. The last name on the list, EWZ, averages 0.42 million. Read the expirations column as a calendar: a name with a contract expiring every weekday shows around ten dates in a two-week window, a weekly-only name shows two, and a monthly-only name shows one or none. SPY lists 10, with a near-the-money 30-day IV of 12.9%. The complete list of names with a weekday calendar, and how that calendar came to exist, is in which stocks have daily options.
Two caveats belong next to the table. It covers options on stocks and ETFs only: cash-settled index options such as SPX trade in the same league as SPY, but they are a separate product with different listing rules and a different symbol format, so they sit outside this ranking. And it is a dated snapshot. The query regenerates from the trailing 20 sessions, the figures on the page are the figures as of the last refresh, and 'best' here means cheapest to get in and out of, not most likely to pay.
Why volume, spread and expiration density decide intraday tradability
A day trade in options is a round trip, often inside an hour, in which the cost of crossing the quote is paid twice against a small expected move. Three measurable attributes set that cost.
- Contract volume. The more contracts change hands, the more market makers compete on each strike and the closer a market order fills to the quoted price. Volume also moves the least from day to day, which makes it the anchor for the ranking.
- Quote width. The bid-ask spread is the gap between the highest price a buyer is showing and the lowest price a seller is showing. On a $2.00 option, a $0.02 spread is 1% of the premium and a $0.20 spread is 10%. A round trip pays it twice, before the underlying has moved at all.
- Expiration density. A name with an expiration every weekday always has a contract with hours of life left, which is what the purest intraday trade uses, and it lets a trader match the contract's date to the day's event instead of settling for the nearest Friday.
Volume and volatility are different things. A stock can carry a very high implied volatility and a nearly empty options book, and the empty book is what makes it hard to trade intraday. That distinction is worked through in liquid vs volatile options, and the names with the largest implied moves are ranked separately in highest implied volatility stocks. This post ranks by liquidity alone.
How concentrated is options volume?
The top of the ranking accounts for most of the market. The panel below takes every underlying with at least one traded contract over the same 20 sessions, ranks them by total contract volume, and groups them into four tiers.
| bucket | underlying_count | share_of_all_contract_volume_pct |
|---|---|---|
| top 5 | 5 | 25.2 |
| ranks 6 to 20 | 15 | 20.5 |
| ranks 21 to 100 | 80 | 27.6 |
| rank 101 and below | 5453 | 26.8 |
The exact SQL behind every number
WITH ranked AS
(
SELECT
underlying_symbol AS symbol,
sum(volume) AS contracts,
row_number() OVER (ORDER BY sum(volume) DESC) AS vol_rank
FROM global_markets.options_greeks
WHERE date IN
(
SELECT date
FROM global_markets.options_greeks
WHERE date >= today() - 40
GROUP BY date
ORDER BY date DESC
LIMIT 20
)
AND volume > 0
GROUP BY underlying_symbol
)
SELECT
multiIf(vol_rank <= 5, 'top 5',
vol_rank <= 20, 'ranks 6 to 20',
vol_rank <= 100, 'ranks 21 to 100',
'rank 101 and below') AS bucket,
count() AS underlying_count,
round(sum(contracts) / (SELECT sum(contracts) FROM ranked) * 100, 1) AS share_of_all_contract_volume_pct
FROM ranked
GROUP BY bucket
ORDER BY min(vol_rank)The top 5 underlyings took 25.2% of every contract that traded, across every listed underlying. The 5453 underlyings in the last tier (rank 101 and below) shared 26.8% between them. The practical reading: outside the top hundred names, an underlying's daily volume is spread thinly across dozens of strikes and several expirations, so most individual contracts print no trade for hours at a time. A limit order in one of those can sit unfilled through the entire move it was meant to catch.
Does the ranking change from day to day?
Averages hide the daily rhythm, so the next panel traces four of the most active names session by session over the same window. Volume tends to jump on the third Friday of the month, when the standard monthly contracts expire, and thins out on the shortened sessions before a holiday.
| session_date | session_label | spy_millions | qqq_millions | iwm_millions | nvda_millions |
|---|---|---|---|---|---|
| 2026-08-20 | Aug 20 | 3.28 | 2.59 | 1.22 | 2.03 |
| 2026-08-21 | Aug 21 | 2.6 | 1.74 | 0.72 | 1.46 |
| 2026-08-24 | Aug 24 | 2.51 | 2.05 | 0.49 | 1.81 |
| 2026-08-25 | Aug 25 | 2.18 | 1.51 | 0.44 | 1.85 |
| 2026-08-26 | Aug 26 | 2.24 | 1.83 | 0.4 | 2.57 |
| 2026-08-27 | Aug 27 | 3.15 | 2.04 | 0.61 | 6.88 |
| 2026-08-28 | Aug 28 | 3.48 | 2.12 | 1.35 | 3.25 |
| 2026-08-31 | Aug 31 | 2.98 | 1.77 | 0.87 | 1.58 |
| 2026-09-01 | Sep 1 | 3.65 | 2.6 | 1.5 | 2.49 |
| 2026-09-02 | Sep 2 | 2.53 | 1.89 | 1.05 | 2.62 |
| 2026-09-03 | Sep 3 | 3.71 | 2.4 | 1.1 | 3.52 |
| 2026-09-04 | Sep 4 | 2.68 | 1.8 | 0.47 | 2.17 |
| 2026-09-08 | Sep 8 | 2.88 | 1.86 | 0.65 | 2.37 |
| 2026-09-09 | Sep 9 | 2.8 | 1.81 | 1.08 | 1.29 |
| 2026-09-10 | Sep 10 | 3.81 | 2.26 | 1.55 | 2.26 |
| 2026-09-11 | Sep 11 | 3.26 | 2.01 | 0.94 | 1.39 |
| 2026-09-14 | Sep 14 | 3.3 | 2.73 | 1.35 | 1.88 |
| 2026-09-15 | Sep 15 | 3.11 | 2.25 | 1.1 | 1.64 |
| 2026-09-16 | Sep 16 | 4.82 | 3.04 | 1.44 | 1.56 |
| 2026-09-17 | Sep 17 | 4.22 | 2.65 | 1.12 | 1.91 |
The exact SQL behind every number
SELECT
toString(date) AS session_date,
concat(formatDateTime(date, '%b'), ' ', toString(toDayOfMonth(date))) AS session_label,
round(sumIf(volume, underlying_symbol = 'SPY') / 1e6, 2) AS spy_millions,
round(sumIf(volume, underlying_symbol = 'QQQ') / 1e6, 2) AS qqq_millions,
round(sumIf(volume, underlying_symbol = 'IWM') / 1e6, 2) AS iwm_millions,
round(sumIf(volume, underlying_symbol = 'NVDA') / 1e6, 2) AS nvda_millions
FROM global_markets.options_greeks
WHERE date IN
(
SELECT date
FROM global_markets.options_greeks
WHERE date >= today() - 40
GROUP BY date
ORDER BY date DESC
LIMIT 20
)
AND underlying_symbol IN ('SPY', 'QQQ', 'IWM', 'NVDA')
AND volume > 0
GROUP BY date
ORDER BY dateThe window runs from Aug 20 to Sep 17, 20 sessions. On the last of them SPY traded 4.22 million contracts against 2.65 million for QQQ and 1.12 million for IWM. Read the gaps between the lines rather than the level of any one line: the totals swing with the expiration calendar while the order of the names holds across the window. That stability is what makes a liquidity ranking useful even though it is a snapshot.
How wide are the spreads on the most active names?
Volume is the number a trader checks; the spread is the cost they pay. To show the difference in dollars and cents, the panel below is pinned to one morning, December 19, 2024, from 10:00 to 10:30 a.m. ET, reading the quote tape for call options expiring the next day on five underlyings, at strikes within 1.5% of that session's close. The date is fixed on purpose so the panel never refreshes and the comparison stays reproducible. Each quote's spread is ask minus bid divided by the midpoint, and the panel reports the median so a few stale or crossed quotes cannot move it.
| symbol | median_spread_pct_of_premium | median_spread_dollars | contracts_in_sample |
|---|---|---|---|
| QQQ | 1.07 | 0.05 | 4 |
| IWM | 1.72 | 0.03 | 4 |
| AAPL | 2.53 | 0.03 | 3 |
| SPY | 3.07 | 0.15 | 5 |
| KO | 11.43 | 0.07 | 3 |
The exact SQL behind every number
SELECT
q.underlying AS symbol,
round(quantileDeterministic(0.5)(q.spread_pct, toUInt64(q.sequence_number)), 2) AS median_spread_pct_of_premium,
round(quantileDeterministic(0.5)(q.spread_dollars, toUInt64(q.sequence_number)), 3) AS median_spread_dollars,
countDistinct(q.ticker) AS contracts_in_sample
FROM
(
SELECT
ticker,
sequence_number,
multiIf(startsWith(ticker, 'O:SPY'), 'SPY',
startsWith(ticker, 'O:QQQ'), 'QQQ',
startsWith(ticker, 'O:IWM'), 'IWM',
startsWith(ticker, 'O:AAPL'), 'AAPL',
'KO') AS underlying,
toFloat64(substring(ticker, length(ticker) - 7)) / 1000 AS strike,
toFloat64(ask_price - bid_price) AS spread_dollars,
toFloat64(ask_price - bid_price) / toFloat64(ask_price + bid_price) * 200 AS spread_pct
FROM global_markets.cache_options_quotes
WHERE ticker IN ('O:SPY241220C00580000', 'O:SPY241220C00583000', 'O:SPY241220C00586000', 'O:SPY241220C00589000', 'O:SPY241220C00592000',
'O:QQQ241220C00510000', 'O:QQQ241220C00513000', 'O:QQQ241220C00516000', 'O:QQQ241220C00519000', 'O:QQQ241220C00522000',
'O:IWM241220C00217000', 'O:IWM241220C00219000', 'O:IWM241220C00221000', 'O:IWM241220C00223000', 'O:IWM241220C00225000',
'O:AAPL241220C00245000', 'O:AAPL241220C00247500', 'O:AAPL241220C00250000', 'O:AAPL241220C00252500', 'O:AAPL241220C00255000',
'O:KO241220C00061000', 'O:KO241220C00062000', 'O:KO241220C00062500', 'O:KO241220C00063000', 'O:KO241220C00064000')
AND sip_timestamp >= '2024-12-19 15:00:00'
AND sip_timestamp < '2024-12-19 15:30:00'
AND bid_price > 0
AND ask_price > bid_price
) AS q
INNER JOIN
(
SELECT
ticker AS underlying,
toFloat64(close) AS session_close
FROM global_markets.stocks_daily_aggs
WHERE date = '2024-12-19'
AND ticker IN ('SPY', 'QQQ', 'IWM', 'AAPL', 'KO')
) AS c ON c.underlying = q.underlying
WHERE abs(q.strike / c.session_close - 1) < 0.015
GROUP BY q.underlying
HAVING count() > 0
ORDER BY median_spread_pct_of_premiumOn that morning QQQ showed the tightest quotes, a median spread of 1.07% of the premium, or $0.05 per share (option prices are quoted per share; one contract covers 100). KO was the widest of the 5 at 11.43%, or $0.07 per share. Note how little the dollar figure moves compared with the percentage. A penny or two is the floor for any quote, and what changes across names is the premium that penny is measured against: the same cents against a smaller premium is a larger slice of the trade. What is a bid-ask spread walks through how that gap is quoted and who collects it.
One more distinction. This post ranks by volume rather than open interest. Open interest counts contracts that exist and have not been closed, a stock of positions carried overnight; volume counts contracts that changed hands today, a flow. For a trade that opens and closes in the same session the flow is the number that matters, and options volume vs open interest shows how far the two can diverge on the same name.
FAQ
What is the most traded option in the market?
By contract volume, the current 20-session ranking puts SPY first at 3.16 million contracts a day. The cash-settled SPX index contract trades in the same league but is listed as an index product rather than a stock option, so it does not appear in a stock and ETF ranking.
Do I need daily expirations to day trade options?
No. A weekly contract with a few days left can be traded intraday like any other. A weekday calendar adds the choice of a contract that expires the same day, which carries the fastest time decay and the largest swings per dollar of premium. The expirations column in the table above shows which names list one.
Is a high-volume option always a tight market?
At the money and near the front expiration, usually yes, which is where the volume concentrates. The same underlying's far out-of-the-money strikes and distant expirations can be quoted several times wider, so check the specific contract rather than the ticker.
Why rank by volume instead of open interest?
Volume counts contracts that traded during the session; open interest counts contracts still open at the end of it. An intraday trader pays the spread on today's flow, so volume is the closer proxy for how easily a position can be entered and exited within the day.
How often does this ranking change?
The table regenerates from the trailing 20 sessions, so the volume figures move with every refresh. The names at the top change far less often than the figures do, and the pinned spread panel never changes at all.
Every panel above ships with the exact SQL beneath it; expand any one to see how the number was counted. To rerun the ranking over a different window, or read the spread on a specific contract, ask the question in plain English on the Strasmore terminal.