3. 盘口时间线数据采集方法

做开盘急涨的盘口复盘,第一步不是看图说话,而是把“当时到底发生了什么”还原成一条可对齐、可检索的时间线。这条时间线通常由三类数据拼成:逐笔成交(每一笔撮合的成交价、成交量、成交方向)、委托队列(买一至买五、卖一至卖五的挂单量与价位,以及逐笔委托的增减)、分时快照(按固定间隔抓取的最新价、均价、成交量、涨跌幅、买卖盘口)。三者粒度不同、时间戳口径不同,采集与清洗的核心任务就是让它们在同一个时间轴上“对得上”。

三类数据的采集口径

逐笔成交数据来自交易所的成交回报,字段一般包括成交时间(精确到毫秒或秒)、证券代码、成交价、成交量和成交方向(主动买/主动卖,部分数据源以买卖盘序号推断)。采集时要注意两点:一是时间戳是交易所撮合时间还是行情落地时间,二者可能相差几十到数百毫秒;二是集合竞价阶段的成交往往在开盘瞬间集中回报,时间戳可能被压缩在同一秒内,需要保留原始序号来维持先后顺序。

委托队列数据反映的是盘口挂单的实时变化。Level-1 行情只给买一卖一,Level-2 才提供十档甚至逐笔委托。对开盘急涨复盘而言,最关键的是开盘前后卖盘的消耗速度和买盘的堆积节奏,因此至少要采集买五卖五的价位与数量,采样间隔建议不高于 3 秒;若数据源支持逐笔委托,则应完整保留委托编号、方向、价格、数量和委托类型(限价/市价/本方最优等)。

分时快照是成本最低、最容易获得的一类数据,通常按 3 秒一笔推送。它适合做整体节奏的骨架,但不适合判断单笔大单的方向,因为快照只给盘口状态,不给逐笔明细。实操中常见的做法是:以分时快照为时间骨架,把逐笔成交和委托队列挂接到骨架的各个时间点上。

盘口时间线:三类数据采集 → 清洗 → 对齐 逐笔成交 字段:时间/价/量/方向 粒度:毫秒级、逐笔 要点:保留原始序号 用途:判断主动买卖力量 委托队列 字段:档位/价/量/委托号 粒度:3 秒快照或逐笔 要点:买五卖五全保留 用途:看卖盘消耗与买盘堆积 分时快照 字段:最新价/均价/量/涨幅 粒度:约 3 秒一笔 要点:作为时间骨架 用途:整体节奏与涨速 数据清洗:去重 · 补缺 · 剔除异常 · 统一单位 · 同一成交号重复推送 → 按成交编号去重 · 快照缺失 → 标记空档,不插值伪造盘口;价格单位统一为元,量统一为手 时间对齐:统一到同一时间轴(以交易所时间为准) · 逐笔成交按“时间 ≤ 快照时间”归入最近快照区间;跨秒边界保留原始毫秒 09:24:57 09:25:00 09:30:00 09:30:03 09:30:06 集合竞价结束 → 开盘 → 急涨观察窗口

清洗:先把“脏数据”处理干净

原始数据到手后,常见问题有四类。第一是重复推送:行情落地时同一笔成交可能被重复写入,必须按成交编号或“时间+价格+量+方向”组合去重,否则成交量会被放大。第二是缺失:网络抖动会导致某些快照丢失,此时应标记空档而不是用前后值插值,因为盘口是状态量,插值会伪造出并不存在的挂单。第三是异常值:价格为 0、成交量明显超过流通盘、买卖档位价格倒挂等,需要按规则剔除并记录。第四是单位不统一:有的数据源价格用“分”,有的用“元”;成交量有的用“股”,有的用“手”,清洗时必须统一,否则后续统计会差出两个数量级。

一个可直接套用的清洗规则示例如下(以 Python 伪代码表达,字段名为示例):

# 1. 去重:同一成交编号只保留首条
tick = tick.drop_duplicates(subset=["trade_id"], keep="first")

# 2. 单位统一:价格转为元,成交量转为手
tick["price"] = tick["price"] / 100      # 若原始单位为分
tick["volume"] = tick["volume"] / 100    # 若原始单位为股

# 3. 异常剔除:价格为0或量超过阈值
tick = tick[(tick["price"] > 0) & (tick["volume"] <= 100000)]

# 4. 快照缺失标记:相邻快照间隔超过 6 秒记为空档
snap["gap"] = snap["ts"].diff().dt.total_seconds() > 6

清洗完成后应输出一份“数据质量摘要”:总记录数、去重条数、剔除条数、空档数量、时间跨度。这份摘要不是形式主义,它决定了后面复盘结论的可信度——如果开盘后 3 秒内的快照缺失严重,那么“急涨第一波由谁推动”的判断就要打折扣。

时间对齐:让三条线落在同一根轴上

对齐的关键是选定基准时间轴。推荐以交易所撮合时间为准,把分时快照的时间点作为骨架节点,逐笔成交按“成交时间不晚于该快照时间”的规则归入最近的前一个快照区间。举例来说,若快照时间为 09:30:00、09:30:03、09:30:06,某笔成交时间为 09:30:04.250,则它归入 09:30:03 至 09:30:06 这个区间,区间内所有成交的成交量之和应等于该区间快照累计成交量的增量,这个等式就是对齐是否成功的校验条件。

委托队列的对齐稍复杂:它本身是状态量,每个快照点对应一个盘口状态。对齐时只需保证每个快照点上的买五卖五数据完整,并把相邻快照之间的委托变化视为“区间内的净变化”。若使用逐笔委托数据,则可以进一步还原出每一笔挂单和撤单,从而算出“卖一被吃掉多少、新挂多少”,这对判断急涨是“真实买盘推动”还是“卖盘撤单造成的虚涨”非常关键。

对齐校验的实用做法:对每个快照区间,比较“逐笔成交量之和”与“快照累计成交量之差”,若偏差超过 1%,说明该区间存在漏采或重复,应回到原始数据复查,而不是直接进入分析。

采集与对齐的落地检查清单

把上述流程固化成一张可执行的检查表,每次复盘前过一遍,能显著减少返工:

环节检查项合格标准(示例)
采集逐笔成交是否含成交编号与方向字段齐全,方向非空
采集委托队列是否覆盖买五卖五十档齐全,采样间隔 ≤ 3 秒
采集快照时间跨度是否覆盖 09:24:57–09:30:30无超过 6 秒的空档
清洗去重、单位统一、异常剔除是否执行质量摘要中各项计数可追溯
对齐区间成交量校验偏差≤ 1%
对齐盘口状态与成交方向是否自洽主动买占比与价格上行方向一致

需要强调的是,采集与对齐的目标不是追求“数据完美”,而是让复盘时每一个结论都能追溯到具体的时间点和具体的记录。当你能指着 09:30:03 至 09:30:06 这个区间说“这里卖一被连续吃掉 800 手、买一同步上移两档”,盘口时间线才真正成为分析工具,而不是一堆看起来很像数据的表格。