O artigo explora estratégias de negociação de alta frequência de moedas digitais, incluindo fontes de lucro (principalmente provenientes de fortes flutuações do mercado e comissões de transação de bolsa), posições pendentes e controle de posições, e métodos para modelar a transação com a distribuição de Pareto. Além disso, cita o reexame de transações individuais e dados de ordens pendentes de preferência fornecidos pela Binance, e planeja discutir em profundidade outras questões sobre estratégias de negociação de alta frequência em artigos posteriores.
Anteriormente, escrevi dois artigos sobre transações de alta frequência em moedas digitais.Introdução a estratégias de alta frequência de moedas digitais, 5 antenas 80 vezes mais poderosas do que a estratégia de alta frequênciaMas só pode ser considerado como um compartilhamento de experiências, para falar em geral. Desta vez, eu planejo escrever uma série de artigos, apresentando a idéia de negociação de alta frequência desde o início, espero ser o mais breve possível, mas devido ao meu nível limitado, a compreensão da negociação de alta frequência não é profunda, este artigo é apenas um jogo de guias, espero que o grande deus esteja certo.
No artigo anterior, foi mencionado que a estratégia de alta frequência é especialmente adequada para os mercados onde as flutuações são muito intensas. Examine a variação de preços de uma variedade de negociação em um curto período de tempo, composta por tendências e turbulências totais. Claro que é possível ganhar dinheiro se pudermos prever com precisão as mudanças de tendência, mas também é o mais difícil. Este artigo trata principalmente da estratégia de alta frequência do maker, e não abordará esse problema.
1.策略同时挂买单和卖单,第一个问题就是在哪里挂单。挂的离盘口越近,成交的概率越高,但在剧烈波动的行情中,瞬间成交的价格可能离盘口较远,挂的那太近没有能吃到足够的利润。挂的太远的单子成交概率又低。这是一个需要优化的问题。
2.控制仓位。为了控制风险,策略就不能长时间累计过多的仓位。可以通过控制挂单距离、挂单量、总仓位限制等办法解决。
Para atingir os objetivos acima, é necessário fazer estimativas de modelagem de vários aspectos, como probabilidade de probabilidade de transação, lucro de transação, estimativa de mercado, muitos artigos e artigos sobre esse assunto, com palavras-chave como High-Frequency Trading, Orderbook e outros. Há muitas recomendações online, não aqui.
A Binance fornece dados de transações por centavo e os melhores pedidos pendentes.DescarregarOs dados de profundidade precisam ser baixados em uma lista branca com uma API, mas também podem ser coletados por si mesmos. Os dados de transações podem ser usados para reanalisar o uso de agregados.
from datetime import date,datetime
import time
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
As transações por conta incluem:
O CSV será adicionado à área de comentários. O CSV será adicionado à área de comentários.
trades = pd.read_csv('COMPUSDT-aggTrades-2023-07-02.csv')
trades
664475 linhas × 7 colunas
agg_trade_id | Preço | Quantidade | primeiro_trade_id | último_trade_id | transact_time (tempo da transacção) | é_comprador_fabricante |
---|---|---|---|---|---|---|
120719552 | 52.42 | 22.087 | 207862988 | 207862990 | 1688256004603 | Falso |
120719553 | 52.41 | 29.314 | 207862991 | 207863002 | 1688256004623 | É verdade. |
120719554 | 52.42 | 0.945 | 207863003 | 207863003 | 1688256004678 | Falso |
120719555 | 52.41 | 13.534 | 207863004 | 207863006 | 1688256004680 | É verdade. |
… | … | … | … | … | … | … |
121384024 | 68.29 | 10.065 | 210364899 | 210364905 | 1688342399863 | Falso |
121384025 | 68.30 | 7.078 | 210364906 | 210364908 | 1688342399948 | Falso |
121384026 | 68.29 | 7.622 | 210364909 | 210364911 | 1688342399979 | É verdade. |
Primeiro, os dados são processados, dividindo os trades primários em grupos de transação ativa de pagamento e grupos de transação ativa de encomendas. Além disso, os dados de transações primárias agrupadas são um dado no mesmo momento e no mesmo preço e na mesma direção. Pode ocorrer um volume de compra ativa de 100, se divididos em vários negócios e com preços diferentes, como dividir 60 e 40 em dois, produzirão dois dados, afetando a estimativa do volume de compra.
trades['date'] = pd.to_datetime(trades['transact_time'], unit='ms')
trades.index = trades['date']
buy_trades = trades[trades['is_buyer_maker']==False].copy()
sell_trades = trades[trades['is_buyer_maker']==True].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'
})
sell_trades = sell_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()
sell_trades['interval']=sell_trades['transact_time'] - sell_trades['transact_time'].shift()
print(trades.shape[0] - (buy_trades.shape[0]+sell_trades.shape[0]))
146181
Para o exemplo de pagamentos, primeiro desenhe um gráfico retangular, e você pode ver que o efeito de cauda longa é muito evidente, com a maior parte dos dados concentrados no ponto mais à esquerda, mas também há uma pequena quantidade de grandes transações distribuídas no final.
buy_trades['quantity'].plot.hist(bins=200,figsize=(10, 5));
为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。
buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));
A distribuição satisfatória de transações é muito estudada. A distribuição satisfatória de transações, também conhecida como distribuição de poder, é uma forma de distribuição de probabilidade comum na física estatística e nas ciências sociais. Na distribuição de transações, a probabilidade de um evento é proporcional a um índice negativo do tamanho do evento. A principal característica desta distribuição é que os grandes eventos (ou seja, os eventos que estão longe da média) têm uma frequência maior do que a esperada em muitas outras distribuições.
O gráfico abaixo mostra a probabilidade de uma transação ser maior do que um determinado valor, a linha azul é a probabilidade real, a linha de arco é a probabilidade simulada. Aqui, sem confusão de parâmetros específicos, pode-se ver que a aparência realmente satisfaz o parâmetro de Pareto. Como a probabilidade de um volume de pedidos maior que 0 é 1, e para satisfazer a padronização, a forma da equação de distribuição deve ser a seguinte:
N é um parâmetro padronizado. Aqui, a média de transações M é escolhida, e o alfa é escolhido 2.06. A estimativa do alfa específico pode ser calculada através do valor P quando D = N. Especificamente: alfa = log ((P ((d>M)) /log ((2)).
depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
alpha = np.log(np.mean(buy_trades['quantity'] > mean_quantity))/np.log(2)
mean_quantity = buy_trades['quantity'].mean()
probabilities_s = np.array([(1+depth/mean_quantity)**alpha for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
Mas essa estimativa só parece que, no diagrama acima, nós desenhamos o diferencial entre o valor simulado e o valor real. O desvio é muito grande, até mesmo perto de 10%, quando o trânsito é menor. Pode-se escolher um ponto diferente para tornar a probabilidade deste ponto mais precisa ao estimar os parâmetros, mas também não resolve o problema do desvio.
Para simplificar, o volume de transações padronizado é representado por r = q/M. Os parâmetros podem ser estimados da mesma forma. O gráfico abaixo mostra que o desvio máximo após a correção não é superior a 2%, o que pode teoricamente ser continuado, mas essa precisão é suficiente.
depths = range(0, 250, 2)
probabilities = np.array([np.mean(buy_trades['quantity'] > depth) for depth in depths])
mean = buy_trades['quantity'].mean()
alpha = np.log(np.mean(buy_trades['quantity'] > mean))/np.log(2.05)
probabilities_s = np.array([(((1+20**(-depth/mean))*depth+mean)/mean)**alpha for depth in depths])
plt.figure(figsize=(10, 5))
plt.plot(depths, probabilities)
plt.plot(depths, probabilities_s)
plt.xlabel('Depth')
plt.ylabel('Probability of execution')
plt.title('Execution probability at different depths')
plt.grid(True)
plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);
Com a equação de estimativa da distribuição de volume de negócios, a probabilidade da equação não é uma probabilidade real, mas uma probabilidade condicional. Neste momento, pode-se responder a pergunta: qual é a probabilidade de que essa ordem seja maior do que um determinado valor se o próximo pedido ocorrer?
O artigo está quase terminado, mas há muitas perguntas que precisam ser respondidas, e a série de artigos abaixo tentará dar respostas.
Quantificação de óculos 🐂🍺
FmzeroQue arrogância!
Ervas daninhasO csv é muito grande para ser baixado sozinho.