如何通过Binance API获取Bid/Ask订单数据计算K线Delta值?
获取Binance Bid/Ask成交数据并计算K线Delta值
要获取Binance的买单(Bid)和卖单(Ask)成交数据,核心是利用Binance API返回的逐笔成交记录中的isBuyerMaker字段区分成交方向,再按K线时间分组计算Delta值。以下是具体实现步骤:
一、核心逻辑说明
Binance逐笔成交数据中的isBuyerMaker字段直接对应成交方向:
isBuyerMaker=False:买家为主动成交方(Taker),吃了卖家的挂单,属于Bid买单成交isBuyerMaker=True:卖家为主动成交方(Taker),吃了买家的挂单,属于Ask卖单成交
Delta值计算:Delta = Ask成交总成交量 - Bid成交总成交量
二、使用REST API获取历史成交数据
1. 依赖准备
先安装Binance官方Python SDK:
pip install python-binance
2. 初始化API客户端
替换为你的Binance API密钥(仅需读取权限):
from binance.client import Client import pandas as pd api_key = "你的API密钥" api_secret = "你的API密钥密码" client = Client(api_key, api_secret)
3. 获取并解析成交数据
# 获取BTCUSDT最近1000笔逐笔成交记录 trades = client.get_trades(symbol="BTCUSDT", limit=1000) df = pd.DataFrame(trades) # 转换时间戳为可读格式 df["time"] = pd.to_datetime(df["time"], unit="ms") # 转换成交量为数值类型(API返回为字符串) df["qty"] = pd.to_numeric(df["qty"]) # 标记订单类型:Bid/Ask df["order_type"] = df["isBuyerMaker"].apply(lambda x: "Ask" if x else "Bid")
4. 按K线分组计算Delta值
以1分钟K线为例:
# 按1分钟时间粒度分组 df["kline_time"] = df["time"].dt.floor("1min") # 分组统计Ask/Bid总成交量,计算Delta delta_df = df.groupby("kline_time").agg( ask_volume=("qty", lambda x: x[df.loc[x.index, "order_type"] == "Ask"].sum()), bid_volume=("qty", lambda x: x[df.loc[x.index, "order_type"] == "Bid"].sum()) ).fillna(0) delta_df["delta"] = delta_df["ask_volume"] - delta_df["bid_volume"] # 查看结果 print(delta_df.head())
5. 获取更早的历史数据
由于get_trades接口单次最多返回1000条数据,可通过循环分页获取更早的记录:
def fetch_all_historical_trades(symbol, start_id=0): all_trades = [] while True: batch_trades = client.get_trades(symbol=symbol, limit=1000, fromId=start_id) if not batch_trades: break all_trades.extend(batch_trades) start_id = batch_trades[-1]["id"] + 1 return pd.DataFrame(all_trades) # 获取BTCUSDT所有历史成交数据(数据量极大,谨慎调用) full_trade_df = fetch_all_historical_trades("BTCUSDT")
三、使用WebSocket获取实时成交数据
如果需要实时计算Delta值,可通过WebSocket订阅实时成交频道:
from binance.websockets import BinanceSocketManager # 存储实时成交数据的列表 real_time_data = [] def handle_real_time_trade(msg): if msg["e"] == "trade": # 解析实时成交数据 trade_info = { "time": pd.to_datetime(msg["T"], unit="ms"), "qty": float(msg["q"]), "isBuyerMaker": msg["m"] } real_time_data.append(trade_info) # 实时计算当前1分钟K线的Delta rt_df = pd.DataFrame(real_time_data) rt_df["kline_time"] = rt_df["time"].dt.floor("1min") current_kline = rt_df[rt_df["kline_time"] == rt_df["kline_time"].max()] ask_total = current_kline[current_kline["isBuyerMaker"]]["qty"].sum() bid_total = current_kline[~current_kline["isBuyerMaker"]]["qty"].sum() current_delta = ask_total - bid_total print(f"当前1分钟K线Delta值: {current_delta:.2f}") # 启动WebSocket连接 bm = BinanceSocketManager(client) conn_key = bm.start_trade_socket("BTCUSDT", handle_real_time_trade) bm.start()
注意事项
- API密钥仅需开启读取权限即可,无需交易权限
- 遵守Binance API调用频率限制,避免触发限流
- 若需计算成交额(成交量×价格)的Delta,可将
qty替换为quoteQty(API返回的成交金额字段)
内容的提问来源于stack exchange,提问作者Gianluigi Mvutu
相关产品推荐
相关产品推荐

