Zipline, Backtesting en Python 2 : Mi primer Data Analisis

Zipline, Backtesting en Python 2 : Mi primer Data Analisis

Table of contents

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

Jesús Cuesta

Odesa (Ucrania)
Inversor desde 2014. Research desde 2017. He trabjado en diferentes gestoras de capital, y Hedgefunds Crypto. Apasasionado en el codigo, los datos y las finanzas. Acualmente localizado en Ucrania.

You might also like