Python实战:获取与可视化订单簿数据

·

在量化交易和金融市场分析中,订单簿(Order Book)是理解市场深度和流动性的核心工具之一。本文将以Python为例,介绍如何通过API获取实时的订单簿数据,并进行多维度可视化分析,帮助您更直观地把握市场动态。


订单簿基础概念

订单簿是交易所中所有未成交的买单(Bids)和卖单(Asks)的集合。它反映了市场上即时的供需关系,是交易者判断价格走势和支持阻力位的重要依据。


准备工作与环境配置

在开始之前,请确保已安装以下Python库:

import requests
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

这些库将分别用于发送HTTP请求、数据处理和可视化绘图。


获取订单簿数据

我们通过向API发送GET请求来获取指定交易对的订单簿数据。以下代码以ETHBUSD为例:

r = requests.get("https://api.binance.com/api/v3/depth", params=dict(symbol="ETHBUSD"))
results = r.json()

返回的数据包含两个列表:bids(买单)和asks(卖单),每个列表由价格和数量组成。


数据处理与初步分析

将获取的JSON数据转换为Pandas DataFrame,便于后续分析和可视化:

frames = {
    side: pd.DataFrame(data=results[side], columns=["price", "quantity"], dtype=float)
    for side in ["bids", "asks"]
}

data = pd.concat([frames[side].assign(side=side) for side in frames], ignore_index=True)

通过分组统计,可以快速了解买卖双方的价格分布情况:

price_summary = data.groupby("side").price.describe()
方向数量均值标准差最小值25%分位中位数75%分位最大值
卖单1001057.860.6961056.641057.201057.911058.491059.04
买单1001055.060.8321053.701054.401054.851055.821056.58

请注意,API通常只返回最接近当前价格的100个买单和卖单。


订单簿顶部与价差

订单簿顶部(Top of the Book)指的是最高买价和最低卖价区域,其价差(Spread)是市场流动性的关键指标:

max_bid = frames["bids"].price.max()
min_ask = frames["asks"].price.min()
spread = min_ask - max_bid

也可以通过专用接口获取更简洁的顶部数据:

r = requests.get("https://api.binance.com/api/v3/ticker/bookTicker", params=dict(symbol="ETHBUSD"))
book_top = r.json()

订单簿可视化方法

散点图:原始数据分布

散点图可直观展示所有订单的价格和数量分布:

sns.scatterplot(x="price", y="quantity", hue="side", data=data)
plt.xlabel("价格")
plt.ylabel("数量")
plt.show()

这种方法展示了所有原始数据,但信息量较大,可能难以直接提取洞察。

直方图:订单数量分布

直方图可以显示在不同价格区间内的订单数量:

sns.histplot(x="price", hue="side", data=data, binwidth=0.1)

但需注意,直方图仅统计订单数量,忽略了每个订单的数量大小,可能误导对实际供需的判断。

加权直方图:考虑订单量

通过将订单量作为权重,可以更真实地反映市场的总供需情况:

sns.histplot(x="price", weights="quantity", hue="side", data=data, binwidth=0.1)

这种方法在直方图的基础上加入了数量的影响,更接近真实的市场情况。

深度图:累积分布函数(ECDF)

深度图是交易平台中最常见的订单簿可视化方式,它通过累积分布函数(ECDF)展示买卖双方的累积量:

sns.ecdfplot(x="price", weights="quantity", stat="count", complementary=True, data=frames["bids"])
sns.ecdfplot(x="price", weights="quantity", stat="count", data=frames["asks"])
plt.show()

深度图能清晰展示在不同价格水平上的累积买卖压力,是判断支撑和阻力位的有效工具。


常见问题

什么是订单簿?

订单簿是交易所中所有未成交买单和卖单的实时列表,反映了市场的即时供需情况。

如何获取订单簿数据?

通过交易所提供的API接口,发送HTTP请求即可获取指定交易对的订单簿数据。大多数交易所都支持REST API或WebSocket接口。

买卖价差的意义是什么?

买卖价差是最高买价和最低卖价之间的差额。价差越小,通常表示市场流动性越好;价差越大,则流动性越差。

深度图有什么作用?

深度图通过累积订单量展示买卖双方在不同价格水平上的力量对比,有助于识别关键的支持和阻力位。

订单簿数据是否包含所有订单?

通常,API返回的订单簿数据只包含最接近当前价格的一定数量的订单(如100条),并非全部未成交订单。

如何提高订单簿分析的准确性?

可以结合多时间帧数据、交易量指标以及市场新闻等进行综合分析,避免单一数据源的局限性。👉 获取实时订单簿分析工具


通过本文的介绍,您应该已经掌握了使用Python获取和可视化订单簿数据的基本方法。结合实际交易策略,这些技术可以帮助您更好地理解市场动态,做出更明智的交易决策。