Stopa zwrotu cenowa a całkowita: różnica
Price return mierzy zmianę ceny, a total return także dywidendy. Sprawdź, jak reinwestowanie wypłat zmienia wynik S&P 500 w perspektywie 20 lat.
Różnica między stopą zwrotu cenową a całkowitą pokazuje rozbieżność między tym, co przedstawia wykres rynkowy, a faktycznym wynikiem inwestora utrzymującego tę samą pozycję. Stopa zwrotu cenowa uwzględnia wyłącznie zmianę ceny. Stopa zwrotu całkowita obejmuje natomiast wszystkie dywidendy, reinwestowane po cenie z dnia ex-dividend. Dzięki temu każda wypłata może się kapitalizować razem z akcjami, które ją wygenerowały.
Podawany w wiadomościach poziom indeksu S&P 500 jest wartością indeksu cenowego. Jego odpowiednik total return obejmuje te same spółki i reinwestuje dywidendy. W ujęciu jednego roku oba wskaźniki wyglądają niemal identycznie. W perspektywie dwudziestu lat pokazują jednak zupełnie różne rezultaty, a różnica między nimi jest większa, niż sugerowałaby roczna rentowność dywidendy.
Jaka jest różnica między stopą zwrotu cenową a całkowitą?
Stopa zwrotu cenowa to iloraz ceny końcowej i ceny początkowej pomniejszony o jeden. Każdy poziom indeksu podawany w telewizji oraz każdy wykres cenowy, który kiedykolwiek został wyświetlony, przedstawia tę wartość.
Stopa zwrotu całkowita opiera się na tym samym wyliczeniu, ale każda wypłacona dywidenda pieniężna jest wykorzystywana do zakupu dodatkowych akcji po cenie z dnia ex-dividend. Tę wersję stosuje się w tabelach wyników funduszy oraz w indeksach benchmarkowych, względem których mierzone są wyniki tych funduszy.
Przykład hipotetyczny pokazuje mechanizm. Zakup akcji po 100 USD, która wypłaca 2 USD rocznie, a następnie sprzedaż jej po roku za 105 USD oznacza stopę zwrotu cenową na poziomie 5%. Stopa zwrotu całkowita wynosi około 7%. Sam pierwszy rok nie wyróżnia się niczym szczególnym. O znaczeniu tej różnicy decyduje kapitalizacja. Reinvestowane 2 USD pozwalają kupić ułamek kolejnej akcji. Ten ułamek również przynosi dywidendę w następnym roku. W rezultacie obie serie oddalają się od siebie w coraz szybszym tempie.
Przed przedstawieniem danych należy wyjaśnić jeszcze jedno pojęcie. Total return swap to kontrakt pochodny, w ramach którego jedna strona przekazuje drugiej pełne ekonomiczne korzyści i ryzyka związane z aktywem w zamian za stopę finansowania. Z konwencją indeksową opisaną poniżej łączy go jedynie nazwa. W dalszej części omówiono wyłącznie indeksy i fundusze.
Jak duża jest różnica w przypadku S&P 500?
10 000 USD zainwestowane w największy ETF odwzorowujący S&P 500 na koniec 2005 roku i utrzymane do 31 lipca 2026 roku. W pierwszym wariancie każda dywidenda jest wydawana w dniu jej otrzymania. W drugim każda dywidenda jest reinwestowana po cenie zamknięcia z tego dnia.
Dokładny kod SQL dla każdej liczby
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 yearWariant oparty wyłącznie na zmianie ceny kończy się wynikiem $59956. Wariant z reinwestowaniem dywidend kończy się wynikiem $85775. Dywidendy odpowiadają za 30.1% wartości końcowego salda, a ich wpływ nie jest widoczny na wykresie ceny.
To lewa krawędź wykresu często prowadzi do błędnych wniosków. Na koniec 2007 obie linie znajdowały się na poziomach $11755 i $11971, a dywidendy odpowiadały za 1.8% salda. Tak niewielką różnicę po pierwszym roku łatwo uznać za szczegół wynikający z zaokrągleń. Dwadzieścia lat powtarzania tego samego efektu, za każdym razem powiększanego przez kapitalizację, tworzy różnicę widoczną przy prawej krawędzi.
Czy różnica nadal zwiększa się wraz z upływem czasu?
Ten sam fundusz, ta sama data końcowa, pięć różnych dat początkowych.
Dokładny kod SQL dla każdej liczby
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.yearsW okresie 1-year stopa zwrotu z ceny wyniosła 18.2%, a całkowita stopa zwrotu 19.5%. Różnica wyniosła 1.3 punktów procentowych. W okresie 10-year wartości te wyniosły odpowiednio 244.3% i 304.5%, co oznacza różnicę 60.2 punktów procentowych. W okresie 20-year obie wartości wyniosły 485% i 736.9%. Różnica wyniosła 251.9 punktów procentowych.
Krzywa nie rośnie liniowo. Zwiększa się tak jak saldo, ponieważ każda reinwestowana dywidenda powiększa bazę, od której naliczana jest kolejna stopa zwrotu.
Dlaczego dywidendy z jednego roku wyglądają nieistotnie
Poniżej przedstawiono każdy rok kalendarzowy z tego samego okresu, z podziałem na zmianę ceny i wpływ dywidendy.
Dokładny kod SQL dla każdej liczby
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 yearNależy analizować obie serie łącznie. Linia ceny jest dominująca i silnie zmienia się w obu kierunkach. Linia dywidendy pozostaje stabilna: 1.9 punktów w 2007, 0.58 punktów w niepełnym roku do lipca 2026 i ani razu nie jest najważniejszą wartością w pozostałych okresach. Żaden pojedynczy wiersz tego panelu nie zmieniłby niczyjej oceny sytuacji. Po zsumowaniu i kapitalizacji w 20 wierszach te same niewielkie wartości pokazują całą różnicę między dwiema liniami na pierwszym wykresie. Reinvestowanie dywidendy oznacza również automatyczny zakup po cenie obowiązującej danego dnia, co jest bliskie uśrednianiu ceny zakupu w czasie. Z tego samego powodu rentowność dywidendy indeksu S&P 500 ma umiarkowaną wartość, ale w długich okresach wpływa na wynik znacznie silniej, niż sugerowałaby jej wysokość.
Które akcje wykazują największą różnicę?
Różnica odzwierciedla rentowność: spółka, która zwraca inwestorowi więcej na każdego dolara ceny, daje mu więcej środków do reinwestowania. Poniżej przedstawiono siedem znanych spółek za dziesięć lat do 31 lipca 2026 r., w ujęciu annualizowanym, aby można było porównać poszczególne okresy.
Dokładny kod SQL dla każdej liczby
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 DESCVZ wykazuje największą roczną różnicę spośród 7 — wynosi ona 5.46 punktów procentowych rocznie: -1.51% w ujęciu annualizowanym wyłącznie na podstawie ceny wobec 3.96% przy reinwestowaniu dywidend. MSFT znajduje się na drugim końcu zestawienia, z różnicą wynoszącą 1.53 punktów. Z porównywania wykresów wynikają dwa wnioski. Wykres cenowy w znacznie większym stopniu zaniża wyniki spółki wypłacającej wysokie dywidendy niż spółki wypłacającej niskie dywidendy. Ponadto każdy screener szeregujący spółki według wyników cenowych pośrednio obniża pozycję spółek dywidendowych. To rentowność dywidendy każdej z tych spółek określa wielkość różnicy.
Gdzie stosuje się poszczególne wersje
- Benchmarki i karty funduszy podają całkowitą stopę zwrotu. Określenie „Total Return Index”, przyrostek „TR” lub informacja „net dividends reinvested” w przypisie oznaczają, że dywidendy zostały uwzględnione.
- Media finansowe i ekrany notowań wykorzystują stopę zwrotu cenową. Stwierdzenie „S&P 500 zamknął sesję 0,4% wyżej” odnosi się do zmiany ceny.
- Zakładki wyników w rachunkach maklerskich zwykle pokazują dla rachunku całkowitą stopę zwrotu, ponieważ środki faktycznie wpłynęły na rachunek. Kolumna zysku dla pojedynczej pozycji często pokazuje zmianę ceny względem kosztu nabycia, co nie jest tą samą wartością.
- Analizy historyczne i opisy strategii wykorzystują wersję dostarczoną przez źródło danych autora. To właśnie stąd bierze się wiele po cichu zawyżonych wyników historycznych.
Najistotniejsza rozbieżność powstaje przy zestawieniu całkowitej stopy zwrotu funduszu ze stopą zwrotu cenową indeksu. Fundusz otrzymuje uznanie za własne dywidendy, podczas gdy benchmark nie uwzględnia żadnych własnych dywidend. Daje to funduszowi przewagę początkową równą całemu strumieniowi dywidend indeksu. W analizowanym powyżej okresie 20-year ten błąd porównawczy odpowiada 251.9 punktom procentowym. Żaden z nich nie wynikał z działań zarządzającego. Porównanie według jednolitych zasad zestawia całkowitą stopę zwrotu z całkowitą stopą zwrotu. Jak mierzy się miesięczne stopy zwrotu przedstawia te same obliczenia na poziomie miesięcznym, a pominięcie najlepszych sesji pokazuje, co dzieje się z przebiegiem cenowym, gdy wyłączy się z niego kilka sesji.
Jak obliczane są te wartości
- Ceny oznaczają dzienne kursy zamknięcia regularnej sesji. Dywidendy to zgłoszone wypłaty gotówkowe, z których każda jest reinwestowana po kursie zamknięcia z dnia ex-dividend. Jest to standardowa konwencja stosowana przy tworzeniu szeregu całkowitej stopy zwrotu.
- Analizowany okres obejmuje czas od grudnia 2005 roku do 31 lipca 2026 roku. Jest to zakres objęty śródsesyjną historią cen wykorzystaną w tych panelach. Dłuższy okres jeszcze bardziej zwiększałby różnicę.
- Fundusz replikujący indeks zastępuje sam indeks, dlatego opłaty i koszt utrzymywania środków pieniężnych są uwzględnione w tych wartościach. Kalendarzową stopę zwrotu cenową mierzy się od pierwszego zamknięcia w roku do ostatniego, co eliminuje zmianę z pierwszej sesji.
FAQ: stopa zwrotu cenowa a całkowita
Czy S&P 500 jest indeksem cenowym czy indeksem całkowitej stopy zwrotu?
Publikowana wartość jest indeksem cenowym: śledzi wartość rynkową spółek wchodzących w jego skład i pomija ich dywidendy. Istnieje również wersja tego samego indeksu oparta na całkowitej stopie zwrotu, w której dywidendy są reinwestowane. Benchmarki funduszy zasadniczo wykorzystują wersję całkowitej stopy zwrotu, natomiast media zwykle podają wartość wersji cenowej.
Jaki wpływ na stopę zwrotu z S&P 500 mają dywidendy?
W okresie 10-year kończącym się 31 lipca 2026 r. analizowany instrument odnotował stopę zwrotu 244.3% w ujęciu cenowym oraz 304.5% po reinwestycji dywidend. W obrębie jednego roku kalendarzowego udział dywidend jest znacznie mniejszy i wynosi około 1.9 punktów w 2007.
Czy rachunek maklerski pokazuje cenową czy całkowitą stopę zwrotu?
Dywidendy pieniężne są księgowane na rachunku, więc jego saldo już je uwzględnia. Kolumna przedstawiająca zysk z pozycji często porównuje wyłącznie bieżącą cenę z kosztem nabycia, czyli pokazuje cenową stopę zwrotu. Obie wartości różnią się dokładnie o otrzymane dywidendy, chyba że w ramach programu reinwestycji były za nie kupowane kolejne akcje.
Czy total return swap oznacza to samo co całkowita stopa zwrotu?
Nie. Total return swap jest dwustronnym kontraktem pochodnym, w którym pełne ekonomiczne wyniki aktywa są wymieniane na stopę finansowania. Całkowita stopa zwrotu w ujęciu indeksowym jest konwencją pomiaru wyników. Wspólne określenie odnosi się do tej samej podstawowej koncepcji, czyli połączenia zmiany ceny i dochodu, ale oba terminy dotyczą różnych instrumentów.
Dlaczego fundusz wygląda lepiej w porównaniu z indeksem cenowym?
Publikowana stopa zwrotu funduszu obejmuje jego dywidendy, podczas gdy indeks cenowy pomija własny strumień dywidend. Takie porównanie daje funduszowi przewagę początkową odpowiadającą dywidendom z benchmarku, czyli 251.9 punktów procentowych w opisanym wyżej okresie 20-year.
Każda wartość przedstawiona w tym materiale pochodzi z przechowywanego, wersjonowanego zapytania o dzienne kursy zamknięcia i złożone dane dotyczące dywidend. Po otwarciu dowolnego panelu można odczytać kod SQL albo wykonać takie samo porównanie cenowej i całkowitej stopy zwrotu dla obserwowanego tickera w terminalu Strasmore.