Pensamiento sobre estrategias de trading de alta frecuencia (4)

El autor:Las hierbas, Creado: 2023-08-08 22:31:47, Actualizado: 2023-09-18 19:51:25

img

El artículo anterior muestra por qué hay que ajustar dinámicamente los parámetros y cómo valorar las estimaciones. Este artículo se centrará en datos de profundidad, estudiando el precio medio (o llamado precio justo, micro-precio, etc.).

Datos de profundidad

Binance ofrece la descarga de datos históricos de las mejores ofertas, que incluyen best_bid_price: el precio de mejor compra, es decir, el mayor precio de compra, best_bid_qty: el número de precios de mejor compra, best_ask_price: el precio de mejor venta, best_ask_qty: el número de precios de mejor venta, transaction_time: el tiempo de espera.

En primer lugar, si nos fijamos en el mercado de ese día, el aumento y la disminución, además, el volumen de transacción del día también cambió mucho con la fluctuación del mercado, especialmente el spread (la diferencia entre el precio de venta y el precio de compra) que muestra muy significativamente la volatilidad del mercado. En las estadísticas de YGG, el 20% del tiempo de dispersión es mayor que un tick, algo que es raro en la era de la competencia de robots en el mercado.

from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
books = pd.read_csv('YGGUSDT-bookTicker-2023-08-07.csv')
tick_size = 0.0001
books['date'] = pd.to_datetime(books['transaction_time'], unit='ms')
books.index = books['date']
books['spread'] = round(books['best_ask_price'] - books['best_bid_price'],4)
books['best_bid_price'][::10].plot(figsize=(10,5),grid=True);

img

books['best_bid_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);
books['best_ask_qty'][::10].rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);

img

books['spread'].value_counts()[books['spread'].value_counts()>500]/books['spread'].value_counts().sum()
0.0001    0.799169
0.0002    0.102750
0.0003    0.042472
0.0004    0.022821
0.0005    0.012792
0.0006    0.007350
0.0007    0.004376
0.0008    0.002712
0.0009    0.001657
0.0010    0.001089
0.0011    0.000740
0.0012    0.000496
0.0013    0.000380
0.0014    0.000258
0.0015    0.000197
0.0016    0.000140
0.0017    0.000112
0.0018    0.000088
0.0019    0.000063
Name: spread, dtype: float64

Ofertas desequilibradas

A partir de lo anterior, se puede ver que la cantidad de pedidos de compra y venta es muy diferente la mayor parte del tiempo, lo que es un fuerte predictor de la situación del mercado a corto plazo. La razón es la misma que la mencionada en el artículo anterior. Si un lado de la orden es significativamente menor que el otro, suponiendo que el siguiente volumen de pedidos de compra y venta se acerque, el lado de la orden será más probable que sea comido, lo que impulsará el cambio de precio.imgDonde Q_b representa la cantidad de pedido en espera de compra (best_bid_qty) y Q_a representa la cantidad de pedido en espera de venta (best_ask_qty).

Define el precio medio:img

El siguiente gráfico muestra la relación entre la tasa de cambio del precio medio y el desequilibrio I a 1 intervalo, y de acuerdo con la expectativa, a medida que aumenta el I, los precios son más probables de subir, y el tamaño del cambio de precio se acelera cuanto más cerca de 1. En el comercio de alta frecuencia, el propósito de introducir un precio medio es para predecir mejor los cambios de precios futuros, es decir, que la diferencia de precios futuros es menor y el precio medio es mejor definido.img

books['I'] = books['best_bid_qty'] / (books['best_bid_qty'] + books['best_ask_qty'])
books['mid_price'] = (books['best_ask_price'] + books['best_bid_price'])/2
bins = np.linspace(0, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['price_change'] = (books['mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Average Mid Price Change Rate');
plt.grid(True)

img

books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].mean()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

Ajuste del precio intermedio

En el gráfico, la variación del precio medio ponderado es mucho menor en relación con los diferentes I, lo que indica que el precio medio ponderado es un mejor ajuste. Pero todavía hay algunas reglas, como que cerca de 0.2 y 0.8 hay una mayor desviación. Esto indica que I todavía puede aportar información adicional.

Para ser más intuitivos, aquí se redefine I:

img

En este momento:

img

Observando esta forma, se puede observar que el precio medio ponderado es una modificación del precio medio medio, cuyo coeficiente de corrección es Spread, y el precio medio ponderado es una función sobre I. Supongamos simplemente que la relación es I/2 ‒. En este momento, se reflejan los beneficios de la distribución de I ajustada (−1,1) sobre la simetría del punto de origen, lo que nos facilita encontrar la relación de adecuación de la función. Observando el gráfico, esta función debe satisfacer la relación de las secuencias extrañas de I, lo que se ajusta a la velocidad de crecimiento de ambos lados, y sobre la simetría del punto de origen, también se puede observar que los valores cercanos al punto de origen son lineales, además, cuando se suma cerca de I0, el resultado de la función es 0, cuando I es 1, el resultado de la función es 0.5‒. Por lo tanto, se conjetura que:

img

Aquí N es el número par positivo, y después de pruebas reales, N es mejor en 8; hasta ahora, este artículo propone el precio medio ponderado después de la modificación:

img

En este momento, la predicción de los cambios en el precio intermedio no tiene nada que ver con I. Este resultado, aunque es mejor que el precio intermedio simple y ponderado, no es aplicable en el mercado real, y aquí solo se da una idea.Micro-precioEn la página web de la organización, se muestra el código de la aplicación, que todos pueden leer.

books['I'] = (books['best_bid_qty'] - books['best_ask_qty']) / (books['best_bid_qty'] + books['best_ask_qty'])
books['weighted_mid_price'] = books['mid_price'] + books['spread']*books['I']/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['weighted_price_change'] = (books['weighted_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['weighted_price_change'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I'])*(books['I']**8+1)/4
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

books['adjust_mid_price'] = books['mid_price'] + books['spread']*(books['I']**3)/2
bins = np.linspace(-1, 1, 51)
books['I_bins'] = pd.cut(books['I'], bins, labels=bins[1:])
books['adjust_mid_price'] = (books['adjust_mid_price'].pct_change()/tick_size).shift(-1)
avg_change = books.groupby('I_bins')['adjust_mid_price'].sum()
plt.figure(figsize=(8,5))
plt.plot(avg_change)
plt.xlabel('I Value Range')
plt.ylabel('Weighted Average Mid Price Change Rate');
plt.grid(True)

img

Resumen

El precio intermedio es muy importante para la estrategia de alta frecuencia, es una predicción de precios futuros a corto plazo, por lo que el precio intermedio debe ser lo más preciso posible. Los precios intermedios descritos anteriormente se basan en los datos de la lista, ya que solo se utiliza un archivo de mercados al analizar. En el mercado real, la estrategia debe utilizar todos los datos posible, especialmente los intercambios de operaciones en el mercado real, y las predicciones de precios intermedios deben comprobarse por los precios reales de transacción.


Más.

- ¿ Por qué?No entiendo lo que dice.

No hay nada.¡Qué arrogante!