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](https://images.datons.ai/C-BILELLO-1/D_asset_performance.png)
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](https://images.datons.ai/C-BILELLO-1/D_hist.png)
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).
![Retorno acumulado anual de ETFs mostrando valores perdidos en los primeros años para Bitcoin](https://images.datons.ai/C-BILELLO-1/D_etf_returns.png)
¿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](https://images.datons.ai/C-BILELLO-1/D_etf_summary.png)
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](https://images.datons.ai/C-BILELLO-1/D_etf_summary_rows.png)
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](https://images.datons.ai/C-BILELLO-1/D_asset_performance.png)
¿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.cumprod
para 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() * 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
Take a step forward and learn to develop algorithms and applications with our digital courses in Udemy.