2. 盘口交易数据基础
盘口交易策略的回测质量,首先取决于数据底座的精度。很多回测结果“看起来很美”,根源往往不是策略逻辑,而是把快照数据当成了逐笔数据使用,或者把逐笔委托与逐笔成交混为一谈。本节围绕 Level-2 行情中最核心的两类明细数据——逐笔委托与逐笔成交——讲清字段含义、时间精度与清洗要点,并说明它们如何支撑盘口策略的回测。
一、两类数据的本质区别
逐笔委托(Order)记录的是“订单进入撮合系统”的事件,反映的是市场参与者想做什么;逐笔成交(Trade)记录的是“撮合实际发生”的事件,反映的是市场真正成交了什么。二者是因果链上的前后两环:委托是意图,成交是结果。盘口策略中判断挂单撤单行为、大单压盘、虚假挂单,必须依赖逐笔委托;判断主动买卖方向、成交强度、大单扫货,必须依赖逐笔成交。
以沪深交易所常见的 Level-2 明细字段为例,逐笔委托通常包含:证券代码、委托时间(精确到毫秒或十毫秒)、委托序号、买卖方向、委托价格、委托数量、委托类型(限价/市价/本方最优等)。逐笔成交通常包含:证券代码、成交时间、成交序号(部分市场称“成交编号”)、买卖方向标识(主动买/主动卖,部分市场需自行推断)、成交价格、成交数量,以及与之关联的买方委托序号与卖方委托序号。
二、时间精度:回测中最容易被忽视的陷阱
Level-2 数据的时间戳精度因市场和数据源而异:上交所逐笔委托与成交通常为十毫秒级,深交所部分数据可到毫秒级,而快照数据一般为三秒一笔。回测中若把不同精度的数据混用,会产生“未来函数”式的偏差。例如用三秒快照的盘口去匹配毫秒级逐笔成交,成交发生时盘口可能早已变化,回测的成交价与成交量就会失真。
实操中应遵循两条原则:第一,回测撮合逻辑必须使用与策略信号同精度或更高精度的数据;第二,所有事件按时间戳排序时,同一时间戳内需定义稳定的次级排序规则(如先委托后成交、按序号升序),否则同一毫秒内的多笔事件顺序不确定,会导致回测结果不可复现。
三、数据清洗要点
原始 Level-2 数据在进入回测引擎前,通常需要经过以下清洗:
- 去重与乱序修复:按(证券代码、委托序号/成交序号)去重,并按时间戳重排,修复跨频道传输导致的乱序。
- 异常价格过滤:剔除价格为 0、超出涨跌停板、或与前一有效价格偏离过大的记录,防止集合竞价边界数据污染连续竞价回测。
- 撤单识别:逐笔委托中数量为负或类型标记为撤单的记录,需单独标记,不能当作新增挂单计入盘口深度。
- 成交方向校验:若数据源未直接给出主动买卖标识,需用成交价与当时买一/卖一价比较推断:成交价≥卖一价记为主动买,成交价≤买一价记为主动卖,介于两者之间需结合委托序号回连判断。
- 停牌与集合竞价段处理:将开盘集合竞价、收盘集合竞价、盘中临时停牌时段单独切分,回测连续竞价策略时排除这些区间。
四、数据如何支撑盘口策略回测
盘口策略的核心信号大多来自“委托与成交的背离”。例如挂单撤单率突增、买一挂单量虚高但成交稀少,往往意味着虚假托单。回测这类信号,必须能按时间顺序重放逐笔委托流,重建每一时刻的盘口队列,再用逐笔成交验证信号触发后的真实成交情况。
下面这张图展示了从原始逐笔数据到回测信号的数据链路与关键处理节点:
图中链路的关键在于“盘口队列重建”这一步:它不是简单累加委托数量,而是按委托序号维护一个有序队列,逐笔处理新增、撤单与成交扣减。只有队列重建准确,后续的撤单率、挂单存活时间、买卖压力比等指标才可信。
五、一个可执行的回测数据准备示例
假设我们要回测一个“买一挂单量突增但成交稀少则视为虚假托单”的策略,数据准备可按如下参数组织(以下为教学示例参数,非实测结果):
| 处理项 | 示例参数 | 判断依据 |
|---|---|---|
| 时间窗口 | 连续竞价 09:30–11:30、13:00–14:57 | 排除集合竞价与停牌段 |
| 挂单突增阈值 | 买一量 3 秒内增幅 ≥ 50% | 相对前一时点买一量 |
| 成交稀少判定 | 同期主动买成交量 < 新增挂单量 10% | 逐笔成交方向汇总 |
| 撤单确认 | 突增后 5 秒内撤单量 ≥ 新增量 60% | 逐笔委托撤单记录 |
| 信号有效期 | 触发后 10 秒内有效 | 盘口状态变化快 |
回测时,逐笔委托流驱动盘口队列更新,逐笔成交流驱动成交量与方向统计,两者按统一时间轴合并。当上述条件同时满足时记录一次信号,并统计信号后 10 秒内的价格变动与成交情况,以此评估策略有效性。若发现信号触发频率异常高或成交价明显偏离盘口,应优先回查数据清洗环节,而不是急于调整策略参数。
总结来说,逐笔委托回答“谁想挂、挂多少、撤没撤”,逐笔成交回答“谁成交、成交多少、方向如何”,二者通过委托序号回连形成完整因果链。把时间精度对齐、把清洗规则定死、把盘口队列重建做准,盘口策略的回测才有可信的起点。