4. 市场微观结构基础

在回测中,如果只使用日线收盘价成交,你会默认一个不存在的理想市场:任何数量都能以收盘价瞬间成交,且没有价差与冲击成本。真实市场并非如此。市场微观结构研究的是订单如何到达、如何撮合、价格如何形成,以及交易成本从何而来。对回测而言,微观结构决定了三件事:你的成交价是多少、你的订单能不能成交、你的成交量会不会改变价格。本章围绕买卖价差、订单簿、流动性、市场冲击与成交概率五个概念,建立可落地的仿真模型。

一、核心原理:从报价到成交的链条

任何一笔主动成交,都发生在订单簿的某一档位上。订单簿是当前所有未成交限价订单的集合,分为买盘(Bid)与卖盘(Ask)。最优买价与最优卖价之间的差额就是买卖价差(Spread)。价差是流动性的最直接价格:价差越窄,立即成交的成本越低。

当你下市价单买入时,你会吃掉卖盘第一档,成交价等于卖一价;如果数量超过卖一档挂单量,就继续吃卖二、卖三,形成多档扫单。此时你的成交均价高于卖一价,这个差额就是市场冲击的一部分。成交后,订单簿被消耗,若没有新订单补充,价格会向不利方向移动,这就是永久冲击;而价差与暂时性深度消耗构成暂时冲击。

核心公式:成交均价 = Σ(档位价格 × 档位成交量) / 总成交量。回测中若忽略多档扫单,等于系统性低估买入成本、高估卖出收益。

二、方法流程:把微观结构参数化

要在回测中仿真成交,需要把订单簿抽象为可计算参数。推荐流程如下:

  1. 获取盘口数据:至少需要买一/卖一价与量;更精细需要多档快照或逐笔委托。
  2. 估计价差:用历史买卖价差的中位数或分位数,按品种、时段、波动状态分组。
  3. 估计深度:统计各档位平均挂单量,得到“每档可承接量”。
  4. 建立冲击模型:用订单量相对平均日成交量(ADV)的比例,映射为价格冲击。
  5. 计算成交概率:限价单是否成交,取决于价格是否被触及以及排队位置。
  6. 输出成交价与成交量:将上述参数代入回测撮合逻辑。

一个常用的冲击模型是平方根模型:冲击 ∝ σ × 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、换手率
市场冲击交易导致的价格变动大单成本非线性上升平方根系数
成交概率限价单被成交的可能性决定策略实际执行率队列位置、穿透深度

四、误区与复盘

常见误区一:用收盘价成交所有订单。误区二:忽略价差,只扣固定手续费。误区三:假设限价单触及即成交。误区四:用同一冲击系数处理所有品种与时段。误区五:忽略开盘、收盘与午间的流动性差异。

复盘时应检查:成交价是否落在当日高低区间内;大单是否被拆分为多档;限价单成交率是否与历史委托数据吻合;成本假设是否随波动率变化。若回测收益对价差假设极其敏感,说明策略本身依赖不现实的流动性,应优先修正假设而非优化参数。

实用建议:先用保守参数(价差取 75 分位、冲击取平方根模型、限价单成交率打七折)跑一遍回测,若仍能盈利,再逐步放宽假设。这比先乐观后悲观更能暴露真实风险。