3. 盘口微价格偏离指标构建

盘口微价格偏离指标的核心任务,是把买一价、卖一价以及它们背后的挂单量,压缩成一个可比较、可回测的数值信号。它要回答的问题很具体:当前盘口的成交重心,相对中间价究竟偏向买方还是卖方,偏了多少,这个偏离是否足够大到值得触发一次交易。本节围绕这个目标,从原始字段出发,逐步推导出偏离度公式、阈值设定方法和信号触发规则。

一、从买一卖一到微价格

最朴素的盘口参照是中间价,即买一价与卖一价的算术平均。但中间价完全忽略了挂单量:买一挂 10 手和挂 10000 手,中间价一模一样,盘口压力却天差地别。微价格(microprice)正是为修正这一点而提出的加权价格,其常见形式为:

microprice = (bid1_price × ask1_size + ask1_price × bid1_size)
             / (bid1_size + ask1_size)

注意权重的交叉关系:买一价的权重是卖一量,卖一价的权重是买一量。直觉上,卖一挂单越厚,说明上方抛压越重,价格重心越应被压低,因此买一价获得更大权重;反之买一挂单厚,重心上移。这个交叉加权是微价格区别于中间价的关键,也是后续偏离度有信息量的来源。

在此基础上定义微价格偏离度。为避免不同价位股票之间量纲不可比,采用相对偏离并统一符号约定:以中间价为基准,偏离度为正表示微价格高于中间价(买方占优),为负表示卖方占优。

mid        = (bid1_price + ask1_price) / 2
deviation  = (microprice - mid) / mid        # 相对偏离,单位与收益率一致

由于 microprice 必然落在买一价与卖一价之间,deviation 的绝对值天然被半个买卖价差约束。这一点很重要:偏离度的上限随价差变化,高价差时同样的绝对偏离对应更小的相对值,因此阈值不能用一个固定数字一刀切。

二、偏离度的归一化

为了让阈值在不同价差环境下保持一致的敏感度,实践中常把偏离度除以半价差,得到无量纲的归一化偏离:

half_spread = (ask1_price - bid1_price) / 2
norm_dev    = (microprice - mid) / half_spread   # 取值约在 [-1, 1]

norm_dev 接近 +1 表示微价格几乎贴住卖一价,买方力量极强;接近 -1 表示贴住买一价。这个量在不同股票、不同时段之间可比性更好,适合作为信号触发的主变量。下面这张图展示了从原始盘口字段到偏离信号再到触发判断的完整数据链路,以及各环节的输入输出关系。

盘口微价格偏离指标:数据链路与信号触发 原始盘口字段 bid1_price 买一价 bid1_size 买一量 ask1_price 卖一价 ask1_size 卖一量 中间价 mid (买一+卖一)/2 微价格 microprice 交叉加权: 买一价×卖一量 + 卖一价×买一量 相对偏离 deviation (microprice − mid)/mid 正=买方占优 归一化 norm_dev deviation / 半价差 取值约 [−1, +1] 阈值判断 norm_dev ≥ +θ → 买入信号 norm_dev ≤ −θ → 卖出信号 关键约束与判读 ① 偏离度绝对值受半价差约束,阈值需随价差水平调整,或直接使用归一化量。 ② 信号需加持续性条件(如连续 N 个快照满足),避免单笔挂单撤换造成的假触发。 ③ 触发后应记录触发时点、norm_dev 值、买卖一价量,供回测逐笔核对。 ④ 阈值 θ 通过历史分位数或网格搜索确定,并在样本外验证稳定性。

三、阈值设定:从固定值到自适应

阈值 θ 的设定直接决定信号频率与质量。最直接的做法是固定阈值,例如 norm_dev ≥ 0.6 触发买入、≤ −0.6 触发卖出。固定阈值实现简单,但在价差结构变化时会失灵:当买卖价差长期偏窄,norm_dev 容易频繁触及边界,信号泛滥;价差偏宽时又几乎不触发。

更稳健的做法是基于历史分布设定自适应阈值。具体操作是:取过去一段窗口(例如 20 个交易日的逐笔快照)计算 norm_dev 序列,取其 80% 与 20% 分位数作为上下阈值。这样阈值随市场状态自动伸缩,信号频率保持相对稳定。示例参数如下表,数值为教学假设,需以实际数据重新估计。

参数 示例取值 作用
快照频率 每 3 秒一次 决定偏离度的采样粒度
阈值窗口 20 个交易日 用于估计分位数阈值
上/下分位 80% / 20% 确定 θ 的上下边界
持续性条件 连续 3 个快照 过滤瞬时挂单扰动
最小价差过滤 半价差 ≥ 1 个最小变动价位 剔除价差异常的无效快照

四、信号触发规则的设计

仅有阈值还不够,单次快照的偏离很可能来自一笔临时挂单的撤换,属于噪声。因此触发规则通常由三个条件叠加构成:方向条件(norm_dev 越过阈值)、持续条件(连续 N 个快照同向满足)、有效性条件(价差、挂单量不低于下限)。三者同时成立才输出信号,任一条件破坏则信号复位。

以买入信号为例,可写成如下判断逻辑:

if half_spread >= tick_size and bid1_size >= min_size and ask1_size >= min_size:
    if norm_dev >= theta_up:
        up_count += 1
    else:
        up_count = 0
    if up_count >= persist_n:
        emit_signal("BUY", ts, norm_dev)
        up_count = 0        # 触发后复位,避免重复计数

卖出信号对称处理,将 theta_up 换成 theta_down、方向取反即可。这里有两个容易忽略的细节:一是触发后必须复位计数器,否则同一段持续偏离会被反复计为多次信号;二是信号发出时应同时记录当时的盘口快照,回测阶段才能还原成交假设,判断信号出现后价格是否真的朝预期方向移动。

五、构建完成后的自检

指标构建完成后,建议先做三项自检再进入回测。第一,检查 norm_dev 的分布是否大致落在 [−1, 1] 内,若大量样本越界,说明半价差计算或字段映射有误。第二,统计信号数量与时间分布,若某时段信号密度异常高,多半是阈值过松或缺少持续性过滤。第三,抽取若干触发时点,人工核对当时的买一卖一价量与 norm_dev 是否自洽,确认公式实现与设计一致。这三步能挡掉大部分实现层面的错误,让后续回测结果真正反映策略逻辑而非代码缺陷。

偏离度的符号约定必须在整个回测系统中保持一致:本文统一以中间价为基准、买方占优为正。若在信号模块中改用卖一价为基准,需同步调整阈值方向,否则买卖信号会整体颠倒。