Pensamiento sobre estrategias de trading de alta frecuencia (1)

El autor:Las hierbas, Creado: 2023-08-03 16:14:16, Actualizado: 2023-12-08 16:37:21

img

El artículo explora las estrategias de transacción de alta frecuencia de las monedas digitales, incluidas las fuentes de ganancias (principalmente las fuertes fluctuaciones del mercado y las comisiones de transacción de los intercambios), los problemas de posición y control de posiciones suspendidas, y los métodos para modelar la transacción con la distribución de Pareto. Además, se hace referencia a los datos de transacción por transacción y de orden de preferencia ofrecidos por Binance para hacer un repaso, y se planea discutir en profundidad otros problemas de estrategias de transacción de alta frecuencia en artículos posteriores.

He escrito dos artículos anteriores sobre las transacciones de alta frecuencia de las monedas digitales.Introducción a las estrategias de alta frecuencia de las monedas digitales, 5 bandas 80 veces más poderosas que las estrategias de alta frecuenciaPero sólo puede ser un intercambio de experiencias y hablar en general. Esta vez planeo escribir una serie de artículos, que presentan la idea de la negociación de alta frecuencia desde el principio, espero ser lo más breve posible, pero debido a mi nivel personal limitado, la comprensión de la negociación de alta frecuencia no es profunda.

Fuentes de ganancias de alta frecuencia

En artículos anteriores, se mencionó que las estrategias de alta frecuencia son especialmente adecuadas para mercados con una gran fluctuación de los mercados. Examinar la variación de precios de una variedad de operaciones en un corto período de tiempo, compuesta por tendencias generales y perturbaciones. Si podemos predecir con precisión las variaciones de tendencias, por supuesto, podemos ganar dinero, pero también es el más difícil.

Los problemas que hay que resolver

1.策略同时挂买单和卖单,第一个问题就是在哪里挂单。挂的离盘口越近,成交的概率越高,但在剧烈波动的行情中,瞬间成交的价格可能离盘口较远,挂的那太近没有能吃到足够的利润。挂的太远的单子成交概率又低。这是一个需要优化的问题。

2.控制仓位。为了控制风险,策略就不能长时间累计过多的仓位。可以通过控制挂单距离、挂单量、总仓位限制等办法解决。

Para lograr los objetivos anteriores, se requiere hacer estimaciones de modelado de muchos aspectos, como probabilidades de probabilidad de transacción, ganancias de transacción, estimaciones de mercado, etc. Muchos artículos y artículos se pueden encontrar en palabras clave como High-Frequency Trading, Orderbook, etc. También hay muchas recomendaciones en línea, no se desarrollan aquí. También es mejor establecer un sistema de retroalimentación rápido y confiable.

Los datos necesarios

Binance ofrece datos de transacciones por billetes y de los mejores pedidos pendientes.DescargarLos datos de profundidad deben ser descargados en la lista blanca con una API, pero también pueden ser recopilados por sí mismos. Los datos de transacción agregados pueden usarse para la revisión.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Las transacciones por billetes incluyen:

  1. agg_trade_id: el id de la transacción que se agrega,
  2. Precio: el precio de la transacción
  3. cantidad: cantidad de transacciones
  4. first_trade_id: la transacción agregada puede tener varias transacciones simultáneas, solo se estadística un dato, que es el id de la primera transacción
  5. Last_trade_id: el ID de la última transacción
  6. transact_time: tiempo de finalización de la transacción
  7. is_buyer_maker: Dirección de la transacción, True representa el comprador, el comprador es el comprador, el comprador es el comprador

Se puede ver que el día había 660.000 transacciones, y las transacciones estaban muy activas.

trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades

Se aplicarán las siguientes condiciones:

el nombre del operador. precio cantidad el nombre del operador el número de transacción tiempo de la transacción es_comprador_fabricante
120719552 52.42 22.087 207862988 207862990 1688256004603 No es cierto.
120719553 52.41 29.314 207862991 207863002 1688256004623 Es cierto.
120719554 52.42 0.945 207863003 207863003 1688256004678 No es cierto.
120719555 52.41 13.534 207863004 207863006 1688256004680 Es cierto.
121384024 68.29 10.065 210364899 210364905 1688342399863 No es cierto.
121384025 68.30 7.078 210364906 210364908 1688342399948 No es cierto.
121384026 68.29 7.622 210364909 210364911 1688342399979 Es cierto.

Modelo de transacción de una sola moneda

Primero se procesan los datos y se dividen los trades primitivos en grupos de compra y en grupos de venta. Los datos de la compra primaria se agrupan en un solo dato al mismo precio y dirección al mismo tiempo. Puede ocurrir un volumen de compra inicial de 100, si se divide en varias transacciones y el precio no es el mismo, por ejemplo, para dividir 60 y 40 billetes, se producen dos datos, lo que afecta la estimación del volumen de compra.

trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
sell_trades = trades[trades['is_buyer_maker']==True].copy()
buy_trades = buy_trades.groupby('transact_time').agg({
    'agg_trade_id': 'last',
    'price': 'last',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
    'date': 'last',
    'transact_time':'last'
})
sell_trades = sell_trades.groupby('transact_time').agg({
    'agg_trade_id': 'last',
    'price': 'last',
    'quantity': 'sum',
    'first_trade_id': 'first',
    'last_trade_id': 'last',
    'is_buyer_maker': 'last',
    'date': 'last',
    'transact_time':'last'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
sell_trades['interval']=sell_trades['transact_time'] - sell_trades['transact_time'].shift()
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
146181

Para el ejemplo de los pagos, primero se dibuja un diagrama recto y se puede ver el efecto de cola larga muy evidente, con la mayor parte de los datos concentrados en el punto más a la izquierda, pero también con una pequeña cantidad de grandes transacciones distribuidas en la cola.

buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));

png

为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。

buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));

png

La distribución satisfactoria de la ley de poder, también conocida como distribución de Pareto, es una distribución de probabilidad común en física estadística y ciencias sociales. En la distribución de la ley, la probabilidad de que un evento tenga un tamaño (o frecuencia) es proporcional a un índice negativo del tamaño del evento. La principal característica de esta distribución es que los eventos grandes (es decir, aquellos que se alejan de la media) tienen una frecuencia más alta de lo esperado en muchas otras distribuciones.

El siguiente gráfico muestra la probabilidad de que la transacción sea mayor que un valor determinado, con la línea azul como probabilidad real y la línea de alambre como probabilidad simulada, sin complicar los parámetros concretos, se puede ver que se satisface la distribución de Pareto.

png

Donde N es el parámetro estandarizado. Aquí se selecciona la media de transacciones M, y se selecciona alfa-2.06. La estimación de la alfa específica se puede calcular mediante el valor de P cuando D = N. Específicamente: alfa = log ((P(d>M)) /log ((2)).

depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
alpha = np.log(np.mean(buy_trades['quantity'] > mean_quantity))/np.log(2)
mean_quantity = buy_trades['quantity'].mean()
probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])

plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)

img

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

Pero esta estimación sólo parece que, en el gráfico anterior, hemos dibujado la diferencia entre el valor simulado y el valor real. Cuando el tránsito es menor, el desvío es muy grande, incluso cerca del 10%. Se puede seleccionar diferentes puntos para que la probabilidad de este punto sea más precisa al estimar los parámetros, pero tampoco se resuelve el problema de la desviación.

png

Para una breve descripción, aquí r = q / M representa el volumen de transacción estandarizado. Los parámetros se pueden estimar de la misma manera que arriba. La siguiente gráfica muestra que el desvío máximo después de la corrección no es superior al 2%, lo que en teoría puede ser continuado, pero esta precisión es suficiente.

depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])

plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

Con las ecuaciones de estimación de la distribución de transacciones, la probabilidad de la ecuación de atención no es una probabilidad real, sino una probabilidad condicional. En este momento, se puede responder a la pregunta: ¿cuál es la probabilidad de que esta orden sea mayor que un valor si ocurre el próximo pedido? También se puede decir: ¿cuál es la probabilidad de que se realicen pedidos de diferentes profundidades (ideal, menos estricto, el libro de pedidos teórico tiene nuevos pedidos y retiradas, y con colas de la misma profundidad).

Ya casi hemos terminado de escribir aquí, pero todavía hay muchas preguntas que deben ser respondidas, y la siguiente serie de artículos intentará darles respuestas.


Más.

Cuantificación de orcs 🐂🍺

No hay nada.¡Qué arrogante!

Las hierbasEl csv es demasiado grande para descargarlo.