📊 這篇屬於 量化交易全景地圖 的一塊;想看各概念怎麼串起來,回總覽逐一拆解。
訂單簿失衡(OBI, Order Book Imbalance)是量化裡最入門的「微觀結構」訊號之一,但多數文章丟一條公式就沒了,你還是不知道它實際長什麼樣。這篇帶你真的抓一次盤口、把它算出來看,並講清楚 OBI 跟常被混用的 OFI 到底差在哪——全部附可跑的 Python,複製就能執行。
先回顧:訂單簿在拔河
訂單簿就是「想買的人」和「想賣的人」各自掛出的價格與數量。最高買價是 Best Bid、最低賣價是 Best Ask。OBI 的直覺就像拔河:買方排了 100 人、賣方只有 20 人,價格「可能」比較容易往上。注意是「可能」不是「一定」——這個分寸是整篇的關鍵。(訂單簿、Maker/Taker 的基礎,可回 量化交易全景地圖 複習。)
OBI:把拔河變成一個數字
OBI 把買賣力量量化成一個介於 −1 到 +1 的數:
OBI = (買量 − 賣量) / (買量 + 賣量)
越接近 +1 代表顯示的買方深度越重、越接近 −1 代表賣方越重、0 代表兩邊均衡。實務上不會只看最佳一檔,而是取前 N 檔加權,因為只看一檔太容易被一兩筆掛單晃動。
動手:用 Python 抓真實盤口算 OBI
不用付費的 Level 2 數據——加密交易所的公開行情就含多檔深度,用 ccxt 的 fetch_order_book 免 API key 就能抓。這也是加密比傳統市場好練手的地方:
import ccxt
ex = ccxt.binance() # 換所只改這行:ccxt.okx() / ccxt.bybit()
ob = ex.fetch_order_book("BTC/USDT", limit=20) # 抓行情免 API key
bids, asks = ob["bids"], ob["asks"] # [[價格, 數量], ...]
def obi(bids, asks, levels):
qb = sum(a for _, a in bids[:levels]) # 前 N 檔買量
qa = sum(a for _, a in asks[:levels]) # 前 N 檔賣量
return (qb - qa) / (qb + qa) # -1 ~ +1
for lv in (1, 5, 20):
print(f"前 {lv} 檔 OBI = {obi(bids, asks, lv):+.3f}")
實際跑一次(BTC/USDT),盤口這一刻長這樣:
前 1 檔 OBI = -0.410 (賣方略重)
前 5 檔 OBI = -0.433
前 20 檔 OBI = -0.370
三個數都是負的、約 −0.4,表示這一瞬間賣方掛單明顯比買方重。但這只是「此刻的快照」,下一秒那些掛單可能整批消失。
順手算 microprice:比中間價更聰明的參考價
一般說的中間價(mid)是 (買價+賣價)/2,但它忽略了兩邊的「量」。microprice(微觀價)用量加權,量大的一側會把價往對手方推,更貼近「下一筆成交比較可能落在哪」:
pb, qb = bids[0] # 最佳買價、買量
pa, qa = asks[0] # 最佳賣價、賣量
microprice = (pb * qa + pa * qb) / (qb + qa) # 量大的一側把價推向對手
做市策略常拿 microprice 當「合理價值(Fair Value)」的起點,再往兩側掛單。
OBI vs OFI:最常被搞混的一組
很多人把 OBI 和 OFI 當同義詞,其實差很多:
| OBI 訂單簿失衡 | OFI 訂單流失衡 | |
|---|---|---|
| 看的是 | 某一瞬間的靜態快照 | 一段時間內的動態變化 |
| 怎麼算 | 當下買量 vs 賣量 | 新增、取消、成交造成的淨變化 |
| 需要 | 一張訂單簿快照 | 連續兩張以上快照(時間序列) |
| 特性 | 直覺、易被瞬間撤單晃動 | 跟短期價格變動關係通常更穩定 |
OFI 的標準作法(Cont 等人)是比較前後兩刻盤口的價與量:買價漲了算「新增買壓」、買價跌了算「買盤撤離」,賣方對稱,最後相減:
def ofi_component(prev, now):
pb0, qb0, pa0, qa0 = prev # 前一刻盤口
pb1, qb1, pa1, qa1 = now # 這一刻盤口
# 買方:價漲=新增買壓;價平=量變化;價跌=買盤撤離
e_bid = qb1 if pb1 > pb0 else (qb1 - qb0 if pb1 == pb0 else -qb0)
# 賣方:價漲=舊賣盤撤離;價平=量變化;價跌=新增賣壓
e_ask = -qa0 if pa1 > pa0 else (qa1 - qa0 if pa1 == pa0 else qa1)
return e_bid - e_ask # 正=淨買壓增加,負=淨賣壓增加
間隔幾秒抓兩次盤口、丟進這個函式,就得到這段時間的淨買賣壓方向。OBI 告訴你「現在誰人多」,OFI 告訴你「剛剛力量往哪邊移動」,兩個一起看才完整。
最容易踩的坑(這段比公式重要)
- 掛單只是意願,可以瞬間取消。你看到的失衡,下一秒可能就不見了。
- 當心 spoofing/layering(幌騙)。有人故意掛遠離盤口的巨量單製造假壓力,引你進場後立刻撤掉。
- 最大的那道「牆」不一定有效。真正有意義的是貼近盤口、持續存在、且配合成交發生的量,不是畫面上最大的掛單。
- OBI/OFI 是「特徵之一」,不是預言。實務上是當多個特徵餵進模型,搭配成交方向一起判斷,絕不是單一進場訊號。
- 回測別偷看未來。用訂單簿做研究極容易不小心用到「當下還不知道的資料」,讓回測虛假地漂亮。
實務上怎麼用
OBI/OFI 最常見的用途是做市:用 microprice 當合理價值、用 OBI 偏斜兩側報價(哪邊壓力大就把報價往那邊挪),用 OFI 偵測短期方向、危險時收單。加密例子:跑做市的人會把這些訊號接進報價邏輯;想實際體驗,可從 用 ccxt 自寫機器人 的同一套 API 技能延伸(抓盤口、下單都是同樣的 ccxt)。
回到全景
OBI/OFI 是量化全景裡「市場怎麼運作」這一塊最實用的入口——你已經會抓真實盤口、算失衡、分清 OBI 與 OFI 了。接下來把同一套盤口資料接上報價邏輯,就進入「做市」的世界。記住那句話:盤口失衡只告訴你「可能」,把「可能」當「一定」是最貴的學費。
常見問題 FAQ
OBI 能預測價格嗎?
不能單獨預測。OBI 反映此刻盤口的買賣力量,但掛單可瞬間取消、甚至有人用假單製造假象(spoofing)。實務上它是「多個短期特徵之一」,要搭配成交方向、OFI、撤單行為一起判斷,而不是單一進場訊號。
OBI 和 OFI 哪個比較好?
不是誰取代誰。OBI 是某一瞬間的靜態快照失衡,OFI 是一段時間內新增/取消/成交的動態變化。OFI 跟短期價格變動的關係通常更穩定,但需要連續快照才能算。兩個一起看最完整。
算 OBI 一定要付費的 Level 2 數據嗎?
不用。多數加密交易所的公開行情就含多檔深度,用 ccxt 的 fetch_order_book 免 API key 就能抓,這也是加密比傳統股市好練手的原因之一。傳統市場的深度數據往往要另外付費。
OBI 可以用在加密合約嗎?
可以,永續合約的訂單簿一樣抓得到。但合約多了資金費率、強平堆積、ADL 等結構,極端行情下盤口會跟現貨很不一樣,別把現貨的直覺直接套到合約上。
看到盤口一面倒的巨量牆,要不要跟?
要很小心。遠離最佳價的巨量掛單常常是「擺著嚇人」的,可能瞬間撤掉(spoofing/layering)。真正有意義的是貼近盤口、持續存在、且配合成交發生的量,不是畫面上最大的那道牆。
延伸閱讀
利益揭露:本文部分交易所連結含邀請碼,使用不增加你的成本,有些還有手續費折扣。內容以教育與「幫你看懂並避坑」為前提,不構成投資建議。






發表迴響