1 votos

Alternativas a los SGBD para la prueba de opciones

He reunido un gran conjunto de datos (~2B+ registros) de datos de precios de opciones en MySQL con fines de backtesting.

En varios puntos, debido a la gran cantidad de datos que se están recuperando y filtrando, el procesamiento era extremadamente lento hasta el punto de detenerse. He dedicado una buena cantidad de tiempo a crear índices pensativos, y consultas relativamente simples se completan rápidamente, pero cualquier cosa sobre un rango más amplio de entradas (por ejemplo, símbolo, período de tiempo, precio, etc) ha sido muy lento.

He considerado bases de datos de series temporales (por ejemplo, kdb+, InfluxDB) pero las consideraciones prácticas limitaban. De lo contrario, he considerado dejarlo en archivos planos y manipularlo con algo de bajo nivel, pero no tengo muy claro un enfoque.

¿Alguien con experiencia en backtesting de estrategias de opciones durante períodos relativamente largos (5-10 años) tiene orientación sobre lo que les ha funcionado con fines de prueba?

9voto

Diondon Puntos 1

Mi respuesta es similar a la dada para esta otra pregunta.

Si principalmente estás utilizando los datos para backtesting, hay muy poca razón para almacenar los datos en una base de datos MySQL. Los datos generalmente siguen un patrón de escribir una vez, leer muchas veces (WORM), sin necesidad de semántica ACID. Tampoco es necesario imponer integridad referencial en la mayoría de los datos. Si deseas hacerlo para las partes relacionadas con las definiciones de instrumentos (por ejemplo, subyacente, precio de ejercicio, fecha de vencimiento, put/call), puedes separar solo las definiciones y ponerlas en una base de datos MySQL.

Generalmente veo a las personas almacenando los datos en una base de datos MySQL solo por (1) experiencia limitada con otros formatos de almacenamiento y herramientas, (2) exceso de exposición a MySQL debido a un fondo no financiero o de desarrollo web. Es razonable comenzar con MySQL porque es una herramienta con la que estás familiarizado, pero una vez que comiences a encontrar limitaciones de rendimiento aquí, sería una de las piezas más obvias en tu stack para optimizar.

Si todavía deseas usar un DBMS para este caso de uso para que no tengas que escribir rutinas personalizadas para procesar los datos, te sugiero algo como Clickhouse, con el que he tenido buenas experiencias. No tiene los costos ni las limitaciones de licencia que vienen con kdb o Vertica, y definitivamente es más adecuado para el caso de uso que InfluxDB. ~2B+ registros son en realidad bastante pequeños, ya que hay implementaciones de producción de Clickhouse que ejecutan consultas y vistas materializadas en un conjunto de datos que está creciendo 6 millones de entradas por segundo.

Otra observación es que estás almacenando todos esos datos en 1 sola tabla grande con 1 campo que identifica el tick. Esto suele ser un anti-patrón para este caso de uso porque:

  1. Los datos de opciones son bastante dispersos: hay una gran cantidad de ticks sobre los que la mayoría tienen muy pocas entradas.
  2. Casi nunca tienes una estrategia que necesita backtestear sobre todos o la mayoría de los ticks al mismo tiempo.

A menudo, tendrá más sentido dividir los datos en tablas más pequeñas, por ejemplo, 1 por instrumento. En teoría, esto parecerá poco intuitivo porque tienes que pagar tiempo lineal para fusionar las tablas ordenadas más pequeñas y recomponer el conjunto de ticks. Sin embargo, generalmente es más eficiente que mantener los datos en 1 gran tabla y filtrar/descartar entradas de la tabla. Esto se debe a consideraciones prácticas:

  1. El número de entradas de interés es pequeño en relación con el número total de entradas.
  2. Estás ahorrando costos significativos de E/S que dominarán el tiempo de procesamiento para este tipo de carga de trabajo.

Por supuesto, 1 "tabla" por instrumento podría ser difícil de administrar ya sea en un DBMS o en archivos planos en un sistema de archivos, por lo que es posible que desees idear algún tipo de estrategia de "sharding", por ejemplo, distribuir los datos por algún hash del tick, de modo que termines con un número más manejable de "tablas", digamos, algo en el orden de 16 a 1024. La estrategia de hash más ingenua es dividirlas por el primer carácter del tick. Otra estrategia de hash ingenua es dividir por la longitud del tick.

Nota: En mi trabajo diario, almacenamos datos completos del libro de órdenes para mercados con miles de millones de registros por día por mercado. Mis sugerencias están motivadas por la experiencia en la gestión de implementaciones a escala de petabytes para tales datos.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X