您现在的位置是: 首页 > 平台 平台
币安&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/
。此端点允许开发者访问给定交易对(例如 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等。