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].
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()
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.
---[1]: Archivo adjunto "paste.txt"
Citations:
[1] paste.txt