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.

El entorno de trabajo - 1

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.

0:00
/9:08

Repo completa

This post is for subscribers only

Already have an account? Sign in.