ranked
Answered against 22 years of US equities and 12 years of US options data and published with the query that produced it. This result is stored as of 2026-09-20, from best-stocks-for-day-trading-options.
| 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 |
- Rows × columns
- 15 × 4
- Computed
- Completeness
- No missing values
- Source
- US exchange, SIP and OPRA market data
- Licence
- Strasmore terms · free, no signup
What each column holds
| Column | Type | Range | Notes |
|---|---|---|---|
symbol |
text | 15 distinct values (AAPL, AMZN, EWZ…) | |
avg_daily_contracts_millions |
number | 0.42 to 3.16 | count |
expirations_next_2_weeks |
number | 2 to 10 | |
atm_30d_iv_pct |
number | 11.1 to 68.6 | percent |
Computed from Strasmore's warehouse of US exchange, SIP and OPRA market data. Equity prices are delayed; options greeks and implied volatility are end-of-day. This result is stored, not recomputed on load — it is exactly the numbers that were returned on , and the query below is what returned them.
Run it yourself
This is the exact query behind the result above. Change a ticker, a date or a column and run it against the warehouse — no account, no key. The no-signup tier is smaller than the one this page was computed on; a query that reaches past it comes back saying which plan runs it.
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