avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

FMZ 定量化: 暗号通貨市場における一般的な需要設計例の分析 (I)

作成日:: 2023-12-17 18:43:46, 更新日:: 2024-11-06 21:18:36
comments   3
hits   1810

FMZ 定量化: 暗号通貨市場における一般的な需要設計例の分析 (I)

暗号通貨資産取引の分野では、市場データの取得と分析、レートの照会、口座資産の変化の監視はすべて重要な業務です。以下は、いくつかの一般的な要件を実装するためのコード例です。

1. 4 時間以内に Binance スポット取引の最大の増加を示すコードをどのように記述すればよいですか?

FMZ で定量取引戦略プログラムを作成するときは、まず要件を分析する必要があります。そこで、ニーズに応じて、以下の点を分析します。

  • 設計を記述するためにどのプログラミング言語が使用されるか Javascript を使用した実装を計画しています。
  • すべての通貨のリアルタイムスポット市場データが必要 この要件を見たとき、私たちが最初にしたのは、BinanceのAPIドキュメントを調べて、集約された市場データがあるかどうかを確認することでした(集約された市場データが最適で、各製品を1つずつ確認するのは時間がかかり、面倒です)。 1つ)。 集約された市場情報インターフェースをクエリします。GET https://api.binance.com/api/v3/ticker/price。 FMZでは、次の方法で取引所の見積インターフェース(署名を必要としない公開インターフェース)にアクセスします。HttpQuery関数。
  • 4時間のローリングウィンドウ期間のデータをカウントする必要がある この統計プログラムをどのように構成するかを考えます。
  • 上昇と下降を計算し、並べ替える 上昇と下降のアルゴリズムについて考えてみましょう。涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 100単位は「%」です。

問題を徹底的に考え、解決策を決めます。プログラムの設計を始めました。

コード設計

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

コード分​​析

  • 1. データ構造 var dictSymbolsPrice = {}: 各取引ペアの価格情報を保存するために使用される空のオブジェクト。キーは取引ペアのシンボルであり、値は取引ペアの名前、価格データの配列、および変更情報を含むオブジェクトです。

    1. メイン関数 main()
    • 2.1. 無限ループ
    while (true) {
        // ...
    }
    

    プログラムは、無限ループを通じて Binance API の取引ペアの価格を継続的に監視します。

    • 2.2. 価格情報を取得する
    var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
    

    Binance API を通じて取引ペアの現在の価格情報を取得します。返された値が配列でない場合は、5 秒待ってから再試行してください。

    • 2.3. 価格データの更新
    for (var i = 0; i < arr.length; i++) {
        // ...
    }
    

    取得した価格情報配列を走査し、dictSymbolsPrice のデータを更新します。各取引ペアについて、現在のタイムスタンプと価格を対応するデータ配列に追加します。

    • 2.4. 例外処理
    } catch(e) {
        Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
    }
    

    例外をキャッチし、例外情報を記録して、プログラムが引き続き実行できるようにします。

    • 2.5. 増加または減少を計算する
    for (var symbol in dictSymbolsPrice) {
        // ...
    }
    

    dictSymbolsPrice を走査し、各取引ペアの増減を計算し、データ長が 4 時間を超える場合は最も古いデータを削除します。

    • 2.6. ソートとテーブルの生成
    var entries = Object.entries(dictSymbolsPrice)
    entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
    
    
    for (var i = 0; i < entries.length; i++) {
        // ...
    }
    

    取引ペアを増加または減少の高から低の順に並べ替え、取引ペアの情報を含むテーブルを生成します。

    • 2.7. ログ出力と遅延
    LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
    Sleep(5000)
    

    テーブルと現在の時刻をログ形式で出力し、5 秒間待ってから次のサイクルに進みます。

プログラムは、Binance API を通じて取引ペアのリアルタイムの価格情報を取得し、増加または減少を計算して、表の形式でログに出力します。プログラムは連続ループで実行され、取引ペアの価格をリアルタイムで監視する機能を実現します。価格情報を取得する際に例外によって実行が中断されないように、プログラムには例外処理が含まれていることに注意してください。

実際のディスク動作テスト

FMZ 定量化: 暗号通貨市場における一般的な需要設計例の分析 (I)

データは最初は少しずつしか収集できないため、4 時間分の十分なデータが収集されていない場合は、ローリング ベースで上昇と下降を計算することは不可能です。そのため、最初は初値を計算の基準として使い、4時間分の十分なデータを収集した後、最も古いデータを1つずつ削除して、上昇と下降を計算するための4時間のウィンドウ期間を維持します。

2. Binance Uマージン先物契約の資金調達率を確認する

資金調達率の照会は上記のコードと同様です。まず、Binance の API ドキュメントをチェックして、資金調達率関連のインターフェースを見つける必要があります。 Binance には資金調達率を照会するためのインターフェースがいくつかあります。ここでは、U ベースの契約のインターフェースを例に挙げます。

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

コードの実装

契約が多すぎるため、ここでは資金調達率の最も高い上位 10 件を出力します。

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

返されるデータ構造は次のとおりです。Binance のドキュメントから、lastFundingRate が希望する資金調達率であることがわかります。

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

実際のディスク動作テスト:

FMZ 定量化: 暗号通貨市場における一般的な需要設計例の分析 (I)

OKX 為替契約資金調達率を取得する Python バージョン

あるユーザーは、Python バージョンが必要であり、それは OKX 取引所からのものであると述べました。ちなみにこちらも実装されています:

https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1インターフェースによって返されるデータ:

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

特定のコード:

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)

実際のディスク動作テスト:

FMZ 定量化: 暗号通貨市場における一般的な需要設計例の分析 (I)

END

これらの例は、基本的な設計アイデアと呼び出し方法を示しています。実際のプロジェクトでは、特定のニーズに基づいて適切な変更と拡張が必要になる場合があります。これらのコードが、暗号通貨デジタル資産取引におけるさまざまなニーズをよりよく満たすのに役立つことを願っています。