En la carga de los recursos... Cargando...

Opiniones sobre las estrategias de negociación de alta frecuencia (1)

El autor:FMZ~Lydia, Creado: 2023-08-04 13:47:39, Actualizado: 2024-11-10 18:54:05

img

Opiniones sobre las estrategias de negociación de alta frecuencia (1)

He escrito dos artículos sobre el comercio de alta frecuencia de monedas digitales, a saber Estrategia de alta frecuencia de la moneda digital Introducción detallada y Ganar 80 veces en 5 días, el poder de la estrategia de alta frecuencia. Sin embargo, estos artículos solo pueden considerarse como un intercambio de experiencias y proporcionar una visión general. Esta vez, planeo escribir una serie de artículos para introducir el proceso de pensamiento detrás del comercio de alta frecuencia desde cero. Espero mantenerlo conciso y claro, pero debido a mi limitada experiencia, mi comprensión del comercio de alta frecuencia puede no ser muy profunda. Este artículo debe ser visto como un punto de partida para la discusión, y doy la bienvenida a las correcciones y orientación de los expertos.

Fuente de las ganancias de alta frecuencia

En mis artículos anteriores, mencioné que las estrategias de alta frecuencia son particularmente adecuadas para mercados con fluctuaciones extremadamente volátiles. Los cambios de precio de un instrumento de negociación en un corto período de tiempo consisten en tendencias y oscilaciones generales. Si bien es realmente rentable si podemos predecir con precisión los cambios de tendencia, este es también el aspecto más desafiante. En este artículo, me centraré principalmente en las estrategias de creadores de alta frecuencia y no profundizaré en la predicción de tendencias. En los mercados oscilantes, al colocar órdenes de oferta y demanda estratégicamente, si la frecuencia de las ofertas es lo suficientemente alta y el margen de ganancia es significativo, puede cubrir las posibles pérdidas causadas por las tendencias. De esta manera, se puede lograr rentabilidad sin predecir los movimientos del mercado. Actualmente, los intercambios proporcionan descuentos para las operaciones de creadores, que también son un componente competitivo de las ganancias. Cuanto mayor sea la proporción del mercado, la proporción de los descuentos debe ser mayor.

Problemas que hay que resolver

  1. El primer problema en la implementación de una estrategia que coloca órdenes de compra y venta es determinar dónde colocar estas órdenes. Cuanto más cerca se colocan las órdenes a la profundidad del mercado, mayor es la probabilidad de ejecución. Sin embargo, en condiciones de mercado altamente volátiles, el precio al que se ejecuta instantáneamente una orden puede estar lejos de la profundidad del mercado, lo que resulta en un beneficio insuficiente. Por otro lado, colocar órdenes demasiado lejos reduce la probabilidad de ejecución. Este es un problema de optimización que debe abordarse.

  2. El control de posición es crucial para gestionar el riesgo. Una estrategia no puede acumular posiciones excesivas durante períodos prolongados. Esto se puede abordar controlando la distancia y la cantidad de órdenes realizadas, así como estableciendo límites en las posiciones globales.

Para lograr los objetivos anteriores, se requieren modelado y estimación para varios aspectos como probabilidades de ejecución, ganancias de ejecuciones y estimación del mercado. Hay numerosos artículos y documentos disponibles sobre este tema, utilizando palabras clave como High-Frequency Trading y Orderbook. Muchas recomendaciones también se pueden encontrar en línea, aunque la elaboración adicional está más allá del alcance de este artículo. Además, es aconsejable establecer un sistema de backtesting confiable y rápido. Aunque las estrategias de alta frecuencia se pueden validar fácilmente a través del comercio en vivo, el backtesting ayuda a proporcionar información adicional y reducir el costo de prueba y error.

Datos requeridos

Binance ofrecedatos descargablespara operaciones individuales y mejores órdenes de oferta / demanda. Los datos de profundidad se pueden descargar a través de su API al ser incluidos en la lista blanca, o pueden recopilarse manualmente. Para fines de backtesting, los datos de comercio agregados son suficientes. En este artículo, usaremos el ejemplo de datos HOOKUSDT-aggTrades-2023-01-27.

En [1]:

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

Los datos comerciales individuales incluyen los siguientes:

  1. En el caso de las entidades financieras, el valor de las operaciones de transferencia de activos de las entidades financieras es el valor de las operaciones de transferencia de activos.
  2. precio: el precio al que se ejecutó la operación.
  3. cantidad: la cantidad de la operación.
  4. el número de transacciones que se realizan en el mercado, incluidas las transacciones que no se realizan en el mercado, y el número de transacciones que se realizan en el mercado.
  5. Last_trade_id: el ID de la última operación de la agregación.
  6. Transaction_time: el tiempo de ejecución de la operación.
  7. is_buyer_maker: Indica la dirección del comercio. True representa una orden de compra ejecutada como un creador, mientras que una orden de venta se ejecuta como un tomador.

Se puede ver que hubo 660.000 operaciones ejecutadas ese día, lo que indica un mercado muy activo.

En [4]:

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

Fuera[4]: No, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no, no.

img

Se aplicarán las siguientes condiciones:

Modelado de la cantidad de comercio individual

Primero, los datos se procesan dividiendo las operaciones originales en dos grupos: órdenes de compra ejecutadas como creadores y órdenes de venta ejecutadas como tomadores. Además, los datos comerciales agregados originales combinan operaciones ejecutadas al mismo tiempo, al mismo precio y en la misma dirección en un solo punto de datos. Por ejemplo, si hay una sola orden de compra con un volumen de 100, puede dividirse en dos operaciones con volúmenes de 60 y 40, respectivamente, si los precios son diferentes. Esto puede afectar a la estimación de los volúmenes de órdenes de compra. Por lo tanto, es necesario agregar los datos nuevamente en función del transact_time. Después de esta segunda agregación, el volumen de datos se reduce en 140,000 registros.

En [6]:

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()

En el [10]:

print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))

Fuera [10]: Las demás:

Tomemos como ejemplo las órdenes de compra, primero tracemos un histograma. Se puede observar que hay un efecto de cola larga significativo, con la mayoría de los datos concentrados hacia la parte más izquierda del histograma. Sin embargo, también hay algunas operaciones grandes distribuidas hacia el extremo de la cola.

En [36]:

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

Fuera [36]:

img

Para una observación más fácil, vamos a recortar la cola y analizar los datos. Se puede observar que a medida que aumenta la cantidad de comercio, la frecuencia de ocurrencia disminuye, y la tasa de disminución se hace más rápida.

En [37]:

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

Fuera [37]:

img

Se han realizado numerosos estudios sobre la distribución de las cantidades de comercio. Se ha encontrado que las cantidades de comercio siguen una distribución de la ley de potencia, también conocida como distribución de Pareto, que es una distribución de probabilidad común en física estadística y ciencias sociales. En una distribución de ley de potencia, la probabilidad de que un evento tenga un tamaño (o frecuencia) es proporcional a un exponente negativo del tamaño de ese evento. La característica principal de esta distribución es que la frecuencia de eventos grandes (es decir, los que están lejos del promedio) es mayor de lo esperado en muchas otras distribuciones. Esta es precisamente la característica de la distribución de la cantidad de comercio.

El siguiente gráfico representa la probabilidad de que las cantidades de comercio superen un cierto valor. La línea azul representa la probabilidad real, mientras que la línea naranja representa la probabilidad simulada. Tenga en cuenta que no entraremos en los parámetros específicos en este punto. Se puede observar que la distribución de hecho sigue una distribución de Pareto. Dado que la probabilidad de que las cantidades de comercio sean mayores de cero es 1, y para satisfacer la normalización, la ecuación de distribución debe ser la siguiente:

img

Aquí, N es el parámetro para la normalización. Elegiremos el monto promedio de la operación, M, y estableceremos alfa a -2.06. La estimación específica de alfa se puede obtener calculando el valor P cuando D=N. Específicamente, alfa = log (((P(d>M)) / log ((2). La elección de diferentes puntos puede resultar en ligeras diferencias en el valor de alfa.

En [55]:

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)

Fuera[55]:

img

En [56]:

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

Fuera[56]:

img

Sin embargo, esta estimación es solo aproximada, como se muestra en el gráfico donde trazamos la diferencia entre los valores simulados y reales. Cuando la cantidad de comercio es pequeña, la desviación es significativa, incluso se acerca al 10%. Aunque seleccionar diferentes puntos durante la estimación de parámetros puede mejorar la precisión de la probabilidad de ese punto específico, no resuelve el problema de la desviación en su conjunto. Esta discrepancia surge de la diferencia entre la distribución de la ley de potencia y la distribución real. Para obtener resultados más precisos, la ecuación de la distribución de la ley de potencia debe modificarse.

img

Para simplificar, usemos r = q / M para representar el monto de comercio normalizado. Podemos estimar los parámetros utilizando el mismo método que antes. El siguiente gráfico muestra que después de la modificación, la desviación máxima no es más del 2%. En teoría, se pueden hacer más ajustes, pero este nivel de precisión ya es suficiente.

En [52]:

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)

Fuera[52]:

img

En [53]:

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

Fuera[53]:

img

Con la ecuación estimada para la distribución de la cantidad de comercio, es importante tener en cuenta que las probabilidades en la ecuación no son las probabilidades reales, sino las probabilidades condicionales. En este punto, podemos responder a la pregunta: ¿Cuál es la probabilidad de que la próxima orden sea mayor que un cierto valor? También podemos determinar la probabilidad de que se ejecuten órdenes a diferentes profundidades (en un escenario ideal, sin considerar adiciones de órdenes, cancelaciones y colas a la misma profundidad).

En este punto, la longitud del texto ya es bastante larga, y todavía hay muchas preguntas que necesitan ser respondidas.


Más.