Retorno de preço vs retorno total: diferença real
Retorno de preço vs. retorno total: o índice headline do S&P 500 exclui dividendos. Compare a diferença em vinte anos e saiba quando usar cada versão.
O retorno pelo preço e o retorno total mostram a diferença entre o que um gráfico de mercado apresenta e o que alguém que manteve a mesma posição efetivamente ganhou. O retorno pelo preço considera apenas a variação da cotação. O retorno total acrescenta todos os dividendos, reinvestidos ao preço do dia em que a ação fica ex-dividendo. Assim, cada pagamento pode capitalizar junto com as ações que o geraram.
O nível do S&P 500 normalmente divulgado nas notícias é um índice de preços. A sua versão de retorno total mantém as mesmas empresas e reinveste os dividendos. Em um único ano, os dois indicadores parecem quase idênticos. Em vinte anos, mostram resultados muito diferentes, e a distância entre eles é maior do que o rendimento anual sugeriria.
Qual é a diferença entre retorno de preço e retorno total?
Retorno de preço é o preço final dividido pelo preço inicial, menos um. Todo nível de índice divulgado na televisão e todo gráfico de preços que você já consultou mostram esse número.
Retorno total faz o mesmo cálculo, mas usa cada dividendo em dinheiro para comprar mais ações ao preço da data ex-dividendo. As tabelas de desempenho dos fundos e os índices de referência usados para avaliá-los adotam essa versão.
Um exemplo hipotético torna a mecânica concreta. Compre uma ação por US$ 100, que pague US$ 2 por ano, e venda-a um ano depois por US$ 105. O retorno de preço é de 5%. O retorno total é de aproximadamente 7%. O primeiro ano não tem nada de extraordinário. É a capitalização que justifica uma página própria: os US$ 2 reinvestidos compram uma fração de outra ação, essa fração recebe o seu próprio dividendo no ano seguinte, e as duas séries se afastam a uma taxa cada vez maior.
Uma distinção antes dos dados. Um total return swap é um contrato derivativo no qual uma das partes repassa toda a exposição econômica a um ativo em troca de uma taxa de financiamento. Ele compartilha apenas o nome com a convenção de índices explicada abaixo. O restante desta página trata de índices e fundos.
Qual é o tamanho da diferença no S&P 500?
US$ 10.000 investidos no maior ETF que acompanha o S&P 500 no fim de 2005, mantidos até 31 de julho de 2026. A primeira linha gasta cada dividendo no dia em que ele é recebido. A segunda reinveste cada dividendo ao preço de fechamento daquele dia.
O SQL exato por trás de cada número
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 yearA linha que considera apenas o preço termina em US$ 59956. A linha com reinvestimento termina em US$ 85775. Os dividendos representam 30.1% desse saldo final, e nenhum deles aparece em um gráfico de preços.
É na borda esquerda do gráfico que esse efeito costuma passar despercebido. No fim de 2007, as duas linhas estavam em US$ 11755 e US$ 11971, e os dividendos representavam 1.8% do saldo. Uma diferença tão pequena no primeiro ano pode ser facilmente tratada como mero arredondamento. Vinte anos do mesmo arredondamento, cada um capitalizando sobre o anterior, produzem o spread na borda direita.
A diferença continua a aumentar com o tempo?
Mesmo fundo, mesma data final, cinco datas de início diferentes.
O SQL exato por trás de cada número
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.yearsNo período de 1-year, o retorno de preço foi de 18.2%, contra um retorno total de 19.5%. A diferença foi de 1.3 pontos percentuais. O período de 10-year separa 244.3% de 304.5%, uma diferença de 60.2 pontos. No período de 20-year, os dois resultados foram 485% e 736.9%: uma diferença de 251.9 pontos percentuais.
A curva não sobe em linha reta. Ela evolui como o saldo, porque cada dividendo reinvestido é incorporado à base sobre a qual o próximo dividendo é composto.
Por que um ano de dividendos parece irrelevante
Aqui está cada ano civil da mesma janela, dividido entre a variação do preço e a contribuição dos dividendos.
O SQL exato por trás de cada número
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 yearLeia as duas séries em conjunto. A linha do preço é a mais ruidosa, com fortes oscilações nas duas direções. A linha dos dividendos é discreta: 1.9 pontos em 2007, 0.58 pontos no ano parcial até julho 2026 e nunca é o destaque nos demais períodos. Nenhuma linha isolada desse painel mudaria a opinião de alguém sobre qualquer assunto. Acumulados e capitalizados ao longo de 20 linhas, esses mesmos números pequenos representam toda a distância entre as duas linhas do primeiro gráfico. Reinvestir um dividendo também equivale a comprar automaticamente ao preço vigente naquele dia, algo muito próximo de aportes periódicos. É pelo mesmo motivo que o dividend yield do S&P 500 aparece como um número modesto, embora tenha um efeito muito maior em janelas longas do que o seu tamanho sugere.
Quais ações mostram a maior diferença?
A diferença acompanha o yield: uma empresa que devolve mais por dólar de preço oferece ao acionista mais recursos para reinvestir. A seleção reúne sete nomes conhecidos no período de dez anos até 31 de julho de 2026, com os retornos anualizados para tornar os horizontes comparáveis.
O SQL exato por trás de cada número
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 apresenta a maior diferença anual entre os 7, de 5.46 pontos percentuais por ano: -1.51% anualizados considerando apenas a valorização do preço, contra 3.96% com os dividendos reinvestidos. MSFT aparece na menor diferença, de 1.53 pontos. Isso traz duas conclusões para quem compara gráficos. Um gráfico de preços subestima muito mais o desempenho de uma ação com yield elevado do que o de uma ação com yield baixo. Além disso, qualquer filtro que classifique os nomes pelo desempenho do preço penaliza silenciosamente os pagadores. O yield de dividendos por trás de cada um desses nomes é o que determina o tamanho da diferença.
Onde cada versão é usada
- Benchmarks e fichas técnicas de fundos apresentam o retorno total. A expressão “Total Return Index”, o sufixo “TR” ou a observação “net dividends reinvested” nas notas de rodapé indicam que os dividendos estão incluídos.
- A imprensa financeira e as telas de cotações usam o retorno de preço. “O S&P 500 fechou em alta de 0,4%” descreve uma variação de preço.
- As abas de desempenho das corretoras normalmente mostram o retorno total da conta, porque o dinheiro efetivamente entrou nela. A coluna de ganho de uma posição individual costuma mostrar a variação de preço em relação ao cost basis, que não é o mesmo valor.
- Backtests e análises de estratégias usam a versão fornecida pelo feed de dados do autor. Essa é a origem de muitos históricos de desempenho discretamente inflados.
O desalinhamento relevante ocorre quando o retorno total de um fundo é comparado com um índice de preço. O fundo recebe crédito pelos próprios dividendos, enquanto o benchmark não recebe crédito pelos seus. Isso dá ao fundo uma vantagem inicial equivalente a todo o fluxo de dividendos do índice. Na janela 20-year acima, esse erro de avaliação vale 251.9 pontos percentuais, e nenhum deles veio do gestor. A comparação correta coloca retorno total ao lado de retorno total. Como são medidos os retornos mensais apresenta o mesmo cálculo em base mensal, e perder os melhores dias mostra o que acontece com a linha de preços quando algumas sessões são retiradas dela.
Como estes números são calculados
- Os preços são os fechamentos diários do pregão regular. Os dividendos são distribuições em dinheiro registradas, cada uma reinvestida ao preço de fechamento na respetiva data ex-dividendo, que é a convenção padrão para construir uma série de retorno total.
- A janela vai de dezembro de 2005 a 31 de julho de 2026, período coberto pelo histórico de preços intradiários usado nestes painéis. Uma janela mais longa amplia ainda mais a diferença.
- Um fundo que acompanha o índice representa o próprio índice. Por isso, as taxas e o efeito do caixa permanecem incluídos nestes números. O retorno de preço no ano-calendário é medido entre o primeiro fechamento do ano e o último, o que exclui a variação da primeira sessão.
FAQ: retorno de preço versus retorno total
O S&P 500 é um índice de preço ou um índice de retorno total?
O número de referência é um índice de preço: acompanha o valor de mercado dos componentes e ignora os dividendos. Existe também uma versão de retorno total do mesmo índice, que reinveste esses dividendos. Os benchmarks dos fundos geralmente usam a versão de retorno total, enquanto a cobertura jornalística geralmente cita a versão de preço.
Quanto os dividendos acrescentam ao retorno do S&P 500?
No período de 10-year encerrado em 31 de julho de 2026, o ETF usado aqui teve retorno de 244.3% com base no preço, contra 304.5% com os dividendos reinvestidos. Dentro de um único ano-calendário, a contribuição é muito menor, de cerca de 1.9 pontos em 2007.
Minha conta na corretora mostra o retorno de preço ou o retorno total?
Os dividendos em dinheiro entram na conta, portanto o saldo já os inclui. A coluna de ganho de uma posição geralmente compara o preço atual com o cost basis, o que representa apenas o retorno de preço. Os dois valores diferem exatamente pelos dividendos recebidos, a menos que um plano de reinvestimento tenha comprado mais ações ao longo do período.
Um total return swap é a mesma coisa que retorno total?
Não. Um total return swap é um contrato de derivativo bilateral que troca o resultado econômico completo de um ativo por uma taxa de financiamento. Retorno total, no sentido usado em índices, é uma convenção de mensuração de desempenho. A expressão semelhante aponta para a mesma ideia subjacente de preço mais renda, mas os dois conceitos não têm relação enquanto instrumentos.
Por que um fundo parece melhor quando comparado com um índice de preço?
O número divulgado pelo fundo inclui seus dividendos, enquanto um índice de preço exclui os seus. A comparação dá ao fundo uma vantagem inicial equivalente ao fluxo de dividendos do benchmark: 251.9 pontos percentuais no período de 20-year mencionado acima.
Todas as cifras aqui vêm de uma consulta armazenada e versionada, baseada em fechamentos diários e registros de dividendos divulgados. Abra qualquer painel para ler o SQL ou faça a mesma comparação entre retorno de preço e retorno total para um ticker que você acompanha no terminal Strasmore.