震惊!用 Python 掌握 BitMEX 历史数据,交易秘诀大公开!

2025-03-16 09:39:50 103

BitMEX API 历史数据详解

BitMEX (Bitcoin Mercantile Exchange) 是一个领先的加密货币衍生品交易所,它为交易者提供了进行比特币和其他加密货币永续合约和期货交易的机会。对于量化交易员、研究人员和数据分析师来说,获取和分析 BitMEX 历史数据至关重要,可以用于开发交易策略、回测算法和进行市场分析。本文将深入探讨如何利用 BitMEX API 获取历史数据,并提供一些实用技巧和注意事项。

BitMEX API 概述

BitMEX API 是一套强大的工具,允许开发者和交易者访问平台上的各种数据和功能。它提供实时市场数据流、详尽的历史数据记录、个人账户信息查询以及高效的订单管理功能。BitMEX API 采用 RESTful 架构,这意味着可以通过标准的 HTTP 请求(如 GET、POST、PUT 和 DELETE)与 API 进行交互,实现数据的请求、提交、修改和删除操作。这种基于 HTTP 协议的设计使得 API 易于理解和使用,降低了集成难度。

为了安全地访问 BitMEX API,必须先创建一个 API 密钥。通过登录 BitMEX 账户,导航至 "API Keys" 部分即可生成专属的密钥对,包括 API 密钥 (API Key ID) 和 API 密钥密码 (API Secret)。务必妥善保管这些密钥,如同保护银行账户密码一样,切勿泄露给任何第三方。在创建 API 密钥时,应仔细设置适当的权限。根据实际需求,可以限制密钥的功能,例如,可以创建一个只允许读取市场数据,但禁止进行交易操作的密钥,以此降低潜在风险。建议定期更换 API 密钥,并启用双因素认证,进一步提升账户安全等级。

BitMEX API 主要分为以下两种类型,以满足不同用户的需求:

  • 公共 API (Public API): 这部分 API 无需任何身份验证即可访问,任何人都可以自由地获取平台提供的公开信息。它主要用于获取市场数据,例如实时的交易历史记录、动态的订单簿快照、最近成交的交易价格和数量,以及各类指数数据。公共 API 是获取历史价格和交易数据的主要入口,可以用于构建数据分析模型、开发交易策略或进行市场研究。调用公共 API 的速率通常会受到限制,以防止滥用,因此需要注意控制请求频率。
  • 私有 API (Private API): 与公共 API 不同,私有 API 需要进行严格的身份验证才能访问。它主要用于访问与个人账户相关的敏感信息,例如账户余额、交易历史、持仓情况、委托订单状态等。私有 API 还允许用户进行交易操作,例如下达买入或卖出订单、修改或取消已有订单、调整杠杆比例、划转资金等。由于私有 API 涉及资金安全和账户隐私,因此必须使用有效的 API 密钥进行身份验证,并采用 HTTPS 协议进行加密传输,以防止数据泄露和中间人攻击。

获取历史数据:API 端点与参数详解

BitMEX API 提供了一系列强大的端点,专门用于检索历史市场数据,这对于量化交易者、研究人员和数据分析师至关重要。 其中,以下端点最为常用,能够满足大部分历史数据需求:

  • GET /api/v1/trade :原始交易数据获取
  • 此端点用于获取交易所发生的每一笔原始交易的详细信息。 你可以通过多种参数来精确过滤所需的数据:

    • symbol (字符串): 指定交易对,例如 XBTUSD (比特币/美元永续合约)。 必填参数。
    • startTime (日期时间): 指定数据开始的时间点,采用 ISO 8601 格式。例如: 2023-01-01T00:00:00.000Z
    • endTime (日期时间): 指定数据结束的时间点,采用 ISO 8601 格式。例如: 2023-01-02T00:00:00.000Z
    • count (整数): 限制返回的交易记录数量。 默认值为 100,最大值为 500。
    • start (整数): 用于分页,指定返回结果的起始位置。 结合 count 参数,可以逐步获取大量数据。
    • reverse (布尔值): 指定返回结果的排序方式。 true 表示按时间倒序排列(最新交易在前), false 表示按时间正序排列(最早交易在前)。 默认为 false

    通过组合这些参数,你可以灵活地检索特定时间段内,特定交易对的交易历史,并控制返回数据的数量和排序方式。 例如,获取 2023 年 1 月 1 日至 2023 年 1 月 2 日的 XBTUSD 交易对的最新 500 笔交易:

    GET /api/v1/trade?symbol=XBTUSD&startTime=2023-01-01T00:00:00.000Z&endTime=2023-01-02T00:00:00.000Z&count=500&reverse=true

  • GET /api/v1/trade/bucketed :聚合交易数据(K 线数据)获取
  • 此端点用于获取经过聚合的交易数据,通常用于生成 K 线图。 与原始交易数据不同,聚合数据以指定的时间间隔(例如 1 分钟、5 分钟、1 小时等)对交易数据进行汇总,提供 OHLC(开盘价、最高价、最低价、收盘价)和交易量等信息。 主要参数包括:

    • symbol (字符串): 指定交易对,例如 XBTUSD 。 必填参数。
    • binSize (字符串): 指定 K 线的时间间隔。 常见的选项包括 1m (1 分钟), 5m (5 分钟), 1h (1 小时), 1d (1 天)。 必填参数。
    • startTime (日期时间): 指定数据开始的时间点,采用 ISO 8601 格式。
    • endTime (日期时间): 指定数据结束的时间点,采用 ISO 8601 格式。
    • count (整数): 限制返回的 K 线数量。 默认值为 100,最大值为 500。
    • start (整数): 用于分页。
    • reverse (布尔值): 指定返回结果的排序方式。 true 表示按时间倒序排列, false 表示按时间正序排列。 默认为 false
    • partial (布尔值): 指定是否返回未完成的 K 线。 true 表示返回, false 表示不返回。 默认为 true

    例如,获取 2023 年 1 月 1 日至 2023 年 1 月 2 日的 XBTUSD 交易对的 1 小时 K 线数据:

    GET /api/v1/trade/bucketed?symbol=XBTUSD&binSize=1h&startTime=2023-01-01T00:00:00.000Z&endTime=2023-01-02T00:00:00.000Z

GET /api/v1/trade API 参数详解

以下是一些常用的 GET /api/v1/trade API 端点参数,用于查询交易历史数据:

  • symbol : (必选) 交易对代码,用于指定要查询的交易市场。例如, XBTUSD 表示比特币/美元的永续合约交易对。务必提供有效的交易对代码,否则 API 将返回错误。
  • count : (可选) 返回的交易记录数量上限。默认为 100 条,最大允许设置为 500 条。如果请求的记录数量超过 500 条,API 将自动截断至 500 条。控制返回的记录数量有助于管理 API 响应的大小和提高处理效率。
  • start : (可选) 指定返回记录的起始位置索引。索引从 0 开始, start=0 表示从最早可用的交易记录开始返回。此参数用于分页获取大量交易数据,每次请求获取一部分数据,逐步遍历整个交易历史。
  • startTime : (可选) 筛选交易记录的起始时间。时间格式必须符合 ISO 8601 标准,例如 2023-01-01T00:00:00.000Z 。仅返回在此时间之后发生的交易。此参数与 endTime 结合使用,可以查询特定时间范围内的交易数据。精确到毫秒级别有助于更精细的查询。
  • endTime : (可选) 筛选交易记录的结束时间。时间格式同样必须符合 ISO 8601 标准。仅返回在此时间之前发生的交易。如果同时指定了 startTime endTime ,则 API 将返回指定时间范围内的交易数据。
  • reverse : (可选) 控制返回交易记录的排序方式。默认为 false ,表示按时间升序排列(即旧的交易记录在前,新的交易记录在后)。如果设置为 true ,则按时间降序排列(即新的交易记录在前,旧的交易记录在后)。选择正确的排序方式对于时间序列分析非常重要。

GET /api/v1/trade/bucketed 参数详解

以下是对 GET /api/v1/trade/bucketed 端点常用参数的详细说明,该端点用于获取交易历史的聚合数据,即K线数据,这对于技术分析至关重要。

  • symbol : (必选) 指定要查询的交易对。例如, XBTUSD 代表比特币兑美元的永续合约。务必提供有效的交易对代码,否则请求将失败。交易对代码通常由两种资产的符号组成,并通过某种分隔符连接。
  • count : (可选) 指定API返回的K线数量上限。默认值为 100,最大允许值为 500。如果未指定,则返回最近的 100 根K线。设置过高的 count 值可能导致请求超时或服务器拒绝请求。
  • start : (可选) 指定返回的 K 线数据的起始位置索引。用于分页查询大量历史数据。索引从 0 开始。例如,如果已经获取了前 100 根 K 线,则设置 start=100 可以获取接下来的 100 根K线。
  • startTime : (可选) 指定 K 线数据的起始时间,使用 ISO 8601 格式表示,例如 2023-10-26T00:00:00Z 。API 将返回从该时间点开始的 K 线数据。 需要注意的是, startTime start 是互斥的, 不能同时使用。 准确的时间戳对于精确的历史数据分析至关重要。
  • endTime : (可选) 指定 K 线数据的结束时间,同样使用 ISO 8601 格式表示,例如 2023-10-27T00:00:00Z 。API 将返回到该时间点为止的 K 线数据。 与 startTime 配合使用,可以获取特定时间范围内的 K 线数据。 同样需要注意的是,如果使用 startTime 或者 endTime ,务必保证时间格式正确,否则API调用将会失败。
  • binSize : (必选) 定义 K 线的时间粒度,即每根 K 线所代表的时间间隔。常用的选项包括: 1m (1 分钟), 5m (5 分钟), 1h (1 小时), 1d (1 天)。选择合适的 binSize 取决于分析的时间范围和交易策略。较小的 binSize 提供更精细的数据,但也会产生更多的数据点。
  • partial : (可选) 指定是否返回未完成的 K 线。如果设置为 true ,则 API 将返回当前正在形成的 K 线,即使该 K 线尚未结束。默认情况下,API 只返回完整的 K 线。 partial 参数对于实时交易和监控非常有用。

使用 Python 获取历史数据示例

以下是一个使用 Python 和 requests 库获取 BitMEX 历史 K 线数据的示例。该示例演示了如何与 BitMEX API 交互,检索指定时间范围和粒度的交易数据。在进行量化交易研究、策略回测或数据分析时,获取历史数据至关重要。

import requests
import

def get_bitmex_historical_data(symbol, bin_size, start_time, end_time, count=500):
"""
获取 BitMEX 历史 K 线数据。

    Args:
        symbol: 交易对,例如 "XBTUSD"。BitMEX 提供的交易对种类繁多,可以根据具体需求进行选择,例如 "ETHUSD", "LTCUSD" 等。
        bin_size: K 线的时间间隔,例如 "1m", "5m", "1h", "1d"。常用的时间间隔包括分钟级别、小时级别和天级别,选择合适的时间间隔取决于交易策略的周期。
        start_time: 起始时间,采用 ISO 8601 格式。ISO 8601 是一种国际标准日期和时间表示法,例如 "2023-10-26T00:00:00.000Z"。
        end_time: 结束时间,采用 ISO 8601 格式。
        count: 返回的 K 线数量,默认为 500,最大为 500。BitMEX API 每次请求最多返回 500 条数据,如果需要获取更多数据,需要进行分页查询。

    Returns:
        一个包含 K 线数据的列表,如果出错则返回 None。
    """
    endpoint = "https://www.bitmex.com/api/v1/trade/bucketed"
    params = {
        "symbol": symbol,
        "binSize": bin_size,
        "startTime": start_time,
        "endTime": end_time,
        "count": count,
        "reverse": False  # 将 reverse 设置为 False 保证时间顺序
    }

    try:
        response = requests.get(endpoint, params=params)
        response.raise_for_status()  # 抛出 HTTPError 异常(如果状态码不为 200)
        data = response.()
        return data
    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return None
    except .JSONDecodeError as e:
        print(f"JSON 解析出错: {e}")
        return None

if __name__ == '__main__':
symbol = "XBTUSD"
bin_size = "1h"
start_time = "2023-10-26T00:00:00.000Z"
end_time = "2023-10-27T00:00:00.000Z"

    historical_data = get_bitmex_historical_data(symbol, bin_size, start_time, end_time)

    if historical_data:
        for kline in historical_data:
            print(kline)
    else:
        print("获取历史数据失败。")

此示例代码首先定义了一个 get_bitmex_historical_data 函数,该函数接受交易对、K 线时间间隔、起始时间和结束时间作为参数,并使用 requests 库向 BitMEX API 发送 GET 请求。如果请求成功,函数将返回一个包含 K 线数据的列表,每条数据代表一个 K 线,包含开盘价、最高价、最低价、收盘价、成交量等信息。 否则,它将返回 None

if __name__ == '__main__': 块中,我们定义了交易对、K 线时间间隔、起始时间和结束时间,然后调用 get_bitmex_historical_data 函数来获取历史数据。我们遍历 K 线数据并打印每条记录。 请注意,在实际应用中,需要对获取的数据进行错误处理,例如网络连接错误、API 速率限制等,以确保程序的稳定性和可靠性。如果需要获取大量历史数据,建议采用分页查询的方式,避免一次性请求过多数据导致 API 调用失败。

速率限制和分页

BitMEX API 实施了速率限制机制,旨在防止恶意滥用,保障平台整体的稳定性和可靠性。 速率限制的具体数值因API类型而异。 公共API(无需身份验证即可访问)通常具有较高的速率限制,例如每分钟允许300个请求。 而私有API(需要身份验证,用于执行交易或访问账户信息)则具有较低的速率限制,以确保更高的安全性。 如果客户端在短时间内发送过多请求,超过了预设的速率限制,API将会返回一个错误代码(例如429 Too Many Requests)。 客户端需要暂停一段时间,等待速率限制窗口重置后,才能再次发送请求。 为了避免触发速率限制,建议开发者合理规划请求频率,并实施适当的重试机制。

当需要获取大量数据时,例如超过API单次请求所能返回的最大记录数(通常为500或1000),分页技术便显得至关重要。 分页,顾名思义,是将数据分割成多个较小的页面,并通过多次API请求逐页获取。 BitMEX API通常使用 start count 参数来实现分页。 start 参数用于指定数据起始位置的索引, count 参数用于指定每页返回的数据条数。 通过循环递增 start 的值,并不断发送API请求,可以获取所有数据。 开发者需要仔细阅读API文档,了解分页参数的具体用法和限制。

以下是一个Python示例,演示如何使用分页获取BitMEX的历史K线数据:

import requests import time

def get_all_bitmex_historical_data(symbol, bin_size, start_time, end_time): """ 获取 BitMEX 历史 K 线数据,使用分页处理。

Args:
    symbol: 交易对,例如 "XBTUSD"。
    bin_size: K 线的时间间隔,例如 "1m", "5m", "1h", "1d"。
    start_time: 起始时间,采用 ISO 8601 格式。
    end_time: 结束时间,采用 ISO 8601 格式。

Returns:
    一个包含 K 线数据的列表,如果出错则返回 None。
"""

all_data = []
start = 0
count = 500
endpoint = "https://www.bitmex.com/api/v1/trade/bucketed"

while True:
    params = {
        "symbol": symbol,
        "binSize": bin_size,
        "startTime": start_time,
        "endTime": end_time,
        "count": count,
        "start": start,
        "reverse": False  # 获取旧到新的数据
    }

    try:
        response = requests.get(endpoint, params=params)
        response.raise_for_status()  # 检查HTTP状态码
        data = response.()

        if not data:
            break  # 没有更多数据了

        all_data.extend(data)
        start += count
        time.sleep(0.2)  # 避免触发速率限制,增加延迟

    except requests.exceptions.RequestException as e:
        print(f"请求出错: {e}")
        return None
    except Exception as e:
        print(f"处理数据出错: {e}")
        return None

return all_data

if __name__ == '__main__': symbol = "XBTUSD" bin_size = "1h" start_time = "2023-10-20T00:00:00.000Z" end_time = "2023-10-27T00:00:00.000Z"

all_historical_data = get_all_bitmex_historical_data(symbol, bin_size, start_time, end_time)

if all_historical_data:
    print(f"获取到 {len(all_historical_data)} 条历史数据。")
    # for kline in all_historical_data:
    #     print(kline)
else:
    print("获取历史数据失败。")

在这个示例中,我们使用 while 循环持续发起数据请求,直到API返回的数据为空,表示所有数据已获取完毕。 在每次循环迭代中,我们将 start 参数的值增加 count ,从而实现分页。 我们还加入了 time.sleep() 函数,强制程序暂停一段时间,以避免因请求频率过高而触发API的速率限制。 为了确保程序的健壮性,我们还加入了异常处理机制,捕获可能出现的网络请求错误和数据处理错误。

数据处理和存储

获取历史加密货币交易数据后,高效的数据处理和可靠的存储是后续分析的关键步骤。原始数据通常包含噪声和冗余,需要进行清洗和转换才能用于模型训练和策略回测。 常用的数据处理技术包括:

  • 数据清洗: 移除重复数据、处理缺失值和纠正错误数据。例如,交易平台API可能返回重复的交易记录,或因网络问题导致数据缺失。 清洗过程包括识别并删除重复项,使用插值或回归模型估算缺失值,以及纠正明显的错误数据(如价格或交易量异常值)。
  • 数据转换: 将数据转换为适合分析的格式,例如将Unix时间戳转换为日期时间对象,或者对价格进行对数变换以减少异方差性。 数据规范化(如将价格缩放到0-1之间)也是常见的转换步骤,可以提高机器学习模型的性能。 特征工程也属于数据转换的范畴,例如从现有数据中创建新的指标,如移动平均线、相对强弱指数 (RSI) 或布林带。
  • 数据聚合: 将数据聚合到不同的时间间隔,例如将 1 分钟 K 线数据聚合为 5 分钟 K 线数据,或将每日数据聚合为每周数据。 聚合过程涉及计算每个时间段内的开盘价、最高价、最低价和收盘价 (OHLC),以及交易量等指标。 选择合适的时间粒度取决于分析的目的;例如,高频交易可能需要分钟级数据,而长期投资策略可能使用日或周级别数据。

你可以将历史数据存储到不同的数据库中,选择取决于数据量、数据结构、查询需求和成本等因素:

  • CSV 文件: 简单易用,适合存储少量数据和快速原型设计。 然而,CSV文件在处理大量数据时效率较低,并且缺乏索引和查询优化功能。 CSV文件通常不适合存储复杂的嵌套数据结构。
  • SQL 数据库 (例如 MySQL, PostgreSQL): 适合存储结构化数据,并提供强大的查询功能。 SQL数据库支持ACID(原子性、一致性、隔离性、持久性)事务,保证数据完整性。 它们使用SQL语言进行查询,允许复杂的过滤、排序和聚合操作。 然而,SQL数据库在处理非结构化数据和高并发写入方面可能存在性能瓶颈。
  • NoSQL 数据库 (例如 MongoDB): 适合存储非结构化数据,并具有高可扩展性。 MongoDB是一种文档数据库,使用JSON-like格式存储数据。 它具有灵活的模式,易于处理不断变化的数据结构。 NoSQL数据库通常具有更好的水平扩展能力,可以处理海量数据。 然而,NoSQL数据库可能牺牲一些ACID特性,需要谨慎处理数据一致性问题。
  • 时序数据库 (例如 InfluxDB, TimescaleDB): 专门用于存储时间序列数据,并提供高效的查询和分析功能。 时序数据库针对时间序列数据的特点进行了优化,例如高效的压缩算法和时间范围查询。 它们通常提供内置的函数和工具,用于时间序列分析,如移动平均线、趋势分析和异常检测。 对于加密货币交易数据,时序数据库是理想的选择,可以实现快速的查询和分析。

BitMEX API 提供了强大的工具来获取历史数据,这对于加密货币交易员和研究人员至关重要。 通过了解 API 端点、参数和速率限制,并使用分页技术,你可以有效地获取大量历史数据。 此外,数据处理和存储是数据分析的关键步骤,选择合适的数据库可以提高效率和可扩展性。 希望本文能帮助你更好地利用 BitMEX API 进行数据分析和交易策略开发。

The End

发布于:2025-03-16,除非注明,否则均为链圈网原创文章,转载请注明出处。