4、自成交异常:定义与识别逻辑、常见触发原因

自成交异常,说白了就是自己跟自己成交。

你挂了一笔买单,另一笔卖单也是你的,两边一碰,成交了。这在交易所眼里,属于典型的异常交易行为。我刚开始做量化那会儿,觉得这玩意儿离自己很远,直到有一次实盘跑着跑着,交易所的警告电话直接打到公司来了……嗯,从那以后我再也不敢小看自成交。

4.1 自成交的定义与识别逻辑

自成交,英文叫 Self-Trade。指同一主体(或关联主体)的买卖订单,在交易系统中相互匹配成交。

交易所怎么识别?其实逻辑不复杂:

  • 同一账户:你的A订单和B订单成交了
  • 关联账户:你控制的多个账户之间成交了
  • 算法关联:同一策略管理的不同子账户之间成交

交易所的监控系统,会实时扫描订单簿。一旦发现买卖双方属于同一控制主体,立刻标记为自成交。我见过最夸张的一次,有个团队一天内自成交了300多次,直接被交易所限制交易一个月。

核心识别指标

  • 同一IP或MAC地址发出的买卖订单
  • 同一API Key管理的多个账户
  • 订单时间戳高度重合(毫秒级)
  • 买卖价格、数量高度对称

4.2 常见触发原因

为什么会触发自成交?我总结下来,主要有两个原因:

4.2.1 流动性不足

这个其实最常见。你想想看,一个冷门品种,盘口只有几手挂单。你的策略一开,买一卖一全是你的单子。啪,成交了。

我在做商品期货CTA时遇到过这种情况。某个农产品合约,日均成交量不到1000手。我的策略在收盘前平仓,结果连续三次自成交。后来我加了流动性过滤,低于一定挂单量直接不交易。

4.2.2 算法Bug

这个就更有意思了。算法Bug导致自成交,我见过好几种:

  • 信号冲突:同一策略同时发出买入和卖出信号
  • 参数错误:买卖价差设置过小,导致订单交叉
  • 状态混乱:策略认为持仓是空的,实际上还有底仓
  • 多实例问题:同一个策略跑了两个实例,互相打架

我记得有一次,团队里一个小伙子写了个套利策略。逻辑是买A卖B,结果代码里把A和B的合约代码写反了。好家伙,两边都是同一个品种,直接自成交了200多笔。交易所的警告函第二天就寄到了公司。

注意:算法Bug导致的自成交,往往比流动性不足更危险。因为Bug不会自己修复,它会持续产生自成交,直到你手动停止策略。

4.3 实盘案例复盘

讲一个我亲身经历的案例吧。

背景:某数字货币交易所,BTC永续合约。策略是高频做市,双边挂单赚价差。

事发经过

  1. 策略正常运行了3天,一切正常
  2. 第4天凌晨,BTC突然出现一波快速下跌
  3. 策略的买单被大量成交,卖单却迟迟没成交
  4. 策略判断持仓过大,开始反向挂单平仓
  5. 平仓单和原有的买单在盘口相遇,自成交爆发

数据

时间 自成交笔数 涉及金额 交易所处罚
00:00 - 00:05 12笔 8.5 BTC 警告
00:05 - 00:10 47笔 32 BTC 限制交易15分钟
00:10 - 00:15 89笔 67 BTC 账户冻结

复盘结论

  • 根本原因:策略在极端行情下,没有做自成交检测
  • 直接原因:平仓逻辑和挂单逻辑没有互斥
  • 教训:任何策略都要加自成交防火墙

我的建议:实盘前,一定要做自成交压力测试。模拟极端行情,看看你的策略会不会自己跟自己打架。我曾经吃过这个亏,现在每个策略上线前,我都会亲自盯着跑一遍压力测试。

4.4 防范措施

怎么防?我列几个硬性措施:

4.4.1 代码层面

// 自成交检测伪代码
function checkSelfTrade(order):
    // 检查当前订单是否与已有订单冲突
    for each existingOrder in orderBook:
        if existingOrder.accountId == order.accountId:
            if isCrossOrder(existingOrder, order):
                reject(order)
                logWarning("自成交检测触发")
                return false
    return true

4.4.2 策略层面

  • 订单互斥:同一品种同一方向,只允许一个活跃订单
  • 最小价差:买卖价差必须大于最小tick的3倍
  • 冷却时间:同一账户的买卖订单,间隔至少500ms
  • 总量控制:单品种总挂单量不超过盘口深度的20%

4.4.3 监控层面

  • 实时监控自成交率,超过阈值自动暂停
  • 记录所有被拒绝的订单,方便复盘
  • 设置报警,自成交一旦发生,立刻通知风控人员

一句话总结:自成交不是小事。交易所对自成交的容忍度极低,轻则警告,重则封号。我见过太多团队因为自成交被交易所拉黑,整个业务直接停摆。所以,防自成交,怎么重视都不为过。

自成交异常知识体系 定义与识别逻辑 同一主体订单相互匹配 常见触发原因 流动性不足 / 算法Bug 实盘案例复盘 高频做市自成交事件 防范措施 代码层面 / 策略层面 / 监控层面 代码层面 自成交检测函数 策略层面 订单互斥 / 最小价差 监控层面 实时报警 / 自动暂停

这张图把自成交异常的核心逻辑串起来了。从定义到原因,再到案例和防范,每一步都不能少。我个人习惯是把这张图打印出来贴在工位上,每次写策略前看一眼,提醒自己别踩坑。

避坑指南:我曾经在实盘前忘了加自成交检测,结果上线第一天就触发了。从那以后,我把自成交检测写进了策略模板里,每个新策略都默认带上。你也不妨试试这个办法。

专注资料整理