Pensamento sobre estratégias de negociação de alta frequência (4)

Autora:Ervas daninhas, Criado: 2023-08-08 22:31:47, Atualizado: 2023-09-18 19:51:25

img

O artigo anterior mostrou por que é necessário ajustar dinamicamente os parâmetros e como avaliar as estimativas boas e ruins, estudando o intervalo de chegada de pedidos. Este artigo vai focar em dados em profundidade, pesquisando o preço médio (ou chamado de preço justo, micro-preço, etc.).

Dados em profundidade

Binance oferece o download de dados históricos de melhores ofertas, incluindo best_bid_price: melhor preço de compra, ou seja, maior preço de compra, best_bid_qty: melhor preço de compra, best_ask_price: melhor preço de venda, best_ask_qty: melhor preço de venda, transaction_time: horário de transação. Este dado não inclui o segundo e mais profundos listados.

Em primeiro lugar, olha para o mercado do dia, os altos e baixos, além disso, o volume de transações do dia também varia muito com a flutuação do mercado, especialmente o spread (a diferença entre o preço de venda e o preço de compra) mostra muito significativamente a volatilidade do mercado. Nas estatísticas do mercado do dia da YGG, há um spread de tempo de 20% maior que um tick, uma situação rara na era em que os robôs competem no 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 diferença entre o volume de pedidos e os pedidos de venda é muito grande na maior parte do tempo, o que tem um forte efeito de previsão do mercado de curto prazo. A razão é a mesma que o artigo anterior mencionou. Se um lado do pedido for significativamente menor do que o outro, assumindo que o volume de pedidos de compra e venda se aproxima, o lado do pedido de venda é mais provável de ser comido, impulsionando a mudança de preço.imgQ_b representa a quantidade de pedidos pendurados (best_bid_qty) e Q_a representa a quantidade de pedidos pendurados (best_ask_qty).

Definição de preço médio:img

O gráfico a seguir mostra a relação entre a taxa de variação do preço médio e o desequilíbrio I a 1 intervalo, e, de acordo com a expectativa, com o aumento do I, os preços são mais propensos a subir e, quanto mais perto de 1, o tamanho da mudança de preço também se acelera. No comércio de alta frequência, o objetivo da introdução do preço médio é prever melhor as mudanças de preços futuros, ou seja, quanto menor a diferença de preços futuros, o preço médio é melhor 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 do preço intermediário

No gráfico, a variação do preço médio ponderado em relação aos diferentes I é muito menor, o que indica que o preço médio ponderado é um melhor ajuste. Mas ainda há algumas regras, como o desvio maior perto de 0,2 e 0,8. Isso mostra que I ainda pode contribuir com informações adicionais. Como o preço médio ponderado assume que a correção do preço é totalmente linear com I, isso claramente não está de acordo com a realidade, como pode ser visto no gráfico acima, quando I está perto de 0 e 1, o desvio é mais rápido, não uma relação linear.

Para ser mais intuitivo, aqui eu redefino I:

img

Neste momento:

img

Observando esta forma, pode-se observar que o preço médio ponderado é uma modificação do preço médio médio, cujo coeficiente de modificação é o Spread, e o preço médio ponderado é sobre a função I. Suponha simplesmente que a relação seja I/2 ‒. Neste momento, os benefícios da distribuição de I ajustada ((-1,1)) são refletidos, I sobre a simetria do ponto de origem, o que nos proporciona uma relação de adequação conveniente para encontrar a função. Observe o gráfico, que essa função deve satisfazer a relação de divisões ímpares de I, de modo a atender ao crescimento rápido de ambos os lados, e sobre a simetria do ponto de origem, também pode-se observar que o valor próximo ao ponto de origem é linear e, mais adicionado, quando se aproxima de I0, o resultado da função é 0, quando I é 1, o resultado da função é 0,5 ─.

img

Aqui, N é um número par positivo e, após testes reais, N é melhor em 8; até aqui, o artigo apresenta o preço médio ponderado depois da correção:

img

Neste momento, a previsão de mudanças no preço médio não tem nada a ver com I. Este resultado, embora melhor do que o preço médio simples e ponderado, não é aplicável no mercado real, apenas para dar uma ideia.Micro-PreçoO blog do blog também tem um link para o site do blog do blog, onde você pode pesquisar o que é um blog.

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

Resumo

O preço médio é muito importante para a estratégia de alta frequência, é a previsão de preços futuros de curto prazo, portanto, o preço médio deve ser o mais preciso possível. Os preços intermediários apresentados anteriormente são baseados em dados de transação, porque apenas um dos mercados foi usado na análise. No mercado real, a estratégia deve usar todos os dados possível, especialmente os trades em troca no mercado real, e a previsão do preço médio deve ser verificada pelo preço de transação real.


Mais.

Louis?Não sei o que dizer.

FmzeroQue arrogância!