Die Ressourcen sind geladen. Beförderung...

Einführung in die High-Frequency-Strategie von Kryptowährungen

Schriftsteller:Das Gras, Erstellt: 2023-03-10 10:09:13, Aktualisiert: 2024-11-11 22:39:27

img

[TOC] Ich habe 2020 einen Artikel über die Hochfrequenzstrategie geschrieben.https://www.fmz.com/digest-topic/6228Auch wenn ich viel Aufmerksamkeit erhielt, war ich nicht sehr tiefgreifend. Es sind noch mehr als zwei Jahre vergangen, und der Markt hat sich geändert. Nach der Veröffentlichung des Artikels konnte ich lange Zeit mit meiner High-Frequency-Strategie stabil Geld verdienen, aber die langsam abnehmenden Gewinne fielen allmählich ab und wurden sogar einmal eingestellt. In den letzten Monaten habe ich mich wieder umgestaltet und kann jetzt noch etwas Geld verdienen.

Bedingungen für Hochfrequenz-Trading

  • Die Kommissionsquote ist bei 100 Mio. U pro Tag bei 5000 U höher als bei 100 Mio. U pro Tag. Natürlich ist der Taker immer noch auf VIP-Rate basiert, also wenn die Strategie nicht bezahlt werden muss, hat die VIP-Rate keinen großen Einfluss auf die High-Frequency-Strategie. Im Allgemeinen müssen an verschiedenen Börsen verschiedene Raten unterschiedliche Kommissionsraten aufrechterhalten werden, die eine hohe Transaktionsrate erfordern.

  • Geschwindigkeit. Die Hochfrequenzpolitik wird auch als Hochfrequenzpolitik bezeichnet, weil sie sehr schnell ist. Der Beitritt zum Colo-Server der Börse, der die geringste Verzögerung und die stabilste Verbindung ermöglicht, ist auch eine Bedingung für die Involver. Die interne Verzögerung der Politik sollte so gering wie möglich sein.

  • Der richtige Markt. Hochfrequenzhandel wird als Perle des quantitativen Handels bezeichnet. Ich glaube, dass viele programmatisierte Händler versucht haben, aber die meisten sollten aufhören, weil sie kein Geld verdienen und keine Richtung zur Verbesserung finden. Der Hauptgrund sollte sein, dass sie den falschen Markt gefunden haben.

  • Im Wettbewerb stehen. Jeder Markt ist dynamisch veränderlich, keine Handelsstrategie kann ein für alle Mal sein. Hochfrequenz-Handel ist viel deutlicher, wenn man in diesen Markt eintritt, ist man direkt mit einer Gruppe der klügsten und fleißigsten Trader im Wettbewerb. In einem Markt mit null Spielern ist man weniger als alle anderen. Je später man eintritt, desto schwieriger ist es.

Hochfrequenzprinzip

Hochfrequenz-Strategien werden in verschiedene Arten eingeteilt.

  • Hochfrequenz-Hedging, Gelegenheit, sich über diese oder andere Börsen zu hüten, um mit dem Vorteil der Geschwindigkeit einen Gewinn zu erzielen
  • Hochfrequenztrends profitieren durch Urteile über kurzfristige Trends
  • Als Händler verkauft man auf beiden Seiten, kontrolliert die Lagerhaltung und profitiert durch Kommissionsgewinn.
  • Es gibt viele andere, nicht alle beschrieben.

Meine Strategie ist eine Kombination von Trend und Markt, vorher die Tendenz zu bestimmen, dann die Bestellung zu hängen, sofort nach der Transaktion zu hängen und zu verkaufen, ohne Lagerbestände zu halten.

Strategische Strukturen

Die folgende Code-Architektur basiert auf der Basis von Binance Perpetual Contracts und unterzeichnet hauptsächlich Websocket-Depth-Depth-Order-Flow-Trades-Märkte und Positionspositionsinformationen. Da Markt- und Kontoinformationen getrennt abonniert sind, muss immer wieder mit Read (−1) beurteilt werden, ob aktuelle Informationen eingeholt werden. Hier wird mit EventLoop (−1000) vermieden, der einen direkten Todeszyklus verhindert und die Systembelastung reduziert. EventLoop (−1000) wird blockiert, wenn es WSSs oder gleichzeitige Aufgaben gibt, die über 1000 ms zurückkehren.

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

Strategische Indikatoren

Wie ich bereits erwähnt habe, erfordert meine Hochfrequenzstrategie, dass ich den Trend vorher bestimme und dann den Kauf ausführe. Die Beurteilung des kurzfristigen Trends basiert hauptsächlich auf den Transaktionsdaten pro Stück, d.h. dem AggTrade im Abonnement, der Transaktionsrichtung, Preis, Menge, Transaktionszeit usw. beinhaltet.

  • Durchschnittliche Transaktionsmenge pro Transaktion, die Summe von Aufträgen in der gleichen Richtung und unterschiedlichen Preisen innerhalb von 100 ms ist, spiegelt die Größe der Kauf- und Verkaufsbestellungen wider. Diese Daten haben ein hohes Gewicht.
  • Die Orderfrequenz oder der Auftragsintervall, ebenfalls auf Basis von Transaktionsdaten pro Stück, ist die vorhergehende durchschnittliche Transaktionsmenge unabhängig vom Konzept der Zeit und nicht vollständig genau, wenn die Aufträge in einer Richtung zwar eine geringe Durchschnittstransaktionsmenge haben, aber eine hohe Frequenz haben, die ebenfalls zur Stärke dieser Richtung beiträgt. Die durchschnittliche Transaktionsmenge* Die Auftragsfrequenz repräsentiert die Gesamttransaktionsmenge in einem festen Intervall und kann für einen direkten Vergleich verwendet werden.
  • Der durchschnittliche Marktanteil, der leichter zu verstehen ist, ist ein Kauf-oder-Verkauf-Gehalt. Der größte Teil des aktuellen Marktanteils ist ein Tick-Gehalt. Wenn der Marktanteil größer wird, wird oft ein Markt dargestellt.
  • Durchschnittlicher Kauf- und Verkaufspreis, wobei der Kauf- und Verkaufspreis für jede einzelne Transaktion berechnet wird, wird mit dem aktuellen Preis verglichen. Ein Durchbruch kann beispielsweise durch den Preis eines letzten Kaufs, der größer als der durchschnittliche Kaufpreis ist, ermittelt werden.

Strategische Logik

Kurzfristige Trends erkennen

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

Wenn der letzte Verkaufspreis größer ist als der durchschnittliche Verkaufspreis, der letzte Kaufpreis größer ist als der durchschnittliche Kaufpreis und der Wert des festen Intervallkaufs größer ist als der Wert des Verkaufsauftrags, wird ein kurzfristiger Aufschwung beurteilt.

Preise nach unten

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

Hier geht es immer noch um die alte Idee, die Tiefe bis zur gewünschten Menge zu wiederholen. Hier wird angenommen, dass innerhalb von 1s eine Zahlung von 10 Münzen getätigt werden kann.

Anzahl der Bestellungen

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

Ratio stellt einen festen Prozentsatz dar, bei dem die Bestellmenge der Anzahl der kürzlich verkauften Bestellungen in einem festen Prozentsatz liegt. Diese Strategie kann sich an die Bestellgröße anhand der aktuellen Verkaufsaktivität anpassen.

Bedingungen

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

Der Durchschnittsdifferenzpreis ist der Differenzpreis, der nur dann bezahlt wird, wenn der Verkaufs- und Kaufpreis größer als ein bestimmtes Multiplikatorwert ist. Wenn Sie einen leeren Auftrag halten, wird dieser auch ausgeglichen und vermeiden Sie eine langfristige Rechnung. Der Auftrag kann nur vom Maker ausgeführt werden, um die Transaktion zu gewährleisten.

Zusammenhängende Architektur

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

Daten überwacht

  • Die Wichtigkeit der Verzögerung und der Geschwindigkeit der Hochfrequenzstrategie wurde bereits betont. Die Strategie sollte verschiedene Verzögerungen überwachen und erfassen, wie Aufträge, Rücknahmen, Positionsrückkehr, Tiefe, Auftragsfluss, Positionen, Gesamtkreislauf usw.
  • Der Anteil an den Transaktionen, der nach der Statistik als Anteil an den Transaktionen betrachtet wird, kann steigen, wenn der Anteil niedrig ist. Es ist auch möglich, dass der strategische Anteil an den Transaktionen in Spitzenzeiten mehr als 10% des Gesamtvolumens erreicht.
  • Die Ausgleichsrendite, die durchschnittliche Ausgleichsrendite, ist der wichtigste Bezugspunkt, um zu beurteilen, ob eine Strategie wirksam ist.
  • Der Kommissionsanteil, der statistische Kommissionsanteil am Gesamtgewinn, spiegelt die Abhängigkeit der Strategie von der Kommissionsrate wider. Handel mit allen verschiedenen Kommissionsstufen, eine unprofitable Strategie kann vielleicht nur mit einer höheren Kommissionsstufe profitabel sein.
  • Die Anzahl der Bestellungen, bei denen nur Bestellungen aufgehängt werden, kann aufgrund der Verzögerung des Auftrags nicht aufgehängt werden.
  • Der Anteil der Transaktionen an den Bestellungen, die Plattformen oft an die Transaktionsrate verlangen, ist ein Zeichen dafür, dass die Strategie zu häufig zurückgezogen wird und behoben werden muss.
  • Die durchschnittliche Auftragsdistanz, die den Abstand zwischen strategischen Aufträgen und Aufschlüssen widerspiegelt, zeigt, dass die meisten noch immer die Position des Kaufs und Verkaufs einnehmen.

Weitere Vorschläge

  • Handel mit mehreren Währungen, die hohen Frequenzstrategien in diesem Artikel gehören nur zur Bezugnahme auf ein einziges Austauschmarkt für ein einziges Währungsmarkt, die Einschränkungen sind groß, die meisten Situationen und die meisten Währungen sind unprofitabel, aber es ist nicht möglich zu prognostizieren, welche Währung in Zukunft profitabel sein wird, also können mehrere oder sogar alle Währungen gehandelt werden, keine Gelegenheit zu verpassen. Selbst unter der Frequenzbeschränkung der Börse kann ein Roboter mehrere Paare handeln, natürlich für die optimale Geschwindigkeit, kann ein Subkonto einen Handel handeln, ein Server für einen Roboter, nur so werden die Kosten viel höher sein.
  • Die Einheitsmenge und die Auftragsbedingungen werden nach der Ertragsrate festgelegt. Handel mit mehreren Währungen führt zu zu hohen Versuchskosten. Wenn die Überwachung unprofitabel ist, wird mit einem minimalen Handelsvolumen und reduzierter Handelsfrequenz getätigt, bis die Strategie dynamisch überwacht wird, bis die Ertragsrate positiv ist, und dann schrittweise erhöht wird.
  • Ein weiteres Merkmal des Hochfrequenzhandels ist die größere Datenmenge, die verarbeitet wird, und mehr Informationen, die verwendet werden. Alle Marktinformationen, die an einem einzigen Börsen-Inbox-Trading-Paar verarbeitet werden, sollten Referenzen sein, und es kann auch dauerhaft auf die Daten der Umgehung verwiesen werden, aber auch auf die Daten anderer Börsen, die an diesem Handelsparium verarbeitet werden, oder sogar auf Daten anderer Währungen. Je mehr Daten, desto größer ist der entsprechende Vorteil.
  • Binance-Server sind in Tokyo untergebracht, andere Börsen haben unterschiedliche Server. Sie können sich an die Techniker der Börse wenden.
  • Der hier beschriebene Strategiecode ist nur ein schlanker Beispielcode, der viele lästige Details entfernt, die jedoch berücksichtigt werden mussten, und die verwendeten Indikatoren sind nur für Referenzzwecke und nicht für direkte Verwendung.

Verwandt

Mehr

mztcoinWas ist die Logik des Verkaufs, wenn Sie eine For-Liste haben, die sofort nach der Transaktion verkauft wird, ohne Lagerbestände zu haben?

mztcoinDie Grasherzen

DANGOUDie Gräsergötter

77924998Welche AWS-Server benutzt Grasshopper?

- Ich weiß nicht.Die Gewalttätige

- Ich weiß nicht.Grasshopper hat ein kostenpflichtiges Hochfrequenzprogramm entwickelt.

Mein Herz ist immer noch da.Kann man sich diese Strategie nutzen, wenn man sie kopieren kann?

Schriftsteller: TradeManIch habe mich in den letzten paar Jahren in der Schule umgewandelt, um zu lernen, wie man in den Hochfrequenz-Handelsgeschäften einsteigt.

Eine Welle in der WindschleifeDie Bullen

fmzeroDer Grasgott ist so hartnäckig!

Ock-QuantitätDie Bullen

Das GrasEs ist schwer zu sehen, es macht keinen Sinn.