Quant500 Academy

2. Precio frente a rentabilidad total: dos series distintas, dos conclusiones distintas

Nivel 3: Ajustes y operaciones societarias

El módulo anterior trataba el ajuste como una corrección técnica. Este trata la decisión que hay detrás, porque no existe una única serie correcta: existen dos, miden cosas distintas y responden a preguntas distintas. Elegir mal no produce un error del 0,1%; produce diferencias que a veinte años se cuentan por múltiplos.

Dos preguntas, dos series

Una serie de precios responde a: ¿a cuánto cotiza un título? Es la serie que ves en la pantalla, la que usas para saber a qué precio entrarías hoy y la que necesitas para calcular una comisión, un deslizamiento o el importe de una orden.

Una serie de rentabilidad total responde a otra cosa: ¿cuánto se ha multiplicado el dinero de alguien que compró y reinvirtió todo lo que le fueron pagando? Sus niveles no son precios negociables. Son el valor de una cartera imaginaria que empezó con un título y fue comprando fracciones adicionales cada vez que llegaba un dividendo.

La confusión nace de que las dos vienen en una columna que se llama precio y con el mismo aspecto. Pero solo la segunda es una medida de rendimiento.

import pandas as pd

px = pd.Series(
    [100.0, 101.0, 99.5, 100.5, 103.0],
    index=pd.date_range("2024-01-02", periods=5, freq="B"),
)
div = pd.Series(0.0, index=px.index)
div.iloc[2] = 1.20   # dividendo con fecha ex el tercer dia

r_precio = px.pct_change()
r_total = (px + div) / px.shift(1) - 1

print((1 + r_precio).prod() - 1)   # 0.0300  -> +3,00%
print((1 + r_total).prod() - 1)    # 0.0424  -> +4,24%

Cinco sesiones y ya hay 124 puntos básicos de diferencia. La serie de precios no está mal calculada: está midiendo otra cosa. Lo que está mal es llamar rentabilidad a lo que devuelve.

Cuánto se separan a largo plazo

La aritmética es implacable porque el rendimiento por dividendo no se suma, se compone. Supón un índice de precios que avanza un 8,0% anual y su versión de rentabilidad total que avanza un 10,0%: dos puntos de diferencia, que suena a poco.

anios = 30
print(1.08 ** anios)                   # 10.06 veces
print(1.10 ** anios)                   # 17.45 veces
print(1.10 ** anios / 1.08 ** anios)   # 1.734

Al cabo de treinta años, la versión con dividendos vale un 73% más. No un 2% más ni un 60% más: un 73%, y crece cuanto más largo es el horizonte. En mercados con rendimiento por dividendo alto (la bolsa británica, buena parte de la europea, las utilities, las petroleras, los fondos inmobiliarios cotizados) el hueco es todavía mayor, porque una parte muy grande del rendimiento del accionista nunca aparece en el precio: sale de la empresa en forma de caja y el precio, por construcción, baja para reflejarlo.

Ese es el punto que hay que interiorizar. El dividendo no es un extra que se añade a la subida del precio: es una parte del rendimiento que se ha restado del precio. Una serie de precios de una empresa que reparte todo su beneficio y no crece puede pasarse décadas plana mientras su accionista dobla el dinero. La serie no miente. Simplemente no está midiendo lo que crees.

Comparaciones tramposas

Aquí es donde esto deja de ser una discusión de definiciones y se convierte en un backtest que aprueba una estrategia mala o suspende una buena.

La regla es sencilla de enunciar y fácil de saltarse: numerador y denominador tienen que estar construidos con la misma convención. Si no sabes cuál usa tu índice de referencia, averígualo antes de sacar conclusiones, no después.

def comparar(estrategia, referencia, tipo_estrategia, tipo_referencia):
    # Aborta si se mezclan convenciones: es un fallo de datos, no de estrategia.
    if tipo_estrategia != tipo_referencia:
        raise ValueError(
            "Convenciones distintas: " + tipo_estrategia + " vs " + tipo_referencia
        )
    return (1 + estrategia).prod() - (1 + referencia).prod()

Caso real: el DAX y su hermano invisible

El DAX alemán es el ejemplo de manual porque va al revés que casi todos. El índice que se publica y que aparece en los titulares es un índice de rentabilidad total: incorpora los dividendos reinvertidos. Existe además una versión de precios menos difundida, el DAX Kursindex, que no los incorpora. Los dos llevan el mismo nombre en la conversación diaria y llevan décadas separándose.

La consecuencia práctica es directa. Si backtesteas una estrategia sobre precios de cierre de valores alemanes y la comparas con el DAX que descargaste sin mirar, estás compitiendo contra un rival que cobra dividendos mientras tú no. Con un rendimiento medio del orden del 3% anual, treinta años de esa ventaja son un factor de 1,03 elevado a 30, en torno a dos veces y media. Ninguna estrategia razonable supera semejante desventaja, y no porque sea mala.

El caso inverso también existe y es más habitual: el S&P 500 y el Nikkei 225 que ves en los titulares son índices de precios. Compararte con ellos usando precios ajustados por dividendo te regala una ventaja que no has ganado.

Para ampliar esta lección

El resto de Quant500

Lo que estás aprendiendo, aplicado al índice todos los días:

La cartera del modelo, cada semana en tu correo

Cada sábado, su semana en un minuto: cómo fue, lo mejor y lo peor, y qué directivos compraron con su dinero. Y el día que el modelo se rehace, qué entra y qué sale. Es una simulación, no un consejo. Como mucho un correo a la semana, sin publicidad y sin cuenta; te das de baja con un clic. Lo hace una persona: Pol Gracia.

Cartera modelo con resultados simulados, no una recomendación personalizada. Tu correo se usa solo para esto: privacidad.

Detrás de la Academia y del resto de Quant500 hay una sola persona: Pol Gracia Serrahima.