用 Python 深度解析币安订单簿:从零到可视化

·

关键词:币安 API、订单簿、Python 量化、深度图、ETHBUSD、实时数据、可视化、交易深度、买卖盘、数据清洗

订单簿(order book)是加密市场最直观也最重要的微观结构之一。本文将手把手教你用 Python 直接调用 币安 API,抓取 ETHBUSD 的实时订单簿,并通过 pandasseaborn 完成数据清洗与可视化,最终绘制出交易所常见的“深度图”。无需任何第三方封装库,全程透明可控,适合想深入理解底层细节的开发者与量化爱好者。


1. 准备工作:环境、依赖与权限

1.1 安装依赖

pip install requests pandas matplotlib seaborn

1.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.580000

4. 盘口快照: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 曲线

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 参数改为 BTCUSDTSOLUSDT 等即可,代码无需改动。


7. 小结与下一步

通过本文,你已学会:

  1. requests 直接调用 币安 API 获取订单簿;
  2. pandas 高效清洗与合并数据;
  3. seaborn 绘制散点图、直方图与深度图;
  4. 理解 买卖盘价差流动性 的量化指标。

下一步可以尝试:

祝你量化之路顺利!