第二章:订单簿基础
订单簿这东西,说白了就是市场的「实时记账本」。我刚开始做量化的时候,总觉得订单簿就是个简单的买卖挂单列表。直到有一次我在回测里发现策略表现很好,实盘却亏得一塌糊涂——后来才发现,我根本没理解订单簿的动态变化规律。
今天咱们就把订单簿的底裤扒干净。从最基础的订单类型开始,到订单簿怎么构建、怎么更新,最后聊聊买卖价差和市场深度这些实战中天天打交道的概念。
2.1 限价订单与市价订单
这两种订单类型,是订单簿的「原子操作」。你想想看,所有复杂的交易策略,最终拆解下来无非就是这两种订单的组合。
限价订单(Limit Order)
限价订单,就是你指定一个价格,告诉交易所:「低于这个价我不卖,高于这个价我不买」。它提供了流动性,但也承担了「成交不了」的风险。
我个人习惯把限价订单分成两类:
- 被动型限价单:挂在当前最优买卖价之外,等着别人来吃。比如当前买一价是10.00,你挂10.01卖,这就是被动提供流动性。
- 激进型限价单:直接挂在最优价之内,比如买一价10.00,你挂10.00买,这其实已经接近市价单的效果了。
市价订单(Market Order)
市价单就是「不管价格,立即成交」。它消耗流动性,但保证成交。说白了,你着急用钱或者着急建仓的时候,就用市价单。
嗯,这里要注意一个坑:市价单的成交价格并不一定是当前显示的价格。我曾经在流动性差的合约上吃过亏——市价单进去,滑点直接吃掉了我一个月的利润。
2.2 订单簿的构建与动态更新
订单簿本质上就是一个价格-数量的映射表。买方一侧按价格从高到低排列,卖方一侧按价格从低到高排列。中间那个空隙,就是买卖价差。
咱们用个简单的Python代码来模拟一下订单簿的构建:
class OrderBook:
def __init__(self):
self.bids = {} # 买盘:价格 -> 数量
self.asks = {} # 卖盘:价格 -> 数量
def add_order(self, side, price, quantity):
if side == 'buy':
self.bids[price] = self.bids.get(price, 0) + quantity
else:
self.asks[price] = self.asks.get(price, 0) + quantity
def remove_order(self, side, price, quantity):
if side == 'buy' and price in self.bids:
self.bids[price] -= quantity
if self.bids[price] <= 0:
del self.bids[price]
# 卖盘同理
def get_best_bid(self):
return max(self.bids.keys()) if self.bids else None
def get_best_ask(self):
return min(self.asks.keys()) if self.asks else None
这段代码虽然简单,但已经包含了订单簿的核心逻辑。实际交易所的订单簿比这复杂得多——还要处理订单ID、时间戳、冰山订单等等。但原理是一样的。
动态更新的三种触发方式
- 新订单到达:限价单进入订单簿,更新对应价格档位的数量。
- 订单成交:市价单吃掉限价单,对应档位的数量减少或消失。
- 订单撤销:交易者取消未成交的限价单,数量归零。
我记得有一次做回测,我忽略了订单撤销这个因素,结果策略在模拟环境里赚得盆满钵满,实盘却频繁撤单导致手续费爆炸。嗯,从那以后我每次回测都会加上「撤单率」这个参数。
2.3 买卖价差与市场深度
这两个指标,是衡量市场流动性的「体温计」。我每天开盘前第一件事,就是扫一眼这两个数据。
买卖价差(Bid-Ask Spread)
价差 = 最优卖价 - 最优买价。说白了,就是你立刻买卖一手需要付出的「过路费」。
| 市场类型 | 典型价差 | 说明 |
|---|---|---|
| 主流币种(BTC/ETH) | 0.01% - 0.05% | 流动性极好,做市商竞争激烈 |
| 小市值币种 | 0.5% - 2% | 流动性差,小心滑点 |
| 期货主力合约 | 0.02% - 0.1% | 受交割日影响,价差会波动 |
市场深度(Market Depth)
市场深度,就是看不同价格档位上挂了多少单。深度越厚,大单对价格的冲击就越小。
我习惯用「深度斜率」来判断市场的承接能力:
- 陡峭的深度曲线:说明流动性集中在最优价附近,大单容易造成价格跳跃。
- 平缓的深度曲线:说明各价位都有挂单,大单可以慢慢消化。
你想想看,如果你要买入100个BTC,深度不够的话,可能买完价格就涨了2%。这就是为什么机构交易员都喜欢用「时间加权平均价格(TWAP)」算法——把大单拆成小单,减少对市场的冲击。
知识体系总览
下面这张图,把本章的核心逻辑串起来了:
这张图把订单簿的「输入-处理-输出-应用」串起来了。你想想看,订单类型决定了订单簿的输入,订单簿的构建和更新是处理过程,买卖价差和深度是输出指标,最终服务于我们的交易策略。
我个人觉得,理解订单簿的关键不在于记住那些公式,而在于培养一种「盘感」——看到价差变化能联想到流动性变化,看到深度变化能预判价格冲击。这种能力,需要大量的实盘观察和复盘。
公众号:蓝海资料掘金营,微信deep3321