replay_outcomes
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-23, from covered-call-screener-from-the-free-sql-api.
| month | calls_screened | avg_annual_yield_pct | itm_rate_all_pct | itm_rate_richest_pct |
|---|---|---|---|---|
| 2025-09 | 34 | 12.5 | 52.9 | 42.9 |
| 2025-10 | 28 | 17.9 | 42.9 | 83.3 |
| 2025-11 | 27 | 18.4 | 3.7 | 0 |
| 2025-12 | 30 | 15 | 10 | 16.7 |
| 2026-01 | 27 | 15.3 | 14.8 | 20 |
| 2026-02 | 18 | 20 | 0 | 0 |
| 2026-03 | 35 | 15.8 | 5.7 | 14.3 |
| 2026-04 | 52 | 15.8 | 92.3 | 100 |
| 2026-05 | 38 | 17 | 57.9 | 100 |
| 2026-06 | 29 | 17.8 | 3.4 | 0 |
| 2026-07 | 22 | 20.8 | 40.9 | 0 |
- Rows × columns
- 11 × 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 |
|---|---|---|---|
month |
text | 11 distinct values (2025-09, 2025-10, 2025-11…) | |
calls_screened |
number | 18 to 52 | |
avg_annual_yield_pct |
number | 12.5 to 20.8 | percent |
itm_rate_all_pct |
number | 0 to 92.3 | percent |
itm_rate_richest_pct |
number | 0 to 100 | 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
selection_days AS
(
SELECT min(date) AS session_date
FROM global_markets.options_greeks
WHERE date >= '2025-09-01' AND date < '2026-08-01'
GROUP BY toStartOfMonth(date)
),
picks AS
(
SELECT
formatDateTime(date, '%Y-%m') AS month,
underlying_symbol AS symbol,
expiration_date AS expiry,
toFloat64(strike_price) AS strike,
toFloat64(option_close) / toFloat64(underlying_close)
* 365.0 / days_to_expiry * 100 AS annual_yield_pct
FROM global_markets.options_greeks
WHERE date >= '2025-09-01'
AND date < '2026-08-01'
AND date IN (SELECT session_date FROM selection_days)
AND underlying_symbol IN ('AAPL', 'MSFT', 'NVDA', 'AMD', 'KO', 'JNJ', 'XOM', 'SPY')
AND iv_converged = 1
AND volume >= 100
AND days_to_expiry BETWEEN 20 AND 45
AND delta BETWEEN 0.25 AND 0.35
AND toFloat64(strike_price) / toFloat64(underlying_close) - 1 BETWEEN 0.02 AND 0.12
AND option_close >= 0.30
AND expiration_date <= '2026-09-19'
),
rich_line AS
(
SELECT
month,
avg(annual_yield_pct) * 1.5 AS cutoff
FROM picks
GROUP BY month
)
SELECT
p.month AS month,
count() AS calls_screened,
round(avg(p.annual_yield_pct), 1) AS avg_annual_yield_pct,
round(countIf(toFloat64(u.close) > p.strike) / count() * 100, 1) AS itm_rate_all_pct,
round(countIf(toFloat64(u.close) > p.strike AND p.annual_yield_pct >= r.cutoff)
/ countIf(p.annual_yield_pct >= r.cutoff) * 100, 1) AS itm_rate_richest_pct
FROM picks AS p
INNER JOIN
(
SELECT ticker, date, close
FROM global_markets.stocks_daily_aggs
WHERE date >= '2025-09-15'
AND date <= '2026-09-19'
AND ticker IN ('AAPL', 'MSFT', 'NVDA', 'AMD', 'KO', 'JNJ', 'XOM', 'SPY')
) AS u ON u.ticker = p.symbol AND u.date = p.expiry
INNER JOIN rich_line AS r ON r.month = p.month
GROUP BY p.month
HAVING countIf(p.annual_yield_pct >= r.cutoff) > 0
ORDER BY p.month
Work with this data in your AI assistant
Opens ready to query, with this page's data. Free, no account.