Strasmore Research
Learn Matt ConnorBy Matt Connor · data as of September 20, 2026 · refreshed weekly

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.

QueryStock and ETF underlyings ranked by average daily options contract volume, last 20 sessions
symbolavg_daily_contracts_millionsexpirations_next_2_weeksatm_30d_iv_pct
SPY3.161012.9
NVDA2.33631
QQQ2.151017.9
TSLA1.49643.1
AAPL0.99624.6
IWM0.971017.7
IBIT0.79634.2
TLT0.71611.1
INTC0.63668.6
AMZN0.57631.8
MU0.54559.5
META0.46639.8
GLD0.451023.2
MSTR0.42265.9
EWZ0.42345.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 15
Run this yourself

As 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.

  1. 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.
  2. 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.
  3. 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.

QueryShare of all options contract volume by liquidity tier, last 20 sessions
bucketunderlying_countshare_of_all_contract_volume_pct
top 5525.2
ranks 6 to 201520.5
ranks 21 to 1008027.6
rank 101 and below545326.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)
Run this yourself

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.

QueryDaily options contract volume, SPY vs QQQ vs IWM vs NVDA, last 20 sessions
session_datesession_labelspy_millionsqqq_millionsiwm_millionsnvda_millions
2026-08-20Aug 203.282.591.222.03
2026-08-21Aug 212.61.740.721.46
2026-08-24Aug 242.512.050.491.81
2026-08-25Aug 252.181.510.441.85
2026-08-26Aug 262.241.830.42.57
2026-08-27Aug 273.152.040.616.88
2026-08-28Aug 283.482.121.353.25
2026-08-31Aug 312.981.770.871.58
2026-09-01Sep 13.652.61.52.49
2026-09-02Sep 22.531.891.052.62
2026-09-03Sep 33.712.41.13.52
2026-09-04Sep 42.681.80.472.17
2026-09-08Sep 82.881.860.652.37
2026-09-09Sep 92.81.811.081.29
2026-09-10Sep 103.812.261.552.26
2026-09-11Sep 113.262.010.941.39
2026-09-14Sep 143.32.731.351.88
2026-09-15Sep 153.112.251.11.64
2026-09-16Sep 164.823.041.441.56
2026-09-17Sep 174.222.651.121.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 date
Run this yourself

The 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.

QueryAt-the-money spread as a percent of premium, calls expiring next day, Dec 19 2024, 10:00 to 10:30 ET
symbolmedian_spread_pct_of_premiummedian_spread_dollarscontracts_in_sample
QQQ1.070.054
IWM1.720.034
AAPL2.530.033
SPY3.070.155
KO11.430.073
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_premium
Run this yourself

On 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.

#options#day trading#options liquidity#bid-ask spread#daily expirations