{"slug":"covered-call-etfs-explained","qid":"total_return_split","label":"Three years of total return, split into price change and distributions: July 2023 to June 2026","post_title":"Covered Call ETFs: the Real Tradeoff","post_url":"/blog/covered-call-etfs-explained#q-total_return_split","columns":["ticker","start_price","end_price","price_return_pct","distribution_return_pct","total_return_pct","payments"],"rows":[{"ticker":"QQQ","start_price":369.95,"end_price":735.76,"price_return_pct":98.9,"distribution_return_pct":2.4,"total_return_pct":101.2,"payments":13},{"ticker":"SPY","start_price":442.7,"end_price":746.32,"price_return_pct":68.6,"distribution_return_pct":4.9,"total_return_pct":73.4,"payments":12},{"ticker":"JEPQ","start_price":48.07,"end_price":61.45,"price_return_pct":27.8,"distribution_return_pct":34.7,"total_return_pct":62.6,"payments":35},{"ticker":"SPYI","start_price":49.77,"end_price":53.1,"price_return_pct":6.7,"distribution_return_pct":36.8,"total_return_pct":43.5,"payments":36},{"ticker":"QYLD","start_price":17.76,"end_price":18.43,"price_return_pct":3.7,"distribution_return_pct":36.1,"total_return_pct":39.8,"payments":36},{"ticker":"XYLD","start_price":41.07,"end_price":40.81,"price_return_pct":-0.6,"distribution_return_pct":31.5,"total_return_pct":30.9,"payments":35},{"ticker":"JEPI","start_price":54.81,"end_price":56.49,"price_return_pct":3.1,"distribution_return_pct":23.7,"total_return_pct":26.8,"payments":35},{"ticker":"RYLD","start_price":17.93,"end_price":15.99,"price_return_pct":-10.8,"distribution_return_pct":32.1,"total_return_pct":21.3,"payments":36}],"shape":"table","sql":"WITH px AS (\n    SELECT ticker,\n           argMin(close, window_start) AS start_price,\n           argMax(close, window_start) AS end_price\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker IN ('QYLD', 'XYLD', 'RYLD', 'JEPI', 'JEPQ', 'SPYI', 'QQQ', 'SPY')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) BETWEEN toDate('2023-07-03') AND toDate('2026-06-30')\n      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959\n    GROUP BY ticker\n),\ndv AS (\n    SELECT ticker,\n           sum(cash_amount) AS distributions,\n           count() AS payments\n    FROM global_markets.stocks_dividends\n    WHERE ticker IN ('QYLD', 'XYLD', 'RYLD', 'JEPI', 'JEPQ', 'SPYI', 'QQQ', 'SPY')\n      AND ex_dividend_date BETWEEN toDate('2023-07-03') AND toDate('2026-06-30')\n      AND cash_amount > 0\n    GROUP BY ticker\n)\nSELECT px.ticker AS ticker,\n       round(px.start_price, 2) AS start_price,\n       round(px.end_price, 2) AS end_price,\n       round((px.end_price - px.start_price) / px.start_price * 100, 1) AS price_return_pct,\n       round(dv.distributions / px.start_price * 100, 1) AS distribution_return_pct,\n       round(((px.end_price - px.start_price) + dv.distributions) / px.start_price * 100, 1) AS total_return_pct,\n       dv.payments AS payments\nFROM px\nINNER JOIN dv ON px.ticker = dv.ticker\nORDER BY total_return_pct DESC","computed_at":"2026-08-01T02:22:14.385681+00:00","elapsed":0.004489853}