{"slug":"price-return-vs-total-return","qid":"annual_contribution","label":"S&P 500 tracker by calendar year: price return vs the points added by reinvested dividends","post_title":"Price Return vs Total Return: The Real Gap","post_url":"/blog/price-return-vs-total-return#q-annual_contribution","columns":["year","price_return_pct","dividend_points_pct"],"rows":[{"year":2007,"price_return_pct":3.5,"dividend_points_pct":1.9},{"year":2008,"price_return_pct":-37.6,"dividend_points_pct":1.49},{"year":2009,"price_return_pct":19.9,"dividend_points_pct":2.79},{"year":2010,"price_return_pct":11,"dividend_points_pct":2.18},{"year":2011,"price_return_pct":-1.1,"dividend_points_pct":2.07},{"year":2012,"price_return_pct":11.7,"dividend_points_pct":2.48},{"year":2013,"price_return_pct":26.3,"dividend_points_pct":2.55},{"year":2014,"price_return_pct":12.3,"dividend_points_pct":2.19},{"year":2015,"price_return_pct":-0.7,"dividend_points_pct":2.07},{"year":2016,"price_return_pct":11.2,"dividend_points_pct":2.39},{"year":2017,"price_return_pct":18.5,"dividend_points_pct":2.3},{"year":2018,"price_return_pct":-6.9,"dividend_points_pct":1.78},{"year":2019,"price_return_pct":28.6,"dividend_points_pct":2.43},{"year":2020,"price_return_pct":15.1,"dividend_points_pct":2.19},{"year":2021,"price_return_pct":28.7,"dividend_points_pct":1.73},{"year":2022,"price_return_pct":-20,"dividend_points_pct":1.3},{"year":2023,"price_return_pct":24.8,"dividend_points_pct":1.91},{"year":2024,"price_return_pct":24,"dividend_points_pct":1.59},{"year":2025,"price_return_pct":16.6,"dividend_points_pct":1.37},{"year":2026,"price_return_pct":9.3,"dividend_points_pct":0.58}],"shape":"ranking","sql":"WITH daily AS (\n    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,\n           argMax(toFloat64(close), window_start) AS close\n    FROM global_markets.delayed_stocks_minute_aggs\n    WHERE ticker = 'SPY'\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2006-01-01')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')\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 d\n),\nyearly AS (\n    SELECT toYear(d) AS year,\n           argMin(close, d) AS first_px,\n           argMax(close, d) AS last_px\n    FROM daily\n    GROUP BY year\n),\ndivs AS (\n    SELECT toYear(dv.ex_dividend_date) AS year,\n           exp(sum(log(1 + toFloat64(dv.cash_amount) / dl.close))) AS factor\n    FROM global_markets.stocks_dividends AS dv\n    INNER JOIN daily AS dl ON dl.d = dv.ex_dividend_date\n    WHERE dv.ticker = 'SPY'\n      AND dv.cash_amount > 0\n    GROUP BY year\n)\nSELECT y.year AS year,\n       round(100 * (y.last_px / y.first_px - 1), 1) AS price_return_pct,\n       round(100 * (y.last_px / y.first_px) * (d.factor - 1), 2) AS dividend_points_pct\nFROM yearly AS y\nINNER JOIN divs AS d ON y.year = d.year\nORDER BY year","computed_at":"2026-08-03T11:31:10.184475+00:00","elapsed":0.005687463}