{"slug":"price-return-vs-total-return","qid":"ticker_gap_10y","label":"Annualized price return vs total return over ten years: seven household names, to July 31, 2026","post_title":"Price Return vs Total Return: The Real Gap","post_url":"/blog/price-return-vs-total-return#q-ticker_gap_10y","columns":["ticker","price_cagr_pct","total_cagr_pct","dividend_points_pct"],"rows":[{"ticker":"VZ","price_cagr_pct":-1.51,"total_cagr_pct":3.96,"dividend_points_pct":5.46},{"ticker":"XOM","price_cagr_pct":6.11,"total_cagr_pct":10.82,"dividend_points_pct":4.71},{"ticker":"KO","price_cagr_pct":7.26,"total_cagr_pct":10.66,"dividend_points_pct":3.4},{"ticker":"JNJ","price_cagr_pct":7.42,"total_cagr_pct":10.39,"dividend_points_pct":2.98},{"ticker":"PG","price_cagr_pct":5.28,"total_cagr_pct":8.19,"dividend_points_pct":2.91},{"ticker":"SPY","price_cagr_pct":13.16,"total_cagr_pct":15,"dividend_points_pct":1.84},{"ticker":"MSFT","price_cagr_pct":23.45,"total_cagr_pct":24.98,"dividend_points_pct":1.53}],"shape":"ranking","sql":"WITH daily AS (\n    SELECT ticker,\n           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 IN ('SPY', 'KO', 'JNJ', 'XOM', 'PG', 'VZ', 'MSFT')\n      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-08-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 ticker, d\n),\npx AS (\n    SELECT ticker,\n           argMin(close, d) AS start_px,\n           argMax(close, d) AS end_px\n    FROM daily\n    GROUP BY ticker\n),\ndivs AS (\n    SELECT dv.ticker AS ticker,\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.ticker = dv.ticker AND dl.d = dv.ex_dividend_date\n    WHERE dv.ticker IN ('SPY', 'KO', 'JNJ', 'XOM', 'PG', 'VZ', 'MSFT')\n      AND dv.cash_amount > 0\n      AND dv.ex_dividend_date >= toDate('2016-08-01')\n      AND dv.ex_dividend_date <= toDate('2026-07-31')\n    GROUP BY dv.ticker\n)\nSELECT px.ticker AS ticker,\n       round(100 * (pow(px.end_px / px.start_px, 0.1) - 1), 2) AS price_cagr_pct,\n       round(100 * (pow(px.end_px / px.start_px * divs.factor, 0.1) - 1), 2) AS total_cagr_pct,\n       round(100 * (pow(px.end_px / px.start_px * divs.factor, 0.1)\n                    - pow(px.end_px / px.start_px, 0.1)), 2) AS dividend_points_pct\nFROM px\nINNER JOIN divs ON px.ticker = divs.ticker\nORDER BY dividend_points_pct DESC","computed_at":"2026-08-03T11:31:10.275794+00:00","elapsed":0.004938499}