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.
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.
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.
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:
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. |
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));
为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
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.
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)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
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.
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);
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.
Cuantificación de orcs 🐂🍺
No hay nada.¡Qué arrogante!
Las hierbasEl csv es demasiado grande para descargarlo.