3. 订单簿与市场微观结构
做量化交易,尤其是高频抢单策略,你绕不开一个东西——订单簿。
说白了,订单簿就是交易所的「实时记账本」。每一笔挂单、撤单、成交,都在上面写得清清楚楚。我个人习惯把订单簿比作一个菜市场:买菜的(买方)和卖菜的(卖方)各自报价,谁出价合适,当场成交。
嗯,今天我们就来拆解这个「菜市场」的底层逻辑。
3.1 订单簿数据结构
先看最基础的东西。订单簿的数据结构其实不复杂,核心就两个队列:买单队列(Bid)和卖单队列(Ask)。
每个队列里,价格从高到低(买单)或从低到高(卖单)排列。每条记录包含:价格、数量、订单编号、时间戳。
我截取一个典型的L2行情快照,你感受一下:
{
"bids": [
[100.50, 1200], // 价格100.50,数量1200股
[100.49, 800],
[100.48, 1500]
],
"asks": [
[100.51, 900],
[100.52, 1100],
[100.53, 600]
],
"timestamp": 1699000000123
}
注意,这里只展示了价格和数量。实际生产环境中,订单簿还会包含订单ID、订单类型(限价单/市价单)、交易所标识等字段。
关键点:订单簿是动态变化的。每毫秒都有新订单进来,也有旧订单被吃掉或撤销。你的策略必须能处理这种「流式更新」。
我在项目中遇到过一个问题:有些交易所的订单簿更新不是全量推送,而是增量推送。比如只告诉你「第3档买单数量变了」。如果你没处理好增量合并,订单簿就会「错位」,策略直接崩掉。
3.2 买卖盘口深度分析
盘口深度,就是看「各个价位上到底有多少单子」。这玩意儿能告诉你市场的真实流动性。
举个例子。假设某股票当前买一价100.50,数量1000股;卖一价100.51,数量500股。表面上看,买卖价差只有1分钱,流动性不错。
但你往深了看:
- 买二价100.49,数量只有200股
- 买三价100.48,数量只有100股
- 卖二价100.52,数量却有10000股
这说明什么?买方深度极差,卖方深度极强。一旦有大单砸下来,价格很容易被打穿。反过来,如果大单往上拉,上方卖单稀薄,价格可能瞬间飙升。
我个人习惯用深度斜率来衡量盘口健康度。计算方式很简单:
深度斜率 = (累计数量变化) / (价格变化)
斜率越小,说明该方向流动性越差。抢单策略里,我一般会避开深度斜率小于某个阈值的品种——你想想看,进去容易,出来可就难了。
实战技巧:我建议你在回测时,把盘口深度作为一个特征加入模型。比如计算「买一到买五的总量 / 卖一到卖五的总量」,这个比值能反映短期多空力量对比。
3.3 价差与滑点模型
价差,就是买一价和卖一价之间的差值。滑点,就是你实际成交价和预期价格之间的差值。
这两个东西,是抢单策略的「隐形杀手」。
先说话价差。理想情况下,价差越小越好。比如某ETF的价差只有1个tick(0.001元),你来回交易的成本就很低。但有些冷门股票,价差可能达到几十个tick,你一买一卖,光价差就亏掉1%。
我常用的价差模型是这样的:
spread = ask_price_1 - bid_price_1
relative_spread = spread / mid_price
其中mid_price = (ask_price_1 + bid_price_1) / 2。相对价差超过0.5%的品种,我个人基本不会碰。
再说滑点。滑点模型要复杂一些。它取决于:
- 订单规模:你下的单子越大,滑点越严重
- 市场流动性:流动性越差,滑点越大
- 下单速度:你比别人慢1毫秒,可能就多滑1个tick
我曾经踩过一个坑:回测时假设滑点为0,结果实盘一跑,每天亏掉2%的滑点成本。后来我学乖了,回测时至少加2个tick的滑点惩罚。
避坑指南:我曾经在回测中忽略了大单对盘口的冲击。结果策略在模拟中赚得飞起,实盘一跑就亏。后来我加入了「市场冲击模型」——简单说,就是根据你的订单量,动态计算它会吃掉几档盘口。
这里给出一个简单的滑点估算公式:
slippage = (order_quantity / total_volume_at_best_price) * tick_size
比如你想买1000股,但卖一档只有500股。那么你的订单会吃掉卖一档的500股,然后继续吃卖二档。滑点就是两个价位之间的差值。
3.4 知识体系总览
为了让你更直观地理解本章内容,我画了一张结构图:
这张图把本章的三个核心模块串起来了。你仔细看,它们其实是层层递进的关系:先理解数据结构,再分析盘口深度,最后用价差和滑点模型来量化成本。
好了,这一章的内容就到这里。记住一句话:订单簿是市场的「心电图」,读懂了它,你才能抓住真正的交易机会。
公众号:蓝海资料掘金营,微信deep3321