Introdução a estratégias de alta frequência de moedas digitais

Autora:Ervas daninhas, Criado: 2023-03-10 10:09:13, Atualizado: 2023-09-18 20:13:58

img

[TOC] Em 2020, escrevi um artigo sobre estratégias de alta frequência.https://www.fmz.com/digest-topic/6228Apesar de ter recebido muita atenção, não escrevi em profundidade. Mais de dois anos se passaram e o mercado também mudou. Após o lançamento do artigo, minha estratégia de alta frequência ganhou dinheiro estável por um longo tempo, mas os lucros lentamente diminuíram e até mesmo foram interrompidos.

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

  • A taxa de comissão é de 5 por cento das centenas de milhares de euros, se o volume de negociação é de 100 milhões de euros por dia. Claro que o tomador é baseado em taxas VIP, então se a estratégia não precisa ser paga, o nível VIP não tem grande impacto sobre a estratégia de alta frequência. Em geral, diferentes níveis de negociação têm taxas de comissão diferentes e precisam manter taxas de negociação mais altas.

  • Velocidade. A política de alta freqüência é chamada de alta freqüência porque é rápida. A adesão ao servidor colo da bolsa, para obter o menor atraso e a conexão mais estável, também é um dos requisitos do interior. O tempo interno da política também deve ser o menor possível.

  • O mercado adequado. O comércio de alta frequência é conhecido como a pérola do comércio quantitativo. Acredito que muitos comerciantes programados já tentaram, mas a maioria deve parar porque não ganha dinheiro e não consegue encontrar uma direção para melhorar. A principal razão deve ser encontrar o mercado de negociação errado.

  • Enfrentar a concorrência. O mercado de qualquer negociação é dinâmico, não há estratégias de negociação que possam ser de uma vez por todas, o comércio de alta frequência é mais evidente, entrar neste mercado é competir diretamente com um grupo de comerciantes mais inteligentes e mais diligentes. Em um mercado zero e brincalhão, você ganha mais do que os outros ganham menos.

Princípios de alta frequência

A estratégia de alta frequência é dividida em vários tipos

  • Hedging de alta frequência, oportunidade de encontrar uma hedge através desta ou de outras bolsas, aproveitando a velocidade para obter lucros.
  • A tendência de alta frequência, ganhando com o julgamento de tendências de curto prazo
  • Como comerciante, ele faz transações em ambos os lados da compra e venda, controla o estoque e ganha com comissões.
  • E muitas outras, muitas descrições diferentes.

Minha estratégia é uma combinação de tendências e mercado, primeiro julgar a tendência, depois colocar a ordem, vender imediatamente após a transação, sem manter a posição de estoque.

Estrutura estratégica

O código abaixo é baseado em uma estrutura de contratos perpétuos baseada no Bitcoin, que subscreve principalmente o fluxo de transações de ordens de profundidade do websocket, bem como informações de posição. Como as informações de mercado e de conta são assinadas separadamente, é necessário usar o read (-1) para determinar se há acesso a informações atualizadas, onde o EventLoop (1000) é usado, evitando um ciclo morto direto, reduzindo o ônus do sistema.

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 estratégicos

Como mencionado anteriormente, a minha estratégia de alta frequência requer a determinação da tendência e a execução de compras. A determinação da tendência de curto prazo é baseada principalmente nos dados de transação por transação, ou seja, o aggTrade na assinatura, que inclui a direção, o preço, o volume, o tempo de transação, etc. As principais referências de compras são a profundidade e o volume de transações. Os indicadores a serem considerados em detalhes abaixo, a maioria dos indicadores são divididos em dois grupos de compras e vendas e são estatísticas dinâmicas em uma determinada janela de tempo, a janela de tempo da minha estratégia é de menos de 10 segundos.

  • O volume médio de transações por transação, que é o agrupamento de pedidos diferentes em preço e direção dentro de 100 ms, reflete o tamanho dos pedidos de compra e venda. Este peso de dados é alto, podendo-se supor que se o volume de transações de compra for maior do que o de venda, este será um mercado dominado por compradores.
  • A freqüência de encomendas, ou intervalo de encomendas, também baseada em dados de transações individuais, a quantidade média de transações anteriores é independente do conceito de tempo e não é totalmente precisa, se as encomendas de uma direção, embora a média de transações seja pequena, a frequência é alta, contribuindo igualmente para a intensidade dessa direção. A frequência média de transações* representa a quantidade total de transações em intervalos fixos, pode ser usada para comparação direta.
  • O preço médio do diferencial, que é mais fácil de entender, é vender um menos comprar um. A maioria dos preços atuais são de um diferencial de um tick, e se o diferencial for maior, geralmente representa um mercado.
  • O preço médio de compra e venda, calculado como o preço médio de cada compra e venda, e comparado com o preço mais recente. Por exemplo, um preço de compra recente maior que o preço médio de compra, pode ser julgado preliminarmente como um rompimento.

Lógica estratégica

Determinação de 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 preço de venda mais recente for maior que o preço médio da encomenda, o preço de compra mais recente for maior que o preço médio da encomenda e o valor da encomenda de intervalo fixo for maior do que o valor da encomenda, então julgue se é positivo no curto prazo.

Preço abaixo

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 assim, tomando o pensamento antigo, a profundidade de repetição para a quantidade necessária, aqui, assumindo que o pagamento de 10 reais pode ser feito dentro de 1s, sem considerar o novo pedido, o preço do pedido de venda é definido como o local onde o pedido de 10 reais é atingido.

Quantidade de encomendas

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

Ratio representa uma proporção fixa, representando o volume de compra como uma proporção fixa do número de pedidos vendidos recentemente. Esta estratégia pode se adaptar para ajustar o tamanho do pedido de acordo com a atividade atual de compra e venda.

Condições

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

A diferença é a diferença do preço médio de transação, e só é paga quando o preço da compra e venda é maior do que um certo múltiplo deste valor e quando o preço é bom. Se houver um pedido vazio, também será estabilizado, evitando o recibo de longo prazo. O pedido pode ser feito apenas por um fabricante, garantindo a transação do pedido.

Arquitetura de concomitância

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()]})
*/

Os dados monitorados

  • A importância da velocidade da estratégia de alta freqüência para o atraso foi enfatizada, e a estratégia deve monitorar e registrar vários atrasos, como descontos, retrações, retornos de posições, profundidade, fluxo de pedidos, posições, ciclo geral, etc. Os atrasos anormais devem ser listados em tempo útil e procurar maneiras de reduzir o atraso da estratégia geral.
  • A proporção de transações, a proporção de transações em estatísticas, a proporção de transações no total das transações, se a proporção for baixa, há espaço para subir. No momento do pico, a proporção estratégica pode atingir mais de 10% do total das transações.
  • O rendimento do equilíbrio, a média estatística do rendimento do equilíbrio, é a referência mais importante para determinar se a estratégia é eficaz.
  • A proporção de remuneração, a proporção estatística de remuneração no total dos ganhos, reflete o grau de dependência da estratégia da remuneração. Negociar todos os diferentes níveis de remuneração, estratégias não lucrativas podem ser lucrativas com uma remuneração um nível mais alta.
  • A taxa de falha de encomendas é a taxa de falhas de encomendas que são apenas transações penduradas, e pode não ser possível pendurá-las devido ao atraso da encomenda. Se essa taxa for alta, a velocidade da estratégia não é boa.
  • A proporção de pedidos realizados, as plataformas costumam ter requisitos para a taxa de transação, se for muito baixa, indica que a estratégia de retirada é muito frequente e precisa ser resolvida.
  • A distância média entre os pedidos de compra e venda, que reflete o intervalo entre a estratégia de encomenda e a liquidação, mostra que a maioria ainda ocupa a posição de compra e venda.

Outras sugestões

  • A estratégia de alta freqüência deste artigo pertence ao mercado de monopólio de monopólio de uma única bolsa de câmbio. A limitação é grande, a maioria das situações e a maioria das moedas não são lucrativas, mas também não é possível prever qual moeda será lucrativa no futuro, então é possível negociar várias ou até todas as moedas, não perca a oportunidade. Mesmo com a restrição de frequência da bolsa, um robô também pode negociar vários pares de transações, é claro, para a velocidade ideal, uma subconta pode negociar uma transação, um servidor para um robô, mas isso custará muito.
  • A quantidade e as condições de compra são determinadas com base no rendimento. Negociar em várias moedas pode resultar em custos excessivos de tentativa. Se a monitorização não for lucrativa, use o menor volume de negociação e reduza a frequência de negociação até que a estratégia de monitorização dinâmica seja positiva e, em seguida, aumente gradualmente o volume de negociação para aumentar o rendimento.
  • Para obter mais informações, a negociação de alta frequência é caracterizada por um maior volume de dados processados e mais informações usadas. Todas as informações de mercado de um único par de transações de um único mercado devem ser referenciadas, e também podem ser referenciadas permanentemente para dados em tempo real, ou para dados de outras trocas de transações, ou mesmo para dados de outras moedas. Quanto mais dados, maiores as vantagens correspondentes.
  • Os servidores do Binance estão localizados em Tokyo, e os servidores de outras bolsas variam, e você pode consultar o técnico da bolsa.
  • O código da estratégia neste artigo é apenas um exemplo de código simplificado, eliminando muitos detalhes onerosos, mas que tiveram que ser considerados, e os indicadores usados são apenas para referência, não para uso direto. A verdadeira execução de uma estratégia de alta frequência requer muita atenção em detalhes que precisam ser modificados pacientemente e perfeitamente.

Relacionados

Mais.

mztcoinDeus da Erva

DANGOUO deus das ervas

77924998Qual é o servidor AWS usado pela Grasshopper?

XukittyO que é o que você quer?

BvxiaokO Grasshopper é um programa de alta frequência pago.

Eu ainda tenho o coração.A estratégia de fazer cópias é útil?

Escrito por TradeManA primeira coisa que eu faço é chamar o Grasshopper, para que ele possa ensinar mais e aprender a entrar em negociações de alta frequência.

♪ Uma onda no sopro do vento ♪O que é que ele faz?

FmzeroO deus da grama é arrogante!

Quantificação de óculosO que é que ele faz?

Ervas daninhasÉ muito difícil, não faz muito sentido.