bracket_legs
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-12, from what-is-an-implied-volatility-index.
| leg | expiry | dte | atm_iv_pct | contract_count | weight_pct | iv30_pct |
|---|---|---|---|---|---|---|
| near | July 10, 2026 | 25 | 21.77 | 6 | 28.6 | 21.83 |
| far | July 17, 2026 | 32 | 21.85 | 6 | 71.4 | 21.83 |
- Rows × columns
- 2 × 7
- 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 |
|---|---|---|---|
leg |
text | 2 distinct values (far, near) | |
expiry |
text | 2 distinct values (July 10, 2026, July 17, 2026) | |
dte |
number | 25 to 32 | |
atm_iv_pct |
number | 21.77 to 21.85 | percent |
contract_count |
number | every row is 6 | count |
weight_pct |
number | 28.6 to 71.4 | percent |
iv30_pct |
number | every row is 21.83 | 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.
the exact SQL behind every number
SELECT
leg,
leg_expiry AS expiry,
leg_dte AS dte,
round(leg_iv * 100, 2) AS atm_iv_pct,
leg_contracts AS contract_count,
round(leg_weight * 100, 1) AS weight_pct,
round(sqrt((near_iv * near_iv * near_dte * (far_dte - 30)
+ far_iv * far_iv * far_dte * (30 - near_dte))
/ (far_dte - near_dte) / 30) * 100, 2) AS iv30_pct
FROM
(
SELECT
maxIf(days_to_expiry, days_to_expiry <= 30) AS near_dte,
minIf(days_to_expiry, days_to_expiry > 30) AS far_dte,
argMaxIf(atm_iv, days_to_expiry, days_to_expiry <= 30) AS near_iv,
argMinIf(atm_iv, days_to_expiry, days_to_expiry > 30) AS far_iv,
argMaxIf(expiry_label, days_to_expiry, days_to_expiry <= 30) AS near_expiry,
argMinIf(expiry_label, days_to_expiry, days_to_expiry > 30) AS far_expiry,
argMaxIf(contracts, days_to_expiry, days_to_expiry <= 30) AS near_contracts,
argMinIf(contracts, days_to_expiry, days_to_expiry > 30) AS far_contracts
FROM
(
SELECT
concat(monthName(expiration_date), ' ', toString(toDayOfMonth(expiration_date)), ', ', toString(toYear(expiration_date))) AS expiry_label,
days_to_expiry,
avg(toFloat64(implied_volatility)) AS atm_iv,
count() AS contracts
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
AND date = '2026-06-15'
AND iv_converged = 1
AND volume > 0
AND days_to_expiry BETWEEN 7 AND 90
AND abs(toFloat64(strike_price) / toFloat64(underlying_close) - 1) < 0.025
GROUP BY expiration_date, days_to_expiry
HAVING contracts >= 2
)
)
ARRAY JOIN
['near', 'far'] AS leg,
[near_expiry, far_expiry] AS leg_expiry,
[near_dte, far_dte] AS leg_dte,
[near_iv, far_iv] AS leg_iv,
[near_contracts, far_contracts] AS leg_contracts,
[(far_dte - 30) / (far_dte - near_dte),
(30 - near_dte) / (far_dte - near_dte)] AS leg_weight
ORDER BY leg_dte
Run your own version of this
The same 22 years of US equities and 12 years of options data are queryable in SQL or plain English. A free account runs 100 queries a day and takes no card.
More from this analysiswhat-is-an-implied-volatility-index
iv30_trace
series 54×5
→
term_structure
series 13×5
→
iv_screener
ranking 6×4
→
The 2s10s spread, every print of the half
table 124×2
→
The 2s10s spread, every print of the half
table 124×2
→
Every half-year since 1976: the 2y and 10y change, the twist between them, and the half's lowest 2s10s print
table 100×7
→
See all 2,214 queries →