3. 数据来源与采集方法

要分析一字涨停股票的竞价封单变化,第一步不是建模,而是把“封单”这件事变成可计算的时间序列。集合竞价阶段(9:15—9:25)的封单量并不是一个静态数字,它随委托的申报、撤单、撮合预期不断变化。不同数据源能看到的粒度和字段差异很大,选错来源,后续的封单衰减率、撤单占比等指标就会失真。本节围绕三类常见来源展开:Level-2 行情、逐笔委托、快照数据,并给出一套可落地的采集与整理方法。

三类数据源的能力边界

Level-2 行情是最常用的来源。它在基础行情之上提供十档(或更多)委托队列,其中买一档的委托量在涨停价上就是“封单量”的直接体现。Level-2 通常以快照形式推送,频率约每 3 秒一笔(部分券商可达更高),字段包括买一价、买一量、卖一价、卖一量、成交价、累计成交量与成交额等。优点是接入门槛低、覆盖全市场;缺点是它只给“档位聚合量”,看不到单笔委托的进入与撤销,因此无法区分“新封单进入”与“旧封单撤走”这两种截然不同的行为。

逐笔委托(含逐笔成交)是粒度最细的来源。交易所的逐笔委托数据会记录每一笔委托的申报时间、价格、数量、买卖方向以及委托类别(如市价、限价、本方最优),逐笔成交则记录撮合明细。对于一字涨停,我们可以逐笔统计“在涨停价上新增的买单量”和“被撤销的买单量”,从而还原封单的净变化过程。它的代价是数据量大、需要按股票代码过滤并按时间排序,且不同数据商的字段命名与推送机制不一致,接入成本较高。

快照数据介于两者之间,通常指按固定间隔(如 3 秒、5 秒)采集的全市场行情切片,可来自行情接口、历史数据文件或自行定时抓取。它适合做长周期回测与批量统计,但采样间隔会丢失竞价阶段的瞬时波动,尤其在 9:20—9:25 撤单受限前后,封单可能出现快速跳变,低频快照容易漏掉关键拐点。

竞价封单数据:三类来源与整理链路 Level-2 行情 买一价 / 买一量(十档) 约 3 秒一笔快照推送 仅聚合量,无单笔撤单 逐笔委托 + 逐笔成交 单笔申报时间 / 价格 / 数量 买卖方向 / 委托类别 可还原新增与撤销量 快照数据 固定间隔行情切片 适合批量回测与统计 低频易漏瞬时拐点 统一整理:按股票代码 + 交易日过滤 → 时间对齐 → 字段标准化 时间戳统一到毫秒,价格统一到分,数量统一到股,缺失值标记而非填零 输出:竞价封单时序表(示例字段) 时间戳 | 涨停价 | 封单量 | 新增买单量 | 撤单量 | 封单净变化 | 数据源标记 用于计算封单衰减率、撤单占比、封单峰值与拐点

采集流程:以逐笔委托还原封单为例

假设我们要采集某只一字涨停股票在 9:15—9:25 的封单时序。第一步是确定涨停价:以前一交易日收盘价为基准,按主板 10%、创业板与科创板 20%、ST 股 5% 的规则计算并四舍五入到分。第二步是拉取该股票当日的逐笔委托与逐笔成交,按时间升序排列。第三步是筛选“价格等于涨停价且方向为买”的委托记录,逐笔累加得到封单量的变化轨迹。

这里有一个容易被忽略的细节:集合竞价期间的委托并不都会成交,9:20 之前允许撤单,9:20—9:25 只接受申报不接受撤单。因此封单量的变化要区分“新增委托”和“撤单”两类事件。逐笔委托数据中,撤单通常以独立的委托类别或负数量记录出现,需要按数据商文档确认字段含义。若使用 Level-2 快照,则只能看到买一量的净结果,无法拆分事件,此时应把指标定义为“封单量序列”而非“封单净流入”。

下面是一段整理逻辑的示意代码,用于把逐笔委托整理成按秒聚合的封单时序。示例参数与字段名仅作教学说明,实际接入时需按所用数据商的接口文档调整。

# 伪代码:逐笔委托 → 封单时序(示例)
limit_price = 12.34          # 涨停价,示例值
records = load_tick_orders("600XXX", "2024-06-XX")  # 按时间升序
records = [r for r in records if r.price == limit_price and r.side == "B"]

seal = 0
rows = []
for r in records:
    if r.type == "新增":
        seal += r.qty
    elif r.type == "撤单":
        seal -= r.qty
    rows.append((r.time, seal, r.type, r.qty))

# 按秒取该秒最后一笔的封单量,形成时序
series = resample_last(rows, freq="1s")

整理时的四个关键约定

时间基准统一。竞价阶段的时间戳精度直接决定拐点识别。逐笔数据常带毫秒,快照只有秒级,混用时要统一到毫秒并对齐到同一交易日,避免跨日拼接造成伪拐点。

价格与数量单位统一。价格统一到“分”,数量统一到“股”,避免不同数据源用“手”和“股”混记导致封单量差 100 倍。这一点在跨源比对时尤其重要。

缺失值不填零。某只股票在某个时点没有推送,应标记为缺失而非 0,否则会把“无数据”误判为“封单归零”,直接污染衰减率计算。

保留数据源标记。每条记录标注来自 Level-2、逐笔还是快照,便于后续做一致性校验。当逐笔统计的封单量与 Level-2 买一量出现系统性偏差时,能快速定位是字段口径问题还是采样问题。

实操建议:先用 Level-2 快照快速筛出当日一字涨停股票池,再对池内股票拉取逐笔委托做精细还原。这样既控制了数据量,又保证了重点股票的封单事件可拆分。
注意:集合竞价 9:20—9:25 不接受撤单,若某数据源在该时段仍出现“撤单”记录,应核查其字段定义,可能是数据商把“未成交委托失效”误标为撤单,直接使用会高估撤单占比。

完成上述整理后,我们得到的是一张以时间为行、以封单量与事件为列的时序表。它既是后续计算封单衰减率、撤单占比、封单峰值的基础,也是判断“封单是否真实、是否被反复撤挂”的证据链。数据源的选择决定了这张表能回答什么问题:快照回答“封单有多少”,逐笔回答“封单怎么来的、又怎么走的”。在分析一字涨停的封单变化时,后者往往才是关键。