4. 市场微观结构基础
在回测中,如果只使用日线收盘价成交,你会默认一个不存在的理想市场:任何数量都能以收盘价瞬间成交,且没有价差与冲击成本。真实市场并非如此。市场微观结构研究的是订单如何到达、如何撮合、价格如何形成,以及交易成本从何而来。对回测而言,微观结构决定了三件事:你的成交价是多少、你的订单能不能成交、你的成交量会不会改变价格。本章围绕买卖价差、订单簿、流动性、市场冲击与成交概率五个概念,建立可落地的仿真模型。
一、核心原理:从报价到成交的链条
任何一笔主动成交,都发生在订单簿的某一档位上。订单簿是当前所有未成交限价订单的集合,分为买盘(Bid)与卖盘(Ask)。最优买价与最优卖价之间的差额就是买卖价差(Spread)。价差是流动性的最直接价格:价差越窄,立即成交的成本越低。
当你下市价单买入时,你会吃掉卖盘第一档,成交价等于卖一价;如果数量超过卖一档挂单量,就继续吃卖二、卖三,形成多档扫单。此时你的成交均价高于卖一价,这个差额就是市场冲击的一部分。成交后,订单簿被消耗,若没有新订单补充,价格会向不利方向移动,这就是永久冲击;而价差与暂时性深度消耗构成暂时冲击。
二、方法流程:把微观结构参数化
要在回测中仿真成交,需要把订单簿抽象为可计算参数。推荐流程如下:
- 获取盘口数据:至少需要买一/卖一价与量;更精细需要多档快照或逐笔委托。
- 估计价差:用历史买卖价差的中位数或分位数,按品种、时段、波动状态分组。
- 估计深度:统计各档位平均挂单量,得到“每档可承接量”。
- 建立冲击模型:用订单量相对平均日成交量(ADV)的比例,映射为价格冲击。
- 计算成交概率:限价单是否成交,取决于价格是否被触及以及排队位置。
- 输出成交价与成交量:将上述参数代入回测撮合逻辑。
一个常用的冲击模型是平方根模型:冲击 ∝ σ × sqrt(Q / ADV),其中 σ 为波动率,Q 为订单量。它比线性模型更符合实证:小单冲击小,大单冲击急剧上升。
# 简化冲击与成交价估算示例
spread = ask1 - bid1
mid = (ask1 + bid1) / 2
participation = order_qty / adv
impact = sigma * (participation ** 0.5)
buy_price = mid + spread / 2 + impact * mid
sell_price = mid - spread / 2 - impact * mid
三、案例场景:同一策略的两种回测结果
假设某策略在流动性较好的大盘股上日均交易 5 次,每次下单量为 ADV 的 0.5%。若回测使用收盘价成交,年化收益 18%。加入微观结构仿真后:价差按 2 个基点、冲击按平方根模型计算,单边成本约 4 个基点,双边 8 个基点。按每日换手一次、一年 250 个交易日估算,年化成本约 20%,策略由盈利转为亏损。这个案例说明:高频或高换手策略对微观结构假设极度敏感。
另一个场景是限价单回测。若你假设“价格触及即成交”,会高估成交率。真实中,你的限价单排在队列后方,只有当价格穿过你的价位且前方订单被消耗后才可能成交。若价格只是触及而未穿透,成交概率显著低于 100%。
| 概念 | 含义 | 回测影响 | 常用参数 |
|---|---|---|---|
| 买卖价差 | 卖一价减买一价 | 立即成交的固定成本 | 基点、分位数 |
| 订单簿深度 | 各档位挂单量 | 决定多档扫单均价 | 每档平均量 |
| 流动性 | 成交而不显著改变价格的能力 | 影响可交易规模 | ADV、换手率 |
| 市场冲击 | 交易导致的价格变动 | 大单成本非线性上升 | 平方根系数 |
| 成交概率 | 限价单被成交的可能性 | 决定策略实际执行率 | 队列位置、穿透深度 |
四、误区与复盘
复盘时应检查:成交价是否落在当日高低区间内;大单是否被拆分为多档;限价单成交率是否与历史委托数据吻合;成本假设是否随波动率变化。若回测收益对价差假设极其敏感,说明策略本身依赖不现实的流动性,应优先修正假设而非优化参数。