Strasmore Research
Learn am Matt ConnorBy Matt Connor

Price Return vs Total Return: Wetin Be the Real Gap?

S&P 500 price index no dey include dividends, but total return dey reinvest dem. See the compounding gap over twenty years and where each one dey apply.

Price return versus total return na the difference between wetin market chart dey show and wetin person wey hold the same position actually earn. Price return dey count only the change for price. Total return dey add every dividend back, reinvested at the price on the day wey e go ex-dividend. This one make each payment compound together with the shares wey generate am.

The main S&P 500 level wey news dey quote na price index. E get total-return twin wey hold the same companies and put the dividends back to work. For one year, both fit look almost the same. But for twenty years, dem dey show very different results. The gap between dem bigger pass wetin the annual yield alone fit suggest.

Wetin be difference between price return and total return?

Price return na the ending price divide by the starting price, minus one. Every index level wey dem quote for television and every price chart wey you don ever scroll through na this number.

Total return dey run the same calculation, but e dey use each cash dividend buy more shares for the price on the ex-dividend date. Fund performance tables and benchmark indexes wey dem use measure those funds dey use this version.

One hypothetical example go make the mechanics clear. Buy one share for $100 wey dey pay $2 every year, then sell am one year later for $105. Price return na 5%. Total return na roughly 7%. That first year no too special. Na the compounding dey make the difference deserve page of its own: the reinvested $2 buy small part of another share, that part collect its own dividend the next year, and the two series dey separate faster and faster.

Make we clear one thing before the data. A total return swap na derivative contract wey one party pass the full economics of an asset to another party in exchange for a financing rate. E share name with the index convention below, but nothing else. The rest of this page dey focus on indexes and funds.

How big the gap dey for S&P 500?

$10,000 put inside the biggest S&P 500 tracker for end of 2005, then hold am reach July 31, 2026. The first line dey spend every dividend the day e land. The second one dey reinvest each dividend for the closing price of that day.

Query$10,000 for S&P 500 tracker: price only vs dividends wey dem reinvest, year-end 2006 reach July 2026
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(toFloat64(close), window_start) AS close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2005-12-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
),
base AS (
    SELECT argMax(close, d) AS start_px
    FROM daily
    WHERE d <= toDate('2005-12-31')
),
year_end AS (
    SELECT toYear(d) AS year,
           argMax(close, d) AS close,
           max(d) AS last_day
    FROM daily
    WHERE d >= toDate('2006-01-01')
    GROUP BY year
),
reinvest AS (
    SELECT dv.ex_dividend_date AS d,
           log(1 + toFloat64(dv.cash_amount) / dl.close) AS log_growth
    FROM global_markets.stocks_dividends AS dv
    INNER JOIN daily AS dl ON dl.d = dv.ex_dividend_date
    WHERE dv.ticker = 'SPY'
      AND dv.cash_amount > 0
      AND dv.ex_dividend_date >= toDate('2006-01-01')
      AND dv.ex_dividend_date <= toDate('2026-07-31')
)
SELECT ye.year AS year,
       round(10000 * ye.close / any(b.start_px)) AS price_only_usd,
       round(10000 * ye.close / any(b.start_px) * exp(sum(ri.log_growth))) AS reinvested_usd,
       round(100 * (1 - exp(-sum(ri.log_growth))), 1) AS dividend_share_pct
FROM year_end AS ye, reinvest AS ri, base AS b
WHERE ri.d <= ye.last_day
GROUP BY ye.year, ye.close
ORDER BY year
Run this yourself

The price-only line end for $59956. The reinvested line end for $85775. Dividends make up 30.1% of that final balance, and price chart no dey show any of am.

Na the left edge of the chart dey catch people. For end of 2007, the two lines dey at $11755 and $11971, while dividends be 1.8% of the balance. Gap for the first year wey small like that fit look like rounding detail. But twenty years of the same rounding detail, with each one dey compound on the previous one, na wetin produce the spread for the right edge.

Gap dey continue to widen as time dey pass?

Na the same fund and same end date, but five different start dates.

QueryPrice return vs total return by holding period: S&P 500 tracker, windows wey end July 31, 2026
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(toFloat64(close), window_start) AS close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2006-07-31')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
),
spans AS (
    SELECT y AS years,
           concat(toString(y), '-year') AS horizon,
           subtractYears(toDate('2026-07-31'), y) AS start_date
    FROM (SELECT arrayJoin([1, 3, 5, 10, 20]) AS y)
),
divs AS (
    SELECT dv.ex_dividend_date AS d,
           log(1 + toFloat64(dv.cash_amount) / dl.close) AS log_growth
    FROM global_markets.stocks_dividends AS dv
    INNER JOIN daily AS dl ON dl.d = dv.ex_dividend_date
    WHERE dv.ticker = 'SPY'
      AND dv.cash_amount > 0
      AND dv.ex_dividend_date <= toDate('2026-07-31')
),
endpoints AS (
    SELECT s.horizon AS horizon,
           s.years AS years,
           argMin(dl.close, dl.d) AS start_px,
           argMax(dl.close, dl.d) AS end_px
    FROM spans AS s, daily AS dl
    WHERE dl.d >= s.start_date
    GROUP BY s.horizon, s.years
),
reinvest AS (
    SELECT s.years AS years,
           exp(sum(dvs.log_growth)) AS factor
    FROM spans AS s, divs AS dvs
    WHERE dvs.d > s.start_date
    GROUP BY s.years
)
SELECT e.horizon AS horizon,
       round(100 * (e.end_px / e.start_px - 1), 1) AS price_return_pct,
       round(100 * (e.end_px / e.start_px * r.factor - 1), 1) AS total_return_pct,
       round(100 * (e.end_px / e.start_px) * (r.factor - 1), 1) AS dividend_points_pct
FROM endpoints AS e
INNER JOIN reinvest AS r ON e.years = r.years
ORDER BY e.years
Run this yourself

For the 1-year window, price return na 18.2%, compared with total return of 19.5%. Difference na 1.3 percentage points. The 10-year window separate 244.3% from 304.5%, worth 60.2 points. For the 20-year window, the two readings na 485% and 736.9%: difference na 251.9 percentage points.

The curve no rise straight. E rise the same way the balance dey rise, because every dividend wey dem reinvest join the base wey the next dividend go compound on.

Why one year of dividends dey look trivial

Here be every calendar year for the same window, split between price move and dividend contribution.

QueryS&P 500 tracker by calendar year: price return vs the points wey reinvested dividends add
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(toFloat64(close), window_start) AS close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2006-01-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY d
),
yearly AS (
    SELECT toYear(d) AS year,
           argMin(close, d) AS first_px,
           argMax(close, d) AS last_px
    FROM daily
    GROUP BY year
),
divs AS (
    SELECT toYear(dv.ex_dividend_date) AS year,
           exp(sum(log(1 + toFloat64(dv.cash_amount) / dl.close))) AS factor
    FROM global_markets.stocks_dividends AS dv
    INNER JOIN daily AS dl ON dl.d = dv.ex_dividend_date
    WHERE dv.ticker = 'SPY'
      AND dv.cash_amount > 0
    GROUP BY year
)
SELECT y.year AS year,
       round(100 * (y.last_px / y.first_px - 1), 1) AS price_return_pct,
       round(100 * (y.last_px / y.first_px) * (d.factor - 1), 2) AS dividend_points_pct
FROM yearly AS y
INNER JOIN divs AS d ON y.year = d.year
ORDER BY year
Run this yourself

Read the two series together. The price line na the loud one, e dey swing hard for both directions. The dividend line na the quiet one: 1.9 points for 2007, 0.58 points for the partial year reach July 2026, and e never be the headline for the years between. No single row for that panel go change anybody mind about anything. But when dem stack and compound across 20 rows, those same small numbers na the full distance between the two lines for the first chart. Reinvesting dividend na also automatic buying at whatever price dey for that day, close to dollar cost averaging. Na the same reason S&P 500 dividend yield dey show as modest number, even though e matter much more over long windows pass wetin the size suggest.

Which stocks get the widest gap?

The gap dey follow the yield: company wey dey return more per dollar of price dey give holder more to reinvest. Na seven familiar names for the ten years up to July 31, 2026, annualized so the different periods fit compare.

QueryAnnualized price return vs total return over ten years: seven household names, reach July 31, 2026
The exact SQL behind every number
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS d,
           argMax(toFloat64(close), window_start) AS close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'KO', 'JNJ', 'XOM', 'PG', 'VZ', 'MSFT')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2016-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, d
),
px AS (
    SELECT ticker,
           argMin(close, d) AS start_px,
           argMax(close, d) AS end_px
    FROM daily
    GROUP BY ticker
),
divs AS (
    SELECT dv.ticker AS ticker,
           exp(sum(log(1 + toFloat64(dv.cash_amount) / dl.close))) AS factor
    FROM global_markets.stocks_dividends AS dv
    INNER JOIN daily AS dl ON dl.ticker = dv.ticker AND dl.d = dv.ex_dividend_date
    WHERE dv.ticker IN ('SPY', 'KO', 'JNJ', 'XOM', 'PG', 'VZ', 'MSFT')
      AND dv.cash_amount > 0
      AND dv.ex_dividend_date >= toDate('2016-08-01')
      AND dv.ex_dividend_date <= toDate('2026-07-31')
    GROUP BY dv.ticker
)
SELECT px.ticker AS ticker,
       round(100 * (pow(px.end_px / px.start_px, 0.1) - 1), 2) AS price_cagr_pct,
       round(100 * (pow(px.end_px / px.start_px * divs.factor, 0.1) - 1), 2) AS total_cagr_pct,
       round(100 * (pow(px.end_px / px.start_px * divs.factor, 0.1)
                    - pow(px.end_px / px.start_px, 0.1)), 2) AS dividend_points_pct
FROM px
INNER JOIN divs ON px.ticker = divs.ticker
ORDER BY dividend_points_pct DESC
Run this yourself

VZ get the widest annual gap among the 7, at 5.46 percentage points per year: -1.51% annualized from price alone, compared with 3.96% when dividends dey reinvested. MSFT dey for the narrow end at 1.53 points. Two things follow for anybody wey dey compare charts. Price chart dey understate high payer more than low payer, and any screen wey rank names by price performance dey quietly mark down the payers. The dividend yield behind each of these names na wetin dey set the size of the gap.

Where dem dey use each version

  • Benchmarks and fund fact sheets dey quote total return. “Total Return Index”, “TR” suffix, or note say “net dividends reinvested” for the fine print all mean say dem count the dividends.
  • Financial media and quote screens dey use price return. “The S&P 500 closed up 0.4%” na price movement.
  • Brokerage performance tabs normally dey show total return for the account, because na there the cash really enter. Gain column for one position often dey show price change against cost basis, and that one no be the same figure.
  • Backtests and strategy write-ups dey use whichever version the author’s data feed provide. Na there many quietly inflated track records come from.

The mismatch wey matter na when person put fund total return beside price index. The fund get credit for its own dividends, but benchmark no get any of its own. That one give the fund head start equal to the index full dividend stream. For the 20-year window above, that scoring error worth 251.9 percentage points, and no one of dem come from the manager. Correct like-for-like comparison na total return beside total return. How dem dey measure monthly returns dey show the same arithmetic for monthly level, while when you miss the best days show wetin happen to the price line when some sessions comot from am.

How dem build these numbers
  • Prices na daily regular-session closing prices. Dividends na cash distributions wey companies file, and dem reinvest each one at the closing price for its ex-dividend date. Na the standard convention for building total return series.
  • The window run from December 2005 reach July 31, 2026. Na the period wey the intraday price history behind these panels cover. Longer window go make the gap wider.
  • Fund wey track the index stand in for the index itself, so fees and cash drag dey inside these figures. Dem measure calendar-year price return from the first close of the year reach the last close. This one remove the first session’s move.

Price return kontra total return FAQ

S&P 500 na price index abi total return index?

The headline number na price index: e dey track market value of the constituents and e no count their dividends. Total return version of the same index dey exist, and e dey reinvest dem. Fund benchmarks generally dey use the total return version, while news coverage generally dey quote the price version.

How much dividends dey add to S&P 500 returns?

For the 10-year window wey end July 31, 2026, the tracker wey we use here return 244.3% on price, against 304.5% when dividends reinvest. Inside one calendar year, the contribution dey much smaller, around 1.9 points for 2007.

My brokerage account dey show price return abi total return?

Cash dividends dey enter the account, so the balance itself already include dem. Position gain column often dey compare current price with your cost basis only, and that one na price return. The two figures go differ by exactly the dividends received, unless reinvestment plan dey buy more shares along the way.

Why fund dey look better when dem compare am with price index?

The fund published figure include its dividends, while price index exclude its own. This comparison give the fund head start equal to the benchmark dividend stream, 251.9 percentage points across the 20-year window above.


Every figure here na stored, versioned query over daily closes and filed dividend records. Open any panel to read the SQL, or run the same price-versus-total-return comparison on ticker wey you dey follow for the Strasmore terminal.

#total return#dividends#s&p 500#index funds#performance