Tutorial
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?
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)
Preguntas
- ¿Cómo descargar datos históricos de precios de múltiples activos financieros?
- ¿Cómo calcular el retorno acumulado anual de cada activo?
- ¿Por qué es necesario agrupar los datos para tener cálculos acumulados?
- ¿Cómo seleccionar el último día de retorno acumulado en cada año?
- ¿Cómo identificar los valores máximos y mínimos de retorno en cada año?
- ¿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).
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 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.
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.
¿Por qué durante el año 2022 casi todos los activos presentan retornos negativos?
Te leo en los comentarios.
Conclusiones
- Descargar datos históricos:
yf.download(tickers)para obtener datos de múltiples activos financieros de Yahoo Finance. - Calcular el retorno acumulado anual:
.pct_change().add(1).cumprod().sub(1)para determinar el rendimiento de un activo a lo largo del tiempo. - Agrupar datos para cálculos acumulados:
groupby.cumprodpara resetear los cálculos acumulados al inicio de cada año. - 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. - Identificar valores máximos y mínimos:
.agg(['max', 'min'])para encontrar los extremos en el rendimiento anual de los activos. - Calcular el porcentaje de retornos positivos:
lambda x: (x > 0).mean() * 100para 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