关键词:币安 API、订单簿、Python 量化、深度图、ETHBUSD、实时数据、可视化、交易深度、买卖盘、数据清洗
订单簿(order book)是加密市场最直观也最重要的微观结构之一。本文将手把手教你用 Python 直接调用 币安 API,抓取 ETHBUSD 的实时订单簿,并通过 pandas 与 seaborn 完成数据清洗与可视化,最终绘制出交易所常见的“深度图”。无需任何第三方封装库,全程透明可控,适合想深入理解底层细节的开发者与量化爱好者。
1. 准备工作:环境、依赖与权限
1.1 安装依赖
pip install requests pandas matplotlib seaborn1.2 导入库
import requests
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns无需 API Key:订单簿属于公开行情接口,直接 GET 即可。
2. 抓取订单簿原始数据
2.1 构造请求
url = "https://api.binance.com/api/v3/depth"
params = {"symbol": "ETHBUSD", "limit": 100} # limit 最大 1000,本文取 100
resp = requests.get(url, params=params)
data_json = resp.json()2.2 解析 bids 与 asks
frames = {
side: pd.DataFrame(
data=data_json[side],
columns=["price", "quantity"]
).astype(float)
for side in ["bids", "asks"]
}2.3 合并为统一 DataFrame
frames_list = [
frames[side].assign(side=side)
for side in frames
]
order_df = pd.concat(frames_list, ignore_index=True)3. 快速统计:买卖盘价格分布
price_summary = order_df.groupby("side")["price"].describe()
print(price_summary)输出示例(数值随行情变化):
side
asks count 100.000000
mean 1057.860000
std 0.696146
min 1056.640000
25% 1057.200000
50% 1057.910000
75% 1058.490000
max 1059.040000
bids count 100.000000
mean 1055.060000
std 0.832385
min 1053.700000
25% 1054.400000
50% 1054.850000
75% 1055.820000
max 1056.5800004. 盘口快照:Top of the Book
best_bid = frames["bids"]["price"].max()
best_ask = frames["asks"]["price"].min()
spread = best_ask - best_bid
print(f"买一: {best_bid} | 卖一: {best_ask} | 价差: {spread:.2f}")也可直接调用 /ticker/bookTicker 获取:
top_url = "https://api.binance.com/api/v3/ticker/bookTicker"
top = requests.get(top_url, params={"symbol": "ETHBUSD"}).json()
top_series = pd.Series(top, dtype=float)
print(top_series[["bidPrice", "askPrice"]])5. 可视化:从散点图到深度图
5.1 散点图:展示原始订单
fig, ax = plt.subplots(figsize=(8, 4))
sns.scatterplot(
x="price", y="quantity", hue="side",
data=order_df, ax=ax, s=30
)
ax.set_title("ETHBUSD 订单簿散点图")
ax.set_xlabel("价格")
ax.set_ylabel("挂单量")
plt.show()5.2 直方图:价格区间挂单数量
fig, ax = plt.subplots(figsize=(8, 4))
sns.histplot(
x="price", hue="side", binwidth=0.5,
data=order_df, ax=ax
)
ax.set_title("价格区间挂单数量")
plt.show()注意:直方图仅统计“订单笔数”,未考虑挂单量大小,可能误导真实供需。
5.3 加权直方图:用挂单量做权重
fig, ax = plt.subplots(figsize=(8, 4))
sns.histplot(
x="price", weights="quantity", hue="side", binwidth=0.5,
data=order_df, ax=ax
)
ax.set_title("加权挂单量分布")
plt.show()5.4 深度图:交易所标准可视化
深度图 = 两条 加权 ECDF 曲线
- 买盘:互补 ECDF(从右向左累加)
- 卖盘:普通 ECDF(从左向右累加)
fig, ax = plt.subplots(figsize=(8, 5))
sns.ecdfplot(
x="price", weights="quantity", stat="count",
complementary=True, data=frames["bids"], ax=ax, color="green"
)
sns.ecdfplot(
x="price", weights="quantity", stat="count",
data=frames["asks"], ax=ax, color="red"
)
ax.set_title("ETHBUSD 实时深度图")
ax.set_xlabel("价格")
ax.set_ylabel("累计挂单量")
plt.show()6. 常见问题 FAQ
Q1:币安 API 的 limit 参数最大能调到多少?
A:深度接口 /depth 支持 5、10、20、50、100、500、1000 七档,免费账号即可使用 1000。
Q2:为什么不用 python-binance 等封装库?
A:封装库隐藏了底层细节,不利于学习 HTTP 交互与数据结构。掌握原生请求后,再使用封装库会更得心应手。
Q3:如何保持数据实时更新?
A:用 while True + time.sleep(1) 轮询接口即可;生产环境建议改用 WebSocket Stream 减少延迟。
Q4:深度图里的“累计挂单量”如何解读?
A:曲线越高,代表在该价格附近堆积的挂单越多,流动性越好;陡峭区域即为强支撑/阻力位。
Q5:能否直接交易?
A:本文仅演示行情读取,下单需使用 /order 接口并携带签名,务必妥善保管 API Key 与 Secret。
Q6:如何扩展到其他交易对?
A:将 symbol 参数改为 BTCUSDT、SOLUSDT 等即可,代码无需改动。
7. 小结与下一步
通过本文,你已学会:
- 用
requests直接调用 币安 API 获取订单簿; - 用 pandas 高效清洗与合并数据;
- 用 seaborn 绘制散点图、直方图与深度图;
- 理解 买卖盘价差 与 流动性 的量化指标。
下一步可以尝试:
- 接入 WebSocket 实时流,实现毫秒级更新;
- 计算 订单簿失衡率(LOB imbalance)作为交易信号;
- 将深度图嵌入 Flask/Django 网页,打造个人行情面板。
祝你量化之路顺利!