{"slug":"spy-dividend-yield-and-uit-cash-drag","qid":"annual_price_vs_dividends","label":"SPY by calendar year: price change against dividends collected","post_title":"SPY Dividend Yield: Why It Trails the Index","post_url":"/blog/spy-dividend-yield-and-uit-cash-drag#q-annual_price_vs_dividends","columns":["year","price_return_pct","dividend_return_pct"],"rows":[{"year":2019,"price_return_pct":28.62,"dividend_return_pct":2.25},{"year":2020,"price_return_pct":15.09,"dividend_return_pct":1.75},{"year":2021,"price_return_pct":28.75,"dividend_return_pct":1.55},{"year":2022,"price_return_pct":-19.95,"dividend_return_pct":1.32},{"year":2023,"price_return_pct":24.82,"dividend_return_pct":1.74},{"year":2024,"price_return_pct":24,"dividend_return_pct":1.49},{"year":2025,"price_return_pct":16.64,"dividend_return_pct":1.25}],"shape":"ranking","sql":"WITH\n    px AS\n    (\n        SELECT\n            toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n            toFloat64(argMax(close, window_start))               AS close_px\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker = 'SPY'\n          AND window_start >= today() - 2950\n          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n               + toMinute(toTimeZone(window_start, 'America/New_York'))) >= 570\n          AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n               + toMinute(toTimeZone(window_start, 'America/New_York'))) <  960\n        GROUP BY d\n    ),\n    by_year AS\n    (\n        SELECT\n            toYear(d)           AS year,\n            argMin(close_px, d) AS first_close,\n            argMax(close_px, d) AS last_close\n        FROM px\n        GROUP BY year\n    ),\n    divs AS\n    (\n        SELECT\n            toYear(ex_date)  AS year,\n            sum(cash_amount) AS year_dividends\n        FROM\n        (\n            SELECT\n                ex_dividend_date            AS ex_date,\n                max(toFloat64(cash_amount)) AS cash_amount\n            FROM global_markets.stocks_dividends\n            WHERE ticker = 'SPY'\n              AND ex_dividend_date >= today() - 2950\n            GROUP BY ex_dividend_date\n        )\n        GROUP BY year\n    )\nSELECT\n    by_year.year                                                   AS year,\n    round((by_year.last_close / by_year.first_close - 1) * 100, 2) AS price_return_pct,\n    round(divs.year_dividends / by_year.first_close * 100, 2)      AS dividend_return_pct\nFROM by_year\nINNER JOIN divs ON divs.year = by_year.year\nWHERE by_year.year > toYear(today() - 2950)\n  AND by_year.year < toYear(today())\nORDER BY year","computed_at":"2026-08-22T04:22:10.710121+00:00","elapsed":2.731425737}