En este artículo aprenderás a extraer información de un data bundle de Zipline fuera de la pipeline y analizarla con Python, asegurando que utilizas exactamente los mismos datos que tu modelo. Esto es clave cuando trabajas con universos de activos y quieres que tus análisis sean fieles a los datos utilizados en backtesting o live trading[1].
Data Source
Toda la data utilizada proviene de un datalake. Crear tu propio datalake es económico y facilita enormemente el research, ya que puedes almacenar grandes volúmenes de datos por un coste muy bajo (por ejemplo, 1TB cuesta unos $7.95 mensuales)[1].
Zipline Bundle en profundidad
Zipline agrupa los datos en conjuntos llamados Bundles. Tras el proceso de ingest, los datos quedan listos para cualquier proceso de análisis o backtesting. En este ejemplo se utiliza el bundle QA Bundle : etf_model, compuesto por los ETFs sectoriales de SPDR del mercado de renta variable americana (11 Tickers)[1].
Cómo ingestar un bundle
Un bundle nace del proceso de ingest: Zipline toma un origen de datos (CSV, base de datos o API), lo normaliza y lo guarda en su formato interno, listo para backtests:
zipline ingest -b nombre-del-bundle
Para investigación propia, la vía más flexible es construir primero tu propio datalake y cargarlo con ArcticDB, como explicamos en la serie Big Data Management. Una vez ingerido, el bundle queda disponible para cualquier backtest sin reprocesar los datos.
Primer análisis con Python y Zipline
El objetivo será crear funciones auxiliares para acceder a la información del data bundle y trabajarla en formato pandas DataFrame, lo que permite un análisis flexible y potente[1].
Cargar Librerías
from zipline.data.bundles import load
from zipline.data.bundles.core import BundleData
from zipline.data.data_portal import DataPortal
Definir fechas y calendario
start_date = '2000-01-01'
end_date = '2023-09-30'
trading_calendar = get_calendar('NYSE')
Cargar el bundle y consultar activos
bundle = load('etf_model')
assets = bundle.asset_finder.retrieve_all(bundle.asset_finder.sids)
symbols = [asset.symbol for asset in assets]
exchange = bundle.asset_finder.exchange_info
- assets: punteros a los activos, útiles para consultas y ejecución de órdenes.
- symbols: lista legible de los tickers del bundle.
- exchange: metadata del exchange[1].
Crear el Data Portal
El DataPortal conecta los data bundles de Zipline con el usuario final vía pandas DataFrames.
data_portal = DataPortal(
bundle.asset_finder,
trading_calendar=bundle.equity_daily_bar_reader.trading_calendar,
first_trading_day=bundle.equity_daily_bar_reader.first_trading_day,
equity_daily_reader=bundle.equity_daily_bar_reader,
adjustment_reader=bundle.adjustment_reader
)
Descargar precios desde el Data Portal
Define una función para extraer precios en un rango de fechas:
def get_pricing(data_portal, trading_calendar, assets, start_date, end_date, field='close'):
end_dt = pd.Timestamp(end_date)
start_dt = pd.Timestamp(start_date)
end_loc = trading_calendar.closes.index.get_loc(end_dt)
start_loc = trading_calendar.closes.index.get_loc(start_dt)
return data_portal.get_history_window(
assets=assets, end_dt=end_dt, bar_count=end_loc - start_loc,
frequency='1d',
field=field,
data_frequency='daily'
)
Llamar a la función y almacenar los datos
historical_data = get_pricing(
data_portal, trading_calendar, assets,
start_date=start_date, end_date=end_date
)
Obtendrás un DataFrame clásico, con índice datetime y columnas para cada activo, listo para cualquier análisis posterior[1].
Ejemplo de análisis: Correlación de retornos diarios
Visualiza la correlación de los retornos diarios de todos los activos:
correlation_matrix = historical_data.pct_change().corr(method='kendall')
plt.figure(figsize=(12, 9))
sns.heatmap(correlation_matrix, annot=True, fmt=".2f", cmap='coolwarm')
plt.title('Mapa de calor de la correlación (método Kendall)')
plt.show()
Ejemplo de análisis: Curvas de retornos acumulados
Muestra la curva de retornos acumulados de cada activo:
pct_data = historical_data.pct_change()
pct_data.cumsum().plot(figsize=(20, 9), legend=True)
plt.title('Porcentuales')
plt.legend(loc='lower left')
plt.show()
Backtrader vs Zipline: ¿cuál elegir?
Si estás empezando, la duda más habitual es Zipline o Backtrader. Ambos son backtesters event-driven en Python, pero con filosofías distintas:
- Zipline viene de Quantopian y está pensado para investigación sistemática a escala: bundles de datos, pipelines y un API de algoritmos que separa la estrategia de la infraestructura. Su rama mantenida es
zipline-reloaded, la que usamos en la Parte 1 de esta serie. - Backtrader destaca por su flexibilidad: alimentas CSVs sin proceso de ingest, integra brokers y ofrece un modo live que Zipline no tiene. A cambio, su desarrollo se ha ralentizado mucho en los últimos años y su documentación es más dispersa.
Regla práctica: para research sistemático con pipeline y datos propios, Zipline; para prototipos rápidos o live trading, Backtrader. Y si lo que te preocupa es la ejecución de órdenes, nuestro artículo sobre máquinas de estado para ejecución complementa cualquiera de los dos.
Conclusiones
Este flujo te permite obtener y analizar datos de un data bundle de Zipline como si fueran de cualquier otra fuente, garantizando que research y backtesting utilizan exactamente la misma información. La integración de DataPortal y pandas facilita el big data management y elimina sesgos entre datasets de análisis y simulación[1].
¿Quieres aprender más sobre Zipline y análisis cuantitativo en Python?
Consulta la serie completa sobre backtesting y pipelines en Python para trading cuantitativo.