Creación de un sistema de comercio para un fondo algo de Bitcoin: lecciones aprendidas

Contexto

Hace casi dos años, en medio del mercado bajista de cifrado de 2018, comenzamos a construir la infraestructura para un fondo cuantitativo de cifrado. El fondo ahora se convierte en estratosfera.

Como un pequeño equipo compuesto por personas apasionadas por construir cosas, creemos que compartir lo que hemos aprendido en este pequeño viaje agregaría algo de valor a las personas de ideas afines; especialmente aquellos que también quieren probar el comercio algorítmico en el espacio de Bitcoin.

Lo que discutimos a continuación no constituye de ninguna manera la única forma de abordar el problema. Por el contrario, creemos que la tecnología actual es lo suficientemente poderosa como para dar rienda suelta a otras soluciones creativas. Por esta razón y otras, estamos más que felices de escuchar sus comentarios.

En esta publicación no profundizamos demasiado en los detalles de codificación, sino más bien una discusión sobre los desafíos que encontramos como desafíos que probablemente también enfrentarás y los ángulos que usamos para resolverlos.

Oportunidad y desafío

Bitcoin como tecnología ha abierto nuevas posibilidades financieras. Lo que antes se consideraba imposible o difícil ahora se puede hacer gracias a las cadenas de bloques. Sin embargo, el ecosistema comercial que se está construyendo alrededor de Bitcoin es nuevo y de rápido movimiento, lo que también significa que aún no ha alcanzado un estado muy estable.

En nuestra opinión, una de las consideraciones clave al operar en el espacio de Bitcoin es que uno tiene acceso directo al mercado (también conocido como DMA) de forma gratuita. Esto no se puede subestimar: de hecho, gracias a esto, no es necesario pagar para obtener un asiento en las bolsas y / o depender de una infraestructura costosa para establecer la conectividad. Esto abre la puerta a la construcción de un sistema comercial desde cero con un bajo costo.

Por otro lado, los protocolos e interfaces de intercambio no se han estandarizado. Por lo general, hay tantas interfaces API como intercambios. Sus infraestructuras están en constante actualización y no siempre ofrecen la más alta calidad o una comunicación confiable con su sistema comercial. Reconocer esto informará sus elecciones con respecto a las tecnologías que utilizará para construir su sistema, pero también su estilo de codificación.

Primero y principal: datos

Para acceder al mercado, basta con registrar una cuenta en un intercambio. La cuenta puede ser anónima si opera con una cantidad relativamente pequeña de capital. Luego obtenga su clave de API y el secreto de API que proporciona el intercambio. Se utilizarán para autenticar la cuenta cuando su código la conecte con el intercambio.

Los datos son probablemente el componente más importante y crítico de su sistema comercial. Según nuestra experiencia, no tenga miedo de perder tiempo (incluso mucho) para hacer que su componente de datos sea correcto. Esto se debe a que todo su negocio depende de ello: su actividad de modelado e investigación necesita datos de alta calidad, su motor de ejecución de órdenes consume datos en tiempo real, etc. En la práctica, como parte del sistema comercial, también está construyendo una recopilación y tratamiento de datos sistema. Imagine un día en el que su actividad principal ya no sea el comercio, idealmente debería poder reutilizar el componente de datos y convertirse en un proveedor de datos.

Si no ha cumplido con todos los requisitos siguientes para sus datos, continúe dedicando tiempo a mejorarlos y no piense en operar (todavía), porque probablemente perderá dinero. Recuerde comprar Bitcoin o algún índice de monedas para mantener la exposición al mercado mientras construye su sistema. La lista de verificación de datos debe incluir al menos:

Además de los datos de intercambio (es decir, datos de mercado), blockchain ofrece otro tipo de datos, que a menudo se denominan datos en cadena. Por ejemplo, la cadena de bloques de Bitcoin registra las transacciones no gastadas, el parámetro de dificultad de la red, las recompensas de bloque, etc. Se recomienda ejecutar un nodo completo para tener una copia completa del libro mayor y ser responsable de sus propios datos en cadena. Sin embargo, si esto sobrecarga su sistema, podría considerar tomarlo de algún proveedor de datos. Descubrimos que Coinmetrics.io tiene excelentes paquetes de datos gratuitos y de pago accesibles a través de su API.

La base de datos es el corazón de su sistema. Puede visualizarlo de esa manera: los datos fluyen de los intercambios (y blockchains) para descansar en su base de datos; luego sus modelos los componen antes de enviarlos de vuelta a los intercambios. Por lo tanto, el sistema puede verse aproximadamente como un canal de comunicación bidireccional entre la base de datos y los intercambios. Asegúrese de pensar detenidamente sobre sus requisitos técnicos y sus elecciones con respecto a la base de datos.

La mayoría de sus datos serán series de tiempo, así que elija una tecnología de base de datos que sea buena para manejar series de tiempo. También considere uno con suficiente granularidad, es decir, si sus datos van por debajo de un milisegundo, la base de datos debería poder registrarlos con marcas de tiempo distinguibles, pero también realizar la tarea lo suficientemente rápido como para minimizar el retraso.

Investigación / backtesting

Una vez que haya terminado con la recopilación de datos y esta parte se ejecute de manera estable, puede comenzar a realizar una investigación cuantitativa y / o backtesting.

La búsqueda de alfa lleva mucho tiempo y es abrumadora porque el problema en cuestión es complejo, no está muy bien definido y también debido a la enorme variedad de herramientas técnicas disponibles para emplear en esta búsqueda. Entonces, desde nuestra propia experiencia, siempre comenzamos con una técnica simple primero (por ejemplo, regresión lineal) e intentamos capturar la intuición relevante de los datos antes de aplicar gradualmente otras más sofisticadas. Finalmente, el backtesting es una forma poderosa de validar una señal (o dicho de otra manera, para separar el ruido de la señal verdadera) antes de implementarlo en el comercio en vivo.

Es una práctica común autoconstruir o reutilizar algún marco para backtesting (un ejemplo de dicho marco existente es zipline). Independientemente de su elección, las características clave requeridas para un backtester son genérico para que pueda probar una amplia gama de estrategias sin demasiado trabajo marginal y minimalismo para que pueda Vuelva a ejecutarlo varias veces para ajustar los parámetros sin aumentar el costo de cálculo.

En general, nos hemos dado cuenta de que esta mentalidad también se aplica a la construcción de otras áreas del sistema.

Ejecutar el modelo en vivo

En última instancia, su sistema tiene que calcular los modelos comerciales en tiempo real. La latencia que permite el modelo por diseño determina cómo se debe construir este componente. Por ejemplo, si se requiere que la latencia sea muy pequeña, querrá deshacerse de cualquier posible sobrecarga en una compensación con el tiempo de cálculo. En tal caso, tendría que consumir los datos tan pronto como lleguen y enviar los resultados del modelo a otros componentes del sistema tan pronto como terminen. Puede significar pasar por alto la base de datos durante la fase de cálculo o utilizar una tecnología con poco gasto de E / S. Si sus modelos se negocian con una frecuencia más baja y si le deja suficiente tiempo para comunicarse con una base de datos física, entonces debe usar la base de datos.

En cualquier configuración, los desafíos comunes a los que nos hemos enfrentado provienen del hecho de que los datos pueden o no estar disponibles en el momento en que se necesitan (imagine que el intercambio no envía paquetes de datos, o retrasos de websocket debido al tráfico intenso, o interrupción de la conexión a Internet, etc.). Su tarea es asegurarse de que su sistema responda de manera sólida a todos estos. Por lo tanto, debe hacer la menor cantidad posible de suposiciones con respecto a la disponibilidad (y en algunos casos, la exactitud) de los datos.

El cálculo de los modelos comerciales dependería de otros componentes del sistema. Asegúrese de tomarse el tiempo adecuado con papel y lápiz para eliminar las dependencias ocultas, especialmente las temporales.

Motor de operaciones

Cuando se calculan sus modelos y se recomiendan qué, cuándo, cuánto comprar o vender, el motor de negociación se hará cargo y pasará las órdenes a los intercambios correspondientes.

El motor de negociación es un componente de alto riesgo, ya que es responsable de hacer realidad sus modelos. Cuando opera, enfrenta al menos la misma dificultad en términos de confiabilidad de los intercambios y paquetes de datos que los otros componentes de su sistema. Pero esta vez, los errores en el motor le costarían dinero.

Cuando lo escriba, tome todas las precauciones que ya ha tomado para otras partes del sistema. También tendría que aclarar si el código asume otras suposiciones implícitas. Si los hay, nuestra experiencia nos mostró que tarde o temprano se invalidarán en el entorno comercial real. El motor de operaciones funciona en un lugar donde las personas intentan adelantarse entre sí, por lo que una regla general: no se debe asumir nada, se debe verificar todo.

Supervisión continua

Estrictamente hablando, esto no debería ser parte de la lógica comercial. Sin embargo, es importante que implemente herramientas para monitorear continuamente el estado de su sistema. Si hay anomalías en cualquier parte de su sistema, esto podría servir como una capa adicional de controles donde las cosas desagradables se pueden detectar e intervenir rápidamente.

Algunos elementos de su interés deben incluir: estado general de su sistema, PnL en vivo, posiciones en vivo, operaciones en vivo y estados de ejecución, consistencia entre los datos de su cuenta de operaciones según lo informado por su sistema frente a los intercambios, etc.

Panel

El tablero es una interfaz gráfica que muestra su sistema / datos de una manera legible por el usuario y permite una interacción básica con el sistema. Hay muchos marcos de código abierto que se pueden utilizar para este componente.

Básicamente, la base de datos se lee bajo el capó y el tablero muestra las series de tiempo relevantes. No debe haber lógicas complicadas en este nivel, sino que debe mantenerse simple para que sea más fácil encontrar información y mantener el rendimiento deseable.

Conclusión

Sabemos que construir un buen sistema comercial lleva tiempo. Solo esperamos que esta publicación le resulte útil para su trabajo. Con suerte, tendremos otras ocasiones para profundizar un poco más en los detalles.