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é.
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:
Donde:
En un proceso de Poisson, los intervalos de tiempo entre eventos siguen una distribución exponencial.
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]:
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]:
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.
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]:
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]:
En [193]:
result_df['quantity_sum'].rolling(1000).mean().plot(figsize=(10,5),grid=True);
Fuera [1]:
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
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.