Rentabilidad por precio vs rentabilidad total
Rentabilidad por precio vs total: el S&P 500 excluye dividendos. Compara la brecha de capitalización a 20 años y cuándo usar cada versión para evaluar resultados.
La rentabilidad por precio frente a la rentabilidad total muestra la diferencia entre lo que refleja un gráfico de mercado y lo que realmente ganó alguien que mantuvo la misma posición. La rentabilidad por precio solo contabiliza el cambio en la cotización. La rentabilidad total suma todos los dividendos y los reinvierte al precio del día en que la acción empieza a cotizar ex-dividendo. Así, cada pago puede capitalizarse junto con las acciones que lo generaron.
El nivel del S&P 500 que aparece en los titulares es un índice de precios. Su equivalente de rentabilidad total mantiene las mismas empresas y reinvierte los dividendos. En un solo año, ambos parecen casi idénticos. En veinte años, describen resultados muy diferentes, y la brecha entre ellos es mayor de lo que sugeriría el rendimiento anual por dividendos.
¿Cuál es la diferencia entre rentabilidad por precio y rentabilidad total?
La rentabilidad por precio es el precio final dividido entre el precio inicial, menos uno. Cada nivel de índice que se muestra en televisión y cada gráfico de precios que haya consultado corresponde a este cálculo.
La rentabilidad total utiliza el mismo cálculo, pero reinvierte cada dividendo en efectivo para comprar más acciones al precio de la fecha ex-dividendo. Las tablas de rendimiento de los fondos y los índices de referencia contra los que se miden esos fondos utilizan esta versión.
Un ejemplo hipotético permite entender el mecanismo. Compre una acción a $100 que paga $2 al año y véndala un año después a $105. La rentabilidad por precio es de 5%. La rentabilidad total es de aproximadamente 7%. Ese primer año no tiene nada de extraordinario. La capitalización es lo que justifica dedicarle una página propia: los $2 reinvertidos compran una fracción de otra acción, esa fracción genera su propio dividendo al año siguiente y ambas series se separan a un ritmo cada vez mayor.
Antes de pasar a los datos, una aclaración. Un total return swap es un contrato derivado en el que una de las partes transfiere a la otra la rentabilidad económica completa de un activo a cambio de una tasa de financiamiento. Comparte el nombre, pero no tiene ninguna otra relación con la convención de índices descrita a continuación. El resto de esta página se refiere a índices y fondos.
¿Qué tan grande es la brecha en el S&P 500?
$10,000 invertidos en el mayor ETF que sigue al S&P 500 al cierre de 2005 y mantenidos hasta el 31 de julio de 2026. La primera línea gasta cada dividendo el día en que se recibe. La segunda reinvierte cada uno al precio de cierre de ese día.
El SQL exacto detrás de cada cifra
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 yearLa línea que solo refleja el precio termina en $59956. La línea con dividendos reinvertidos termina en $85775. Los dividendos representan 30.1% del saldo final, y nada de ese efecto aparece en un gráfico de precios.
El extremo izquierdo del gráfico es donde esto suele pasar inadvertido. Al cierre de 2007, las dos líneas se ubicaban en $11755 y $11971, y los dividendos equivalían a 1.8% del saldo. Una brecha tan pequeña durante el primer año puede parecer fácilmente un detalle de redondeo. Veinte años con ese mismo detalle de redondeo, cada uno capitalizándose sobre el anterior, generan el spread del extremo derecho.
¿La brecha sigue ampliándose con el tiempo?
El mismo fondo, la misma fecha final y cinco fechas de inicio diferentes.
El SQL exacto detrás de cada cifra
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.yearsDurante el periodo de 1-year, la rentabilidad por precio fue de 18.2%, frente a una rentabilidad total de 19.5%: una diferencia de 1.3 puntos porcentuales. En el periodo de 10-year, las cifras fueron 244.3% y 304.5%, con una diferencia de 60.2 puntos. Durante el periodo de 20-year, las dos lecturas fueron 485% y 736.9%: una diferencia de 251.9 puntos porcentuales.
La curva no sube en línea recta. Avanza como lo hace el saldo, porque cada dividendo reinvertido se incorpora a la base sobre la que se capitaliza el siguiente.
Por qué un año de dividendos parece insignificante
Aquí se muestra cada año calendario del mismo periodo, dividido entre el movimiento del precio y la contribución del dividendo.
El SQL exacto detrás de cada cifra
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 yearLea las dos series en conjunto. La línea del precio es la dominante y oscila con fuerza en ambas direcciones. La línea del dividendo es discreta: 1.9 puntos en 2007, 0.58 puntos en el año parcial hasta julio de 2026, y nunca es la protagonista en los años intermedios. Ninguna fila de ese panel cambiaría por sí sola la opinión de nadie sobre nada. Acumulados y compuestos a lo largo de 20 filas, esos mismos números pequeños representan toda la distancia entre las dos líneas del primer gráfico. Reinvertir un dividendo también implica comprar automáticamente al precio vigente ese día, un concepto cercano al promediado del costo en dólares. Por la misma razón, el rendimiento por dividendo del S&P 500 parece un número modesto, aunque tiene mucha más importancia en periodos largos de lo que su tamaño sugiere.
¿Qué acciones muestran la brecha más amplia?
La brecha sigue el rendimiento: una empresa que devuelve más por cada dólar de precio ofrece al tenedor más capital para reinvertir. Se incluyen siete nombres conocidos durante los diez años hasta el 31 de julio de 2026, con cifras anualizadas para que los horizontes sean comparables.
El SQL exacto detrás de cada cifra
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 registra la mayor brecha anual entre las 7, de 5.46 puntos porcentuales al año: -1.51% anualizado solo sobre el precio, frente a 3.96% con dividendos reinvertidos. MSFT se ubica en el extremo más estrecho, con 1.53 puntos. Esto tiene dos implicaciones para quien compare gráficos. Un gráfico de precios subestima mucho más a una acción con un rendimiento elevado que a una con un rendimiento bajo. Además, cualquier filtro que clasifique los nombres por desempeño del precio penaliza implícitamente a las acciones que pagan dividendos. El rendimiento por dividendo de cada uno de estos nombres es lo que determina el tamaño de su brecha.
Dónde se utiliza cada versión
- Los benchmarks y las fichas de fondos informan la rentabilidad total. La mención «Total Return Index», el sufijo «TR» o una nota sobre «net dividends reinvested» en la letra pequeña indican que los dividendos están incluidos.
- Los medios financieros y las pantallas de cotizaciones utilizan la rentabilidad por precio. «El S&P 500 cerró con un alza de 0.4%» describe un movimiento del precio.
- Las pestañas de rendimiento de las corredurías suelen mostrar la rentabilidad total de la cuenta, porque el efectivo efectivamente se abonó allí. La columna de ganancia de una posición individual suele mostrar el cambio de precio frente al cost basis, que no es la misma cifra.
- Los backtests y los análisis de estrategias utilizan la versión que haya proporcionado el feed de datos del autor. Ese es el origen de muchos historiales de rendimiento inflados de forma silenciosa.
La discrepancia importante aparece al comparar la rentabilidad total de un fondo con un índice de precios. El fondo recibe el crédito por sus propios dividendos, mientras que al benchmark no se le asigna ninguno de los suyos. Esto da al fondo una ventaja inicial equivalente a todo el flujo de dividendos del índice. En la ventana de 20-year anterior, ese error de medición equivale a 251.9 puntos porcentuales, y ninguno provino del gestor. La comparación correcta enfrenta rentabilidad total con rentabilidad total. Cómo se miden las rentabilidades mensuales desarrolla el mismo cálculo a nivel mensual, y perderse los mejores días muestra qué ocurre con la trayectoria del precio cuando se excluyen algunas sesiones.
Cómo se construyen estas cifras
- Los precios corresponden a los cierres diarios de la sesión regular. Los dividendos son distribuciones de efectivo declaradas, cada una reinvertida al precio de cierre de su fecha ex-dividendo. Esta es la convención estándar para construir una serie de rentabilidad total.
- La ventana abarca de diciembre de 2005 al 31 de julio de 2026, el periodo cubierto por el historial de precios intradía que sustenta estos paneles. Una ventana más larga amplía aún más la diferencia.
- Un fondo que replica el índice representa al propio índice. Por ello, las comisiones y el efectivo no invertido están incluidos en estas cifras. La rentabilidad por precio del año calendario se mide desde el primer cierre del año hasta el último, lo que excluye el movimiento de la primera sesión.
Preguntas frecuentes sobre rentabilidad por precio frente a rentabilidad total
¿El S&P 500 es un índice de precios o un índice de rentabilidad total?
La cifra principal corresponde a un índice de precios: sigue el valor de mercado de sus componentes e ignora sus dividendos. Existe una versión de rentabilidad total del mismo índice que reinvierte esos dividendos. Los benchmarks de los fondos suelen utilizar la versión de rentabilidad total, mientras que la cobertura de prensa normalmente cita la versión de precios.
¿Cuánto aportan los dividendos a la rentabilidad del S&P 500?
Durante el periodo de 10-year que terminó el 31 de julio de 2026, el instrumento de seguimiento utilizado aquí obtuvo 244.3% por precio, frente a 304.5% con los dividendos reinvertidos. Dentro de un solo año calendario, la contribución es mucho menor: alrededor de 1.9 puntos en 2007.
¿Mi cuenta de corretaje muestra la rentabilidad por precio o la rentabilidad total?
Los dividendos en efectivo se depositan en la cuenta, por lo que el saldo ya los incluye. La columna de ganancias de una posición suele comparar el precio actual con el cost basis, lo que representa únicamente la rentabilidad por precio. Ambas cifras difieren exactamente por los dividendos recibidos, salvo que un plan de reinversión haya comprado más acciones durante el periodo.
¿Un total return swap es lo mismo que la rentabilidad total?
No. Un total return swap es un contrato bilateral de derivados que intercambia la economía completa de un activo por una tasa de financiamiento. La rentabilidad total, en el sentido de un índice, es una convención para medir el desempeño. La expresión común alude a la misma idea subyacente de precio más ingresos, pero ambos conceptos no están relacionados como instrumentos.
¿Por qué un fondo parece tener un mejor desempeño cuando se lo compara con un índice de precios?
La cifra publicada por el fondo incluye sus dividendos, mientras que un índice de precios excluye los propios. La comparación otorga al fondo una ventaja inicial equivalente al flujo de dividendos del benchmark: 251.9 puntos porcentuales durante el periodo de 20-year mencionado arriba.
Todas las cifras de esta página provienen de una consulta almacenada y versionada sobre cierres diarios y registros de dividendos presentados. Abra cualquier panel para consultar el SQL o ejecute la misma comparación entre rentabilidad por precio y rentabilidad total para un ticker que siga en la terminal de Strasmore.