3. 未匹配量的数据获取与清洗

集合竞价未匹配量分析的第一步,不是画图,也不是下结论,而是把“未匹配量”这一列数据可靠地拿到手,并处理成可用于比较和计算的干净序列。很多分析结论失真,根源往往不在判断逻辑,而在数据本身:字段含义理解错、时间点取错、缺失值被当成零、异常值未识别。本节围绕数据获取与清洗展开,重点讲清楚从哪里取、取什么、怎么判断脏数据、怎么处理。

一、先明确要取的字段与口径

集合竞价阶段(以A股为例,9:15—9:25)行情软件通常提供“匹配量”“未匹配量”“虚拟匹配价”“虚拟匹配量”等字段。不同软件对“未匹配量”的定义可能不同,常见有两种口径:一是未匹配量指当前虚拟匹配价下,买方或卖方未能成交的剩余委托量(通常带方向,如“未匹配买入量/未匹配卖出量”);二是部分软件只给出一个净额或绝对值。取数前必须确认口径,否则后续“未匹配量大小代表压力方向”的判断会完全反过来。

建议至少取以下字段:交易日期、证券代码、竞价时间点(如9:20、9:24、9:25)、虚拟匹配价、匹配量、未匹配买入量、未匹配卖出量、未匹配量方向标识。若接口只提供净未匹配量,则需在文档中记录“净额=买入未匹配−卖出未匹配”或相反的定义,并在全课程中保持一致。

二、数据获取的两条路径

路径一:行情软件导出。多数软件支持将集合竞价明细或分时快照导出为CSV/Excel。操作要点是:选择“集合竞价”时段而非连续竞价;导出字段勾选完整;注意导出的是“快照”还是“逐笔”。快照类数据每个时间点一行,适合做时间序列;逐笔类数据需要按时间聚合。导出后第一时间检查行数是否与交易日、时间点数量吻合,例如某日9:20—9:25每5秒一个点,理论上应有约60行,若只有几行说明导出范围选错。

路径二:数据接口提取。常见方式是通过行情API或本地数据库(如Level-1快照、Level-2逐笔委托)按字段拉取。以Python伪代码示意取数与初步整理:

import pandas as pd

# 假设 df 为接口返回的集合竞价快照
# 字段:code, trade_date, snap_time, match_price, match_vol,
#       unmatched_buy_vol, unmatched_sell_vol
df["snap_time"] = pd.to_datetime(df["snap_time"])
df = df.sort_values(["code", "trade_date", "snap_time"])

# 统一未匹配量方向:净未匹配量 = 买入未匹配 - 卖出未匹配
df["net_unmatched"] = df["unmatched_buy_vol"] - df["unmatched_sell_vol"]

# 只保留 9:15—9:25 的竞价快照
df = df[(df["snap_time"].dt.time >= pd.Timestamp("09:15").time()) &
        (df["snap_time"].dt.time <= pd.Timestamp("09:25").time())]

接口取数要特别注意两点:一是时间戳时区与格式,避免把9:25的数据错标成9:30;二是字段单位(股/手),不同接口可能不一致,混用会导致量级错误。

三、缺失值的识别与处理

缺失值在竞价数据中很常见,原因包括:该时间点无成交也无有效委托、接口限流丢包、软件导出空单元格、停牌或临时停牌。处理原则是先区分“真缺失”和“假缺失”:若某时间点确实没有未匹配量(例如9:15刚开盘委托极少),记为零是合理的;若是接口丢包导致整段缺失,则不能简单补零,否则会人为制造“无压力”的假象。

实操中可按证券—日期分组检查时间点连续性:若相邻快照间隔明显大于正常采样间隔(如正常5秒、出现60秒空档),标记为疑似丢包;若某字段为空但同组其他字段正常,标记为字段级缺失。对字段级缺失,可用前向填充(ffill)并限制填充步数,或直接剔除该时间点;对整段丢包,建议剔除该证券当日数据或从备用源补取,而不是插值。插值只适用于连续且变化平缓的匹配价,不适合未匹配量这种可能突变的量。

四、异常值的判定与处置

未匹配量的异常值通常表现为:数量级远超当日匹配量、方向与价格明显矛盾、同一时间点重复记录、负值(若口径不允许)。判定可结合业务规则与统计规则:业务上,未匹配量一般不应为负(除非接口用负号表示卖出方向,此时需先统一符号);统计上,可用同一证券近N日同时点未匹配量的中位数与MAD(中位数绝对偏差)做稳健离群判断,避免均值受极端值拉偏。

处置方式要分情况:重复记录直接去重(按代码+日期+时间点保留一条);明显录入错误的负值按口径修正符号或置为缺失;数量级异常的记录先核对原始接口再决定剔除,不可盲目截断。所有被修改、剔除的记录应保留清洗日志,记录代码、日期、时间点、原值、处理方式和原因,便于复核。

集合竞价未匹配量:获取 → 校验 → 清洗 → 可用数据 行情软件导出 CSV / Excel 快照 注意时段与字段勾选 数据接口提取 API / 本地快照库 注意时区与单位 字段与口径确认 • 虚拟匹配价 / 匹配量 • 未匹配买入量 • 未匹配卖出量 • 净未匹配量方向定义 • 时间点:9:20 / 9:24 / 9:25 • 单位:股 或 手(统一) 完整性校验 行数 ≈ 交易日 × 时间点数;检查采样间隔 区分“真缺失(无委托)”与“假缺失(丢包)” 异常值处置 去重 → 符号修正 → 稳健离群判定(MAD) 剔除或补取,保留清洗日志 输出:按 代码—日期—时间点 对齐的未匹配量序列 含方向标识、单位统一、缺失与异常已标记,可直接进入压力分析 关键原则:缺失值先判“真/假”再决定补零或剔除;异常值先核对原始接口再处置;所有修改留日志,保证可复核、可复现。 口径一致性优先于数据量:净未匹配量的正负方向必须在全课程中统一,否则压力方向判断会整体反转。

五、清洗后的质量检查

清洗完成不等于可用。建议做三项快速检查:其一,抽样核对,随机抽3—5只证券,把清洗后的未匹配量与原始导出文件逐点比对,确认没有错位或单位错误;其二,分布检查,看同一时点全市场未匹配量的分布是否出现明显双峰或极端长尾,若有,往往说明混入了不同口径的数据源;其三,时间序列连续性检查,确认每只证券在9:20—9:25的关键时点都有记录,因为9:20后不可撤单,这一段的未匹配量对价格压力判断最有价值。

教学示例说明:上文中的时间点、采样间隔、字段名与代码片段均为讲解用示例,实际字段名和接口格式以所用软件或数据源文档为准;示例中的数值未经过真实行情验证,仅用于说明处理逻辑。

把数据获取与清洗做扎实,后续的未匹配量趋势、方向变化与价格压力的对应关系才有可靠基础。清洗阶段多花十分钟核对口径与日志,往往能避免分析阶段数小时的返工。