Pensamiento sobre estrategias de trading de alta frecuencia (3)

El autor:Las hierbas, Creado: 2023-08-07 18:17:28, Actualizado: 2023-09-18 19:50:53

img

En el artículo anterior, expliqué cómo modelar el volumen acumulado de transacciones, así como un simple análisis de los efectos de los impactos de precios. Este artículo también se centrará en el análisis de los datos de las órdenes de operaciones.

El tiempo de la orden

En general, se asume que el tiempo de llegada de la orden coincide con el proceso de Parasol, aquí hay un artículo que lo describe.El proceso de ParatónEn el siguiente artículo, voy a demostrar que es cierto.

La descarga de AggTrades del 5 de agosto, con un total de 1931.193 operaciones, es muy exagerada. Primero de todo, si nos fijamos en la distribución de pagos, se puede ver que hay un pico local irregular en torno a los 100 ms y 500 ms, que debe ser causado por la orden de tiempo del robot encargado por la montaña de hielo, lo que también puede ser una de las razones de la situación inusual del día.

La función de masa de probabilidad (PMF) de la distribución de Parsons es dada por la siguiente fórmula:

img

Algunos de ellos son:

  • k es el número de eventos que nos interesan.
  • λ es la frecuencia media de ocurrencia de los eventos en unidad de tiempo (o espacio unitario).
  • P ((k; λ) indica la probabilidad de que ocurran k eventos por casualidad bajo condiciones de una tasa de ocurrencia media λ.

En el proceso de Parason, el intervalo de tiempo entre los eventos está sujeto a la distribución exponencial. La función de densidad de probabilidad de la distribución exponencial (PDF) está dada por la siguiente fórmula:

img

Al combinar los hallazgos, los resultados y la distribución de Pareto se diferenciaron mucho más de lo esperado, y el proceso de Pareto subestimó la frecuencia de los tiempos de intervalos largos y sobreestimó la frecuencia de los tiempos de intervalos bajos.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
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']
buy_trades['interval'][buy_trades['interval']<1000].plot.hist(bins=200,figsize=(10, 5));

img

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)

img

La distribución del número de veces que ocurren los pedidos en 1s, comparada con la distribución de Parsons, también es muy distinta. La distribución de Parsons subestima significativamente la frecuencia de los eventos de baja probabilidad.

  • Incidencia inconstante: el proceso de Parsons asume que la incidencia media de los eventos en cualquier período de tiempo dado es constante. Si esta hipótesis no es cierta, entonces la distribución de los datos se desvía con la distribución de Parsons.
  • Interacción de los procesos: otra hipótesis básica del proceso de Parsons es que los eventos son independientes entre sí. Si los eventos en el mundo real se influyen entre sí, entonces su distribución puede desviarse de la distribución de Parsons.

Es decir, en un entorno real, la frecuencia con la que ocurren los pedidos no es constante, requiere actualizaciones en tiempo real y tiene un efecto incentivador, es decir, más pedidos en un tiempo fijo provocan más pedidos. Esto hace que la estrategia no pueda fijar un solo parámetro.

result_df = buy_trades.resample('0.1S').agg({ 
    'price': 'count',
    'quantity': 'sum'
}).rename(columns={'price': 'order_count', 'quantity': 'quantity_sum'})
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() ;

img

Actualización de parámetros en tiempo real

El análisis anterior de los intervalos de orden puede concluir que los parámetros fijos no se adaptan a los mercados reales y que los parámetros clave de la descripción del mercado de la estrategia deben actualizarse en tiempo real. La solución más fácil de pensar es la media móvil de las ventanas móviles. Los dos gráficos siguientes son la media de la frecuencia de pagos en 1s y el volumen de transacciones en 1000 ventanas respectivamente.

El gráfico también explica por qué la frecuencia de los pedidos se desvía tanto de la distribución de Parsons, aunque el promedio del número de pedidos por segundo es de solo 8.5 veces, pero en los casos extremos el promedio de pedidos por segundo se desvía mucho.

En este caso, se encontró que el error de parálisis se predijo con el menor valor de los dos primeros segundos y que era mucho mejor que el resultado de un simple pronóstico de valor medio.

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

img

result_df
orden_contigo cantidad_suma
2023-08-05 03:30:06.100 1 76.0
2023-08-05 03:30:06.200 0 0.0
2023-08-05 03:30:06.300 0 0.0
2023-08-05 03:30:06.400 1 416.0
2023-08-05 03:30:06.500 0 0.0
2023-08-05 23:59:59.500 3 9238.0
2023-08-05 23:59:59.600 0 0.0
2023-08-05 23:59:59.700 1 3981.0
2023-08-05 23:59:59.800 0 0.0
2023-08-05 23:59:59.900 2 534.0
result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);

img

(result_df['order_count'] - result_df['mean_count'].mean()).abs().mean()
6.985628185332997
result_df['mean_count'] = result_df['order_count'].ewm(alpha=0.11, adjust=False).mean()
(result_df['order_count'] - result_df['mean_count'].shift()).abs().mean()
0.6727616961866929
result_df['mean_quantity'] = result_df['quantity_sum'].ewm(alpha=0.1, adjust=False).mean()
(result_df['quantity_sum'] - result_df['mean_quantity'].shift()).abs().mean()
4180.171479076811

Resumen

Este artículo presenta en pocas palabras las razones del proceso de desviación de las parámetros del intervalo de tiempo de la orden, principalmente porque los parámetros cambian con el tiempo. Para predecir el mercado con mayor precisión, las estrategias requieren hacer predicciones en tiempo real de los parámetros básicos del mercado. Se puede medir el bien y el mal de las predicciones con residuos.


Más.