Reflexões sobre estratégias de negociação de alta frequência (1)

Autora:Ervas daninhas, Criado: 2023-08-03 16:14:16, Atualizado: 2023-12-08 16:37:21

img

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.

Fonte de ganhos de alta frequência

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.

Problemas a serem resolvidos

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.

Dados necessários

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:

  1. agg_trade_id: o id da transação,
  2. preço: preço da transação
  3. quantity: quantidade de transações
  4. first_trade_id: a transação agregada pode ter várias transações simultâneas, apenas uma estatística, que é a id da primeira transação
  5. last_trade_id: id da última transação
  6. transact_time: tempo de conclusão da transação
  7. is_buyer_maker: direção da transação, True representa a transação do comprador, a venda é o tomador

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.

Modelagem de transações individuais

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));

png

为了观察方便,截掉尾部观察.可以看到成交量越大,出现频率越低,且减少的趋势更快。

buy_trades['quantity'][buy_trades['quantity']<200].plot.hist(bins=200,figsize=(10, 5));

png

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:

png

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)

img

plt.figure(figsize=(10, 5))
plt.grid(True)
plt.title('Diff')
plt.plot(depths, probabilities_s-probabilities);

png

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.

png

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);

png

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.


Mais.

Quantificação de óculos 🐂🍺

FmzeroQue arrogância!

Ervas daninhasO csv é muito grande para ser baixado sozinho.