iv_by_year
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-10-01, from zm-implied-volatility.
| year | session_count | avg_iv_pct | low_iv_pct | high_iv_pct |
|---|---|---|---|---|
| 2019 | 167 | 59.9 | 35.3 | 84.6 |
| 2020 | 253 | 73.1 | 36.4 | 132 |
| 2021 | 252 | 51.4 | 34.1 | 79.6 |
| 2022 | 251 | 69.9 | 48.3 | 115.8 |
| 2023 | 250 | 47.7 | 28.7 | 80.7 |
| 2024 | 252 | 34.6 | 22.4 | 65.6 |
| 2025 | 250 | 33.5 | 22.5 | 53.6 |
| 2026 | 186 | 46.1 | 25.5 | 65.5 |
- Rows × columns
- 8 × 5
- 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 |
|---|---|---|---|
year |
number | 2,019 to 2,026 | |
session_count |
number | 167 to 253 | count |
avg_iv_pct |
number | 33.5 to 73.1 | percent |
low_iv_pct |
number | 22.4 to 48.3 | percent |
high_iv_pct |
number | 53.6 to 132 | 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 atm_daily AS
(
SELECT
date,
round(100 * avg(toFloat64(implied_volatility)), 1) AS iv_pct
FROM global_markets.options_greeks
WHERE underlying_symbol = 'ZM'
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 20 AND 45
AND toFloat64(underlying_close) > 0
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.05
GROUP BY date
)
SELECT
toYear(date) AS year,
count() AS session_count,
round(avg(iv_pct), 1) AS avg_iv_pct,
min(iv_pct) AS low_iv_pct,
max(iv_pct) AS high_iv_pct
FROM atm_daily
GROUP BY year
ORDER BY year
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.