3
focar em
1444
Seguidores

Uma introdução detalhada às estratégias de moeda digital de alta frequência

Criado em: 2023-03-10 10:09:13, atualizado em: 2024-11-11 22:39:27
comments   13
hits   11533

Uma introdução detalhada às estratégias de moeda digital de alta frequência

[TOC] Em 2020, escrevi um artigo apresentando estratégias de alta frequência, https://www.fmz.com/digest-topic/6228. Embora tenha recebido muita atenção, não foi escrito em profundidade. Mais de dois anos se passaram e o mercado mudou. Depois que esse artigo foi publicado, minha estratégia de alta frequência conseguiu gerar dinheiro de forma constante por um longo tempo, mas os lucros diminuíram gradualmente e até pararam em um ponto. Nos últimos meses, tenho me esforçado muito na reforma e atualmente consigo ganhar algum dinheiro. Este artigo apresentará minhas ideias para estratégias de alta frequência e alguns códigos simplificados em mais detalhes, que podem servir como um ponto de partida para discussão. Todos são bem-vindos para se comunicar e dar feedback.

Condições para negociação de alta frequência

  • Para contas que recebem descontos, tomando a Binance como exemplo, o desconto atual do maker é de 0,5% de 100.000. Se o volume diário de transações for de 100 milhões de U, o desconto será de 5.000 U. É claro que a taxa de aceitação ainda é baseada na taxa VIP, então, se a estratégia não exigir a aceitação de ordens, o nível VIP terá pouco impacto em estratégias de alta frequência. Geralmente, diferentes níveis de trocas têm diferentes taxas de desconto e exigem a manutenção de um volume maior de transações. Há muito tempo, quando o mercado de algumas moedas flutuava muito, ainda havia lucro mesmo sem descontos. Com a intensificação da circulação interna, os descontos representavam uma grande proporção dos lucros e até dependiam inteiramente de descontos. Os traders de alta frequência buscam Melhores tarifas.

  • velocidade. A razão pela qual a estratégia de alta frequência é chamada de alta frequência é porque ela é muito rápida. Aderir ao servidor colo da exchange para obter a menor latência e a conexão mais estável também se tornou uma das condições para a circulação interna. O consumo interno de tempo da estratégia também deve ser o mais baixo possível. Este artigo apresentará o framework websocket que eu uso, que usa execução concorrente.

  • O mercado certo. O trading de alta frequência é conhecido como a joia do trading quantitativo. Acredito que muitos traders programáticos já tentaram, mas a maioria das pessoas provavelmente para porque não ganham dinheiro e não conseguem encontrar uma maneira de melhorar. O principal motivo é provavelmente que eles estão procurando o caminho errado. O mercado de negociação. No estágio inicial de uma estratégia, deve-se procurar mercados relativamente fáceis para ganhar dinheiro negociando, para que haja lucros e feedback sobre melhorias, o que será propício ao avanço da estratégia. Se você começar no mercado mais competitivo e competir com muitos rivais em potencial, você perderá dinheiro, não importa o quanto tente, e não conseguirá mais se manter firme. Recomendo os pares de negociação de contratos perpétuos recém-listados. Neste momento, não há tantos concorrentes, especialmente quando o volume de negociação é relativamente grande. Este é o momento mais fácil para ganhar dinheiro. BTC e ETH têm o maior volume de negociação e as transações mais ativas, mas também são os mais difíceis de sobreviver.

  • Enfrente a concorrência de frente. Qualquer mercado de negociação está mudando dinamicamente. Nenhuma estratégia de negociação pode funcionar de uma vez por todas. Isso é ainda mais óbvio na negociação de alta frequência. Entrar neste mercado significa competir diretamente contra um grupo dos traders mais inteligentes e diligentes. Em um mercado de soma zero, quanto mais você ganha, menos os outros ganham. Quanto mais tarde você entrar, mais difícil será. Aqueles que já estão no mercado também devem continuar melhorando, pois podem ser eliminados a qualquer momento. Três ou quatro anos atrás deveria ter sido a melhor oportunidade. Recentemente, a atividade geral do mercado de moeda digital declinou, e agora é muito difícil para novatos se envolverem em negociações de alta frequência.

Princípio de alta frequência

Existem muitos tipos de estratégias de alta frequência

  • Hedge de alta frequência: encontrar oportunidades de hedge por meio desta bolsa ou de outras bolsas e aproveitar a velocidade para obter ordens primeiro e obter lucros
  • Tendências de alta frequência, lucrar com tendências de curto prazo
  • Os formadores de mercado colocam ordens tanto no lado de compra quanto de venda, controlam suas posições e lucram ganhando comissões.
  • Há muitos outros, que não serão descritos um por um.

Minha estratégia é uma combinação de tendência e formador de mercado. Primeiro determino a tendência, depois coloco uma ordem e imediatamente coloco uma ordem de venda após a transação ser concluída. Não mantenho posições de estoque. O código da estratégia é apresentado abaixo.

Estrutura de estratégia

O código a seguir é baseado na arquitetura básica dos contratos perpétuos da Binance e assina principalmente informações de mercado, posições e fluxos de ordens em profundidade do websocket. Como as informações de mercado e as informações de conta são assinadas separadamente, é necessário usar read(-1) continuamente para determinar se as informações mais recentes são obtidas. EventLoop(1000) é usado aqui para evitar um loop infinito direto e reduzir a carga do sistema. EventLoop(1000) será bloqueado até que wss ou tarefas simultâneas retornem, com um tempo limite de 1000 ms.

var datastream = null
var tickerstream = null
var update_listenKey_time = 0

function ConncetWss(){
    if (Date.now() - update_listenKey_time < 50*60*1000) {
        return
    }
    if(datastream || tickerstream){
        datastream.close()
        tickerstream.close()
    }
    //需要APIKEY
    let req = HttpQuery(Base+'/fapi/v1/listenKey', {method: 'POST',data: ''}, null, 'X-MBX-APIKEY:' + APIKEY) 
    let listenKey = JSON.parse(req).listenKey
    datastream = Dial("wss://fstream.binance.com/ws/" + listenKey + '|reconnect=true', 60)
    //Symbols是设定的交易对
    let trade_symbols_string = Symbols.toLowerCase().split(',')
    let wss_url = "wss://fstream.binance.com/stream?streams="+trade_symbols_string.join(Quote.toLowerCase()+"@aggTrade/")+Quote.toLowerCase()+"@aggTrade/"+trade_symbols_string.join(Quote.toLowerCase()+"@depth20@100ms/")+Quote.toLowerCase()+"@depth20@100ms"
    tickerstream = Dial(wss_url+"|reconnect=true", 60)
    update_listenKey_time = Date.now()
}

function ReadWss(){
    let data = datastream.read(-1)
    let ticker = tickerstream.read(-1)
    while(data){
        data = JSON.parse(data)
        if (data.e == 'ACCOUNT_UPDATE') {
            updateWsPosition(data)
        }
        if (data.e == 'ORDER_TRADE_UPDATE'){
            updateWsOrder(data)
        }        
        data = datastream.read(-1)
    }
    while(ticker){
        ticker = JSON.parse(ticker).data
        if(ticker.e == 'aggTrade'){
            updateWsTrades(ticker)
        }
        if(ticker.e == 'depthUpdate'){
            updateWsDepth(ticker)
        }
        ticker = tickerstream.read(-1)
    }
    makerOrder()
}

function main() {
    while(true){
        ConncetWss()
        ReadWss()
        worker()
        updateStatus()
        EventLoop(1000)
    }
}

Indicadores de estratégia

Como mencionado anteriormente, minha estratégia de alta frequência exige determinar a tendência antes de executar compras e vendas. A tendência de curto prazo é julgada principalmente com base nos dados de transação de cada transação, ou seja, aggTrade na assinatura, que inclui direção da transação, preço, quantidade, tempo da transação, etc. As principais referências para compra e venda são profundidade e volume de negociação. A seguir, uma introdução detalhada aos indicadores que precisam de atenção. A maioria dos indicadores é dividida em dois grupos: comprar e vender, e são contados dinamicamente em uma determinada janela de tempo. A janela de tempo da minha estratégia é de 10 segundos.

  • O volume médio de transações de cada transação. O volume de transações é a coleta de diferentes ordens da mesma direção e preço dentro de 100 ms, o que reflete o tamanho das ordens de compra e venda. Esses dados têm um peso maior. Pode-se supor que se o volume de transações da ordem de compra é maior que o da ordem de venda, então o mercado é orientado pelo comprador.
  • A frequência de pedidos ou intervalo de pedidos também é baseada em dados de transação. O volume médio de transações anterior não considera o conceito de tempo e não é completamente preciso. Se o volume de pedidos em uma direção for pequeno em média, mas a frequência for alta, isso também contribui para A força desta direção. Volume médio*A frequência de pedidos representa o volume total em um intervalo fixo e pode ser usada para comparação direta. Os eventos de chegada de pedidos estão em conformidade com a distribuição de Poisson, que pode ser usada para estimar simplesmente a quantidade total de pedidos que chegam em um intervalo de tempo específico e fornecer uma referência para a localização dos pedidos pendentes.
  • O spread médio do mercado é relativamente fácil de entender, que é o de venda menos o de compra. A maioria dos preços de mercado atuais tem uma diferença de preço de 1 tick. Se a diferença de preço se tornar maior, geralmente significa que uma tendência de mercado surgiu.
  • O preço médio de compra e venda é calculado pela média dos preços de cada transação e pela comparação com o preço mais recente. Se o preço da ordem de compra mais recente for maior que o preço médio da ordem de compra, pode-se determinar preliminarmente que ocorreu um rompimento.

Estratégia Lógica

Determinar tendências de curto prazo

//bull代表短期看涨,bear短期看跌
let bull =  last_sell_price > avg_sell_price && last_buy_price > avg_buy_price &&
            avg_buy_amount / avg_buy_time > avg_sell_amount / avg_sell_time;
let bear =  last_sell_price < avg_sell_price && last_buy_price < avg_buy_price && 
            avg_buy_amount / avg_buy_time < avg_sell_amount / avg_sell_time;

Se o último preço de venda for maior que o preço médio de venda, o último preço de compra for maior que o preço médio de compra e o valor da ordem de compra em intervalo fixo for maior que o valor da ordem de venda, então é considerado otimista de curto prazo. . Pelo contrário, é pessimista.

Preço do pedido

function updatePrice(depth, bid_amount, ask_amount) {

    let buy_price = 0
    let sell_price = 0
    let acc_bid_amount = 0
    let acc_ask_amount = 0

    for (let i = 0; i < Math.min(depth.asks.length, depth.bids.length); i++) {
        acc_bid_amount += parseFloat(depth.bids[i][1])
        acc_ask_amount += parseFloat(depth.asks[i][1])
        if (acc_bid_amount > bid_amount  && buy_price == 0) {
            buy_price = parseFloat(depth.bids[i][0]) + tick_size
        }
        if (acc_ask_amount > ask_amount  && sell_price == 0) {
            sell_price = parseFloat(depth.asks[i][0]) - tick_size
        }
        if (buy_price > 0 && sell_price > 0) {
            break
        }
    }
    return [buy_price, sell_price]
}

Aqui ainda adotamos a ideia antiga e iteramos a profundidade para a quantidade necessária. Aqui assumimos que uma ordem de compra de 10 moedas pode ser executada em 1 segundo. Sem considerar novas ordens pendentes, o preço da ordem de venda é definido para a posição onde o a ordem de compra de 10 moedas será atingida. Você precisa definir o intervalo de tempo específico.

Quantidade do pedido

let buy_amount = Ratio * avg_sell_amount / avg_sell_time
let sell_amount = Ratio * avg_buy_amount / avg_buy_time

Proporção significa Proporção Fixa, o que significa que a quantidade da ordem de compra é uma proporção fixa da quantidade da ordem de venda mais recente. Essa estratégia pode ajustar de forma adaptativa o tamanho do pedido com base na atividade atual de compra e venda.

Condições do pedido

if(bull && (sell_price-buy_price) > N * avg_diff) {
    trade('buy', buy_price, buy_amount)
}else if(position.amount < 0){
    trade('buy', buy_price, -position.amount)
}
if(bear && (sell_price-buy_price) >  N * avg_diff) {
    trade('sell', sell_price, sell_amount)
}else if(position.amount > 0){
    trade('sell', sell_price, position.amount)
}

Entre eles, avg_diff é a diferença do preço médio de mercado. Uma ordem de compra só será colocada quando o spread bid-ask for maior que um certo múltiplo desse valor e a tendência for de alta. Se você mantiver uma ordem curta, a posição também será fechado neste momento para evitar retenção de longo prazo do pedido. Você pode colocar uma ordem only-maker para garantir que a ordem pendente seja executada. E você pode usar o ID de pedido personalizado da Binance, para não precisar esperar o pedido ser devolvido.

Arquitetura concorrente

var tasks = []
var jobs = []

function worker(){
    let new_jobs = []
    for(let i=0; i<tasks.length; i++){
        let task = tasks[i]
        jobs.push(exchange.Go.apply(this, task.param))
    }
    _.each(jobs, function(t){
        let ret = t.wait(-1)
        if(ret === undefined){
            new_jobs.push(t)//未返回的任务下次继续等待
        }
    })
    jobs = new_jobs
    tasks = []
}

/*
需要的任务参数写在param里
tasks.push({'type':'order','param': ["IO", "api", "POST","/fapi/v1/order",
        "symbol="+symbol+Quote+"&side="+side+"&type=LIMIT&timeInForce=GTX&quantity="+
        amount+"&price="+price+"&newClientOrderId=" + UUID() +"&timestamp="+Date.now()]})
*/

Dados de monitoramento

  • Atraso. A importância da velocidade das estratégias de alta frequência foi enfatizada. Vários atrasos devem ser monitorados e registrados na estratégia, como colocação de ordens, cancelamento de ordens, retornos de posição, profundidade, fluxo de ordens, posições, ciclos gerais, etc. Quaisquer atrasos anormais devem ser verificados imediatamente e devem ser encontradas maneiras de encurtar o atraso geral da estratégia.
  • A proporção do volume de negociação, as estatísticas mostram a proporção do volume de negociação no volume total de negociação. Se a proporção for baixa, ainda há espaço para melhoria. Em horários de pico, é possível que as estratégias sejam responsáveis ​​por mais de 10% do volume total de negociações.
  • A taxa de retorno de fechamento, a taxa média estatística de retorno de fechamento, é a referência mais importante para julgar se a estratégia é eficaz.
  • A taxa de comissão é a relação entre comissão e receita total, o que reflete a dependência da estratégia em comissões. A bolsa tem diferentes níveis de desconto, e uma estratégia não lucrativa pode se tornar lucrativa se o desconto for um nível mais alto.
  • A proporção de ordens falhadas. As ordens são apenas colocadas e executadas. Devido ao atraso na colocação de ordens, elas podem não ser colocadas. Se essa proporção for alta, significa que a velocidade da estratégia não é vantajosa.
  • A proporção de ordens que são executadas. A plataforma frequentemente tem requisitos para a taxa de execução. Se for muito baixa, significa que a estratégia cancela ordens com muita frequência e precisa ser resolvida.
  • Distância média entre ordens de compra e venda. Esses dados refletem a distância entre ordens de estratégia e o preço de mercado. Pode-se ver que a maioria delas ainda ocupa as posições de comprar uma e vender uma.

Outras sugestões

  • Negociando várias moedas, a estratégia de alta frequência neste artigo se refere apenas ao mercado de uma única moeda em uma única bolsa, o que tem grandes limitações. Na maioria dos casos e para a maioria das moedas, não é lucrativo, mas também é impossível preveja qual moeda será lucrativa no futuro, para que você possa negociar várias ou até mesmo todas as moedas e não perder nenhuma oportunidade. Mesmo abaixo do limite de frequência da troca, um robô pode negociar vários pares de negociação. Claro, para a melhor velocidade, uma subconta pode negociar um par de negociação, e um servidor corresponde a um robô, mas o custo será muito maior .
  • Determine a quantidade do pedido e as condições do pedido com base na taxa de retorno. Negociar várias moedas resultará em um alto custo de experimentação. Se o monitoramento não for lucrativo, use o volume mínimo de negociação e reduza a frequência de negociação até que a estratégia monitore dinamicamente uma taxa de retorno positiva, então aumente gradualmente o volume de negociação para aumentar os lucros.
  • Obtenha mais informações. Outra característica da negociação de alta frequência é que ela processa maiores quantidades de dados e usa mais informações. Todas as informações de mercado de um único par de negociação em uma única bolsa devem ser referenciadas, e swaps perpétuos também podem se referir a dados spot, bem como dados do par de negociação em outras bolsas, ou mesmo dados de outras moedas. Quanto mais dados, melhor. As vantagens correspondentes também são maiores. Por exemplo, a Binance pode assinar as melhores informações de ordens pendentes por Símbolo. Como o menor push de profundidade e fluxo de ordens é de 100 ms, somente isso é em tempo real, o que é muito valioso para estratégias de alta frequência.
  • O servidor da Binance está na AWS Tokyo, e os servidores de outras exchanges são diferentes. Por favor, consulte a equipe técnica da exchange para mais detalhes.
  • O código de estratégia neste artigo é apenas um código de amostra simplificado, que exclui muitos detalhes tediosos, mas necessários. Os indicadores usados ​​são apenas para referência e não devem ser usados ​​diretamente. Há muitos detalhes aos quais é preciso prestar atenção ao executar uma estratégia de alta frequência, e é preciso paciência para modificá-la e melhorá-la.