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.).
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);
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);
(books['spread'][::10]/tick_size).rolling(10000).mean().plot(figsize=(10,5),grid=True);
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
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.Q_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:
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.
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)
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)
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:
Neste momento:
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 ─.
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:
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)
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)
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)
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.
Louis?Não sei o que dizer.
FmzeroQue arrogância!