您现在的位置是: 首页 >  平台 平台

币安&Coinbase BTC数据速递:Python抓取实战,交易掘金!

时间:2025-03-06 102人已围观

如何在币安和Coinbase获取比特币交易数据

本文将详细介绍如何在币安(Binance)和 Coinbase 这两个主流加密货币交易所获取比特币(BTC)交易数据。 这些数据对于算法交易、市场分析、研究和构建交易机器人至关重要。我们将探讨不同的数据获取方式,包括交易所的API以及其他可用的工具和库。

1. 通过币安API获取比特币交易数据

币安提供了强大的 REST API 和 WebSocket API,可以用来获取各种市场数据,包括比特币的交易数据。

1.1 注册币安账号并获取API密钥

要开始使用币安API进行交易或数据分析,您需要先注册一个币安账户。请访问币安官方网站,按照注册流程完成账户创建。注册过程通常需要提供您的电子邮件地址、设置密码,并进行身份验证(KYC)。身份验证可能需要您提供个人信息和身份证明文件,以便币安符合监管要求并确保账户安全。

注册成功后,登录您的币安账户。导航至用户中心,找到“API管理”或类似的页面。在此页面,您可以创建一个新的API密钥对。API密钥对由一个API Key(公钥)和一个Secret Key(私钥)组成。API Key用于识别您的身份,而Secret Key用于对您的API请求进行签名,确保请求的真实性和完整性。

在创建API密钥时,请务必谨慎设置权限。为了最大程度地保护您的资金安全,强烈建议您仅授予“读取权限(Read Only)”,除非您需要使用API进行交易。如果您确实需要交易权限,请仔细评估风险,并采取额外的安全措施,例如设置交易额度限制。

另一个重要的安全措施是启用IP地址限制。通过将API密钥限制为仅允许来自特定IP地址的访问,您可以防止未经授权的访问。建议您只允许您自己的服务器或计算机的IP地址访问API。如果您不确定您的IP地址,您可以使用在线IP查找工具进行查询。

创建API密钥后,请务必妥善保管您的API Key和Secret Key。Secret Key只会显示一次,因此请立即将其保存到安全的地方,例如密码管理器或加密的文本文件。如果您的Secret Key泄露,请立即撤销该API密钥并创建一个新的密钥对。

请注意,币安可能会根据安全策略更改API的使用规则。建议您定期查阅币安的API文档和更新公告,以确保您的应用程序与最新的API版本兼容,并符合所有安全要求。

1.2 使用REST API获取历史交易数据

币安REST API提供了一系列端点,用于获取历史交易数据,这对于技术分析、策略回测以及构建交易机器人至关重要。 其中一个核心端点是 /api/v3/klines ,它允许用户检索指定时间段内的K线数据(也称为蜡烛图数据)。 这些K线数据包含每个时间段内的开盘价(Open)、最高价(High)、最低价(Low)、收盘价(Close)以及成交量(Volume)等关键信息,通常简称为OHLCV数据。 通过调整时间周期和数据条数,可以获取不同粒度的历史数据。

以下是一个使用Python和流行的HTTP客户端库 requests 来获取BTCUSDT交易对最近5分钟K线数据的示例代码。 使用 requests 库可以方便地发送HTTP请求并处理API返回的JSON数据。 该示例展示了如何构建API URL,发送GET请求,处理响应,并将返回的数据解析为可用的Python数据结构。

import requests

def get_binance_klines(symbol, interval, limit):

"""

获取币安K线数据

Args:
    symbol (str): 交易对,例如 "BTCUSDT"
    interval (str): K线周期,例如 "5m" (5分钟), "1h" (1小时), "1d" (1天)
    limit (int): 返回的数据条数 (最大值为1000,超过1000需要多次请求或使用其他方式)

Returns:
    list: K线数据列表,每个元素是一个列表,包含开盘时间, 开盘价, 最高价, 最低价, 收盘价, 成交量等信息.  每个K线数据的格式为:[timestamp, open, high, low, close, volume, close_time, quote_asset_volume, number_of_trades, taker_buy_base_asset_volume, taker_buy_quote_asset_volume, ignore]
"""

url = f"https://api.binance.com/api/v3/klines?symbol={symbol}&interval={interval}&limit={limit}"

response = requests.get(url)

response.raise_for_status() # 如果请求失败(例如404, 500错误),抛出HTTPError异常

return response.()

if __name__ == '__main__':

symbol = "BTCUSDT"

interval = "5m"

limit = 100 # 获取最近100条5分钟K线数据

klines = get_binance_klines(symbol, interval, limit)

# 打印K线数据
for kline in klines:
    timestamp = kline[0]
    open_price = kline[1]
    high_price = kline[2]
    low_price = kline[3]
    close_price = kline[4]
    volume = kline[5]
    print(f"时间: {timestamp}, 开: {open_price}, 高: {high_price}, 低: {low_price}, 收: {close_price}, 量: {volume}")

# 可以将数据保存到CSV文件或者数据库中,以便后续分析,例如:
# import csv
# with open('btcusdt_5m_klines.csv', 'w', newline='') as csvfile:
#     writer = csv.writer(csvfile)
#     writer.writerow(['timestamp', 'open', 'high', 'low', 'close', 'volume']) # 写入表头
#     for kline in klines:
#         writer.writerow(kline[:6])  # 写入数据,只取前6个元素

这段代码的核心在于 get_binance_klines 函数。该函数接收交易对( symbol )、K线周期( interval )和数据条数( limit )作为参数。它使用这些参数构建一个完整的API请求URL,并通过 requests.get() 方法发送一个GET请求到币安服务器。 response.raise_for_status() 方法用于检测HTTP响应状态码,并在发生错误时抛出异常,以确保代码的健壮性。 response.() 方法将返回的JSON格式数据解析成Python列表,方便后续处理。 在主程序中,我们调用该函数获取数据,并遍历打印结果。为了方便进一步的分析,建议将数据保存到文件,例如CSV格式。

除了 K线数据,币安REST API还提供了许多其他有用的端点,用于获取更全面的市场数据和交易信息,这些数据对于开发更复杂的交易策略和分析工具至关重要,例如:

  • /api/v3/trades :获取指定交易对最近的交易记录。 可以设置 limit 参数来控制返回的交易记录数量。返回的数据包含交易时间、价格、数量、买卖方向等信息。
  • /api/v3/depth :获取指定交易对当前订单簿深度。 可以设置 limit 参数来控制返回的订单簿深度。订单簿深度反映了市场上买单和卖单的分布情况,对于分析市场供需关系非常有帮助。
  • /api/v3/ticker/price : 获取单个交易对的最新价格。
  • /api/v3/ticker/24hr : 获取单个交易对的24小时价格变动统计。
  • /api/v3/exchangeInfo : 获取交易所交易对信息,包括交易对名称,交易对状态,价格和数量的最小单位等。

1.3 使用WebSocket API 获取实时交易数据

币安WebSocket API 提供了实时、高频的数据流,可以用于获取实时交易数据,例如实时成交价格、成交量等信息。与传统的REST API相比,WebSocket API 允许服务器主动向客户端推送数据,无需客户端频繁轮询服务器,从而显著降低延迟,提高数据获取的效率。尤其在高频交易、算法交易等场景下,WebSocket API 是获取实时市场数据的首选方式。

以下是一个使用 Python 的 asyncio 库和 websockets 库获取 BTCUSDT 交易对实时交易数据的示例代码:

import asyncio
import websockets
import 

async def subscribe_binance_trades(symbol):
    """
    订阅币安实时交易数据。

    Args:
        symbol (str): 交易对,例如 "BTCUSDT"。交易对必须使用大写字母,例如 "ETHBTC"。
    """
    uri = f"wss://stream.binance.com:9443/ws/{symbol.lower()}@trade"

    async with websockets.connect(uri) as websocket:
        print(f"已连接到币安WebSocket,正在订阅 {symbol} 交易数据...")
        try:
            while True:
                message = await websocket.recv()
                data = .loads(message)

                # 解析交易数据
                event_type = data['e']  # 事件类型,例如 "trade"
                event_time = data['E']  # 事件时间,Unix时间戳(毫秒)
                trade_id = data['t']  # 交易ID
                price = data['p']  # 成交价格
                quantity = data['q']  # 成交数量
                buyer_is_maker = data['m']  # 买方是否是做市商 (True/False)
                is_best_match = data['M']   # 是否是最佳匹配 (True/False)

                print(f"[{event_time}] 交易ID: {trade_id}, 价格: {price}, 数量: {quantity}, 买方是做市商: {buyer_is_maker}, 最佳匹配: {is_best_match}")

        except websockets.exceptions.ConnectionClosedOK:
            print("WebSocket 连接已正常关闭")
        except websockets.exceptions.ConnectionClosedError as e:
            print(f"WebSocket 连接异常关闭: {e}")
        except Exception as e:
            print(f"发生错误: {e}")

if __name__ == '__main__':
    symbol = "BTCUSDT"
    asyncio.run(subscribe_binance_trades(symbol))

这段代码使用 websockets 库建立与币安 WebSocket API 的连接,并订阅指定的交易对(例如 BTCUSDT)的实时交易数据。 uri 变量定义了 WebSocket 连接的 URL,它遵循币安 WebSocket API 的规范。代码在一个无限循环中持续接收来自 WebSocket 服务器的消息。每个消息都是一个 JSON 字符串,需要使用 .loads() 函数将其解析为 Python 字典。解析后的字典包含了各种交易相关的信息,例如交易 ID、成交价格、成交数量、买方是否是做市商等。这些信息被提取并打印到控制台。 buyer_is_maker 字段表明了买方是否为做市商,这对于分析市场流动性非常有用。 is_best_match 字段指示这笔交易是否是最佳匹配。对于Python 3.7+,使用 asyncio.run() 可以方便地运行异步函数。

需要注意的是,币安 WebSocket API 对连接数和消息频率有限制。在生产环境中,应该合理管理连接,避免超过这些限制,同时需要适当处理异常情况,例如连接断开、消息格式错误等,以保证程序的稳定运行。还可以根据实际需求,订阅不同的数据流,例如深度数据、K 线数据等。

2. 通过Coinbase API获取比特币交易数据

Coinbase 提供了一套全面的应用程序编程接口(API),允许开发者访问其交易所的比特币交易数据。这为量化分析、交易机器人开发以及市场监控提供了强大的工具。与币安类似,要开始使用Coinbase API,你需要在Coinbase平台上注册一个账户,并生成相应的API密钥。API密钥用于验证你的身份并授权你访问特定的数据和功能。

获取API密钥通常涉及几个步骤:登录你的Coinbase账户;导航至API设置或开发者页面;然后,按照提示创建新的API密钥。创建密钥时,你需要指定密钥的权限,例如读取交易数据、执行交易等。务必谨慎选择权限,避免授予不必要的访问权限,以确保账户安全。生成API密钥后,妥善保管你的密钥和密钥密码,切勿泄露给他人。

通过Coinbase API,你可以获取各种类型的比特币交易数据,包括历史交易记录、实时价格信息、订单簿数据等。这些数据可以用于构建各种应用程序,例如实时行情监控工具、自动化交易策略、以及数据分析平台。Coinbase API通常提供多种编程语言的SDK(软件开发工具包)或库,方便开发者使用, 例如Python, Java, Node.js等。这些SDK封装了底层的API调用,使开发者能够更轻松地访问和处理Coinbase的数据。 使用API时,请务必仔细阅读Coinbase API的文档,了解API的使用限制、速率限制以及错误处理机制。 合理的使用API资源,避免触发速率限制,影响应用程序的性能。

2.1 注册Coinbase账号并获取API密钥

您需要在Coinbase上注册一个账户。如果计划进行交易数据分析或自动化交易,强烈建议使用Coinbase Pro,因为它提供了更高级的功能和更低的交易费用。注册完成后,登录Coinbase Pro平台,导航至API设置页面,开始创建API密钥的流程。

Coinbase Pro 提供了比普通Coinbase账号更强大的API功能,其中包括更全面的市场数据、更高级的订单类型以及更高的API调用频率限制,使其更适合用于交易数据分析、算法交易策略的实现和自动化交易机器人的开发。在API设置页面,您可以生成API密钥,包括API密钥本身(API Key)、API密钥的密钥(API Secret)以及API密钥的通行短语(Passphrase)。请务必妥善保管这些信息,因为它们是访问您的Coinbase Pro账户的关键凭证。

为了安全起见,强烈建议仅授予API密钥所需的最低权限。例如,如果您的应用仅需要读取市场数据,那么只授予读取权限即可,避免授予交易或提现等敏感权限。为了进一步增强安全性,您还可以限制API密钥的访问权限,例如通过设置IP白名单,只允许特定的IP地址访问您的API密钥。定期审查和更新API密钥也是良好的安全实践,可以有效降低安全风险。

2.2 使用Coinbase API获取历史交易数据

Coinbase API 提供了 RESTful 端点用于获取历史交易数据。获取特定交易对历史交易记录的端点为 /products/ /trades 。此端点允许开发者访问给定交易对(例如 BTC-USD)的历史成交价格、成交量和其他相关信息,为市场分析和策略制定提供数据基础。

以下是一个使用 Python 和 requests 库获取 BTC-USD 交易对历史交易数据的示例代码,并加入了错误处理和更详细的注释:

import requests
import

def get_coinbase_trades(product_id, limit):
"""
获取 Coinbase 历史交易数据
Args:
product_id (str): 产品 ID,例如 "BTC-USD"
limit (int): 返回的数据条数,最大为 100
Returns:
list: 交易数据列表,每个元素是一个字典,包含时间(ISO 8601格式), 交易ID, 价格, 数量, 买/卖方向等信息
Raises:
requests.exceptions.HTTPError: 如果 API 请求返回错误状态码
"""

    url = f"https://api.pro.coinbase.com/products/{product_id}/trades?limit={limit}"
    try:
        response = requests.get(url)
        response.raise_for_status()  # 检查响应状态码,如果不是 200 则抛出异常
        return response.()
    except requests.exceptions.HTTPError as e:
        print(f"API 请求失败: {e}")
        return None
    except .JSONDecodeError as e:
        print(f"JSON 解析失败: {e}")
        return None

if name == ' main ':
product_id = "BTC-USD"
limit = 100 # 获取最近 100 条交易记录
trades = get_coinbase_trades(product_id, limit)

    if trades:
        # 打印交易数据
        for trade in trades:
            time = trade['time']  # ISO 8601 格式的时间戳
            trade_id = trade['trade_id']
            price = trade['price']
            size = trade['size']
            side = trade['side']  # 买入或卖出
            print(f"时间: {time}, 交易ID: {trade_id}, 价格: {price}, 数量: {size}, 方向: {side}")

        # 可以将数据保存到 CSV 文件或者数据库中,以便后续分析
    else:
        print("未能获取交易数据")

这段代码定义了一个 get_coinbase_trades 函数,它接受产品 ID 和数据条数作为参数,构建 API 请求 URL,并使用 requests 库发送 GET 请求。 response.() 将返回的 JSON 数据解析成 Python 列表。该函数还包含了错误处理机制,能够捕获 API 请求失败或 JSON 解析错误的情况。代码最后遍历交易数据,并将时间戳(ISO 8601 格式)、交易 ID、价格、数量和买入/卖出方向打印出来。您可以根据需要将数据保存到 CSV 文件、数据库或其他数据存储介质中,以便进行后续的分析、可视化和回测等操作。

2.3 使用Coinbase WebSocket API获取实时交易数据

Coinbase Pro 提供了一个强大的 WebSocket API,允许开发者实时获取市场数据,包括交易数据。这对于构建交易机器人、监控市场动态或进行实时数据分析至关重要。以下是一个使用 Python 和 websockets 库订阅 Coinbase Pro 实时交易数据的示例代码,并进行了详细的解释:

为了使用这个示例,你需要安装 websockets 库。可以使用 pip 命令进行安装: pip install websockets

import asyncio
import websockets
import 

async def subscribe_coinbase_trades(product_id):
    """
    订阅 Coinbase Pro 实时交易数据。

    Args:
        product_id (str): 产品 ID,例如 "BTC-USD"。 这是你想订阅交易信息的交易对。
    """
    uri = "wss://ws-feed.pro.coinbase.com"  # Coinbase Pro WebSocket API 的 URI
    subscribe_message = {
        "type": "subscribe",
        "product_ids": [product_id],
        "channels": ["matches"]  # 订阅 "matches" 通道,该通道包含实时的交易信息
    }

    async with websockets.connect(uri) as websocket:
        await websocket.send(.dumps(subscribe_message))  # 将订阅消息转换为 JSON 字符串并发送
        print(f"已连接到 Coinbase WebSocket,正在订阅 {product_id} 交易数据...")

        try:
            while True:
                message = await websocket.recv()  # 接收来自 WebSocket 的消息
                data = .loads(message)  # 将接收到的 JSON 字符串转换为 Python 字典

                # 检查消息类型,确保它是 "match" 类型,即交易数据
                if data['type'] == 'match':
                    # 解析交易数据
                    time = data['time']  # 交易发生的时间戳
                    trade_id = data['trade_id']  # 交易 ID
                    price = data['price']  # 交易价格
                    size = data['size']  # 交易数量
                    side = data['side']  # 交易方向("buy" 或 "sell")

                    print(f"[{time}] 交易ID: {trade_id}, 价格: {price}, 数量: {size}, 方向: {side}")

        except websockets.exceptions.ConnectionClosedOK:
            print("WebSocket 连接已关闭")  # 处理 WebSocket 连接正常关闭的情况
        except Exception as e:
            print(f"发生错误: {e}")  # 处理其他可能发生的异常

if __name__ == '__main__':
    product_id = "BTC-USD"  # 设置要订阅的产品 ID 为 BTC-USD (比特币/美元)
    asyncio.run(subscribe_coinbase_trades(product_id))  # 运行异步函数

这段代码的核心在于与 Coinbase Pro 的 WebSocket API 建立连接,并订阅 matches 通道。 subscribe_message 字典定义了订阅的具体内容,包括要订阅的产品 ID 和通道类型。代码使用 websockets.connect() 函数建立 WebSocket 连接,并使用 websocket.send() 函数发送订阅消息。一旦连接建立并订阅成功,代码便进入一个无限循环,等待接收来自 WebSocket 的实时交易数据。

接收到的每条消息都是一个 JSON 字符串,需要使用 .loads() 函数将其转换为 Python 字典。然后,代码检查消息类型,确保它是 match 类型,即交易数据。如果是交易数据,代码便解析出时间戳、交易 ID、价格、数量和买/卖方向等信息,并将其打印到控制台。该示例还包括了错误处理机制,用于捕获 WebSocket 连接关闭和任何其他可能发生的异常。

为了运行这段代码,你需要确保你的 Python 环境中安装了 websockets 库。 你还可以根据需要修改 product_id 变量,以订阅其他交易对的实时交易数据。 另外,请注意,Coinbase Pro 的 WebSocket API 有速率限制,如果你的程序发送请求过于频繁,可能会被限制访问。因此,建议你合理控制请求的频率。

3. 注意事项

  • API 速率限制: 币安和Coinbase为了维护系统稳定,都对API请求频率设定了严格的限制。这意味着在一定时间内,你可以发送的API请求数量是有限的。超出此限制,API将会返回错误代码,导致你的程序无法正常运行。因此,在编写交易机器人或数据分析脚本时,务必合理地控制请求频率,避免触发速率限制。你需要查阅币安和Coinbase各自的官方API文档,详细了解不同API端点的速率限制规则,例如每分钟允许请求的数量、权重计算方式等。可以采用批量请求或者缓存机制来减少请求的次数。如果速率限制被触发,通常需要等待一段时间才能恢复正常。
  • 错误处理: 在使用API进行交易或数据获取时,必须进行全面的错误处理。网络请求可能会失败,API服务器可能会返回错误,JSON数据格式可能不正确等等。因此,需要针对各种可能出现的错误情况编写相应的处理逻辑。例如,检查HTTP响应状态码(如200表示成功,400表示客户端错误,500表示服务器错误),处理JSON解析错误(例如使用try-except块捕获JSONDecodeError异常),以及处理API返回的特定错误代码(例如余额不足、订单不存在等)。完善的错误处理机制可以提高程序的健壮性和可靠性。
  • 数据存储: 通过API获取的交易数据、市场数据等信息通常需要进行存储,以便后续的分析、回测或监控。常用的数据存储方式包括CSV文件、关系型数据库(如MySQL、PostgreSQL)和NoSQL数据库(如MongoDB)。选择哪种存储方式取决于数据量、数据结构和查询需求。CSV文件适合存储少量数据,易于阅读和编辑;关系型数据库适合存储结构化数据,支持复杂的查询操作;NoSQL数据库适合存储非结构化数据或半结构化数据,具有高可扩展性和灵活性。在存储数据时,需要考虑数据的完整性、一致性和安全性。
  • 安全: API密钥是访问币安和Coinbase API的凭证,务必妥善保管,防止泄露。一旦泄露,他人可以使用你的密钥进行非法操作,造成资金损失或数据泄露。绝对不要将API密钥硬编码到代码中,更不要将其上传到公共代码仓库(如GitHub)。推荐使用环境变量或者配置文件来存储API密钥。环境变量可以在操作系统级别设置,配置文件可以将密钥与其他配置信息分开存放。可以考虑使用IP地址白名单来限制API密钥的使用范围,只允许特定的IP地址访问API。定期更换API密钥也是一种有效的安全措施。
  • 文档: 币安和Coinbase的API文档是使用API的必备参考资料。文档中详细介绍了API的各个端点的功能、参数、返回值、错误代码等信息。在使用API之前,务必仔细阅读相关的文档,了解API的详细用法和参数含义。官方文档通常会提供示例代码,可以参考这些示例代码来编写自己的程序。还可以关注官方文档的更新,及时了解API的最新变化和功能。币安和Coinbase的API文档通常会提供多种编程语言的示例代码,例如Python、JavaScript、Java等。