1. 盘口高频异动聚类分析导论

盘口高频异动聚类分析,是把逐笔委托、逐笔成交与盘口快照中那些“短时间、高频率、形态相似”的异动片段自动识别出来,并按行为特征归为一类的分析方法。它要回答的不是“这只股票明天涨不涨”,而是更基础也更可复用的问题:当前盘口正在发生哪一类行为?这类行为在历史上通常对应什么后续演化?

传统盘口观察依赖人工盯盘,交易者凭经验把“大单扫货”“对倒放量”“撤单压盘”等模式记在脑子里。问题在于:人眼每秒只能处理有限档位的变化,而高频异动的持续时间往往只有几百毫秒到几秒,且同一时刻可能叠加多种行为。聚类分析的价值,就是把这种模糊的“盘感”转化为可量化、可复现、可回溯的特征向量与类别标签。

课程要解决的核心问题

本课程围绕四个层层递进的问题展开。第一,如何定义异动:什么样的盘口变化算“高频异动”,需要给出明确的时间窗口、档位范围与阈值口径。第二,如何描述异动:把一段异动片段转化为特征向量,例如委托速率、撤单率、主动买卖比、盘口斜率、成交均价偏移等。第三,如何归类异动:选择合适的聚类算法与距离度量,把形态相近的片段聚成簇,并给每个簇赋予可解释的语义标签。第四,如何验证与应用:用样本外数据检验簇的稳定性,并把聚类结果映射回具体的盯盘信号或风控规则。

本课程强调“特征工程优先于算法调参”。盘口数据的信噪比很低,特征设计是否贴合微观结构,往往比换用哪种聚类算法更能决定最终效果。

整体分析流程

一条完整的分析链路包含六个环节,下图展示了从原始数据到可应用标签的流转关系,以及每个环节的关键产出物。

盘口高频异动聚类分析流程 ① 数据接入 逐笔委托 / 逐笔成交 十档盘口快照 ② 异动切片 时间窗口 + 档位范围 阈值触发截取片段 ③ 特征构造 速率 / 撤单率 / 买卖比 斜率 / 均价偏移 ④ 聚类 距离度量 簇划分 ⑤ 簇语义标注 扫货 / 对倒 / 压盘撤单 人工复核 + 统计画像 ⑥ 稳定性验证与应用 样本外复现 / 轮廓系数 映射为盯盘信号与风控规则 特征迭代反馈 各环节关键产出 ① 标准化事件表:时间戳、方向、价格、数量、档位 ② 异动片段集合:每段含起止时间与触发原因 ③ 特征矩阵:每行一个片段,每列一个特征 ④ 簇标签:片段 → 簇编号的映射 ⑤ 语义字典:簇编号 → 行为名称与画像 ⑥ 规则集:可落地的监控条件与阈值 注:虚线为特征迭代反馈,非单向流水线

需要强调的是,这条链路不是一次性流水线。聚类结果往往会反过来提示特征设计的缺陷——例如某个簇内部混杂了两种截然不同的行为,说明缺少一个区分维度,此时应回到特征构造环节补充特征,而不是强行增加簇数量。

实战数据集概览

课程使用的示例数据集为某只中盘股的连续竞价时段盘口数据,覆盖一个完整交易日,包含三类文件:逐笔委托(含委托编号、方向、价格、数量、委托时间)、逐笔成交(含成交编号、主动方向、价格、数量、成交时间)、以及每三秒一帧的十档盘口快照(含各档价格与挂单量)。数据规模约为委托记录数十万条、成交记录十余万条、快照约四千八百帧。

在正式分析前,需要先做三项预处理。其一是时间对齐:把三类数据统一到毫秒级时间戳,并处理交易所时间戳与本地接收时间的偏差。其二是方向还原:逐笔成交中的主动方向需结合委托编号与盘口价格判断,避免把被动成交误记为主动买入。其三是异常剔除:剔除集合竞价时段、涨跌停封死时段的片段,因为这些时段的盘口结构不具备连续竞价的统计特性。

下面是一段异动切片与特征构造的示例代码,用于说明从原始事件到特征向量的具体转换方式。参数取值属于教学示例的合理假设,并非实测结论。

# 示例:以 500ms 窗口切片并构造基础特征(教学示例参数)
WINDOW_MS = 500
THRESHOLD_ORDERS = 40      # 窗口内委托笔数阈值
THRESHOLD_CANCEL_RATE = 0.35

def slice_events(events, window_ms=WINDOW_MS):
    segments = []
    for t0 in range(events[0].ts, events[-1].ts, window_ms):
        seg = [e for e in events if t0 <= e.ts < t0 + window_ms]
        if len(seg) >= THRESHOLD_ORDERS:
            segments.append(seg)
    return segments

def build_features(seg):
    n = len(seg)
    cancels = sum(1 for e in seg if e.type == "cancel")
    buys = sum(e.qty for e in seg if e.side == "buy")
    sells = sum(e.qty for e in seg if e.side == "sell")
    return {
        "order_rate": n / (WINDOW_MS / 1000),   # 委托速率(笔/秒)
        "cancel_rate": cancels / n,             # 撤单率
        "buy_sell_ratio": buys / max(sells, 1), # 主动买卖量比
    }

运行上述逻辑后,每个满足阈值的窗口会得到一个三维特征向量。把全天所有片段堆叠成矩阵,就得到了聚类的输入。此时可以先观察特征的分布:若委托速率呈现明显的双峰,说明盘口存在“平静”与“活跃”两种状态,这本身就是聚类结构存在的初步证据。

学习本课程后的能力预期

完成全部章节后,读者应当能够独立完成一次完整的盘口异动聚类分析:从原始逐笔数据出发,设计贴合微观结构的特征,选择合适的聚类方案,对簇进行语义解释,并用样本外数据检验结论的稳定性。更重要的是,读者应建立起“先看数据结构、再选方法”的分析习惯,避免把聚类当作黑箱,把簇编号当作结论。

盘口异动聚类揭示的是统计意义上的行为相似性,不构成对后续价格方向的保证。任何基于聚类标签的交易或风控决策,都必须经过独立的样本外验证与风险预算约束。