Reportes anuales sobre retorno acumulado con múltiples activos financieros

Aprende cómo procesar múltiples activos financieros para agregarlos a un reporte que destaque el rendimiento anual de cada activo.

Si comparamos el rendimiento de activos financieros como Bitcoin, ETFs y acciones, ¿cuál fue el activo con mayor rentabilidad, desde el año 2010?

Comparación de rendimiento anual de diferentes activos financieros desde 2010
F1. Rendimiento anual de activos financieros desde 2010

En este tutorial, te explicamos cómo descargar, procesar y reportar el rendimiento de activos financieros usando Python.

El reporte está inspirado los análisis de Charlie Bilello.

Data

Definimos la lista de tickers de los activos a analizar.

tickers = ['BTC-USD', 'QQQ', 'IWF', 'SPY', ...]

Descargamos movimientos diarios de precios históricos usando la librería yfinance, que descarga datos de Yahoo Finance.

import yfinance as yf
df = yf.download(tickers)
Gráfico de precios históricos diarios para Bitcoin, ETFs y acciones
F2. Precios históricos diarios de activos financieros

Preguntas

  1. ¿Cómo descargar datos históricos de precios de múltiples activos financieros?
  2. ¿Cómo calcular el retorno acumulado anual de cada activo?
  3. ¿Por qué es necesario agrupar los datos para tener cálculos acumulados?
  4. ¿Cómo seleccionar el último día de retorno acumulado en cada año?
  5. ¿Cómo identificar los valores máximos y mínimos de retorno en cada año?
  6. ¿Cómo calcular el porcentaje de retornos positivos para cada activo?

Metodología

Retorno acumulado anual

Seleccionamos los precios de cierre ajustados Adj Close desde el año 2010 y calculamos el retorno acumulado anual, seleccionando el último día hábil de cada año.

(df
 .loc['2010':, 'Adj Close']
 .groupby(df.index.year).pct_change().add(1)
 .groupby(df.index.year).cumprod().sub(1)
 .resample('YE').last().T
)

BTC-USD (Bitcoin) presenta valores perdidos en los primeros años debido a su regulación y adopción (ver historia completa en Wikipedia).

Retorno acumulado anual de ETFs mostrando valores perdidos en los primeros años para Bitcoin
F3. Retorno acumulado anual de ETFs

¿Conoces a alguien que podría interesarle este artículo? Compártelo con ellos.

Resumen por columnas

¿Cómo se comportaron los activos durante todos los años?

Calculamos el retorno promedio anual y el retorno acumulado anual para cada activo.

Para más detalles sobre el cálculo de los retornos, visita este tutorial.

t_avg = df.mean(axis=1).mul(100)
t_cum = df.add(1).cumprod(axis=1).sub(1).mul(100).iloc[:,[-1]]

pd.DataFrame({'AVG': t_avg, 'CAGR': t_cum})
Resumen de retorno promedio anual y acumulado de diferentes activos financieros
F4. Resumen de retorno de activos financieros

Resumen por filas

¿Cuáles fueron los valores máximos y mínimos en cada año? ¿Cuál fue el porcentaje de retornos positivos?

positive_pct = lambda x: (x > 0).mean() * 100
dfr.agg(['max', 'min', positive_pct])

Todos los activos presentan retornos positivos acumulados al final del período, siendo BTC-USD el activo con mayor rentabilidad.

Valores máximos, mínimos y porcentaje de retornos positivos de activos financieros por año
F5. Resumen anual de rendimiento de activos financieros

Combinar y aplicar estilo

Finalmente, combinamos todas las tablas y aplicamos un estilo para resaltar los valores máximos y mínimos.

En este tutorial se explica cómo aplicar estilos a tablas de pandas.

Comparación de rendimiento anual de diferentes activos financieros desde 2010
F1. Rendimiento anual de activos financieros desde 2010

¿Por qué durante el año 2022 casi todos los activos presentan retornos negativos?

Te leo en los comentarios.

Conclusiones

  1. Descargar datos históricos: yf.download(tickers) para obtener datos de múltiples activos financieros de Yahoo Finance.
  2. Calcular el retorno acumulado anual: .pct_change().add(1).cumprod().sub(1) para determinar el rendimiento de un activo a lo largo del tiempo.
  3. Agrupar datos para cálculos acumulados: groupby.cumprod para resetear los cálculos acumulados al inicio de cada año.
  4. Seleccionar el último día de retorno acumulado: .resample('Y').last() para obtener el valor final de cada año, útil para análisis anual.
  5. Identificar valores máximos y mínimos: .agg(['max', 'min']) para encontrar los extremos en el rendimiento anual de los activos.
  6. Calcular el porcentaje de retornos positivos: lambda x: (x > 0).mean() * 100 para evaluar la frecuencia de ganancias de un activo.

Además de este tutorial, puedes aprender más con nuestros cursos en directo.

Te enseñaré las mejores prácticas para programar más en menos líneas y resolver tus dudas, todo mientras trabajamos en casos prácticos sobre datos que te interesen.

Para más información, visita datons

Great! You’ve successfully signed up.

Welcome back! You've successfully signed in.

You've successfully subscribed to datons.

Success! Check your email for magic link to sign-in.

Success! Your billing info has been updated.

Your billing was not updated.