事中防线的核心难题在于:没有任何单笔委托是错的。一支涨停股上的买单、两个账户之间的成交、一笔秒撤的大单,单看都完全合法——异常出现在模式里:买单集中在尾盘拉升、两个账户互为对手方的成交占比过高、大单申报后撤单率畸高。监控系统的任务是把监管对"操纵行为"的描述性口径翻译成可计算规则。这篇讲这个翻译过程和技术路线选择。
从监管口径到计算规则
交易所的异常交易监控指引对各类行为的定义是描述性的,翻译成规则要先找到可观测的代理变量。三类典型行为:
对倒(对敲):同一实际控制人下的多个账户互为对手方成交,制造活跃假象。可观测代理:账户组内成交占比——属于同一控制组的两个账户 A、B,它们之间的成交量占各自当日总成交量的比例。设 A、B 当日互为对手方成交 $V_{AB}$,各自总成交 $V_A$、$V_B$,则:
$$ \rho = \frac{V_{AB}}{\min(V_A, V_B)} $$
分母取较小值是保守设计:如果 A 只和 B 交易,$\rho = 1$,无论 B 还和多少人交易都暴露了这个账户的成交完全指向对家。阈值的设定要结合流动性背景——小盘股账户间自然成交占比天然偏高,固定阈值会误伤;常见做法是阈值随证券的日均换手率分档。
拉抬打压:通过大单申报推高或压低价格。可观测代理有两个:价格偏离度(成交/申报价相对前收、相对同期间市场均价的偏离)和申报压力比(某账户在买盘一档的申报量 / 全市场该档申报总量)。尾盘拉升的识别加一个时间窗条件:偏离度在时间窗内单调放大且伴随申报量激增。规则的复杂性主要在时间窗的对齐上——逐笔数据的时间戳精度、集合竞价阶段的特殊处理,都会改变窗口内统计结果。
虚假申报:大额申报频繁撤单,干扰盘口。可观测代理最简单:撤单率 = 撤单笔数(或金额)/ 申报笔数(金额),分母分算两个口径,任一超过阈值即触发,再叠加"撤单前盘口停留时长不足 X 秒"的条件区分正常改价。
注意所有规则都输出疑似信号而不是定性结论。账户组关系要靠反洗钱和尽职调查数据维护,监控系统只负责"这组账户的成交行为值得人工看",定性是交易所和监管的事——这个边界必须明确,否则监控系统会背上看不懂业务的责任。
规则引擎 vs 流式计算:两条路线
行为规则有一个共同特征:状态跨事件累积。单笔成交数据本身没意义,意义在"过去 5 分钟同一证券的成交占比""当日累计撤单率"。数据从哪来、状态在哪累积,决定了两条技术路线:
规则引擎路线(CEP,复杂事件处理):流式事件进入 Esper/Flink CEP 这类引擎,规则写成"模式 + 窗口 + 聚合"的声明式语句。优势是规则上线快——业务人员定义的口径可以直接翻译,不用发版;劣势是复杂规则的性能天花板低,多账户组、多时间窗的组合规则在事件洪峰(开盘、行情异动)时延迟飙升,且引擎的调试能力弱,"为什么这笔成交没触发规则"这种问题排查成本高。
自研流式聚合路线:Kafka 消费逐笔数据,Flink 作业按证券/账户键做窗口聚合,聚合结果落特征库,规则判定是特征库上的批查询(分钟级 T+0)或微批。优势是性能可控、聚合特征可复用(同一组特征支持多类规则查询,不用每条规则重复消费全量流);代价是规则变更要走发版流程,灵活性差。
实务的答案是分层的:高频硬规则走自研聚合(撤单率、成交占比这类口径稳定、计算量大的),长尾规则走规则引擎(监管新口径、临时专项监控,要求今天上线)。两条路线的产出汇到同一个告警工作台,人工复核的流程不感知规则跑在哪条路上。这也回答了"为什么不用一套引擎"——两条路线的约束(性能 vs 灵活)不可兼得,拆开各管一段,比强行统一便宜。
误报的成本:为什么阈值不追求灵敏度
统计直觉会说:阈值放宽松,多抓一些疑似,人工复核筛掉就好。实际运行里误报的成本被严重低估。一个告警的生命周期是:系统告警 → 合规专员初审 → 调阅明细数据 → 需要时上报交易所——全流程人力成本按小时计,而一家活跃营业部一天可能产生几千条原始信号。误报率 90% 意味着合规团队每天在垃圾里筛金子,一周后就会对告警麻木,真正的风险信号淹没在噪音里。
所以阈值调优的目标函数不是灵敏度,而是复核容量:按合规团队每天能认真复核 N 条告警倒推阈值,让日均告警量稳定在 N 附近。数学上,告警量是阈值 $\theta$ 的递减函数 $A(\theta)$,调参就是解 $A(\theta) \approx N$。误报率的评估也要分证券分时段做——开盘半小时信号天然密集,同样的阈值在那里误报率翻倍,所以实践中规则参数要带时段维度:开盘时段收紧阈值(交易行为模式本身就极端),盘中常态放松。
数据侧的两个前提
规则再精巧,数据不行就全盘不行。两个前提条件:
账户组关系数据质量。对倒规则的输入是"哪些账户属于同一控制人",这组数据来自反洗钱系统的尽职调查和可疑交易分析的人工积累,天然滞后且不全。规则上要设计降级:已知关联组的账户用组内占比规则,未知关联的单账户用"成交对手集中度"近似(一个账户的对手方高度集中且反向操作频繁,疑似对倒的旁证)。
逐笔数据的时间对齐。《行情异常处理》讲过序列号与乱序,这里再强调一次是因为窗口聚合对乱序敏感:同一笔成交的买方时间和卖方回报时间差几十毫秒很正常,账户组成交占比的窗口统计必须按撮合成交时间(交易所时间戳)对齐,用各自收到回报的时间对齐会把同一笔成交算进两个窗口。逐笔数据进监控系统之前要做一遍以交易所时间为准的重排序,这个预处理环节承担了全部的对齐责任,规则层才能放心用窗口语义。