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

El autor:- ¿ Por qué?, Creado: 2023-08-08 10:05:19, Actualizado: 2023-09-12 15:50:55

img

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

En el artículo anterior, presenté cómo modelar el volumen acumulativo de operaciones y analicé el fenómeno del impacto del precio. En este artículo, continuaré analizando los datos de pedidos de operaciones. YGG lanzó recientemente contratos basados en Binance U, y las fluctuaciones de precios han sido significativas, con un volumen de operaciones que incluso superó a BTC en un momento dado. Hoy, lo analizaré.

Intervalos de tiempo de pedido

En general, se asume que el tiempo de llegada de los pedidos sigue un proceso de Poisson.Proceso de pescadoAquí, voy a proporcionar pruebas empíricas.

He descargado los datos de AggTrades para el 5 de agosto, que consta de 1,931,193 operaciones, lo que es bastante significativo. Primero, echemos un vistazo a la distribución de las órdenes de compra. Podemos ver un pico local no suave alrededor de 100 ms y 500 ms, que probablemente sea causado por órdenes de iceberg colocadas por bots comerciales a intervalos regulares. Esto también puede ser una de las razones de las condiciones inusuales del mercado ese día.

La función de masa de probabilidad (PMF) de la distribución de Poisson se da por la siguiente fórmula:

img

Donde:

  • κ es el número de eventos que nos interesan.
  • λ es la tasa media de eventos que ocurren por unidad de tiempo (o unidad de espacio).
  • imgrepresenta la probabilidad de que ocurran exactamente κ eventos, dada la tasa media λ.

En un proceso de Poisson, los intervalos de tiempo entre eventos siguen una distribución exponencial.

img

Los resultados de ajuste muestran que hay una diferencia significativa entre los datos observados y la distribución de Poisson esperada. El proceso de Poisson subestima la frecuencia de los intervalos de tiempo largos y sobreestima la frecuencia de los intervalos de tiempo cortos.

En [1]:

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

En [2]:

trades = pd.read_csv('YGGUSDT-aggTrades-2023-08-05.csv')
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].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'
})
buy_trades['interval']=buy_trades['transact_time'] - buy_trades['transact_time'].shift()
buy_trades.index = buy_trades['date']

En el [10]:

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

Fuera [10]:

img

En [20]:

Intervals = np.array(range(0, 1000, 5))
mean_intervals = buy_trades['interval'].mean()
buy_rates = 1000/mean_intervals
probabilities = np.array([np.mean(buy_trades['interval'] > interval)  for interval in Intervals])
probabilities_s = np.array([np.e**(-buy_rates*interval/1000) for interval in Intervals])

plt.figure(figsize=(10, 5))
plt.plot(Intervals, probabilities)
plt.plot(Intervals, probabilities_s)
plt.xlabel('Intervals')
plt.ylabel('Probability')
plt.grid(True)

Fuera [1]:

img

Cuando se compara la distribución del número de ocurrencias de orden en 1 segundo con la distribución de Poisson, la diferencia también es significativa.

  • Tasa de ocurrencia no constante: El proceso de Poisson asume que la tasa promedio de eventos que ocurren dentro de un intervalo de tiempo dado es constante.
  • Interacciones entre procesos: Otra suposición fundamental del proceso de Poisson es que los eventos son independientes entre sí.

En otras palabras, en un entorno del mundo real, la frecuencia de las ocurrencias de pedidos no es constante, y debe actualizarse en tiempo real. También puede haber un efecto incentivador, donde más pedidos dentro de un período de tiempo fijo estimulan más pedidos. Esto hace que las estrategias no puedan confiar en un solo parámetro fijo.

En el año [190]:

result_df = buy_trades.resample('1S').agg({ 
    'price': 'count',
    'quantity': 'sum'
}).rename(columns={'price': 'order_count', 'quantity': 'quantity_sum'})

En [219]:

count_df = result_df['order_count'].value_counts().sort_index()[result_df['order_count'].value_counts()>20]
(count_df/count_df.sum()).plot(figsize=(10,5),grid=True,label='sample pmf');

from scipy.stats import poisson
prob_values = poisson.pmf(count_df.index, 1000/mean_intervals) 

plt.plot(count_df.index, prob_values,label='poisson pmf');
plt.legend() ;

Fuera[219]:

img

Actualización de parámetros en tiempo real

De los análisis de los intervalos de orden anteriores, se puede concluir que los parámetros fijos no son adecuados para las condiciones reales del mercado, y los parámetros clave que describen el mercado en la estrategia deben actualizarse en tiempo real. La solución más directa es usar un promedio móvil de ventana móvil. Los dos gráficos a continuación muestran la frecuencia de órdenes de compra dentro de 1 segundo y la media del volumen de negociación con un tamaño de ventana de 1000. Se puede observar que hay un fenómeno de agrupación en el comercio, donde la frecuencia de órdenes es significativamente mayor que lo habitual durante un período de tiempo, y el volumen también aumenta sincrónicamente. Aquí, la media de los valores anteriores se utiliza para predecir el último valor absoluto, y el error medio de los residuos se utiliza para medir la calidad de la predicción.

A partir de los gráficos, también podemos entender por qué la frecuencia de orden se desvía tanto de la distribución de Poisson.

Se encuentra que el uso de la media de los dos segundos anteriores para predecir produce el menor error residual, y es mucho mejor que simplemente usar la media para los resultados de predicción.

En [221]:

result_df['order_count'].rolling(1000).mean().plot(figsize=(10,5),grid=True);

Fuera [1]:

img

En [193]:

result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);

Fuera [1]:

img

En [195]:

(result_df['order_count'] - result_df['mean_count'].mean()).abs().mean()

Fuera[195]:

6.985628185332997

En el [205]:

result_df['mean_count'] = result_df['order_count'].rolling(2).mean()
(result_df['order_count'] - result_df['mean_count'].shift()).abs().mean()

Fuera[205]:

3.091737586730269

Resumen de las actividades

Este artículo explica brevemente las razones de la desviación de los intervalos de tiempo de orden del proceso de Poisson, principalmente debido a la variación de los parámetros a lo largo del tiempo. Para predecir con precisión el mercado, las estrategias necesitan hacer pronósticos en tiempo real de los parámetros fundamentales del mercado. Los residuos se pueden usar para medir la calidad de las predicciones.


Más.