3. 逐笔成交数据探索性分析

拿到一份逐笔成交明细后,最忌讳的做法是直接把它喂进特征工程或模型。逐笔数据体量大、噪声重、量纲差异明显,如果不先做探索性分析(EDA),后续构造出的成交量特征、频率特征很可能建立在错误的分布假设上。本节的任务是:用统计描述摸清数据的基本形态,用分布图识别偏态与异常,用时间序列图观察成交频率与成交量在交易日内的节奏,从而为后续的窗口划分、标准化方式和异常样本剔除提供依据。

一、先明确逐笔成交表的关键字段与统计口径

典型的逐笔成交数据至少包含:成交时间(精确到毫秒或秒)、成交价格、成交数量(股或手)、成交金额、买卖方向标识(主动买/主动卖或BS标志)、成交编号等。探索性分析前必须先固定口径,否则统计结果无法复现。本节约定如下:

  • 成交量:以“股”为单位,若原始数据以“手”记录,统一乘以100;
  • 成交金额:价格×成交量,用于校验与派生均价;
  • 成交频率:单位时间内的成交笔数,本节以1分钟为基本聚合粒度;
  • 时间参照:以交易日开盘时刻为0点,按自然时间轴向右递增,全天连续竞价时段为09:30–11:30与13:00–15:00。

口径统一后,才能保证“笔数”“频率”“成交量”在不同股票、不同交易日之间具备可比性。

二、统计描述:用少量指标快速定位数据形态

对成交价格、成交量、成交金额三个数值字段,至少计算以下统计量:样本数、均值、标准差、最小值、25%分位、中位数、75%分位、最大值,以及偏度和峰度。逐笔成交量几乎必然呈现极端右偏——大量小额成交与少量大单并存,因此中位数往往远小于均值,偏度显著为正。这一观察直接决定了后续是否需要对成交量取对数或做分位数截断。

实际操作中,可用如下方式一次性输出描述统计(示例代码,参数与结果均为教学假设):

import pandas as pd

df = pd.read_parquet("trades_600000_20240115.parquet")
df["amount"] = df["price"] * df["volume"]

desc = df[["price", "volume", "amount"]].describe(
    percentiles=[0.25, 0.5, 0.75, 0.95, 0.99]
)
desc.loc["skew"] = df[["price", "volume", "amount"]].skew()
desc.loc["kurt"] = df[["price", "volume", "amount"]].kurt()
print(desc)

假设某只股票当日逐笔成交量中位数为800股、均值为2600股、99%分位为42000股、偏度约6.5,则说明:一半以上的成交是小单,但均值被少数大单明显拉高。此时若直接用原始成交量做标准化,大单会主导方差;更稳妥的做法是先做对数变换 log1p(volume),或在特征构造时同时保留“是否超过99%分位”的标记。

三、分布可视化:识别偏态、多峰与异常聚集

统计量只能给出数字,分布图才能暴露结构。建议至少绘制三类图:

  1. 成交量直方图(对数坐标):原始尺度下直方图通常挤在左侧、右侧拖出长尾,几乎不可读;对成交量取 log1p 后再画直方图,往往呈现近似单峰或轻微双峰,便于判断是否存在“小单群”与“大单群”两个成交群体。
  2. 成交价格分布:价格通常集中在当日均价附近,呈窄幅多峰,峰的位置对应盘口挂单密集的价位,可用于辅助判断价格支撑与压力区域。
  3. 按买卖方向的成交量箱线图:分别统计主动买与主动卖的成交量分布,比较两者中位数与上四分位,可初步观察当日买卖力量是否对称。

若对数成交量直方图出现明显双峰,说明市场存在两类行为模式(如算法拆单的小额连续成交与人工大单),后续构造“大单占比”类特征时就有了明确依据,而不是凭经验拍一个阈值。

四、成交频率与成交量随时间的变化

逐笔数据最有价值的探索维度是时间。将成交按1分钟聚合,得到每分钟的成交笔数(频率)与成交量,再绘制时间序列折线图,可以清楚看到日内节奏。典型形态包括:开盘后前几分钟频率与成交量骤增,随后回落至平稳水平;午间休市形成断点;尾盘再次放量。这些形态不是噪声,而是市场微观结构的稳定规律,直接影响滚动窗口特征的取值。

聚合与绘图的实现方式如下(示例):

df["minute"] = df["time"].dt.floor("1min")
per_min = df.groupby("minute").agg(
    trades=("volume", "size"),
    volume=("volume", "sum"),
    vwap=("amount", "sum")
)
per_min["vwap"] = per_min["vwap"] / per_min["volume"]

观察时重点关注三点:一是开盘与尾盘分钟的成交量是否达到全天均值的数倍,若是,则构造滚动特征时应避免把开盘窗口与盘中窗口混在一起标准化;二是频率曲线与成交量曲线是否同步,若频率平稳而成交量突增,说明是大单驱动而非交易活跃度提升;三是是否存在长时间零成交的分钟,这类空档在重采样时需显式补零,否则窗口长度会失真。

逐笔成交 EDA 三条观察线 ① 统计描述 样本数 / 均值 / 标准差 中位数 / 四分位 / 极值 偏度 / 峰度 成交量:中位数 800 股 均值 2600 股,偏度 ≈ 6.5 → 强右偏,需对数变换 判断:均值被大单拉高 动作:log1p 或分位截断 保留“超99%分位”标记 ② 分布可视化 log1p(成交量) 价格分布:窄幅多峰 买卖方向箱线图对比 双峰 → 小单群 / 大单群 → 支撑“大单占比”特征 ③ 频率与成交量随时间 09:30 11:30/13:00 15:00 每分钟成交笔数 每分钟成交量 开盘/尾盘放量 → 分窗标准化 零成交分钟 → 重采样补零

上图把三条观察线并列呈现:左侧统计描述给出偏态判断,中间分布图确认双峰结构,右侧时间序列揭示日内节奏。三者共同回答一个问题——这份逐笔数据“长什么样”,从而决定后续样本构建时采用何种变换、何种窗口和何种异常处理策略。

五、把观察结论落到样本构建上

探索性分析不是走流程,它的每个结论都应转化为具体的处理决策。基于上述观察,可形成如下判断依据:若成交量偏度大于3,则对成交量特征做 log1p 变换;若对数直方图呈双峰,则额外构造“大单占比”与“平均单笔成交量”两个特征;若开盘与尾盘成交量显著高于盘中,则滚动窗口特征按“开盘段、盘中段、尾盘段”分段标准化,而不是全天统一标准化;若存在零成交分钟,则在按分钟重采样时用 reindex 补齐并填零,保证窗口长度一致。

建议在 EDA 阶段就把上述判断写成一份简短的“数据画像记录”,包含偏度值、双峰结论、开盘放量倍数和零成交分钟数。后续构造特征时直接引用这份记录,可避免不同批次数据用不同处理方式,保证样本构建流程的一致性与可复现性。

完成本节观察后,读者应当能够回答:这份逐笔数据的成交量分布是否偏斜、是否存在多类成交群体、日内节奏是否稳定、哪些时段需要特殊处理。这些答案将直接支撑下一阶段的窗口划分与特征计算,使样本构建建立在经过验证的数据形态之上,而非默认假设之上。