4
Подписаться
1271
Подписчики

Количественная оценка FMZ: анализ примеров общего спроса на рынке криптовалют (I)

Создано: 2023-12-17 18:43:46, Обновлено: 2024-11-06 21:18:36
comments   3
hits   1810

Количественная оценка FMZ: анализ примеров общего спроса на рынке криптовалют (I)

В сфере торговли криптовалютными активами ключевыми операциями являются получение и анализ рыночных данных, запрос курсов и мониторинг изменений активов на счетах. Ниже приведены примеры кода для реализации некоторых общих требований.

1. Как написать код, который покажет наибольший рост спотовой торговли Binance за 4 часа?

При написании программы количественной торговой стратегии на FMZ сначала необходимо проанализировать требования. Итак, в зависимости от потребностей мы анализируем следующие пункты:

  • Какой язык программирования используется для написания дизайна? Планируется реализация с использованием Javascript.
  • Нужны данные спотового рынка в режиме реального времени для всех валют Когда мы увидели это требование, первое, что мы сделали, — просмотрели документацию API Binance, чтобы узнать, есть ли какие-либо агрегированные рыночные данные (агрегированные рыночные данные были бы лучшим вариантом, поскольку было бы долго и утомительно проверять каждый продукт по отдельности). один). Запрос интерфейса агрегированной рыночной информации: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) {
        // ...
    }
    

    Программа непрерывно отслеживает цены торговых пар API Binance через бесконечный цикл.

    • 2.2. Получить информацию о ценах
    var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
    

    Получите текущую информацию о ценах торговой пары через API Binance. Если возвращаемое значение не является массивом, подождите 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 секунд, прежде чем перейти к следующему циклу.

Программа получает информацию о ценах торговой пары в режиме реального времени через API Binance, затем рассчитывает рост или падение и выводит ее в журнал в виде таблицы. Программа выполняется в непрерывном цикле для реализации функции мониторинга цен пар транзакций в режиме реального времени. Следует отметить, что программа включает обработку исключений, чтобы гарантировать, что выполнение не будет прервано из-за исключений при получении информации о ценах.

Тест реальной работы диска

Количественная оценка FMZ: анализ примеров общего спроса на рынке криптовалют (I)

Поскольку данные можно собирать только по частям в начале, невозможно рассчитать подъем и падение на скользящей основе, если не собрано достаточно данных за 4 часа. Поэтому в начале начальная цена используется как точка отсчета для расчета. После сбора достаточного количества данных за 4 часа самые старые данные удаляются один за другим, чтобы сохранить 4-часовой период окна для расчета роста и падения.

2. Проверьте ставки финансирования всех фьючерсных контрактов Binance U-margin.

Запрос ставки финансирования аналогичен коду выше. Сначала вам нужно проверить документацию API Binance, чтобы найти интерфейс, связанный со ставкой финансирования. Binance имеет несколько интерфейсов для запроса ставок финансирования. Здесь мы возьмем интерфейс контрактов на основе U в качестве примера:

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

Реализация кода

Поскольку контрактов слишком много, мы выводим здесь десятку с самыми высокими ставками финансирования.

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)

Версия Python для получения ставки финансирования контракта биржи OKX

Пользователь упомянул, что нужна версия 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

Эти примеры предоставляют основные идеи дизайна и методы вызова. В реальных проектах могут потребоваться соответствующие модификации и расширения в зависимости от конкретных потребностей. Надеюсь, эти коды помогут вам лучше удовлетворить ваши разнообразные потребности в торговле цифровыми активами криптовалюты.