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.
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:
Algunos de ellos son:
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:
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));
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)
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.
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() ;
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);
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);
(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
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.