Estratégia de alta frequência de moeda digital Introdução detalhada

Autora:Lydia., Criado: 2023-03-27 16:46:14, Atualizado: 2023-09-18 20:12:59

img

Estratégia de alta frequência de moeda digital Introdução detalhada

Escrevi um artigo em 2020 a introduzir estratégias de alta frequência,https://www.fmz.com/bbs-topic/9750. Embora tenha recebido bastante atenção, não foi muito aprofundado. Mais de dois anos se passaram desde então, e o mercado mudou. Depois que esse artigo foi publicado, minha estratégia de alta frequência poderia gerar lucros de forma estável por um longo tempo, mas gradualmente, os lucros diminuíram e até pararam em um ponto. Nos últimos meses, eu gastei algum esforço para renová-lo, e agora ele ainda pode gerar alguns lucros. Neste artigo, fornecerei uma introdução mais detalhada às minhas ideias de estratégia de alta frequência e algum código simplificado como ponto de partida para discussões; e os comentários são bem-vindos.

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

  • As contas de desconto, tomando o Binance como exemplo, têm um desconto do fabricante de 0,0005% atualmente. Se o valor da transação diária for de 100 milhões de U, o desconto será de 5000 U. Claro, as taxas de tomada ainda são baseadas em taxas VIP, então se a estratégia não exigir tomadas, o nível VIP tem pouco impacto nas estratégias de alta frequência. Diferentes níveis de exchanges geralmente têm taxas de desconto diferentes e exigem manter um alto valor de transação. Nos primeiros tempos, quando alguns mercados de moeda flutuavam muito, havia lucros mesmo sem descontos. À medida que a concorrência se intensificava, os descontos representavam uma maior proporção dos lucros ou até mesmo dependiam apenas deles; os comerciantes de alta frequência buscavam taxas de alto nível.

  • Velocidade. A razão pela qual as estratégias de alta frequência são chamadas de alta frequência é porque elas são muito rápidas. Juntar-se ao servidor de cores do exchange, obter a menor latência e a conexão mais estável também se tornou uma das condições para a concorrência interna. O tempo de consumo interno da estratégia deve ser o menor possível, e este artigo apresentará a estrutura de websocket que uso, que adota execução simultânea.

  • Mercado adequado. A negociação de alta frequência é conhecida como a pérola da negociação quantitativa, e muitos comerciantes programáticos a tentaram, mas a maioria das pessoas parou porque não conseguem lucrar e não conseguem encontrar uma direção para melhorar. A principal razão deve ser que eles escolheram o mercado de negociação errado. No estágio inicial do desenvolvimento da estratégia, mercados relativamente fáceis devem ser escolhidos para lucrar na negociação para que haja lucros e feedback para melhoria, o que é propício ao progresso da estratégia. Se você começar a competir no mercado mais competitivo com muitos oponentes potenciais, não importa o quanto você tente, você perderá dinheiro e desistirá logo.

  • Enfrentar a concorrência. O mercado para qualquer transação está mudando constantemente, e nenhuma estratégia de negociação pode durar para sempre, especialmente na negociação de alta frequência. Entrar neste mercado significa competir diretamente com os comerciantes mais inteligentes e mais diligentes. Em um mercado de jogo de soma zero, quanto mais você ganhar, menos os outros ganharão. Quanto mais tarde você entrar, maior a dificuldade; aqueles que já estão no mercado também devem melhorar continuamente.

Princípio de alta frequência

Existem várias estratégias de alta frequência:

  • A cobertura de alta frequência, a procura de oportunidades de cobertura através desta ou de outras bolsas, baseando-se na vantagem da velocidade para obter ordens e obter lucros;
  • Tendência de alta frequência, obtendo lucros julgando tendências de curto prazo;
  • Criador de mercado, colocando ordens tanto no lado de compra como no lado de venda, controlando bem as posições e obtendo lucros através dos descontos;
  • Há muitos outros que não vou mencionar um por um. Minha estratégia é uma combinação de tendência e criador de mercado. Primeiro, julgamos a tendência, depois colocamos uma ordem. Após a transação ser concluída, colocamos uma ordem imediatamente para vender sem manter posições de estoque. Em seguida, eu a introduzirei em conjunto com o código de estratégia.

Quadro estratégico

O código a seguir é baseado na estrutura básica dos contratos perpétuos da Binance, subscrevendo principalmente a profundidade do websocket, dados de mercado de fluxo de ordens de profundidade e informações de posição. Como os dados de mercado e as informações da conta são assinados separadamente, é necessário usar read ((-1) continuamente para determinar se as informações mais recentes foram obtidas.

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()
    }
    //Need 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 are the set trading pairs
    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 da estratégia

Como mencionado anteriormente, minha estratégia de alta frequência requer determinar a tendência antes de executar a compra e venda. A tendência de curto prazo é julgada principalmente com base em dados de transação tick-by-tick, ou seja, o aggTrade na assinatura, que inclui direção da transação, preço, quantidade, tempo de transação, etc. A compra e venda se referem principalmente à profundidade e ao valor da negociação. A seguir estão introduções detalhadas dos indicadores a serem considerados; a maioria deles é dividida em grupos de compra e venda e é contada dinamicamente dentro de uma determinada janela de tempo. A janela de tempo da minha estratégia é dentro de 10 segundos.

  • O valor médio da transação por negociação, por transação comercial é a coleção de ordens diferentes com a mesma direção e preço dentro de 100ms, refletindo o tamanho das ordens de compra e venda.
  • A freqüência de transação ou intervalo de ordens, também é baseada em dados transação por transação, o valor médio da transação mencionado anteriormente não leva em conta o conceito de tempo e não é inteiramente preciso. Se uma ordem em uma direção tem um pequeno valor médio de transação, mas uma alta frequência, ainda contribui para a força dessa direção. O valor médio da transação * freqüência de ordem representa o valor total da transação em intervalos fixos e pode ser usado para comparação direta.
  • O mercado atual geralmente tem um spread de 1 tick. se o spread se torna maior, muitas vezes significa que há uma tendência de mercado.
  • Se o preço da ordem de compra recente for superior ao preço médio da ordem de compra, pode julgar-se preliminarmente que ocorreu um avanço.

Estratégia lógica

Determinação da tendência a curto prazo

//bull represents short-term bullish, bear represents short-term bearish
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 superior ao preço médio de venda, o último preço de compra for superior ao preço médio de compra e o valor da ordem de compra de intervalo fixo for superior ao valor da ordem de venda, então é julgado de alta a curto prazo.

Preço para a colocação de encomendas

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 velha abordagem, iterando até a profundidade necessária. Supondo que 10 moedas possam ser negociadas em 1 segundo, sem considerar novas ordens pendentes, o preço de venda é definido na posição onde 10 moedas são compradas. O tamanho específico da janela de tempo precisa ser definido por você mesmo.

Montante da encomenda

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

A proporção representa uma proporção fixa, o que significa que a quantidade da ordem de compra é uma proporção fixa da quantidade da ordem de venda recente.

Condições de ordem de colocação

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

onde avg_diff é a diferença média de preço de mercado, e uma ordem de compra só será colocada quando o spread bid-ask for maior que um certo múltiplo deste valor e for de alta. Se manter uma posição curta, também fechará a posição para evitar a detenção por um período prolongado. As ordens podem ser colocadas como ordens de um único fabricante para garantir que sejam executadas. Além disso, o ID de ordem personalizado da Binance pode ser usado para que não haja necessidade de esperar pela resposta da ordem.

Estrutura concomitante

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)//Unreturned tasks will continue to wait next time
        }
    })
    jobs = new_jobs
    tasks = []
}

/*
Write the required task parameters in 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 monitorizados

  • A estratégia de alta frequência é uma estratégia de alto desempenho, que inclui a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho, a criação de uma estratégia de alto desempenho
  • Relação de valor da transação, calcule o valor da transação como uma porcentagem do valor total da transação. Se a proporção for baixa, ainda há espaço para crescimento. Nos horários de pico, é possível que a estratégia represente mais de 10% do valor total da negociação.
  • Taxa de lucro das posições de encerramento, o cálculo da taxa média de lucro da posição de encerramento é a referência mais importante para julgar se uma estratégia é eficaz.
  • A taxa de desconto, a proporção de descontos na receita total, reflete o grau de dependência dos descontos pela estratégia.
  • A taxa de falha de ordens de colocação, as ordens só são negociadas através da colocação de uma ordem. Devido ao atraso na colocação de uma ordem, ela pode não ser colocada. Se esta taxa for alta, significa que a velocidade da estratégia não é vantajosa.
  • A proporção de pedidos concluídos, as plataformas muitas vezes têm requisitos para a taxa de transação.
  • Distância média de compra e venda de ordens, que reflete a estratégia de colocação de ordens e a lacuna entre o mercado, podemos ver que a maioria deles ainda ocupam a posição de comprar um e vender um.

Outras sugestões

  • A estratégia de alta frequência neste artigo refere-se apenas a uma única troca, moeda única e mercado único. Ela tem grandes limitações, e a maioria das situações e moedas não podem gerar lucros. No entanto, é impossível prever qual moeda será lucrativa no futuro, então você pode negociar várias ou mesmo todas as moedas sem perder oportunidades. Mesmo sob o limite de frequência das trocas, um robô pode negociar vários pares de negociação.
  • Determine a quantidade de ordem e as condições de ordem com base no rendimento. O comércio com várias moedas resultará em alto custo de tentativas, se o monitoramento não for rentável, use o valor mínimo da transação e reduza a frequência de negociação até que a estratégia monitore dinamicamente uma taxa de retorno positiva, em seguida, aumente o valor da transação para melhorar os retornos gradualmente.
  • Obter mais informações, outra característica da negociação de alta frequência é que ela processa uma quantidade maior de dados e usa mais informações. Todas as informações de mercado para um único par de negociação dentro de uma única bolsa devem ser referenciadas, e os contratos perpétuos também podem se referir aos dados do mercado ao instante, bem como aos dados de outras bolsas para o mesmo par de negociação, ou mesmo dados de outras moedas. Quanto mais dados houver, maior a vantagem correspondente.
  • O servidor da Binance está localizado em Tóquio, outras bolsas de câmbio têm servidores diferentes, você pode consultar a equipe técnica da bolsa para mais detalhes.
  • O código de estratégia neste artigo é apenas um código de exemplo simplificado, com muitos detalhes complicados, mas necessários removidos. Os indicadores usados são apenas para referência e não devem ser usados diretamente.

Relacionados

Mais.