新手指南:如何用Python玩转Binance API历史数据?

发布时间:2025-03-08 分类: 讲座 访问:71℃

Binance API接口获取历史数据

加密货币交易者和研究人员经常需要访问历史数据,以便进行回测、策略开发和市场分析。Binance作为全球领先的加密货币交易所,提供了强大的API接口,允许用户便捷地获取各种历史数据。本文将详细介绍如何使用Binance API获取历史数据,并提供一些实用的代码示例。

Binance API 概述

Binance API 提供了一套全面的接口,包括 REST API 和 WebSocket API,以满足不同用户的需求。 REST API 和 WebSocket API 在数据获取和应用场景上各有侧重。通常,如果您的目标是检索历史交易数据、历史K线数据或其他静态的历史信息,REST API 是一个更有效率和便捷的选择。因为它允许您通过简单的HTTP请求,批量获取所需数据。

  • REST API: REST API 基于标准的 HTTP 请求和响应机制,使用户能够通过发送 GET, POST, PUT, DELETE 等 HTTP 方法来与币安服务器进行交互。 其优势在于易于使用、易于集成,并且适用于需要一次性请求大量数据的场景。 例如,获取特定交易对的历史K线数据,或者查询账户的历史交易记录,都可以通过 REST API 完成。 REST API 的请求通常是同步的,客户端发送请求后需要等待服务器返回响应。
  • WebSocket API: WebSocket API 则提供了一种双向、实时的通信通道。 客户端和服务器之间建立持久连接后,服务器可以主动向客户端推送数据,而无需客户端频繁发起请求。 这种特性使得 WebSocket API 非常适合于需要实时监控市场动态和执行高频交易的场景。 例如,实时获取交易对的最新价格、深度数据,或者监控账户余额的变动,都可以通过 WebSocket API 实现。 WebSocket API 的请求是异步的,客户端可以同时监听多个数据流。

为了保障用户的资产安全和数据隐私,Binance API 对部分端点进行了权限控制。 访问这些受保护的端点,例如进行交易操作、查询用户的账户信息或提现等,都需要进行身份验证。 身份验证通常通过在 HTTP 请求头中添加 API 密钥和签名来实现。 然而,对于一些公共端点,例如获取市场行情数据或公共交易对的交易数据,可能无需身份验证即可访问。 在开始使用 Binance API 之前,务必仔细阅读官方文档,了解每个端点的权限要求以及身份验证方式,并妥善保管您的 API 密钥,防止泄露。

获取历史数据的关键端点

以下是一些常用的 Binance API 端点,用于获取历史数据,助力量化交易、市场分析和策略回测:

  • GET /api/v3/klines (K线数据): 获取指定交易对的K线(蜡烛图)数据,也称为 OHLC (Open, High, Low, Close) 数据。K线数据按照时间间隔聚合,例如 1 分钟、5 分钟、1 小时、1 天等。通过指定 interval 参数,您可以获取不同时间粒度的K线数据。您可以通过 startTime endTime 参数限定数据的时间范围,通过 limit 参数限制返回的数据条数。例如,您可以查询 BTCUSDT 交易对的 15 分钟 K 线数据,时间范围为过去一周,并限制返回最近的 1000 条数据。该接口是进行技术分析和回测交易策略的基础。
  • GET /api/v3/historicalTrades (历史成交记录): 获取指定交易对的历史成交记录,提供每一笔成交的详细信息,包括成交价格、成交数量、成交时间、买卖方向(买入或卖出)等。通过 fromId 参数,您可以从指定的成交 ID 开始获取数据,实现分页获取。 limit 参数控制返回的成交记录数量上限,避免一次请求返回过多数据。需要注意的是,访问该接口通常需要较高的 API 权限。历史成交记录对于深度研究市场微观结构、分析交易活动模式至关重要。
  • GET /api/v3/aggTrades (聚合成交记录): 获取指定交易对的聚合成交记录。聚合成交记录将多个在极短时间内发生的成交合并成一个记录,可以减少数据量,提高数据处理效率。该接口返回的数据包括成交价格、成交数量、成交时间、成交的第一笔成交 ID、最后一笔成交 ID、以及是否为主动卖出单等信息。通过 startTime endTime 参数,您可以筛选特定时间段内的聚合成交记录。 limit 参数用于限制返回的记录数量。聚合成交数据适用于大规模数据分析,例如成交量分布、价格波动分析等。

使用 GET /api/v3/klines 获取K线数据

这是获取加密货币历史K线数据的最常用方法。K线数据,也称为蜡烛图数据,提供了特定时间段内资产价格的详细信息,对于技术分析至关重要。通过 GET /api/v3/klines 接口,您可以检索指定交易对、特定时间间隔内的开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)和交易量(Volume)等关键指标。

每个K线代表一个时间周期,例如1分钟、5分钟、1小时或1天。返回的数据通常包含以下字段:

  • 开盘价 (Open): 该时间周期内的第一笔交易价格。
  • 最高价 (High): 该时间周期内达到的最高价格。
  • 最低价 (Low): 该时间周期内达到的最低价格。
  • 收盘价 (Close): 该时间周期内的最后一笔交易价格。收盘价通常被认为是该时间周期内最重要的价格指标。
  • 交易量 (Volume): 该时间周期内交易的资产数量。交易量可以帮助您评估价格变动的强度和市场参与度。
  • 成交额 (Quote Asset Volume): 报价资产的交易量。
  • 交易笔数 (Number of Trades): 该时间周期内发生的交易总数。
  • 主动买入成交量 (Taker buy base asset volume): 主动买入的交易量。
  • 主动卖出成交量 (Taker buy quote asset volume): 主动卖出的交易量。
  • 忽略字段 (Ignore): 通常是一个占位符,可以忽略。

通过调整请求参数,例如 symbol (交易对)、 interval (时间间隔)和 limit (返回数据条数),您可以灵活地定制K线数据的获取。例如,要获取BTCUSDT交易对的1小时K线数据,您可以设置 symbol=BTCUSDT interval=1h limit 参数用于限制返回的K线数量,通常用于控制API响应的大小。

使用K线数据可以进行各种技术分析,例如识别趋势、寻找支撑位和阻力位、以及评估市场波动性。开发者可以将这些数据集成到交易机器人、图表工具和其他分析应用程序中,以便更好地了解市场动态和做出明智的交易决策。

API Endpoint: K线数据接口

请求方式: GET

接口地址: /api/v3/klines

接口描述: 此接口用于获取指定交易对的K线数据。K线数据是加密货币交易分析的重要组成部分,反映了特定时间段内资产的价格变动情况,包括开盘价、最高价、最低价和收盘价(OHLC)。

请求参数:

  • symbol (必选): 交易对代码,例如 BTCUSDT 。指定需要获取K线数据的交易对。
  • interval (必选): K线时间间隔,例如 1m (1分钟), 5m (5分钟), 15m (15分钟), 30m (30分钟), 1h (1小时), 4h (4小时), 1d (1天), 1w (1周), 1M (1月)。定义每根K线代表的时间长度。
  • startTime (可选): 开始时间戳,以毫秒为单位。用于指定K线数据的起始时间。
  • endTime (可选): 结束时间戳,以毫秒为单位。用于指定K线数据的结束时间。
  • limit (可选): 返回的数据条数限制,默认值和最大值为 1000。控制返回K线数据的数量。

返回数据格式:

返回一个JSON数组,每个元素代表一根K线,包含以下数据:

  1. 开盘时间 (Unix timestamp in milliseconds)
  2. 开盘价 (string)
  3. 最高价 (string)
  4. 最低价 (string)
  5. 收盘价 (string)
  6. 成交量 (string)
  7. 收盘时间 (Unix timestamp in milliseconds)
  8. 成交额 (string)
  9. 交易笔数 (number)
  10. 主动买入的成交量 (string)
  11. 主动买入的成交额 (string)
  12. 忽略此参数 (string)

示例:

GET /api/v3/klines?symbol=BTCUSDT&interval=1h&limit=100

此请求将返回BTCUSDT交易对最近100小时的K线数据。

注意事项:

  • 时间戳使用UTC时间,单位为毫秒。
  • 返回的数据是按照时间顺序排列的,从旧到新。
  • 如果未指定 startTime endTime ,则默认返回最近的K线数据。
  • 频率限制可能适用。请参考API文档中的频率限制部分。
  • 请仔细检查 symbol interval 参数的有效性。

Parameters:

  • symbol : 交易对,用于指定需要查询历史K线数据的加密货币交易对。例如, BTCUSDT 代表比特币与USDT的交易对, ETHBTC 代表以太坊与比特币的交易对。 必须使用交易所支持的交易对格式。
  • interval : K线时间间隔,定义了每个K线所代表的时间周期。例如, 1m 表示1分钟K线,每个K线包含了1分钟内的开盘价、最高价、最低价和收盘价等信息。 常用的时间间隔包括: 1m (1分钟), 3m (3分钟), 5m (5分钟), 15m (15分钟), 30m (30分钟), 1h (1小时), 2h (2小时), 4h (4小时), 6h (6小时), 8h (8小时), 12h (12小时), 1d (1天), 3d (3天), 1w (1周), 1M (1月)。选择合适的时间间隔取决于交易策略和分析周期。
  • startTime : (可选) 起始时间戳,用于指定查询历史K线数据的起始时间。 时间戳必须为Unix时间戳,单位为毫秒。 如果未指定,则默认从最早的数据开始查询(取决于交易所的数据保留策略)。例如, 1678886400000 代表 2023年3月15日 00:00:00 UTC。
  • endTime : (可选) 结束时间戳,用于指定查询历史K线数据的结束时间。时间戳必须为Unix时间戳,单位为毫秒。 如果未指定,则默认查询到最新的数据。结束时间戳应晚于起始时间戳。 例如, 1678972800000 代表 2023年3月16日 00:00:00 UTC。
  • limit : (可选) 返回数据条数,用于限制返回的K线数据条数。默认值为 500,最大值为 1000。 如果请求的数据量超过限制,则只会返回指定数量的数据。 该参数用于控制请求的数据量,避免服务器压力过大。

示例 (Python): 获取Binance K线数据

使用Python获取Binance交易所的K线数据,需要用到 requests 库进行API请求, pandas 库进行数据处理,以及 datetime 库处理时间戳。

import requests
import pandas as pd
import datetime

def get_klines(symbol, interval, start_time, end_time):
    """
    从Binance API获取K线数据。

    Args:
        symbol (str): 交易对,例如 "BTCUSDT"。
        interval (str): K线时间间隔,例如 "1m", "5m", "1h", "1d"。
        start_time (int): 起始时间戳,单位毫秒。
        end_time (int): 结束时间戳,单位毫秒。

    Returns:
        pandas.DataFrame: 包含K线数据的DataFrame,包含开盘时间、开盘价、最高价、最低价、收盘价、交易量等信息。
    """

    base_url = "https://api.binance.com/api/v3/klines"
    params = {
        "symbol": symbol,
        "interval": interval,
        "startTime": start_time,
        "endTime": end_time,
        "limit": 1000  # 每次请求最多获取1000条数据,Binance API的限制
    }

    data = []
    while True:
        try:
            response = requests.get(base_url, params=params)
            response.raise_for_status()  # 检查HTTP状态码,如果请求失败则抛出异常
        except requests.exceptions.RequestException as e:
            print(f"请求失败: {e}")
            break

        try:
            klines = response.() # 将响应的JSON数据解析为Python列表
        except ValueError:
            print("无法解析JSON响应")
            break

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

        data.extend(klines)

        # 更新 startTime,用于获取下一批数据。由于每次最多获取1000条,需要循环请求直到达到end_time
        params["startTime"] = klines[-1][0] + 1  # 下一个K线的起始时间戳

        if params["startTime"] >= end_time:
            break  # 已经获取到endTime之前的数据

    df = pd.DataFrame(data, columns=[
        "Open time", "Open", "High", "Low", "Close", "Volume", "Close time",
        "Quote asset volume", "Number of trades", "Taker buy base asset volume",
        "Taker buy quote asset volume", "Ignore"
    ])

    # 将数据类型转换为数值类型
    numeric_cols = ["Open", "High", "Low", "Close", "Volume", "Quote asset volume",
                    "Taker buy base asset volume", "Taker buy quote asset volume"]
    df[numeric_cols] = df[numeric_cols].astype(float)

    # 将时间戳转换为日期时间,  unit="ms"表示毫秒
    df["Open time"] = pd.to_datetime(df["Open time"], unit="ms")
    df["Close time"] = pd.to_datetime(df["Close time"], unit="ms")

    return df

示例用法

在加密货币交易和分析中,获取历史K线数据是至关重要的一步。以下示例展示了如何利用编程接口获取指定交易对、时间间隔和时间范围内的K线数据,以便进行进一步的量化分析或策略回测。

symbol = "BTCUSDT"
指定交易对,例如比特币兑泰达币 (BTCUSDT)。这是你希望获取K线数据的交易市场。不同的交易所支持不同的交易对,请根据实际情况进行选择。

interval = "1h"
定义K线的时间间隔。 "1h" 表示每小时一个K线。其他常见的时间间隔包括 "1m" (1分钟), "5m" (5分钟), "15m" (15分钟), "30m" (30分钟), "4h" (4小时), "1d" (1天), "1w" (1周), "1M" (1月) 等。选择合适的时间间隔取决于你的分析需求和交易策略。

start_time = int(datetime.datetime(2023, 1, 1).timestamp() * 1000)
设置K线数据的起始时间。这里将 2023年1月1日 00:00:00 转换为 Unix 时间戳(毫秒)。 Unix 时间戳是从1970年1月1日 00:00:00 UTC开始到指定时间的秒数,乘以1000得到毫秒数。 datetime 模块用于方便地创建和操作日期时间对象。

end_time = int(datetime.datetime(2023, 1, 31).timestamp() * 1000)
设置K线数据的结束时间。这里将 2023年1月31日 23:59:59 转换为 Unix 时间戳(毫秒)。 确保结束时间晚于起始时间,以获取有效的时间范围数据。

klines_df = get_klines(symbol, interval, start_time, end_time)
调用 get_klines 函数,传入交易对、时间间隔、起始时间和结束时间作为参数,获取K线数据。该函数返回一个 DataFrame 对象,其中包含从交易所获取的历史K线数据。 DataFrame 是一种常用的数据结构,可以方便地进行数据分析和处理。

print(klines_df)
打印 DataFrame 对象,显示获取到的K线数据。 DataFrame 通常包含以下列:开盘价 (Open), 最高价 (High), 最低价 (Low), 收盘价 (Close), 成交量 (Volume) 以及时间戳 (Timestamp) 等。这些数据可以用于各种技术指标的计算和图表绘制。

将K线数据保存到CSV文件

为了便于本地存储和后续分析,我们可以将获取到的K线数据以CSV(逗号分隔值)文件的形式保存到硬盘上。 pandas 库提供了方便的 to_csv() 方法来实现这一功能。

klines_df.to_csv("btc_usdt_1h_klines.csv", index=False)

上述代码将名为 klines_df DataFrame 对象保存为名为 btc_usdt_1h_klines.csv 的CSV文件。其中:

  • klines_df :这是包含K线数据的 DataFrame 对象,数据已经整理完毕。
  • "btc_usdt_1h_klines.csv" :这是保存文件的路径和文件名。您可以根据需要修改文件路径和文件名,例如保存到特定文件夹下,或者使用不同的命名方式。文件名通常包含交易对(如 btc_usdt )、时间周期(如 1h )和数据类型(如 klines ),以便于识别和管理。
  • index=False :这个参数非常重要。它指示 pandas 不要将 DataFrame 的索引写入CSV文件。默认情况下, to_csv() 会将索引也作为一列数据写入,但这通常是不必要的,因为索引通常只在 DataFrame 内部使用。如果不设置 index=False ,CSV文件会多出一列无用的索引数据。

通过执行这段代码,您将在指定的路径下获得一个包含K线数据的CSV文件,可以使用Excel、Google Sheets等软件打开和查看,也可以使用Python或其他编程语言进行进一步的分析和处理。确保在运行代码之前,您已经安装了 pandas 库,并且 klines_df 对象已经正确创建并包含了K线数据。

代码解释:

  1. 导入库: 详细阐述了所需Python库的功能及在脚本中的作用。
    • requests : 用于向Binance API发送HTTP请求,获取加密货币的K线数据。 它允许Python程序与Web服务器进行交互,并检索所需的数据。
    • pandas : 强大的数据分析和处理库,用于将获取到的K线数据整理成易于操作的DataFrame结构。 提供了高效的数据结构和数据分析工具。
    • datetime : 用于处理时间戳,将从API获取的Unix时间戳转换为更易读的日期时间格式。
  2. get_klines 函数: 深入解析该函数的功能、参数以及实现逻辑。
    • 参数详解:
      • symbol : 指定要查询的加密货币交易对,例如 "BTCUSDT" 代表比特币兑美元。
      • interval : 定义K线的时间间隔,例如 "1m" 代表1分钟,"1h" 代表1小时,"1d" 代表1天。
      • start_time : K线数据的起始时间戳 (Unix timestamp, 毫秒级别)。
      • end_time : K线数据的结束时间戳 (Unix timestamp, 毫秒级别)。
    • API 请求构造: 基于传入的参数,构建完整的Binance API请求URL。 包含了API endpoint地址以及请求参数。
    • 分页获取数据: Binance API 对单次请求返回的数据量有限制,因此使用循环分页机制来获取所有数据。 通过循环不断更新 startTime ,直到获取到指定 endTime 之前的所有数据,确保数据的完整性。
    • 数据转换与处理:
      • 将从API获取的JSON格式数据转换为 pandas DataFrame,方便进行后续的数据分析和处理。
      • 设置 DataFrame 的列名,使其更具可读性,方便理解每一列数据的含义。
      • 将 DataFrame 中的数值列 (例如开盘价、最高价、最低价、收盘价、交易量) 转换为 float 类型,以便进行数值计算。
      • 将时间戳列转换为日期时间类型,方便进行时间序列分析。
    • 返回值: 该函数返回一个包含所有 K线数据的 pandas DataFrame。
  3. 示例用法: 详细说明如何使用 get_klines 函数获取数据,并进行简单的后续处理。
    • 参数设置: 设置 symbol , interval , start_time end_time 变量,指定要获取的K线数据范围。
    • 函数调用: 调用 get_klines 函数,传入设置好的参数,获取K线数据。
    • 数据展示: 使用 print(df) 打印 DataFrame,查看获取到的K线数据。
    • 数据持久化: 将 DataFrame 保存到 CSV 文件,方便后续的数据分析和使用。文件名可以自定义,例如 "btc_klines.csv"。

重要提示:

  • Binance API 请求频率限制 (Rate Limits): Binance API 为了保障服务器稳定性和公平性,对请求频率设置了严格的限制。超出限制的请求将被拒绝,并可能导致您的 IP 地址或 API 密钥被暂时或永久封禁。您必须仔细阅读 Binance API 的官方文档,了解不同 API 端点的具体频率限制,例如每分钟允许的请求数量。API 返回的 HTTP 状态码 429 表示“请求过多”,表明您已超出频率限制。应实施合理的错误处理机制,例如指数退避算法,在遇到 429 错误时暂停一段时间后重试,并逐步增加暂停时间,避免再次触发限制。也可以使用 Binance 提供的 Websocket 接口订阅实时数据,减少对 REST API 的请求次数。
  • 时间戳单位为毫秒: Binance API 中所有与时间相关的数据,例如订单创建时间、交易时间等,均以 Unix 时间戳表示,单位为毫秒。Unix 时间戳是从 1970 年 1 月 1 日 00:00:00 UTC 到当前时间的总毫秒数。您需要确保在构建 API 请求和解析 API 响应时,正确处理时间戳的单位。如果您的编程语言或库默认使用秒作为时间戳单位,必须进行相应的转换。例如,将秒数乘以 1000 转换为毫秒数。错误的单位换算可能导致数据分析结果不准确,甚至导致交易错误。
  • 循环获取数据时的边界情况处理: 在通过循环迭代方式获取 Binance API 数据(例如历史交易记录或 K 线数据)时,需要特别注意边界情况。API 通常会分页返回数据,您需要使用 `limit` 和 `offset` 或其他分页参数来控制每次请求返回的数据量和起始位置。循环过程中,您需要判断是否已经到达最后一页,避免无限循环或数据重复。同时,API 可能会返回空数据或错误代码,需要进行相应的处理。例如,当 API 返回的数据量小于 `limit` 时,可能表示已经到达最后一页。另外,也要考虑 API 数据的更新频率,确保获取到所有最新的数据。

使用 GET /api/v3/historicalTrades 获取历史成交记录

该端点允许您检索特定交易对的历史成交数据,是分析市场趋势和交易行为的重要工具。 通过此接口,您可以获取包括成交价格、成交数量、成交时间和买卖方向等详细信息,从而更深入地了解市场动态。

重要提示: 由于数据量较大,频繁调用此接口可能会受到速率限制。 请合理安排您的请求频率,并考虑使用其他API端点(如K线数据)来获取更长时间范围的聚合数据。 为了确保数据的准确性,建议在使用前验证数据的完整性和有效性。

此端点返回的每条成交记录都包含以下关键信息:

  • id : 成交记录的唯一标识符。
  • price : 成交价格,以报价资产计价。
  • qty : 成交数量,以基础资产计价。
  • quoteQty : 成交额,即成交价格乘以成交数量。
  • time : 成交时间戳,以毫秒为单位。
  • isBuyerMaker : 指示买方是否为做市商。如果为 true ,则买方是做市商;如果为 false ,则买方是吃单方。

通过分析这些数据,您可以识别市场上的买卖压力,判断价格趋势,并制定相应的交易策略。 请务必仔细阅读API文档,了解所有参数的含义和使用方法,以便更好地利用此端点进行数据分析。

API Endpoint: 获取历史成交记录

GET /api/v3/historicalTrades

此API Endpoint用于检索指定交易对的历史成交记录。它允许开发者获取一段时间内发生的每一笔交易的详细信息,包括交易的价格、数量、交易时间以及买卖方向等关键数据。通过合理利用这些历史数据,用户可以进行深度市场分析,识别潜在的交易机会,并构建更有效的交易策略。

请求方式: GET

用途: 用于查询特定交易对的历史成交明细数据。 该接口可用于分析市场深度、价格波动、成交量模式等,进而支持量化交易策略的回测与优化,以及风险评估等应用场景。

参数说明: 调用此API通常需要传递一些参数,以指定您希望获取的历史交易记录范围。常见的参数包括:

  • symbol (必选): 指定交易对,例如 "BTCUSDT"。
  • limit (可选): 限制返回的交易记录数量。 默认值为500,最大值为1000。值越大,返回的数据越多,但响应时间可能会增加。
  • fromId (可选): 从指定的交易ID开始返回交易记录。这用于分页查询,以便获取大量历史数据。如果没有指定,则从最新的交易记录开始返回。
  • startTime (可选): 返回指定时间戳之后的交易记录。单位为毫秒。
  • endTime (可选): 返回指定时间戳之前的交易记录。单位为毫秒。

响应数据: API会返回一个JSON数组,其中每个元素代表一笔历史成交记录。每个交易记录通常包含以下字段:

  • id: 交易ID,唯一标识一笔交易。
  • price: 成交价格。
  • qty: 成交数量。
  • quoteQty: 成交额(以报价货币计)。
  • time: 成交时间(Unix时间戳,毫秒级)。
  • isBuyerMaker: 是否是买方作为maker。 如果为true,则表示买方是maker,意味着他们的订单已经挂在订单簿上,并被卖方taker吃单。
  • isBestMatch: 是否是最佳匹配。

注意事项:

  • 频繁调用此API可能会受到速率限制。开发者需要合理控制请求频率,避免触发服务器的保护机制。
  • 对于大量历史数据的获取,建议使用分页查询( fromId 参数)或时间范围查询( startTime endTime 参数),以避免一次性请求过多数据导致服务器压力过大。
  • 确保传入的参数值有效且符合API的规范。例如, symbol 参数必须是交易所支持的有效交易对。

Parameters:

  • symbol : 交易对,指定要查询的交易品种。例如, BTCUSDT 表示比特币兑 USDT 的交易对, ETHBTC 表示以太坊兑比特币的交易对。确保提供的交易对存在于交易所中,否则API调用可能会失败。不同交易所支持的交易对可能有所不同,请参考交易所的API文档。
  • limit : (可选) 返回的数据条数,控制API调用返回的交易记录数量。 默认值为 500,最大允许值为 1000。 如果未指定此参数,则API将返回默认数量的交易记录。较大的 limit 值可以获取更多的历史数据,但也可能增加API响应时间。
  • fromId : (可选) 从指定的交易ID开始获取数据,允许从历史交易记录的特定点开始检索。 fromId 是一个唯一的交易标识符,通常由交易所分配。如果没有提供 fromId ,API 将返回最新的交易记录。使用 fromId 可以实现分页或增量数据获取,例如,先获取最新的交易记录,然后使用最后一条记录的 ID 作为 fromId 来获取更早的交易记录。这种方式特别适用于需要处理大量历史数据的场景。

示例 (Python): 从 Binance 获取历史交易数据

使用 Python 编程语言,通过 Binance API 获取指定交易对的历史成交记录,并将其存储为 Pandas DataFrame 格式,便于后续数据分析和处理。

import requests import pandas as pd

定义一个名为 get_historical_trades 的函数,该函数接受交易对代码、数据条数限制以及起始交易 ID 作为参数,用于获取历史成交记录。

def get_historical_trades(symbol, limit=1000, from_id=None):
    """
    从 Binance API 获取指定交易对的历史成交记录。

    Args:
        symbol (str): 交易对代码,例如 "BTCUSDT"。
        limit (int): 返回的数据条数上限,默认为 1000,最大值为 1000。API 限制每次请求最多返回 1000 条记录。
        from_id (int, optional): 从指定的交易 ID 开始获取数据。如果未提供,则从最新的交易记录开始获取。

    Returns:
        pandas.DataFrame: 包含历史成交记录的 DataFrame,包含诸如交易时间、价格、数量等信息。

    Raises:
        requests.exceptions.HTTPError: 如果 API 请求返回错误状态码。
    """

    base_url = "https://api.binance.com/api/v3/historicalTrades"
    params = {
        "symbol": symbol,
        "limit": limit
    }

    # 如果提供了起始交易 ID,则将其添加到请求参数中。
    if from_id:
        params["fromId"] = from_id

    # 使用 requests 库发送 GET 请求到 Binance API。
    response = requests.get(base_url, params=params)

    # 如果 API 请求返回错误状态码,则抛出异常。
    response.raise_for_status()

    # 将 API 响应的 JSON 数据解析为 Python 列表。
    trades = response.()

    # 使用 Pandas 库将 Python 列表转换为 DataFrame。
    df = pd.DataFrame(trades)

    # 返回包含历史成交记录的 DataFrame。
    return df

示例用法

以下示例展示了如何使用 get_historical_trades 函数获取指定交易对的历史成交数据。

定义你感兴趣的交易对,例如 "BTCUSDT",它代表比特币兑美元泰达币的交易对。 将交易对字符串赋值给变量 symbol

symbol = "BTCUSDT"

接下来,调用 get_historical_trades 函数,并传入交易对 symbol 和需要获取的交易数量 limit 作为参数。 limit 参数用于限制返回的交易记录数量,例如设置为 1000,表示获取最近的 1000 条交易记录。

trades_df = get_historical_trades(symbol, limit=1000)

函数 get_historical_trades 将返回一个 Pandas DataFrame 对象,其中包含交易数据。 你可以使用 print(trades_df) 打印 DataFrame,以便查看获取到的历史成交数据。

print(trades_df)

trades_df DataFrame 通常包含以下列(具体取决于交易所的API):

  • timestamp : 交易发生的时间戳。
  • price : 交易的成交价格。
  • qty : 交易的数量。
  • side : 交易方向 (买入或卖出)。 通常用 "buy" 或 "sell" 表示,也可能用 1 (买入) 和 -1 (卖出) 表示。
  • is_maker : 指示该笔交易是否是由挂单方 (maker) 发起的。
  • trade_id : 交易所提供的交易ID。

请注意,实际可用的列和数据格式可能因交易所API的不同而有所差异。 建议查阅你所使用的交易所的API文档,以了解返回数据的详细结构。 过多的请求可能会触发交易所的速率限制,导致API调用失败。 请根据交易所的规定合理设置 limit 参数,并做好错误处理。

获取从指定ID开始的成交记录

假设你想从 ID 为 123456789 的成交记录开始获取

tradesdf = gethistoricaltrades(symbol, limit=1000, fromid=123456789)

print(trades_df)

代码解释:

  1. get_historical_trades 函数:
    • 接受交易对 ( symbol ,例如 "BTCUSDT"),返回数据条数 ( limit ,默认为 500,最大值为 1000) 和起始交易 ID ( from_id ,可选参数,用于指定开始获取历史成交记录的交易 ID) 作为参数。交易对参数必须符合交易所支持的交易对格式。
    • 构造 API 请求 URL,其中包含交易所的 API endpoint (例如: /api/v3/historicalTrades ) 以及必要的查询参数,如 symbol , limit fromId 。URL 的构建需要根据交易所的具体 API 文档进行调整,确保参数传递正确。
    • 发送 HTTP GET 请求至构造好的 URL,并使用 Python 的 requests 库进行网络请求。函数会检查 HTTP 响应的状态码,如果状态码不是 200 (表示成功),则会抛出异常,提示请求失败,并显示具体的错误信息。异常处理机制能够确保在 API 请求失败时,程序能够正常退出并给出错误提示。
    • 将返回的 JSON 数据转换为 pandas DataFrame。使用 pandas 库中的 pd.DataFrame() 函数将 JSON 数据转换为 DataFrame 格式,方便后续的数据分析和处理。DataFrame 的每一行代表一笔成交记录,每一列代表成交记录的各个字段,例如成交时间、价格、数量等。
    • 返回包含历史成交记录的 DataFrame。如果请求成功并且成功转换为 DataFrame,则函数会返回包含历史成交记录的 DataFrame 对象。如果请求失败或转换过程中出现错误,则会返回 None 或抛出异常。
  2. 示例用法:
    • 设置交易对,例如将 symbol 设置为 "ETHUSDT"。该参数决定了要获取哪个交易对的历史成交记录。需要确保交易所支持该交易对,否则 API 请求会失败。
    • 调用 get_historical_trades 函数获取数据,可以选择指定 limit from_id 参数。例如, get_historical_trades(symbol="BTCUSDT", limit=100, from_id=12345) 将获取 BTCUSDT 交易对的 100 条历史成交记录,从交易 ID 为 12345 的记录开始。
    • 打印 DataFrame,可以使用 print(df) 函数将 DataFrame 的内容打印到控制台。为了更好地查看数据,可以使用 df.head() 函数打印 DataFrame 的前几行,或者使用 df.describe() 函数查看数据的统计信息。
    • 展示了如何使用 from_id 参数从指定交易 ID 开始获取数据。 from_id 参数允许用户从特定的交易 ID 开始获取历史成交记录,这在处理大量数据时非常有用。例如,如果已经获取了前 1000 条成交记录,可以记录下最后一条成交记录的 ID,然后使用该 ID 作为 from_id 参数,继续获取后续的成交记录,避免重复获取数据。

重要提示:

  • 频率限制: 与 K 线数据类似,使用 Binance API 获取交易历史数据时,务必密切关注并严格遵守 Binance API 的频率限制。超出限制可能导致您的请求被拒绝,影响数据获取。建议在程序中实现适当的延迟和错误处理机制,以避免触发频率限制。具体限制信息请参考 Binance API 官方文档。
  • 分页和迭代: Binance API 对交易历史数据的获取采用分页机制。
    • 首次请求: 如果没有提供 fromId 参数,API 将默认返回最新的交易记录。
    • 获取更早数据: 如果需要获取更早的交易记录,必须使用 fromId 参数进行迭代。 fromId 代表交易 ID,用于指定从哪个交易开始返回数据。
    • 迭代流程:
      1. 首次获取: 先执行一次 API 请求,获取一批最新的交易数据。
      2. 获取最早 ID: 在返回的数据中,找到最早(时间戳最小)的交易记录,提取其对应的交易 ID。
      3. 迭代请求: 将该交易 ID 作为 fromId 参数,再次发起 API 请求,获取更早的交易数据。
      4. 重复迭代: 重复上述步骤,直到获取到所需的所有交易记录。
    请注意,每次迭代都需要更新 fromId ,否则会重复获取相同的数据。 要注意维护好已获取到的数据列表,避免数据重复或者丢失。

使用 GET /api/v3/aggTrades 获取聚合成交记录

该端点与 GET /api/v3/historicalTrades 类似,但 GET /api/v3/aggTrades 返回的是聚合的成交记录,而非原始的逐笔成交数据。 聚合的成交记录将一段时间内的多笔交易合并成一条记录,提供更简洁的市场活动视图。

通过此接口,您可以查询指定交易对的聚合交易信息。返回的数据包含了成交价格、成交数量、成交时间以及其他相关信息,这些信息已经被聚合成更易于分析的形式。例如,您可以获取在特定时间范围内以某个价格区间发生的总成交量,而无需处理大量的原始交易数据。

使用 GET /api/v3/aggTrades 接口能够有效减少数据传输量,降低客户端的处理负担,尤其是在需要快速了解市场整体交易情况时。适用于对历史成交数据进行统计分析、绘制K线图等场景。

API Endpoint: 获取聚合交易数据

GET /api/v3/aggTrades

此API接口用于获取指定交易对的聚合交易数据。聚合交易是原始交易数据的聚合,它将多个在短时间内发生的、价格相近的交易合并成一条记录,从而减少数据量,便于分析。

通过此接口,您可以获取诸如聚合交易ID、价格、数量、成交时间戳以及买方是否是做市商等信息。这对于进行高频交易策略回测、市场深度分析以及快速了解市场动向非常有帮助。

请求参数:

  • symbol (必选): 交易对代码,例如 "BTCUSDT"。
  • fromId (可选): 从指定的聚合交易ID开始获取数据。
  • startTime (可选): 开始时间戳(毫秒)。
  • endTime (可选): 结束时间戳(毫秒)。
  • limit (可选): 返回的聚合交易数量限制,默认值为500,最大值为1000。

响应示例:


[
  {
    "a": 26129,       // 聚合交易ID
    "p": "0.01633102",  // 价格
    "q": "4.70443515",  // 数量
    "f": 27781,       // 首个交易ID
    "l": 27781,       // 末个交易ID
    "T": 1498793709153, // 交易时间戳
    "m": false,      // 买方是否是做市商
    "M": true       // 忽略
  }
]

注意事项:

  • 如果没有指定 fromId startTime endTime ,则返回最新的聚合交易数据。
  • 如果同时指定了 fromId startTime endTime ,则优先使用 fromId
  • 时间戳必须是Unix时间戳的毫秒表示。
  • 请求过于频繁可能会导致IP被限制访问。

Parameters:

  • symbol : 交易对,用于指定您希望查询历史成交记录的交易市场。例如, BTCUSDT 代表比特币兑美元的交易对, ETHBTC 代表以太坊兑比特币的交易对。选择正确的交易对是获取目标市场数据的关键。
  • fromId : (可选) 从指定的交易ID开始获取数据。此参数允许您从特定的成交ID开始检索历史成交数据,常用于断点续传或增量更新数据。如果您只想获取某个时间点之后的新成交记录,可以使用此参数。请注意, fromId 必须是已存在的成交ID。
  • startTime : (可选) 起始时间戳,单位毫秒。时间戳代表自 epoch(1970 年 1 月 1 日 00:00:00 UTC)以来的毫秒数。通过设置 startTime ,您可以指定开始检索历史成交记录的时间点。例如,如果您只想获取某个特定日期之后的交易记录,可以使用该日期对应的时间戳。
  • endTime : (可选) 结束时间戳,单位毫秒。与 startTime 类似, endTime 用于指定结束检索历史成交记录的时间点。通过同时设置 startTime endTime ,您可以精确地定义需要获取的历史成交记录的时间范围。如果不设置 endTime ,则默认检索到当前时间的成交记录。
  • limit : (可选) 返回数据条数,默认 500,最大 1000。此参数用于控制API返回的成交记录数量。如果您需要获取大量历史数据,可能需要多次调用API,并根据 fromId 参数进行分页。请注意,超过最大限制 1000 将导致API报错。

示例 (Python):

import requests import pandas as pd import datetime

def get_aggregate_trades(symbol, start_time=None, end_time=None, from_id=None, limit=1000): """ 获取 Binance 聚合成交记录。聚合交易是指将多个小额交易合并成一笔交易,通常用于隐藏真实交易量,减少市场操纵的可能性。通过API获取聚合交易数据,可以分析市场微观结构,了解交易活动的模式。

Args:
     symbol (str): 交易对,例如 "BTCUSDT"。这是必填参数,指定要查询的交易对。注意区分大小写,确保与币安交易所使用的符号完全匹配。
    start_time (int, optional): 起始时间戳,单位毫秒。如果未提供,则从最早的可用数据开始获取。提供起始时间可以精确控制获取数据的起始点。
     end_time (int, optional): 结束时间戳,单位毫秒。如果未提供,则获取到最新的数据。与起始时间配合使用,可以限定查询的时间范围。
       from_id (int, optional): 从指定的交易ID开始获取数据。用于增量式获取数据,避免重复获取已经处理过的交易记录。如果已知上次获取的最后一个交易ID,可以使用此参数从下一个交易开始获取。
      limit (int, optional): 返回数据条数,默认 500,最大 1000。限制每次API调用返回的交易记录数量。合理设置limit可以平衡API调用次数和数据获取效率。

Returns:
     pandas DataFrame: 包含聚合成交记录的DataFrame。DataFrame的每一行代表一笔聚合成交记录,包含交易ID、价格、数量、买方是否是做市商等信息。
"""

base_url = "https://api.binance.com/api/v3/aggTrades"
params = {
     "symbol": symbol,
     "limit": limit
}
if start_time:
     params["startTime"] = start_time
if end_time:
     params["endTime"] = end_time
if from_id:
     params["fromId"] = from_id

response = requests.get(base_url, params=params)
response.raise_for_status() # 检查HTTP响应状态码,如果不是200则抛出异常

trades = response.()

df = pd.DataFrame(trades)

return df

示例用法

以下代码展示了如何使用 get_aggregate_trades 函数获取指定时间段内特定交易对的聚合交易数据。 请确保您已安装相应的依赖库,例如 pandas ,如果需要对数据进行进一步的分析和处理。

symbol = "BTCUSDT" : 定义了交易对符号,这里以比特币兑美元(BTCUSDT)为例。您可以根据需要修改为其他任何交易所支持的交易对,例如ETHUSDT,LTCBTC等。 不同的交易对代表着不同的数字资产组合。

start_time = int(datetime.datetime(2023, 1, 1).timestamp() * 1000) : 设置起始时间。 datetime.datetime(2023, 1, 1) 创建一个表示2023年1月1日的 datetime 对象。 .timestamp() 方法将其转换为Unix时间戳(秒),然后乘以1000得到毫秒级时间戳,这是API通常需要的格式。通过将结果转换为整数,确保时间戳符合API的要求,避免浮点数带来的潜在问题。

end_time = int(datetime.datetime(2023, 1, 31).timestamp() * 1000) : 设置结束时间。 类似于起始时间的处理方式,这里设置结束时间为2023年1月31日,同样转换为毫秒级Unix时间戳。选择合适的起始时间和结束时间,可以控制数据获取的时间范围,从而满足不同的分析需求。 请注意,过大的时间范围可能导致请求超时或返回大量数据,需要合理设置。

agg_trades_df = get_aggregate_trades(symbol, start_time=start_time, end_time=end_time, limit=1000) : 调用 get_aggregate_trades 函数,传入交易对符号、起始时间、结束时间和数量限制。 limit=1000 参数限制了每次API请求返回的聚合交易数量。 您可以根据需要调整 limit 参数,但是需要注意交易所API的限制,避免超过最大限制而导致请求失败。 返回的 agg_trades_df 通常是一个 pandas DataFrame 对象,包含了聚合交易数据,例如成交价格、成交数量、成交时间等。

print(agg_trades_df) : 打印返回的聚合交易数据,方便查看和调试。 在实际应用中,您可以将 agg_trades_df 用于进一步的数据分析、可视化或者策略回测。

代码解释:

这段代码的功能与获取历史成交记录的代码逻辑高度相似,其核心差异体现在它所调用的 Binance API 端点不同。这里使用的是 /api/v3/aggTrades 接口,该接口专门用于获取聚合交易记录。聚合交易记录将短时间内发生的多次交易合并成一条数据,从而减少数据量,提高查询效率。与获取原始交易记录的接口相比, /api/v3/aggTrades 接口通常返回的数据更简洁,更适合用于分析市场趋势。

更重要的是,此代码段引入了对 startTime endTime 参数的支持。这两个参数允许用户指定一个时间范围,精确地获取该时间段内的聚合交易数据。 startTime 定义了查询的起始时间,而 endTime 则定义了查询的结束时间。这两个参数都应该以 Unix 时间戳的形式提供,单位通常是毫秒。 通过这两个参数,开发者可以灵活地按时间段检索数据,例如,可以获取过去 24 小时内的所有聚合交易记录,或者获取某个特定交易对在特定时间窗口内的交易活动。这对于量化交易策略的回测和实时监控至关重要。

使用 startTime endTime 参数需要注意时间戳的格式和时区问题,确保与 API 的要求一致。频繁地请求大量历史数据可能会触发 API 的速率限制,开发者需要合理设置请求频率,避免被限制访问。对于更长时间跨度的历史数据,可能需要分页查询或者使用其他更高级的 API 功能。

重要提示:

  • API 频率限制: 与访问 K 线数据和历史成交记录相同,务必密切关注 Binance API 的频率限制。过度请求可能导致您的 IP 地址被暂时或永久屏蔽。请仔细阅读并遵守 Binance API 官方文档中关于请求频率的详细说明,并采取适当的策略,例如实施请求队列和指数退避算法,以避免触及限制。 使用WebSocket流式传输可以减少频率限制的问题。
  • 聚合成交记录的权衡: 获取聚合成交记录可以在一定程度上减少需要处理的数据量,从而降低带宽和存储需求。然而,这种聚合方式会不可避免地损失部分原始交易的细节信息,例如精确的成交时间和独立的交易 ID。 在选择使用聚合成交记录时,务必充分评估其对您的分析和交易策略的影响,并根据实际需求进行权衡。 某些交易策略可能依赖于微观层面的交易数据,而聚合成交记录可能无法满足这些需求。

掌握 Binance API 获取历史数据的方法对于加密货币交易者和研究人员至关重要。通过合理使用 GET /api/v3/klinesGET /api/v3/historicalTradesGET /api/v3/aggTrades 等端点,可以获取各种历史数据,为回测、策略开发和市场分析提供支持。在实际使用中,需要注意 Binance API 的频率限制,并根据实际需求选择合适的端点和参数。

原创声明:本文仅代表作者观点,不代表 区主线 立场。系作者授权新闻网站模板发表,未经授权不得转载。
相关文章 ARTICLE
币安提现记录全攻略:秒查历史,资金安全无忧!

币安提现记录全攻略:秒查历史,资金安全无忧!

想知道如何快速查看币安平台的提现记录?本文详细介绍了网页版和APP版的操作步骤,助您轻松掌握资金动向,保障资产安全。从登录账户到筛选记录,再到查看交易详情...

想知道KuCoin API如何实时掌握行情?新手教程来了!

想知道KuCoin API如何实时掌握行情?新手教程来了!

本文详细介绍了如何使用KuCoin...

Kraken实时数据秘籍:加密货币交易决策的加速器!

Kraken实时数据秘籍:加密货币交易决策的加速器!

本文深入讲解如何在Kraken交易所获取实时交易数据,包括网页端、APP和API三种方法,助力加密货币投资者及时掌握市场动态,提升交易决策效率。

Upbit订单历史:揭秘盈利密码,告别盲目交易!

Upbit订单历史:揭秘盈利密码,告别盲目交易!

Upbit订单历史记录是加密货币交易者的宝贵工具,通过分析订单类型、价格、数量、手续费等信息,可以有效管理风险,优化交易策略,并确保税务合规。本文详细解读...

欧易OKX API申请:5分钟搞定,量化交易起飞!

欧易OKX API申请:5分钟搞定,量化交易起飞!

本文详述欧易OKX API申请流程,从账户登录到密钥管理,步步清晰。强调安全第一,权限控制,助你安全高效地进行量化交易。

HTX API交易实战:快速入门与安全指南!

HTX API交易实战:快速入门与安全指南!

本文全面介绍了如何在HTX交易所使用API接口进行交易,从API密钥的获取和安全须知,到环境配置、常用API接口,再到代码示例,帮助读者快速上手并安全使用HTX API。

OKX API第三方交易指南:安全吗?风险高不高?一文全解!

OKX API第三方交易指南:安全吗?风险高不高?一文全解!

OKX API功能强大,但第三方交易涉及安全与合规。本文详解API功能、权限控制、风控措施及注意事项,助你安全高效地进行OKX API交易。

币圈止损利器:Binance&Bitfinex保驾护航!

币圈止损利器:Binance&Bitfinex保驾护航!

本文深入解析币安和Bitfinex交易所止损单的使用方法,包括止损市价单、止损限价单、追踪止损单等,助您在加密货币市场中有效控制风险,保护投资。同时强调止...

必看!Binance/Gate.io跨链交易指南:掌握资产转移秘诀!

必看!Binance/Gate.io跨链交易指南:掌握资产转移秘诀!

本文深入解析Binance和Gate.io的跨链交易,涵盖直接提现、BinanceBridge等方法,并强调风险提示,助您安全高效地进行跨链操作,畅游区块链世界。

Bithumb交易所历史数据揭秘:韩国加密货币投资趋势洞察?

Bithumb交易所历史数据揭秘:韩国加密货币投资趋势洞察?

本文深入剖析Bithumb交易所的历史数据,分析其交易量与韩国加密货币市场的关系,探讨投资者偏好、监管影响及安全问题,展望其未来发展。