El entorno de trabajo - 1
En este nuevo artículo, vamos a tratar como crear un entorno profesional para trading quant algorítmicos. Para ello vamos a utilizar un stock de tecnologías, que nos van a facilitar el deployeo, focalizando nuestra actividad en el research puro, y no en la infraestructura.
Antecedentes
Dentro de la labor de la ingeniería financiera, utilizamos una amplia colección de herramientas y librerías, que en ningún punto estuvieron diseñadas, para ser usadas en conjunto. Por consecuencia, necesitamos empaquetar todas las librerías necesarias y evitar problemas, con otros proyectos o permitir la portabilidad.
Si añadimos, que los miembros de un equipo, no utilizan los mismos sistemas operativos, etc. Se genera una amalgama de configuraciones que necesitamos que el entorno de desarrollo sea homogéneo para todos los miembros del equipo. Por consecuencia, necesitaríamos también añadir el sistema operativo y las configuraciones adicionales dentro del paquete.
Para solucionar esto vamos a crear una imagen de Docker, un sistema de contenedores, donde nos permite virtualizar aplicaciones concretas, en lugar de todo un sistema operativo.
El plan será, crear un contenedor Docker, con el sistema operativo, el gestor de entornos y paquetes de Python, y las herramientas necesarias para la investigación quant.
Una vez creado el contenedor y compilarlo. Únicamente se necesitará una línea de comandos, para tener el entorno listo para acceder, en menos de 10 segundos.
¿Qué hay dentro del stack?
Dentro de nuestra imagen de Docker, vamos a tener una configuración global, que se utilizara en todos los proyectos, y otra configuración con una configuración más especifica del proyecto.
Dentro de la configuración global, utilizaremos como sistema operativo debían. ¿Por qué? Porque es estable, y requiere de muy poco manteamiento. Alpine no es una posibilidad, porque nuestro objetivo no es ahorrar recursos, y cualquier otro sistema operativo, está automáticamente descartado.
Para gestionar el tema de los entornos y los paquetes, utilizamos miniconda. Que nos proporcionara un entorno Python listo para funcionar. Ademas de otras librerías necesarias como los add-ons del entorno, el propio JupyterLab, …
Y dentro de la parte específica de los proyectos, instalaremos los paquetes y personalizaciones necesarias. En este caso, vamos a crear una configuración sencilla y inicial, donde utilizaremos zipline-reloaded y pyfolio-reloaded.
Crearemos un "Hola Mundo" dentro de zipline, donde una vez este todo el entorno desplegado, realizamos un backtest básico, para verificar el funcionamiento del proyecto. De todas formas, el proyecto está en constante mantenimiento y mejoras, dado que personalmente utilizo este mismo entorno ()en unas versiones más avanzadas, aquí liberamos métodos algo más antiguos.
Resumen de componentes del stack:
- Debian GNU Linux
- Miniconda3
- JupyterLab
- Archivos de configuración y librerías de configuración de JupyterLab
- Archivos de configuración, optimizaciones y librerías para poder funcionar con zipline.
- Extras: Archivos como ejemplos de research, optimizaciones de código, un datalake local, o cualquier otra información necesaria para el stack.
Ventaja Final
Una vez la imagen esté compilada, necesitaremos hacer únicamente el comando
docker compose up -d
para tener el entorno funcional.
Creación de un stack
Primero, debemos crear la estructura del proyecto donde se compone de:
Dos carpetas principales. En la carpeta llamada DockerSource, tenemos todo lo relacionado con la construcción de la imagen.
- .env: Datos privados de entorno para conectarse al datalake etc.
- Dockerfile: Instrucciones de compilación de la imagen de Docker, es donde se dan los pasos concretos que se automatizan hasta la creación de la imagen+
- extension.py: Optimizaciones de Zipline
- overrides.json: Optimizaciones JupyterLab
- req.txt: Lista detallada de paquetes necesarios para instalar en el entorno vía pip.
- qa_datalake.py. Código de ingesta del datalake a zipline.
Dentro de la segunda carpeta, ya se incluye los denominados workdirs, o directorios de trabajo, son los directorios donde se almacena la información inicial con la cual interactuara el researcher.
En este caso disponemos de una serie de carpetas, que agrupar por temáticas notebooks o documentación que en algún punto han sido o serán relevantes.
Compilar la imagen
1 - Clonar la imagen
Descarga la versión más reciente del código desde el repositorio.
git clone https://github.com/quantarmyz/quantstack.git
Crear archivo de entorno .env
Crea un archivo .env
dentro de la carpeta DockerSource como
:
/quantstack/DockerSource/.env
Formato del archivo:
ENDPOINT=TuEndPoint.COM
DB=TuBucket
ACCESS_KEY=TuAccessKey
SECRET_KEY=TuSecretKey
Compilar la imagen
Desde la terminal, en la ruta /quantstack
, ejecuta:
docker compose build --no-cache
Configuración Opcional del Docker Compose
Edita /quantstack/docker-compose.yml
según sea necesario (se recomienda configurar el token).
Iniciar el stack
Ejecuta el siguiente comando para el modo debug:
docker compose up
Para ejecutar en segundo plano:
docker compose up -d
Acceso a JupyterLab
Si no se han realizado modificaciones, la dirección es:
localhost:8888
Contraseña:
testing
Añadir Feed de datos a Zipline
Desde el JupyterLab, abre un terminal y ejecuta:
conda activate base
zipline ingest -b qa_datalake
Esto conectará al datalake, descargará los datos y los añadirá a la base de datos de Zipline.
Ejemplo de Backtesting
En la imagen se puede apreciar, como hemos lanzado el template por defecto de backtesting en el qastack
Video
Para facilitar la tarea, he grabado un video donde compilo la imagen y la ejecuto. En menos de 9 minutos, se puede tener el stack funcionando.