订单簿数据分析
查看中央限价订单簿(CLOB),可以提供关于某一证券当前市场的有用即时洞察。

一键发币: SUI | SOL | BNB | ETH | BASE | ARB | OP | POLYGON | AVAX | FTM | OK
对于交易的证券而言,除了高度流动性的证券(如七大科技股或G10外汇对)外,许多证券会周期性地缺乏流动性。对于这些产品的交易者来说,这可能导致滑点。
这通常会导致执行价格较差以及仓位利润损失。经验丰富的投资者对此非常清楚,并通过场外交易(OTC)来最小化滑点损失,在场外交易中,大宗订单由交易双方双边协商完成,交易的证券从未进入市场,从而减少了波动性。
然而,在需要填写大额订单且无法找到合适的交易对手时,即使是经验丰富的投资者也必须深入交易所的限价订单簿中,尝试以公平的价格进行交易。
查看中央限价订单簿(CLOB),可以提供关于某一证券当前市场的有用即时洞察。
CLOB 包含了在给定时刻市场上所有不同的订单。
希望在 CLOB 上进行交易的实体提交“买入”(Bid)和“卖出”(Ask)订单,这些订单将反映在 CLOB 上。为了透明起见,交易所有义务向所有用户展示它们。

1、订单类型
虽然利用 CLOB 特性的订单类型有很多,但它们都是两种基本类型的组合。
市价订单和限价订单。
1.1 市价订单
无论价格如何都立即执行的订单。当你提交一个市价订单购买1000单位的证券,价格为100美元时,通常会发现你的交易记录显示如下:
- 500单位价格为100美元
- 200单位价格为101美元
- 300单位价格为99美元
你正在用执行速度换取价格的不确定性。
1.2 限价订单
仅在预定价格下执行的订单。使用我们之前的例子,即1000单位的证券价格为100美元,如果放置限价订单,我们的记录可能看起来像这样:
- 500单位价格为100美元
- 200单位价格为100美元
- 300单位价格为100美元
不过需要注意的是,在流动性较差、价格剧烈波动的市场中,完成限价订单可能需要很长时间。
你用时间换取了价格的确定性。
2、利用订单簿数据
高度流动的市场依赖于在大多数价格区间内拥有大量买入和卖出订单。在流动性较差的市场中,有时我们可以观察到买入和卖出订单严重失衡。如果订单极度偏向一方,某种订单类型过多,这意味着在现有价格水平上进一步买入将无法完成,短期内价格将进一步上涨。
如果没有紧迫性,可以简单地放置限价订单并等待价格回到所需水平。
然而,如果有紧迫性,则需要检查订单簿以确认当前状态是否值得下达市价订单。
或者,这种知识也可以用于短期交易以从订单簿失衡中获利。
如果观察到失衡现象,这表明价格可能会移动以解决这些失衡问题。例如,如果出现大量的买入订单积聚,短期内价格可能会飙升。
实际上,一种常见的套利策略是将订单簿失衡与价格变动进行比较,以获得特定资产类别和交易所的买入信号。
已经有许多文献探讨了利用订单簿失衡进行套利,超出了本文的范围。
3、在Python中提取币安订单簿数据
在接下来的部分中,我们将从币安提取相对交易较少的资产的订单簿数据。

虽然可以通过图形界面完成相同的分析,但在Python中提取数据并绘制数据的主要优势在于分析的粒度更高。
# 在命令行运行 "pip install python-binance"
from binance import Client
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import math
apikey = '****Your API KEY from Binance******'
secret = '*****Your Secret Key from Binance'
client = Client(apikey, secret)
tickers = pd.DataFrame(client.get_all_tickers())
tickers.set_index("symbol", inplace=True)
# 标记
ticker = "SOLUSDC"
# 市场深度
depth = client.get_order_book(symbol=ticker)
bids = pd.DataFrame(depth["bids"],
columns=["bid price", "bid volume"]).astype(float).round(2).iloc[::-1]
asks = pd.DataFrame(depth["asks"],
columns=["ask price", "ask volume"]).astype(float).round(2)
# print("bids", bids)
# print("asks", asks)
# 中间价格
mid_price = round((bids["bid price"].max()+asks["ask price"].min())/2, 2)
# 时间戳
timestamp=depth["lastUpdateId"]
# 订单簿阈值
threshold = 0.05
floor = math.floor(mid_price*(1-threshold))
ceiling = math.ceil(mid_price*(1+threshold))
# 订单失衡
ask_vol = asks.loc[asks["ask price"]<ceiling, "ask volume"].sum()
bid_vol = bids.loc[bids["bid price"]>floor, "bid volume"].sum()
order_book_imbalance = round(bid_vol-ask_vol, 2)
plt.title(f"Binance order book {ticker};timestamp: {timestamp}")
bid_plot = plt.bar(bids["bid price"], bids["bid volume"], color="lime")
ask_plot = plt.bar(asks["ask price"], asks["ask volume"], color="red")
plt.xticks(np.arange(floor, ceiling, 1))
plt.xlim(floor, ceiling)
plt.xticks(rotation=45)
plt.ylim(0, 150) # 随意选择的上限y轴限制,根据每个标记调整
mid_price_plot = plt.axvline(x = mid_price, color = 'b', linestyle = "--", label = '中心价格')
plt.grid(True)
plt.legend(handles = [bid_plot, ask_plot, mid_price_plot],
labels = ["bids", "asks", f"中间价格: ${mid_price}"],
title = f"Order Book Imbalance: {order_book_imbalance}",
loc='upper right', prop={"size":10})
plt.show()
我们可以将分析限制在当前价格的某个范围内,忽略许多远端限价订单,这些订单对当前的中央限价订单簿状态几乎没有影响。
在这种情况下,我们使用变量 “threshold” 将分析限制在当前价格的 5% 范围内。
正如我们所看到的,订单簿似乎有些平衡,买入订单数量多于卖出订单。
在当前中间价格 $98.31 下,我们观察到正向失衡 607 单位的 SOL。
这大约相当于 $60,000 的未完成买入订单。
原文链接:Analyzing Binance Order Book Data using Python
DefiPlot翻译整理,转载请标明出处
免责声明:本站资源仅用于学习目的,也不应被视为投资建议,读者在采取任何行动之前应自行研究并对自己的决定承担全部责任。