Cómo obtener datos históricos de criptomonedas

Descargar datos OHLC de resolución minuto a través de API de intercambio

ACTUALIZAR:

Debido al interés general en este asunto, creé un conjunto de datos que incluía todos los datos OHLC de la API de intercambio de Bitfinex y los cargué como un conjunto de datos público en Kaggle.

Introducción

El comercio algorítmico es una forma popular de abordar el entorno acelerado y volátil de los mercados de criptomonedas. Sin embargo, la implementación de una estrategia comercial automatizada es un desafío y requiere una gran cantidad de backtesting, que a su vez requiere una gran cantidad de datos históricos. Si bien hay varias fuentes disponibles que proporcionan datos históricos de criptomonedas, la mayoría de ellas tienen inconvenientes. O son caros, proporcionan solo datos de baja resolución temporal (diariamente) o cubren períodos de tiempo limitados de una cantidad limitada de pares de divisas. Aquí veremos que obtener datos históricos abiertos, altos, bajos y cercanos (OHLC) con una resolución de 1 minuto no es una tarea mágica y se puede hacer en unas pocas líneas de código Python de forma gratuita.

Conectando al intercambio

En este tutorial, utilizaremos la API de intercambio de Bitfinex para recuperar datos históricos. Sin embargo, el enfoque también debería funcionar para cualquier otro intercambio que proporcione una API similar. Además, no necesita una cuenta de Bitfinex para que este código funcione, ya que solo utilizaremos puntos finales de API públicos. En caso de que no esté familiarizado con qué es una API o cómo usarla, le sugiero que lea la documentación de la API de Bitfinex, después de todo, esta también es la interfaz a través de la cual su algoritmo interactuará más tarde con el intercambio. Pero no se preocupe, no necesitará escribir la interfaz de Python para la API de Bitfinex. Ya hay varias implementaciones disponibles, una de ellas es este cliente aquí. La instalación más fácil es a través de pip:

>>> pip install bitfinex-tencars

Alternativamente, si tiene instalado Git, simplemente puede ejecutar los siguientes comandos para instalar el cliente. Solo recuerde reemplazar con su carpeta de destino.

>>> git clone https://github.com/akcarsten/bitfinex_api.git 
>>> python  /setup.py install

Si no tiene instalado Git, puede clonar el repositorio en la página de GitHub, luego vaya a la carpeta donde lo clonó y ejecute:

>>> instalación de python setup.py

En ambos casos, el cliente de Bitfinex se instalará en su distribución de Python.

Usando el cliente API

Si observa la documentación de la API de Bitfinex, verá que hay dos versiones de la API, v1 y v2, ambas implementadas en el cliente que acaba de instalar, pero aquí solo usaremos la API v2. Entonces, después de importar el cliente API de Bitfinex, necesitamos crear una instancia de la API v2 ejecutando el siguiente código. Tenga en cuenta que no proporcionamos ninguna clave aquí, por lo que solo tendremos acceso a los puntos finales públicos, se mostrará un mensaje correspondiente después de ejecutar el código.

>>> importar bitfinex
 
>>> # Crear una instancia de API de la API v2
>>> api_v2 = bitfinex.bitfinex_v2.api_v2 ()

Y esa es nuestra puerta a los datos. De la documentación, sabemos que uno de los puntos finales públicos se llama velas, que devuelve los datos detrás de los gráficos de velas que se ven en todos los intercambios. Este tipo de datos contiene la siguiente información, una marca de tiempo del precio de apertura, cierre, alto y bajo y el volumen de comercio. También se conoce como datos OHLC. La forma más sencilla de interactuar con este punto final a través del cliente es llamarlo con su configuración predeterminada.

>>> resultado = api_v2.candles ()

La línea de arriba le dará los últimos 1000 minutos de datos OHLC para el precio de Bitcoin en USD. Bueno, eso es bueno, pero podríamos estar interesados ​​en un período de tiempo hace mucho tiempo o en un par de divisas diferente. En este caso, podemos especificar parámetros adicionales para obtener exactamente lo que queremos. Y estos parámetros son:

  • símbolo: par de divisas, predeterminado: BTCUSD
  • intervalo: resolución temporal, p. 1m por 1 minuto de datos OHLC
  • límite: número de puntos de datos devueltos, predeterminado: 1000
  • inicio: tiempo de inicio del intervalo en milisegundos desde 1970
  • final: tiempo final del intervalo en milisegundos desde 1970

Entonces, con esta información a mano, podemos ejecutar la primera consulta. El siguiente código devolverá los datos OHLC de resolución de 1 minuto del precio de Bitcoin en USD durante los primeros dos días en abril de 2018.

>>> fecha y hora de importación
>>> tiempo de importación
>>> # Definir parámetros de consulta
>>> par = 'btcusd' # par de divisas de interés
>>> bin_size = '1m' # Esto devolverá datos de minutos
>>> limit = 1000 # Queremos el máximo de 1000 puntos de datos
>>> # Definir la fecha de inicio
>>> t_start = datetime.datetime (2018, 4, 1, 0, 0)
>>> t_start = time.mktime (t_start.timetuple ()) * 1000
>>> # Definir la fecha de finalización
>>> t_stop = datetime.datetime (2018, 4, 2, 0, 0)
>>> t_stop = time.mktime (t_stop.timetuple ()) * 1000
>>> resultado = api_v2.candles (símbolo = par, intervalo = bin_size,
>>> limit = limit, start = t_start, end = t_stop)

Recopilación de datos históricos para intervalos de tiempo más largos.

Ahora eso es genial, pero todavía hay un problema: la API solo devolverá un máximo de 1000 puntos de datos. Entonces, si tuviéramos que aumentar el intervalo de tiempo de interés para todo el mes de abril de 2018, no podríamos obtenerlo con una resolución de 1 minuto. Entonces, para superar esta limitación, necesitamos escribir una función que divida nuestra consulta grande en varias más pequeñas. Una cosa adicional que debemos tener en cuenta aquí es que hay un límite de cuántas solicitudes podemos hacer a la API de Bitfinex. Actualmente, este límite es de 60 llamadas por minuto, lo que significa que después de cada solicitud debemos esperar un mínimo de 1 segundo antes de comenzar la siguiente. Para estar seguro, la función a continuación espera 2 segundos, pero puede cambiarla si lo desea.

>>> def fetch_data (inicio, parada, símbolo, intervalo, tick_limit, paso):
>>> # Crear instancia de API
>>> api_v2 = bitfinex.bitfinex_v2.api_v2 ()
>>> datos = []
>>> inicio = inicio - paso
>>> mientras comienza >> inicio = inicio + paso
>>> fin = inicio + paso
>>> res = api_v2.candles (símbolo = símbolo, intervalo = intervalo,
>>> limit = tick_limit, start = start,
>>> fin = fin)
>>> data.extend (res)
>>> hora de dormir (2)
>>> devolver datos

Con la función anterior, ahora podemos ejecutar consultas durante intervalos de tiempo más largos, lo único que debemos proporcionar es el tamaño del paso en milisegundos. Esa es la cantidad de puntos de datos que debemos solicitar en cada una de las consultas más pequeñas. Esto es básicamente lo mismo que el límite que definimos anteriormente pero ahora en milisegundos. Por lo tanto, para reducir el número de llamadas a la API, deberíamos ir al máximo, lo que significa para el caso de 1 minuto un tamaño de paso de: 60000 * 1000 = 60000000.

>>> # Establecer tamaño de paso
>>> time_step = 60000000
>>> # Definir la fecha de inicio
>>> t_start = datetime.datetime (2018, 4, 1, 0, 0)
>>> t_start = time.mktime (t_start.timetuple ()) * 1000
>>> # Definir la fecha de finalización
>>> t_stop = datetime.datetime (2018, 5, 1, 0, 0)
>>> t_stop = time.mktime (t_stop.timetuple ()) * 1000
>>> pair_data = fetch_data (start = t_start, stop = t_stop, symbol = pair,
>>> intervalo = bin_size, tick_limit = limit,
>>> paso = time_step)

Finalmente, vamos a convertir los resultados en un marco de datos de Pandas para que podamos eliminar posibles duplicados, asegurarnos de que todo esté en el orden correcto y convertir la marca de tiempo en un formato legible.

>>> importar pandas como pd
>>>
>>> # Crear marco de datos de pandas y limpiar / formatear datos
>>> nombres = ['hora', 'abrir', 'cerrar', 'alto', 'bajo', 'volumen']
>>> df = pd.DataFrame (par_datos, columnas = nombres)
>>> df.drop_duplicates (inplace = True)
>>> df ['hora'] = pd.to_datetime (df ['hora'], unidad = 'ms')
>>> df.set_index ('tiempo', inplace = True)
>>> df.sort_index (inplace = True)

Conclusión

Por lo tanto, recuperar datos de OHLC de alta resolución en realidad no es tan complicado. Y si se pregunta cuántos pares de divisas podemos hacer eso a través de la API de Bitfinex, simplemente ejecute las dos líneas de código a continuación.

>>> api_v1 = bitfinex.bitfinex_v1.api_v1 ()
>>> pares = api_v1.symbols ()

Ahora, si lo empujáramos, podríamos escribir un script como este que recolecte todos los datos para cada par de divisas y los guarde en un archivo CSV. Eso le brinda todos los datos históricos de negociación de OHLC del intercambio de Bitfinex en una resolución de 1 minuto que debería ayudarlo a desarrollar una estrategia de negociación automatizada. Sin embargo, tomará un tiempo hasta que todos los datos estén en su computadora, por lo que debe limitar su consulta a un período de tiempo más corto o ser más selectivo con sus pares de divisas.

Espero que esto ayude y que puedan consultar el código aquí, seguirme en Twitter o conectarse a través de LinkedIn.