3
Seguir
1444
Seguidores

Una introducción detallada a las estrategias de monedas digitales de alta frecuencia

Creado el: 2023-03-10 10:09:13, Actualizado el: 2024-11-11 22:39:27
comments   13
hits   11539

Una introducción detallada a las estrategias de monedas digitales de alta frecuencia

[TOC] Escribí un artículo en 2020 presentando estrategias de alta frecuencia, https://www.fmz.com/digest-topic/6228. Aunque recibió mucha atención, no fue escrito en profundidad. Han pasado más de dos años y el mercado ha cambiado. Después de publicar ese artículo, mi estrategia de alta frecuencia logró generar dinero de manera constante durante mucho tiempo, pero las ganancias disminuyeron gradualmente e incluso se detuvieron en un momento. En los últimos meses he dedicado mucho esfuerzo a la renovación y actualmente estoy consiguiendo ganar algo de dinero. En este artículo, presentaré mis ideas sobre estrategias de alta frecuencia y algunos códigos simplificados con más detalle, que pueden servir como punto de partida para el debate. Todos son bienvenidos a comunicarse y brindar comentarios.

Condiciones para el trading de alta frecuencia

  • Para las cuentas que reciben reembolsos, tomando a Binance como ejemplo, el reembolso actual para creadores es del 0,5 % de 100 000. Si el volumen de transacciones diarias es de 100 millones de U, el reembolso será de 5000 U. Por supuesto, la tarifa del tomador todavía se basa en la tarifa VIP, por lo que si la estrategia no requiere tomar órdenes, el nivel VIP tendrá poco impacto en las estrategias de alta frecuencia. Generalmente, los diferentes niveles de intercambio tienen diferentes tasas de reembolso y requieren mantener un mayor volumen de transacciones. Hace mucho tiempo, cuando el mercado de algunas divisas fluctuaba mucho, aún había ganancias incluso sin descuentos. Con la intensificación de la circulación interna, los descuentos representaron una gran proporción de los beneficios, e incluso dependían completamente de los descuentos. Los traders de alta frecuencia buscan Las mejores tarifas.

  • velocidad. La razón por la que la estrategia de alta frecuencia se llama alta frecuencia es porque es muy rápida. Unirse al servidor colo del exchange para obtener la latencia más baja y la conexión más estable también se ha convertido en una de las condiciones para la circulación interna. El consumo de tiempo interno de la estrategia también debe ser lo más bajo posible. En este artículo, presentaré el marco de trabajo de WebSocket que utilizo, que utiliza ejecución concurrente.

  • El mercado adecuado. El trading de alta frecuencia se conoce como la joya del trading cuantitativo. Creo que muchos traders programáticos lo han probado, pero la mayoría de la gente probablemente deja de hacerlo porque no gana dinero y no encuentra una forma de mejorar. La razón principal es probablemente que están buscando el camino equivocado. El mercado comercial. En la etapa inicial de una estrategia, uno debe buscar mercados en los que sea relativamente fácil ganar dinero operando, de modo que haya ganancias y retroalimentación sobre las mejoras, lo que favorecerá el avance de la estrategia. Si empiezas en el mercado más competitivo y compites con muchos rivales potenciales, perderás dinero por mucho que lo intentes y no podrás aguantar más. Recomiendo los nuevos pares de negociación con contratos perpetuos que se han incluido en la lista. En este momento, no hay tantos competidores, especialmente cuando el volumen de negociación es relativamente grande. Este es el momento más fácil para ganar dinero. BTC y ETH tienen el mayor volumen comercial y las transacciones más activas, pero también son las más difíciles de sobrevivir.

  • Enfrentar la competencia directamente. Cualquier mercado de trading cambia de forma dinámica. Ninguna estrategia de trading puede funcionar de una vez por todas. Esto es aún más evidente en el trading de alta frecuencia. Entrar en este mercado significa competir directamente contra un grupo de los traders más inteligentes y diligentes. En un mercado de suma cero, cuanto más ganas, menos ganan los demás. Cuanto más tarde entres, más difícil será. Los que ya están en el mercado también deben seguir mejorando, ya que pueden ser eliminados en cualquier momento. Hace tres o cuatro años debería haber sido la mejor oportunidad. Recientemente, la actividad general del mercado de divisas digitales ha disminuido y ahora es muy difícil para los novatos participar en operaciones de alta frecuencia.

Principio de alta frecuencia

Existen muchos tipos de estrategias de alta frecuencia.

  • Cobertura de alta frecuencia: encontrar oportunidades de cobertura a través de este intercambio u otros intercambios, y aprovechar la velocidad para captar órdenes primero y obtener ganancias.
  • Tendencias de alta frecuencia, benefíciese de las tendencias a corto plazo
  • Los creadores de mercado colocan órdenes tanto en el lado de compra como de venta, controlan sus posiciones y obtienen ganancias al ganar comisiones.
  • Hay muchos otros, que no se describen uno por uno.

Mi estrategia es una combinación de estrategia de tendencia y de creación de mercado. Primero determino la tendencia, luego coloco una orden y, de inmediato, coloco una orden de venta después de que se complete la transacción. No mantengo posiciones de inventario. El código de la estrategia se presenta a continuación.

Marco de estrategia

El siguiente código se basa en la arquitectura básica de los contratos perpetuos de Binance y se suscribe principalmente a la información del mercado y a la información de posición de las transacciones de flujo de órdenes de profundidad websocket. Dado que la información del mercado y la información de la cuenta se suscriben por separado, es necesario utilizar read(-1) continuamente para determinar si se obtiene la información más reciente. EventLoop(1000) se utiliza aquí para evitar un bucle infinito directo y reducir la carga del sistema. EventLoop(1000) se bloqueará hasta que wss o las tareas simultáneas regresen, con un tiempo de espera 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 estrategia

Como se mencionó anteriormente, mi estrategia de alta frecuencia requiere determinar la tendencia antes de ejecutar compras y ventas. La tendencia a corto plazo se juzga principalmente en función de los datos de transacción de cada transacción, es decir, aggTrade en la suscripción, que incluye la dirección de la transacción, el precio, la cantidad, el tiempo de la transacción, etc. Las principales referencias para comprar y vender son la profundidad y el volumen de negociación. A continuación se presenta una introducción detallada de los indicadores que requieren atención. La mayoría de los indicadores se dividen en dos grupos: compra y venta, y se cuentan de forma dinámica en una determinada ventana de tiempo. La ventana de tiempo de mi estrategia es de 10 segundos.

  • El volumen de transacción promedio de cada transacción. El volumen de transacción es la recopilación de diferentes órdenes de la misma dirección y precio en 100 ms, lo que refleja el tamaño de las órdenes de compra y venta. Este dato tiene un mayor peso. Se puede suponer que si el volumen de transacción de la orden de compra es mayor que el de la orden de venta, entonces el mercado está impulsado por el comprador.
  • La frecuencia de pedidos o el intervalo de pedidos también se basan en los datos de transacciones. El volumen de transacciones promedio anterior no considera el concepto de tiempo y no es completamente preciso. Si el volumen de pedidos en una dirección es pequeño en promedio pero la frecuencia es alta, también contribuye A la fuerza de esta dirección. Volumen medio*La frecuencia de pedido representa el volumen total en un intervalo fijo y puede utilizarse para una comparación directa. Los eventos de llegada de pedidos se ajustan a la distribución de Poisson, que puede utilizarse para estimar de forma sencilla la cantidad total de pedidos que llegan en un intervalo de tiempo específico y proporcionar una referencia para la ubicación de los pedidos pendientes.
  • El spread promedio del mercado es relativamente fácil de entender: es el de venta menos el de compra. La mayoría de los precios actuales del mercado tienen una diferencia de precio de 1 tick. Si la diferencia de precio se hace mayor, suele significar que ha surgido una tendencia en el mercado.
  • El precio promedio de compra y venta se calcula promediando los precios de cada transacción y comparándolo con el último precio. Si el precio de la orden de compra más reciente es mayor que el precio promedio de la orden de compra, se puede determinar de manera preliminar que se ha producido un avance.

Lógica de estrategia

Determinar tendencias a corto plazo

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

Si el último precio de venta es mayor que el precio de venta promedio, el último precio de compra es mayor que el precio de compra promedio y el valor de la orden de compra de intervalo fijo es mayor que el valor de la orden de venta, entonces se considera que es alcista a corto plazo. . Por el contrario, es bajista.

Precio del 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]
}

Aquí seguimos adoptando la vieja idea e iteramos la profundidad hasta la cantidad requerida. Aquí asumimos que una orden de compra de 10 monedas se puede ejecutar en 1 segundo. Sin considerar nuevas órdenes pendientes, el precio de la orden de venta se establece en la posición donde la Se realizará una orden de compra de 10 monedas. Debes configurar tú mismo el tamaño de la ventana de tiempo específica.

Cantidad de pedido

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

Ratio significa relación fija, lo que significa que la cantidad de la orden de compra es una relación fija de la cantidad de la orden de venta más reciente. Esta estrategia puede ajustar de forma adaptativa el tamaño del pedido en función de la actividad de compra y venta actual.

Condiciones del 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 ellos, avg_diff es la diferencia del precio medio del mercado. Solo se colocará una orden de compra cuando el diferencial entre oferta y demanda sea mayor que un determinado múltiplo de este valor y la tendencia sea alcista. Si mantiene una orden corta, la posición También estará cerrado en este momento para evitar la retención prolongada del pedido. Puede colocar una orden de solo creador para garantizar que se ejecute la orden pendiente. Además, puedes utilizar el ID de orden personalizado de Binance, por lo que no tendrás que esperar a que se devuelva la orden.

Arquitectura concurrente

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

Datos de seguimiento

  • Retraso. Se ha hecho hincapié en la importancia de la velocidad de las estrategias de alta frecuencia. Se deben controlar y registrar diversos retrasos en la estrategia, como la colocación de órdenes, la cancelación de órdenes, la devolución de posiciones, la profundidad, el flujo de órdenes, las posiciones, los ciclos generales, etc. Cualquier retraso anormal debe verificarse rápidamente y deben encontrarse formas de acortar el retraso de la estrategia general.
  • La proporción del volumen de operaciones, las estadísticas muestran la proporción del volumen de operaciones en el volumen total de operaciones. Si la proporción es baja, todavía hay margen de mejora. En las horas pico, es posible que las estrategias representen más del 10% del volumen comercial total.
  • La tasa de rendimiento de cierre, la tasa de rendimiento de cierre promedio estadística, es la referencia más importante para juzgar si la estrategia es efectiva.
  • La relación de comisión es la relación entre la comisión y los ingresos totales, que refleja la dependencia de la estrategia de las comisiones. El intercambio tiene diferentes niveles de reembolso, y una estrategia no rentable puede volverse rentable si el reembolso es un nivel superior.
  • La proporción de órdenes fallidas. Las órdenes solo se colocan y se ejecutan. Debido a la demora en la colocación de las órdenes, es posible que no se coloquen. Si esta proporción es alta, significa que la velocidad de la estrategia no es ventajosa.
  • La proporción de órdenes que se ejecutan. La plataforma suele tener requisitos para la tasa de ejecución. Si es demasiado baja, significa que la estrategia cancela órdenes con demasiada frecuencia y es necesario resolverla.
  • Distancia media entre órdenes de compra y de venta. Este dato refleja la distancia entre las órdenes de estrategia y el precio de mercado. Se puede observar que la mayoría de ellas todavía ocupan posiciones de compra y venta.

Otras sugerencias

  • En el trading con múltiples divisas, la estrategia de alta frecuencia de este artículo solo se refiere al mercado de una única bolsa, una única divisa y un único mercado. Tiene grandes limitaciones y no es rentable en la mayoría de los casos y para la mayoría de las divisas. Sin embargo, es Es imposible predecir qué moneda será rentable en el futuro, por lo que puede operar con varias o incluso todas las monedas y no perder ninguna oportunidad. Incluso con el límite de frecuencia de la bolsa, un robot puede operar con varios pares de divisas. Por supuesto, para lograr la mejor velocidad, una subcuenta puede operar con un par de divisas y un servidor corresponde a un robot, pero el costo será mucho mayor. .
  • Determinar la cantidad y las condiciones del pedido en función de la tasa de devolución. Operar con múltiples divisas implicará un alto costo de experimentación. Si el monitoreo no es rentable, utilice el volumen de operaciones mínimo y reduzca la frecuencia de las operaciones hasta que la estrategia monitoree dinámicamente una tasa de retorno positiva; luego, aumente gradualmente el volumen de operaciones para aumentar las ganancias.
  • Obtenga más información. Otra característica del trading de alta frecuencia es que procesa mayores cantidades de datos y utiliza más información. Se debe hacer referencia a toda la información de mercado de un único par de divisas en una única bolsa, y los swaps perpetuos también pueden hacer referencia a datos al contado, así como a datos del par de divisas en otras bolsas, o incluso a datos de otras monedas. Cuantos más datos, Mejor. Las ventajas correspondientes también son mayores. Por ejemplo, Binance puede suscribirse a la mejor información de órdenes pendientes por símbolo. Dado que el impulso más corto de profundidad y flujo de órdenes es de 100 ms, solo esto es en tiempo real, lo que es muy valioso para las estrategias de alta frecuencia.
  • El servidor de Binance se encuentra en AWS Tokyo y los servidores de otros exchanges son diferentes. Consulta con el personal técnico del exchange para obtener más detalles.
  • El código de estrategia de este artículo es solo un código de muestra simplificado, que elimina muchos detalles tediosos pero necesarios. Los indicadores utilizados son solo de referencia y no deben usarse directamente. Hay muchos detalles a los que hay que prestar atención cuando se ejecuta una estrategia de alta frecuencia, y se requiere paciencia para modificarla y mejorarla.