Covered Call ETFs: the Real Tradeoff
Three years of total return, split into price change and distributions: July 2023 to June 2026table ·
2026-08-01 · 8×7
Total return by calendar year: a Nasdaq index fund vs a Nasdaq covered call fundranking ·
2026-08-01 · 4×3
Price path indexed to 100: two index funds and their covered call counterparts, month endsseries ·
2026-08-01 · 36×5
Covered Call vs Cash-Secured Put
Both positions at four moments: entry, three weeks in, the SPY high, and the June diptable ·
2026-07-31 · 4×5
What each strike paid on May 1, 2026: SPY June 18 calls and puts side by sideranking ·
2026-07-31 · 8×3
Covered call vs cash-secured put: profit and loss per share, same strike, same expiryseries ·
2026-07-31 · 29×3
Covered Calls: Income on Your Shares
The same covered call at entry, the SPY peak, the dip, and the final sessiontable ·
2026-07-16 · 4×5
Buy-and-hold SPY vs the covered call, per-share value over 7 weeksseries ·
2026-07-16 · 31×3
The $740 call you sold, daily value over its 7-week lifeseries ·
2026-07-16 · 31×2
Three years of total return, split into price change and distributions: July 2023 to June 2026
Three years of total return, split into price change and distributions: July 2023 to June 2026
| ticker | start_price | end_price | price_return_pct | distribution_return_pct | total_return_pct | payments |
|---|---|---|---|---|---|---|
| QQQ | 369.95 | 735.76 | 98.9 | 2.4 | 101.2 | 13 |
| SPY | 442.7 | 746.32 | 68.6 | 4.9 | 73.4 | 12 |
| JEPQ | 48.07 | 61.45 | 27.8 | 34.7 | 62.6 | 35 |
| SPYI | 49.77 | 53.1 | 6.7 | 36.8 | 43.5 | 36 |
| QYLD | 17.76 | 18.43 | 3.7 | 36.1 | 39.8 | 36 |
| XYLD | 41.07 | 40.81 | -0.6 | 31.5 | 30.9 | 35 |
| JEPI | 54.81 | 56.49 | 3.1 | 23.7 | 26.8 | 35 |
| RYLD | 17.93 | 15.99 | -10.8 | 32.1 | 21.3 | 36 |
the exact SQL behind every number
WITH px AS (
SELECT ticker,
argMin(close, window_start) AS start_price,
argMax(close, window_start) AS end_price
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('QYLD', 'XYLD', 'RYLD', 'JEPI', 'JEPQ', 'SPYI', 'QQQ', 'SPY')
AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2023-07-03') AND toDate('2026-06-30')
AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
+ toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
GROUP BY ticker
),
dv AS (
SELECT ticker,
sum(cash_amount) AS distributions,
count() AS payments
FROM global_markets.stocks_dividends
WHERE ticker IN ('QYLD', 'XYLD', 'RYLD', 'JEPI', 'JEPQ', 'SPYI', 'QQQ', 'SPY')
AND ex_dividend_date BETWEEN toDate('2023-07-03') AND toDate('2026-06-30')
AND cash_amount > 0
GROUP BY ticker
)
SELECT px.ticker AS ticker,
round(px.start_price, 2) AS start_price,
round(px.end_price, 2) AS end_price,
round((px.end_price - px.start_price) / px.start_price * 100, 1) AS price_return_pct,
round(dv.distributions / px.start_price * 100, 1) AS distribution_return_pct,
round(((px.end_price - px.start_price) + dv.distributions) / px.start_price * 100, 1) AS total_return_pct,
dv.payments AS payments
FROM px
INNER JOIN dv ON px.ticker = dv.ticker
ORDER BY total_return_pct DESC
More from this analysisCovered Call ETFs: the Real Tradeoff
Price path indexed to 100: two index funds and their covered call counterparts, month ends
series 36×5
→
Total return by calendar year: a Nasdaq index fund vs a Nasdaq covered call fund
ranking 4×3
→
Both positions at four moments: entry, three weeks in, the SPY high, and the June dip
table 4×5
→
Covered call vs cash-secured put: profit and loss per share, same strike, same expiry
series 29×3
→
See all 2,170 queries →