Cómo se miden los rendimientos mensuales
El cálculo del rendimiento mensual depende de los precios elegidos, la inclusión de dividendos y el ajuste por splits en la serie de datos.
Si se pregunta qué "hizo una acción en junio", se obtendrán cifras distintas según la fuente, y todas pueden ser correctas. El rendimiento mensual de una acción depende de decisiones que la mayoría de las personas no percibe: qué dos precios delimitan el mes, si se incluyen los dividendos y si la serie de precios fue ajustada por splits. Esta página compara las distintas convenciones utilizando datos reales, de forma paralela, para eliminar la confusión sobre estas diferencias.
Close-to-close: la convención estándar
La convención utilizada por los proveedores de índices, las fichas técnicas de los fondos y la mayoría de las páginas de cotizaciones: el rendimiento mensual se calcula desde el precio de cierre de la última sesión regular del mes anterior hasta el cierre final de este mes. El último cierre de mayo es el punto de partida para junio. El cálculo es simple: precio final menos precio inicial, dividido por el precio inicial. Un ejemplo básico: una acción que cierra mayo a $50.00 y cierra junio a $53.50 tuvo un rendimiento de (53.50 − 50.00) ÷ 50.00 = 0.07, o 7%, durante el mes. Cada convención en esta página utiliza diferentes datos de entrada para esa misma fórmula. Aquí se muestra con los datos reales de junio de 2026, junto con la principal alternativa:
El SQL exacto detrás de cada cifra
SELECT ticker,
round(argMaxIf(cl, day, day <= '2026-05-31'), 2) AS may_final_close,
round(argMinIf(op, day, day >= '2026-06-01'), 2) AS june_first_open,
round(argMaxIf(cl, day, day <= '2026-06-30'), 2) AS june_final_close,
round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))
/ argMaxIf(cl, day, day <= '2026-05-31'), 2) AS close_to_close_pct,
round(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))
/ argMinIf(op, day, day >= '2026-06-01'), 2) AS open_to_close_pct,
round(abs(100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMinIf(op, day, day >= '2026-06-01'))
/ argMinIf(op, day, day >= '2026-06-01')
- 100 * (argMaxIf(cl, day, day <= '2026-06-30') - argMaxIf(cl, day, day <= '2026-05-31'))
/ argMaxIf(cl, day, day <= '2026-05-31')), 2) AS convention_gap_points
FROM (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMinIf(toFloat64(open), window_start, rth) AS op,
argMaxIf(toFloat64(close), window_start, rth) AS cl
FROM (
SELECT ticker, window_start, open, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('NVDA', 'SPY')
AND window_start >= '2026-05-28 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)
GROUP BY ticker, day
)
GROUP BY ticker
ORDER BY tickerEl junio de NVDA fue -5.39% close-to-close, pero -7.4% medido desde la primera apertura de sesión regular de junio hasta su último cierre. Misma acción, mismo mes, 2.01 puntos porcentuales de diferencia entre ambas respuestas correctas. La diferencia total es un periodo de un overnight más el fin de semana: NVDA cerró mayo a $211.15 y abrió junio a $215.73; ese salto pertenece a "junio" en la convención open-to-close y al límite en la convención close-to-close. SPY muestra la misma estructura de forma más moderada: -1.33% close-to-close frente a -1.2% open-to-close.
Ningún número es incorrecto. El close-to-close responde a "¿qué experimentó un inversor que mantuvo su posición durante el cambio de mes?". El open-to-close responde a "¿qué entregó la negociación del mes a alguien que compró en la apertura de junio?". Diferen siempre que el mercado presenta un gap en el límite de la sesión, y los gaps nocturnos son habituales, no excepcionales.
Dividends: price return vs total return
The second choice: does the cash a stock paid out during the month count? A price return ignores it; a total return adds it back. For most single months the gap is small — a quarterly payer distributes roughly a quarter of its yield per quarter — but it compounds into a chasm over years, and June 2026 happened to be an SPY payment month:
El SQL exacto detrás de cada cifra
WITH px AS (
SELECT argMaxIf(cl, day, day <= '2026-05-31') AS may_close,
argMaxIf(cl, day, day <= '2026-06-30') AS jun_close
FROM (
SELECT ticker,
toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMinIf(toFloat64(open), window_start, rth) AS op,
argMaxIf(toFloat64(close), window_start, rth) AS cl
FROM (
SELECT ticker, window_start, open, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker IN ('NVDA', 'SPY')
AND window_start >= '2026-05-28 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)
GROUP BY ticker, day
)
WHERE ticker = 'SPY'
),
dv AS (
SELECT sum(cash_amount) AS div_per_share
FROM global_markets.stocks_dividends
WHERE ticker = 'SPY'
AND ex_dividend_date >= '2026-06-01'
AND ex_dividend_date <= '2026-06-30'
)
SELECT round(may_close, 2) AS may_final_close,
round(jun_close, 2) AS june_final_close,
round(div_per_share, 4) AS june_dividend_per_share,
round(100 * (jun_close - may_close) / may_close, 2) AS price_return_pct,
round(100 * div_per_share / may_close, 2) AS dividend_contribution_pct,
round(100 * ((jun_close + div_per_share) - may_close) / may_close, 2) AS total_return_pct
FROM px CROSS JOIN dvSPY's June price return was -1.33%; add the $1.9035 per-share distribution that went ex-dividend during the month and the total return improves to -1.08% — a 0.25% contribution from cash. Index families publish both flavors (the "S&P 500" you see quoted is usually the price index), fund performance pages are required to show total return, and screeners mix the two freely. When two sources disagree by a few tenths on a dividend payer's month, the dividend is the first suspect — the ex-dividend date determines which month a payment belongs to.
A single June is tenths of a percent. Horizon is what separates the two conventions — here is the same arithmetic stretched across five years:
El SQL exacto detrás de cada cifra
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMaxIf(toFloat64(close), window_start,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND ((window_start >= '2021-06-28 04:00:00' AND window_start < '2021-07-01 08:00:00')
OR (window_start >= '2026-06-26 04:00:00' AND window_start < '2026-07-01 08:00:00'))
GROUP BY day
),
px AS (
SELECT argMaxIf(cl, day, day <= '2021-06-30') AS start_close,
argMaxIf(cl, day, day <= '2026-06-30') AS end_close
FROM daily
),
dv AS (
SELECT round(sum(cash_amount), 2) AS divs_per_share,
count() AS payments
FROM global_markets.stocks_dividends
WHERE ticker = 'SPY'
AND ex_dividend_date >= '2021-07-01'
AND ex_dividend_date <= '2026-06-30'
)
SELECT round(start_close, 2) AS june_2021_close,
round(end_close, 2) AS june_2026_close,
divs_per_share AS dividends_paid_per_share,
payments AS dividend_payments,
round(100 * (end_close - start_close) / start_close, 2) AS five_year_price_return_pct,
round(100 * ((end_close + divs_per_share) - start_close) / start_close, 2) AS five_year_return_with_divs_pct,
round(100 * divs_per_share / start_close, 2) AS dividend_points_added
FROM px CROSS JOIN dvFrom its June 2021 close of $428.07 to its June 2026 close of $746.32, SPY's five-year price return measures 74.35%. Over the same span it paid 20 distributions totaling $34.07 per share; counting that cash lifts the figure to 82.3% — 7.96 points of gap before a single dividend is reinvested. A true total-return index reinvests each payment on its ex-date, and the reinvested shares push the gap wider still. On a mature payer, "large margins" is not a figure of speech; it is the default outcome of years of quarterly cash.
Cierre ajustado vs. cierre bruto: la trampa del split
La mayoría de las herramientas de gráficos —Yahoo Finance, Google Finance y la mayoría de las apps de brokers— cotizan un cierre ajustado: una serie de precios históricos donde los valores pasados se dividen por los splits (y, en algunas plataformas, también se ajustan por dividendos) para que la línea sea comparable a través del tiempo. Nuestro almacén guarda la cinta tal como se imprimió originalmente. En un mes ordinario, ambos valores coinciden. En un mes que contiene un split de acciones, muestran resultados muy distintos; como el split de diez por uno de NVDA ejecutado el 10 de junio de 2024, dentro del mes:
El SQL exacto detrás de cada cifra
WITH px AS (
SELECT argMaxIf(cl, day, day <= '2024-05-31') AS may_close,
argMaxIf(cl, day, day <= '2024-06-30') AS jun_close
FROM (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMaxIf(toFloat64(close), window_start,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'NVDA'
AND window_start >= '2024-05-29 04:00:00'
AND window_start < '2024-07-01 08:00:00'
GROUP BY day
)
),
sp AS (
SELECT split_to / split_from AS ratio
FROM global_markets.stocks_splits
WHERE ticker = 'NVDA'
AND execution_date >= '2024-06-01'
AND execution_date <= '2024-06-30'
)
SELECT round(may_close, 2) AS may_final_close_raw,
round(jun_close, 2) AS june_final_close_raw,
toInt32(ratio) AS shares_after_split_per_old_share,
round(100 * (jun_close - may_close) / may_close, 2) AS raw_price_change_pct,
round(may_close / ratio, 2) AS may_close_split_adjusted,
round(100 * (jun_close - may_close / ratio) / (may_close / ratio), 2) AS adjusted_return_pct
FROM px CROSS JOIN spLeído en bruto, NVDA "cayó" de $1097.46 a $123.41 ese junio —un colapso de -88.75%. No ocurrió nada de eso: en la fecha de ejecución, cada acción antigua se convirtió en 10 nuevas y el precio se dividió para coincidir, manteniendo el valor en dólares de cada accionista igual. Divida el cierre de mayo por la misma proporción —$109.75 en base ajustada por split— y junio de 2024 registra un 12.45%, un mes alcista. Cualquier fuente que cotice datos ajustados reportará algo cercano al segundo valor; un cálculo ingenuo sobre precios brutos reportará el primero. El cierre ajustado es la razón más común por la cual dos fuentes discrepan drásticamente sobre un retorno mensual histórico; cuando una cifra parezca imposiblemente grande en cualquier dirección, revise el calendario de splits antes que cualquier otra cosa.
¿Cuál es el precio de "cierre"?
Existe otra frontera en las convenciones: el precio de cierre en sí mismo. El número que utiliza cada ficha técnica es el precio oficial de la subasta de cierre, el precio único establecido por la subasta de cierre a las 4:00 PM ET. Sin embargo, la negociación continúa fuera del horario habitual, y el último precio de la sesión extendida puede diferir del cierre oficial:
El SQL exacto detrás de cada cifra
SELECT round(argMaxIf(toFloat64(close), window_start, rth), 2) AS regular_session_close,
round(argMax(toFloat64(close), window_start), 2) AS last_extended_print,
round(100 * (argMax(toFloat64(close), window_start) - argMaxIf(toFloat64(close), window_start, rth))
/ argMaxIf(toFloat64(close), window_start, rth), 3) AS after_hours_drift_pct
FROM (
SELECT window_start, close,
toTimeZone(window_start, 'America/New_York') >= toDateTime('2026-06-30 09:30:00', 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime('2026-06-30 16:00:00', 'America/New_York') AS rth
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2026-06-30 04:00:00'
AND window_start < '2026-07-01 08:00:00'
)El 30 de junio la diferencia fue de -0.003% — una cifra pequeña esa noche, pero en una noche de reporte de ganancias de una acción individual, la sesión extendida puede presentar movimientos de escala porcentual que el rendimiento mensual oficial asignará al siguiente mes. El trading fuera de horario y premarket analiza ese límite en detalle. Un caso especial relacionado: los límites mensuales ocasionalmente coinciden con sesiones reducidas por días festivos, donde la jornada regular termina a la 1:00 PM ET y el cierre oficial se establece en una subasta de cierre temprana; el calendario de días festivos del mercado los detalla.
Capitalización de doce meses en un año
El rendimiento anual no es la suma de doce rendimientos mensuales, sino su producto. La fórmula de vinculación consiste en convertir cada mes en un factor de crecimiento (1 + rendimiento), multiplicar los doce factores y restar 1. Un mes de −5% seguido de uno de +5% suma cero, pero su capitalización es 0.95 × 1.05 − 1 = −0.25%. Este es el recorrido mensual real de SPY durante los doce meses que terminan en junio de 2026:
El SQL exacto detrás de cada cifra
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMaxIf(toFloat64(close), window_start,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2025-06-24 04:00:00'
AND window_start < '2026-07-01 08:00:00'
GROUP BY day
),
monthly AS (
SELECT toStartOfMonth(day) AS month_start,
argMax(cl, day) AS month_close
FROM daily
GROUP BY month_start
),
rets AS (
SELECT month_start,
formatDateTime(month_start, '%Y-%m') AS month,
round(month_close, 2) AS month_final_close,
100 * (month_close / lagInFrame(month_close) OVER (ORDER BY month_start) - 1) AS r
FROM monthly
)
SELECT month,
month_final_close,
round(r, 2) AS simple_return_pct,
round(100 * log(1 + r / 100), 2) AS log_return_pct
FROM rets
WHERE isFinite(r)
ORDER BY month_startDoce meses de cierre a cierre, desde 2.28% en 2025-07 hasta -1.33% en 2026-06; la última fila es la misma cifra de SPY para junio de 2026 que midió el primer panel. Vincule los doce meses correctamente y compárelos con el método simplificado de solo sumar los porcentajes:
El SQL exacto detrás de cada cifra
WITH daily AS (
SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS day,
argMaxIf(toFloat64(close), window_start,
toTimeZone(window_start, 'America/New_York') >= toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 09:30:00'), 'America/New_York')
AND toTimeZone(window_start, 'America/New_York') < toDateTime(concat(toString(toDate(toTimeZone(window_start, 'America/New_York'))), ' 16:00:00'), 'America/New_York')) AS cl
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'SPY'
AND window_start >= '2025-06-24 04:00:00'
AND window_start < '2026-07-01 08:00:00'
GROUP BY day
),
monthly AS (
SELECT toStartOfMonth(day) AS month_start,
argMax(cl, day) AS month_close
FROM daily
GROUP BY month_start
),
rets AS (
SELECT month_start,
100 * (month_close / lagInFrame(month_close) OVER (ORDER BY month_start) - 1) AS r
FROM monthly
),
ends AS (
SELECT argMin(month_close, month_start) AS base_close,
argMax(month_close, month_start) AS final_close
FROM monthly
)
SELECT count() AS months_linked,
round(sum(r), 2) AS simple_sum_pct,
round(100 * (exp(sum(log(1 + r / 100))) - 1), 2) AS geometric_compound_pct,
round(100 * (any(final_close) / any(base_close) - 1), 2) AS direct_twelve_month_pct,
round(100 * (exp(sum(log(1 + r / 100))) - 1) - sum(r), 2) AS compounding_gap_points,
round(sum(100 * log(1 + r / 100)), 2) AS sum_of_monthly_log_returns_pct,
round(100 * log(any(final_close) / any(base_close)), 2) AS twelve_month_log_return_pct
FROM rets CROSS JOIN ends
WHERE isFinite(r)La suma de los doce meses es 19.83%, pero su capitalización es 20.79%. El cálculo directo, desde el cierre de junio de 2025 hasta junio de 2026, da 20.79%, lo cual coincide con la cifra capitalizada en lugar de la suma. La diferencia aquí es de 0.96 puntos en un año relativamente estable; esta brecha aumenta con la volatilidad y el horizonte temporal. Sumar los porcentajes mensuales es un hábito común en las hojas de cálculo, pero es incorrecto.
Las últimas dos columnas muestran la convención diseñada para la suma: el log return, que es el logaritmo natural del factor de crecimiento, ln(1 + rendimiento). Los log returns mensuales suman 18.89%, lo cual es idéntico al log return de doce meses de 18.89%; esta es precisamente la razón por la que los analistas y los modelos de riesgo los utilizan. Para meses con movimientos pequeños, ambas convenciones apenas difieren (2025-11: 0.21% simple, 0.21% log); cuanto mayor es el movimiento mensual, mayor es la diferencia (2026-04: 10.49% simple, 9.97% log). Las fichas técnicas de los fondos citan rendimientos simples; los log returns se utilizan en artículos de investigación y matemáticas de volatilidad.
La lista de verificación para reconciliar dos fuentes
Cuando dos cifras de rendimiento mensual no coinciden, casi siempre se debe a uno de estos cuatro factores:
- Endpoints — close-to-close (el estándar) o open-to-close (la negociación propia del mes). Varían cuando hay un gap en el límite.
- Dividends — price return o total return. Varían en cualquier mes que incluya una fecha ex-dividend.
- Adjustment — precios brutos o series de adjusted-close. Varían drásticamente en cualquier mes que incluya un split.
- El cierre mismo — el print oficial de la subasta (el estándar) frente a la última operación que puede incluir horas extendidas.
Al aplicar los mismos factores en ambas fuentes, la discrepancia desaparece. Una comparación entre un fondo y un índice solo es válida cuando ambas cifras utilizan la misma configuración de estos cuatro factores; si hay un error en uno, la comparación medirá el factor en lugar del rendimiento. Nuestro propio resumen de junio de 2026 establece su convención desde el principio precisamente por esta razón: cada cifra mensual allí es close-to-close, con prints oficiales y price return.
Preguntas frecuentes sobre rendimientos mensuales
¿Qué es un rendimiento de cierre a cierre?
Es el cambio porcentual desde el precio de cierre de la sesión regular del periodo anterior hasta el cierre final de este periodo. Es la convención estándar para los rendimientos de acciones diarios, mensuales y anuales en las fichas técnicas y reportes de índices.
¿Por qué dos sitios web muestran rendimientos distintos para la misma acción y mes?
Casi siempre se debe a una de estas cuatro convenciones: diferentes puntos de referencia (cierre a cierre frente a apertura a cierre), si se cuentan o no los dividendos, precios brutos frente a precios ajustados por split, o una fuente de precio de cierre distinta. Las mediciones de NVDA para junio de 2026 muestran -5.39% o -7.4% solo con el primer cambio.
¿Un split de acciones cambia el cálculo del rendimiento mensual?
No debería —un split cambia el número de acciones y el precio simultáneamente, dejando el valor de la posición sin cambios— pero altera cualquier cálculo realizado con precios brutos. El rendimiento de NVDA en junio de 2024 parece -88.75% con cierres brutos y muestra 12.45% una vez que se ajusta el split de diez por uno.
¿Los rendimientos mensuales de las acciones incluyen dividendos?
Solo los rendimientos totales los incluyen. Los rendimientos de precio —incluyendo el nivel principal del índice S&P 500— los excluyen. En junio de 2026, el dividendo sumó 0.25% al mes de SPY, la brecha entre su precio y su rendimiento total.
¿El rendimiento mensual de mi cartera personal se calcula de la misma manera?
No cuando hay movimientos de efectivo hacia adentro o hacia afuera. Los rendimientos de un solo título, como los de esta página, están ponderados por tiempo; una cuenta con depósitos y retiros requiere un cálculo ponderado por dinero (tasa interna de retorno), de lo contrario, los flujos de efectivo se confunden con el rendimiento. La mayoría de los brokers reportan una cifra ponderada por tiempo precisamente para excluir sus depósitos del número final.
Cada cifra anterior es una consulta almacenada y versionada del tape real —expanda el SQL de cualquier panel, o mida el mes de cualquier ticker bajo cualquier convención en la terminal Strasmore.