avatar of 发明者量化-小小梦 发明者量化-小小梦
konzentrieren Sie sich auf Private Nachricht
4
konzentrieren Sie sich auf
1271
Anhänger

FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (I)

Erstellt in: 2023-12-17 18:43:46, aktualisiert am: 2024-11-06 21:18:36
comments   3
hits   1810

FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (I)

Im Bereich des Handels mit Kryptowährungen sind das Erhalten und Analysieren von Marktdaten, das Abfragen von Kursen und das Überwachen von Änderungen des Kontovermögens wichtige Vorgänge. Nachfolgend finden Sie Codebeispiele zur Implementierung einiger gängiger Anforderungen.

1. Wie schreibe ich den Code, der den größten Anstieg im Binance-Spothandel innerhalb von 4 Stunden anzeigt?

Wenn Sie auf FMZ ein quantitatives Handelsstrategieprogramm schreiben, müssen Sie zunächst die Anforderungen analysieren. Deshalb analysieren wir je nach Bedarf die folgenden Punkte:

  • Welche Programmiersprache wird zum Schreiben des Designs verwendet? Geplante Umsetzung mittels Javascript.
  • Benötigen Sie Echtzeit-Spotmarktdaten für alle Währungen Als wir diese Anforderung sahen, haben wir als erstes die API-Dokumentation von Binance durchgesehen, um zu sehen, ob es aggregierte Marktdaten gab (aggregierte Marktdaten wären am besten, da es zeitaufwändig und mühsam wäre, jedes Produkt einzeln zu prüfen). eins). Abfrage der Schnittstelle für aggregierte Marktinformationen:GET https://api.binance.com/api/v3/ticker/price。 Der Zugang zur Börsennotierungsschnittstelle (öffentliche Schnittstelle, die keine Signatur erfordert) erfolgt auf der FMZ überHttpQueryFunktion.
  • Es müssen die Daten des gleitenden Fensterzeitraums von 4 Stunden gezählt werden Überlegen Sie, wie Sie dieses Statistikprogramm strukturieren möchten.
  • Berechnen Sie den Anstieg und Abfall, sortieren Sie Denken Sie an den Anstiegs- und Abfallalgorithmus. Ist das:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100, die Einheit ist „%“.

Denken Sie über das Problem nach und entscheiden Sie sich für eine Lösung. Wir haben mit der Gestaltung des Programms begonnen.

Code-Entwurf

var dictSymbolsPrice = {}

function main() {
    while (true) {
        // GET https://api.binance.com/api/v3/ticker/price
        try {
            var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
            if (!Array.isArray(arr)) {
                Sleep(5000)
                continue 
            }
            
            var ts = new Date().getTime()
            for (var i = 0; i < arr.length; i++) {
                var symbolPriceInfo = arr[i]
                var symbol = symbolPriceInfo.symbol
                var price = symbolPriceInfo.price

                if (typeof(dictSymbolsPrice[symbol]) == "undefined") {
                    dictSymbolsPrice[symbol] = {name: symbol, data: []}
                }
                dictSymbolsPrice[symbol].data.push({ts: ts, price: price})
            }
        } catch(e) {
            Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
        }
        
        // 计算涨跌幅
        var tbl = {
            type : "table",
            title : "涨跌幅",
            cols : ["交易对", "当前价格", "4小时前价格", "涨跌幅", "数据长度", "最早数据时间", "最新数据时间"],
            rows : []
        }
        for (var symbol in dictSymbolsPrice) {
            var data = dictSymbolsPrice[symbol].data
            if (data[data.length - 1].ts - data[0].ts > 1000 * 60 * 60 * 4) {
                dictSymbolsPrice[symbol].data.shift()
            }

            data = dictSymbolsPrice[symbol].data
            dictSymbolsPrice[symbol].percentageChange = (data[data.length - 1].price - data[0].price) / data[0].price * 100
        }

        var entries = Object.entries(dictSymbolsPrice)
        entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)

        for (var i = 0; i < entries.length; i++) {
            if (i > 9) {
                break
            }   
            var name = entries[i][1].name
            var data = entries[i][1].data
            var percentageChange = entries[i][1].percentageChange
            var currPrice = data[data.length - 1].price
            var currTs = _D(data[data.length - 1].ts)
            var prePrice = data[0].price
            var preTs = _D(data[0].ts)
            var dataLen = data.length

            tbl.rows.push([name, currPrice, prePrice, percentageChange + "%", dataLen, preTs, currTs])
        }
        
        LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
        Sleep(5000)
    }
}

Code-Analyse

  • 1. Datenstruktur var dictSymbolsPrice = {}: Ein leeres Objekt zum Speichern von Preisinformationen für jedes Handelspaar. Der Schlüssel ist das Symbol des Handelspaares und der Wert ist ein Objekt, das den Namen des Handelspaares, ein Array von Preisdaten und Änderungsinformationen enthält.

    1. Hauptfunktion main()
    • 2.1. Endlosschleife
    while (true) {
        // ...
    }
    

    Das Programm überwacht kontinuierlich die Handelspaarpreise der Binance-API über eine Endlosschleife.

    • 2.2. Preisinformationen einholen
    var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
    

    Holen Sie sich die aktuellen Preisinformationen des Handelspaares über die Binance-API. Wenn der zurückgegebene Wert kein Array ist, warten Sie 5 Sekunden und versuchen Sie es erneut.

    • 2.3. Preisdaten aktualisieren
    for (var i = 0; i < arr.length; i++) {
        // ...
    }
    

    Durchlaufen Sie das erhaltene Preisinformations-Array und aktualisieren Sie die Daten in dictSymbolsPrice. Fügen Sie für jedes Handelspaar den aktuellen Zeitstempel und Preis zum entsprechenden Datenarray hinzu.

    • 2.4. Ausnahmebehandlung
    } catch(e) {
        Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
    }
    

    Fangen Sie Ausnahmen ab und zeichnen Sie Ausnahmeinformationen auf, um sicherzustellen, dass das Programm weiterhin ausgeführt werden kann.

    • 2.5. Berechnen Sie die Erhöhung oder Verringerung
    for (var symbol in dictSymbolsPrice) {
        // ...
    }
    

    Durchlaufen Sie dictSymbolsPrice, berechnen Sie die Erhöhung oder Verringerung jedes Handelspaares und löschen Sie die frühesten Daten, wenn die Datenlänge 4 Stunden überschreitet.

    • 2.6. Sortieren und Erstellen von Tabellen
    var entries = Object.entries(dictSymbolsPrice)
    entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
    
    
    for (var i = 0; i < entries.length; i++) {
        // ...
    }
    

    Sortieren Sie die Handelspaare nach ihrem Anstieg oder Abfall vom Höchstwert zum Tiefstwert und erstellen Sie eine Tabelle mit den Handelspaarinformationen.

    • 2.7. Protokollausgabe und Verzögerung
    LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
    Sleep(5000)
    

    Geben Sie die Tabelle und die aktuelle Zeit in Protokollform aus und warten Sie 5 Sekunden, bevor Sie mit dem nächsten Zyklus fortfahren.

Das Programm erhält die Echtzeit-Preisinformationen des Handelspaares über die Binance-API, berechnet dann die Erhöhung oder Verringerung und gibt sie in Form einer Tabelle im Protokoll aus. Das Programm wird in einer Endlosschleife ausgeführt, um die Funktion der Echtzeitüberwachung der Transaktionspaarpreise zu erreichen. Es ist zu beachten, dass das Programm eine Ausnahmebehandlung enthält, um sicherzustellen, dass die Ausführung nicht aufgrund von Ausnahmen beim Abrufen von Preisinformationen unterbrochen wird.

Echter Festplattenbetriebstest

FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (I)

Da die Datenerfassung zu Beginn nur Stück für Stück erfolgt, ist eine gleitende Berechnung des Anstiegs und Abfalls nicht möglich, wenn nicht für vier Stunden genügend Daten erfasst wurden. Daher wird zu Beginn der Anfangspreis als Benchmark für die Berechnung verwendet. Nachdem 4 Stunden lang genügend Daten gesammelt wurden, werden die ältesten Daten nacheinander eliminiert, um ein 4-Stunden-Fenster für die Berechnung des Anstiegs und Abfalls aufrechtzuerhalten.

2. Überprüfen Sie die Finanzierungsraten aller Binance U-Margin-Futures-Kontrakte

Die Abfrage des Finanzierungssatzes ähnelt dem obigen Code. Zuerst müssen Sie die API-Dokumentation von Binance überprüfen, um die Schnittstelle zum Finanzierungssatz zu finden. Binance verfügt über mehrere Schnittstellen zur Abfrage von Finanzierungsraten. Hier nehmen wir die Schnittstelle von U-basierten Verträgen als Beispiel:

GET https://fapi.binance.com/fapi/v1/premiumIndex

Code-Implementierung

Da es zu viele Verträge gibt, geben wir hier die Top Ten mit den höchsten Finanzierungsquoten aus.

function main() {
    while (true) {
        // GET https://fapi.binance.com/fapi/v1/premiumIndex
        try {
            var arr = JSON.parse(HttpQuery("https://fapi.binance.com/fapi/v1/premiumIndex"))
            if (!Array.isArray(arr)) {
                Sleep(5000)
                continue 
            }
            
            arr.sort((a, b) => parseFloat(b.lastFundingRate) - parseFloat(a.lastFundingRate))
            var tbl = {
                type: "table",
                title: "U本位合约资金费率前十",
                cols: ["合约", "资金费率", "标记价格", "指数价格", "当期费率时间", "下期费率时间"],
                rows: []
            }
            for (var i = 0; i < 9; i++) {
                var obj = arr[i]
                tbl.rows.push([obj.symbol, obj.lastFundingRate, obj.markPrice, obj.indexPrice, _D(obj.time), _D(obj.nextFundingTime)])
            }
            LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
        } catch(e) {
            Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
        }
        Sleep(1000 * 10)
    }
}

Die zurückgegebene Datenstruktur ist wie folgt. Aus der Binance-Dokumentation können wir ersehen, dass lastFundingRate der gewünschte Finanzierungssatz ist.

{
    "symbol":"STMXUSDT",
    "markPrice":"0.00883606",
    "indexPrice":"0.00883074",
    "estimatedSettlePrice":"0.00876933",
    "lastFundingRate":"0.00026573",
    "interestRate":"0.00005000",
    "nextFundingTime":1702828800000,
    "time":1702816229000
}

Echter Festplattenbetriebstest:

FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (I)

Python-Version zum Abrufen des Finanzierungssatzes für OKX-Austauschverträge

Ein Benutzer hat erwähnt, dass eine Python-Version erforderlich ist und diese von der OKX-Börse stammt. Hier ist übrigens auch implementiert:

https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1Von der Schnittstelle zurückgegebene Daten:

{
    "code":"0",
    "data":[
        {
            "fundingTime":1702828800000,
            "fundingList":[
                {
                    "instId":"BTC-USDT-SWAP",
                    "nextFundingRate":"0.0001102188733642",
                    "minFundingRate":"-0.00375",
                    "fundingRate":"0.0000821861465884",
                    "maxFundingRate":"0.00375"
                } ...

Spezifischer Code:

import requests
import json
from time import sleep
from datetime import datetime

def main():
    while True:
        # https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1
        try:
            response = requests.get("https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1")
            arr = response.json()["data"][0]["fundingList"]
            Log(arr) 
            if not isinstance(arr, list):
                sleep(5)
                continue

            arr.sort(key=lambda x: float(x["fundingRate"]), reverse=True)

            tbl = {
                "type": "table",
                "title": "U本位合约资金费率前十",
                "cols": ["合约", "下期费率", "最小", "当期", "最大"],
                "rows": []
            }

            for i in range(min(9, len(arr))):
                obj = arr[i]
                row = [
                    obj["instId"],
                    obj["nextFundingRate"],
                    obj["minFundingRate"],
                    obj["fundingRate"],
                    obj["maxFundingRate"]
                ]
                tbl["rows"].append(row)
            
            LogStatus(_D(), "\n", '`' + json.dumps(tbl) + '`')

        except Exception as e:
            Log(f"Error: {str(e)}")

        sleep(10)

Echter Festplattenbetriebstest:

FMZ-Quantifizierung: Analyse gängiger Nachfragedesignbeispiele im Kryptowährungsmarkt (I)

END

Diese Beispiele stellen grundlegende Designideen und Aufrufmethoden dar. In tatsächlichen Projekten können je nach spezifischen Anforderungen entsprechende Änderungen und Erweiterungen erforderlich sein. Ich hoffe, diese Codes können Ihnen dabei helfen, Ihre verschiedenen Anforderungen im Handel mit digitalen Kryptowährungsvermögenswerten besser zu erfüllen.