Razón fundamental

Debemos asegurarnos de que tenemos la forma correcta de datos para tratar cuando hacemos backtesting de un plan comercial, es decir, para llevar a cabo nuestra estrategia con datos previos para evaluar los retornos y otras variables relevantes. El enfoque no siempre es tan sencillo, siempre que ciertos métodos requieran datos de libro de nivel, otros funcionarán bien con velas de una hora y, según el tipo de información que necesite, elementos como la tecnología, la disponibilidad y la accesibilidad pueden ser bastante diferente. Si no tiene la menor idea de lo que significan estos datos de libros de nivel o velas de una hora, no hay necesidad de temer, ya que no tocaremos los de esta publicación.

Los datos requeridos se especifican principalmente por la frecuencia de la estrategia comercial. Las categorías de estrategias comerciales son un tema sobre el que escribiré en mi serie Algotrading sobre un tema completamente diferente, pero puede encontrar algunos detalles confiables en Investopedia. Bien, entonces, ¿por qué esta publicación trata sobre la recopilación de datos "comerciales" y por qué estamos usando la API de Binance? Usted, el lector, debe estar un poco intrigado por el contenido de mi publicación.

Frecuencia de datos y Binance

Los puntos finales de datos comerciales están disponibles en su mayoría en el 99,99 por ciento de los intercambios, diría yo. Es granular, ofrece un amplio detalle (en algunos casos muy únicos) para las técnicas de backtesting para el comercio de alta frecuencia (HFT), además de actuar como bloques de construcción de velas OHLC (1S a 24H o más, si eso es lo que desea). Los datos comerciales son sólidos y permiten mucha innovación con técnicas de frecuencia múltiple.
"Hablar es barato. Muéstrame el código ". - Linus Torvalds

Qué estaremos codificando

Vamos a construir un script de Python que obtenga el símbolo de par, una fecha de inicio y una fecha de finalización como argumentos de la línea de comandos. Esto generará un archivo CSV que contiene todas las transacciones en el disco. El método se puede explicar en profundidad a través de los siguientes pasos:
Análisis de símbolo, fecha de inicio y argumentos de fecha de finalización.
Para obtener la primera identificación comercial, obtenga la primera operación que se produjo en la fecha de inicio.
Se alcanza el bucle para obtener 1000 operaciones (límite de API de Binance) por solicitud antes de la fecha de finalización.
Finalmente, guarde el disco con la información. Para empezar, lo guardaremos en CSV, pero tiene muchas otras opciones para elegir.
Nosotros usaremos las bibliotecas pandas, queries, time, sys y datetime. No se mostraría ninguna verificación de error en los fragmentos de código, ya que no agrega mucho significado a la descripción. En GitHub, por supuesto, puede encontrar el archivo completo.

Tiempo de codificación: análisis de los argumentos

El guión usaría las razones de la siguiente manera:
Símbolo: el símbolo del par comercial definido por Binance. Puede consultarlo aquí, o puede copiarlo desde la URL de la aplicación web Binance, menos el carácter.
Suelta el "" de la última parte de la URL y obtendrás el símbolo
Fecha de inicio y fecha de finalización: se explica por sí mismo. El formato planificado es mm / dd / aaaa, o porcentaje m / porcentaje d / porcentaje Y en la jerga de Python.
Usaremos el sys incorporado para obtener las razones (nada demasiado sofisticado por aquí), y usaremos la biblioteca de fecha y hora para analizar la fecha.
símbolo = sys.argv [1]
fecha_inicial = fecha y hora.strptime (sys.argv [2], '% m /% d /% Y')
fecha_de_finalización = datetime.strptime (sys.argv [3], '% m /% d /% Y') + timedelta (días = 1) - timedelta (microsegundos = 1)
Agregamos un día y deducimos un microsegundo de modo que el componente de tiempo de la fecha de finalización sea ahora a las 23: 59: 59.999, lo que hace que sea más realista obtener períodos para el mismo día.

Obteniendo operaciones

Podemos obtener como máximo 1,000 operaciones en una sola solicitud usando la API de Binance y con el punto final aggTrades, y si usamos criterios de inicio y fin, pueden tener como máximo una hora de diferencia. Después de algunos errores, traté de seguir el enfoque from-id obteniendo intervalos de tiempo (en una etapa u otra, la liquidez se volvería loca y me perdería algunas operaciones útiles). Se elige el punto final de AggTrades para que se devuelvan las operaciones comprimidas. No perderemos ningún conocimiento valioso en esa dirección. Obtenga transacciones agregadas y comprimidas. Las operaciones que terminan en el mismo momento, con la misma orden, tendrían el monto agregado al mismo precio.

Nombre:  programming-1873854_960_720.png
Visitas: 128
Tamaño: 319.9 KB


La solución from-id es la siguiente: enviando intervalos de fechas al punto final, podemos obtener el primer intercambio de la fecha de inicio. Después de eso, recuperaremos 1,000 operaciones, comenzando desde la primera identificación comercial obtenida. Luego, después de nuestra fecha de finalización, buscaremos si se ha realizado la última operación. Si es así, todo el tiempo que hemos pasado y podemos guardar los hallazgos en el archivo. De lo contrario, nuestra variable from id se cambiará para obtener la última identificación comercial y reanudar el ciclo nuevamente. Uf, basta de hablar, codifiquemos.

Verificamos si el current_time que contiene la fecha de la última operación obtenida es mayor que nuestro to_date, y si es así, nosotros:
• Recuperar transacciones usando la función de id
• Ajuste los parámetros de Id y hora actual, ambos con los nuevos datos comerciales obtenidos.
• Imprime un hermoso mensaje de depuración
• Pd.concat las operaciones obtenidas en nuestro DataFrame con las operaciones anteriores.
• Y duerme un poco para que Binance no pueda darnos una respuesta HTTP 429 fea

Limpieza y ahorro

Necesitamos realizar una limpieza de datos rápida después del ensamblaje de nuestro DataFrame. Vamos a eliminar los duplicados y recortar las operaciones que ocurrieron después de nuestra fecha límite (tenemos el problema porque estamos obteniendo 1,000 operaciones en fragmentos, por lo que se supone que debemos realizar ciertas operaciones después de nuestra fecha de finalización objetivo).

Encapsularemos las características de nuestra moldura:
def trim (df, to_date):
return df [df ['T'] <= get_unix_ms_from_date (to_date)]
Y realizar nuestra limpieza de datos:
df.drop_duplicates (subconjunto = 'a', inplace = True)
df = trim (df, to_date)
Ahora, usando el proceso to csv, podemos guardarlo en un archivo:
filename = f'binance __ {symbol} __ trades__from __ {sys.argv [2] .replace ("/", "_")} __ a __ {sys.argv [3] .replace ("/", "_")}. csv '
df.to_csv (nombre de archivo)
También se pueden utilizar otros sistemas de almacenamiento de datos, como el Ártico.