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永续合约。策略是高频做市,双边挂单赚价差。
事发经过:
- 策略正常运行了3天,一切正常
- 第4天凌晨,BTC突然出现一波快速下跌
- 策略的买单被大量成交,卖单却迟迟没成交
- 策略判断持仓过大,开始反向挂单平仓
- 平仓单和原有的买单在盘口相遇,自成交爆发
数据:
| 时间 | 自成交笔数 | 涉及金额 | 交易所处罚 |
|---|---|---|---|
| 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 监控层面
- 实时监控自成交率,超过阈值自动暂停
- 记录所有被拒绝的订单,方便复盘
- 设置报警,自成交一旦发生,立刻通知风控人员
一句话总结:自成交不是小事。交易所对自成交的容忍度极低,轻则警告,重则封号。我见过太多团队因为自成交被交易所拉黑,整个业务直接停摆。所以,防自成交,怎么重视都不为过。
这张图把自成交异常的核心逻辑串起来了。从定义到原因,再到案例和防范,每一步都不能少。我个人习惯是把这张图打印出来贴在工位上,每次写策略前看一眼,提醒自己别踩坑。
避坑指南:我曾经在实盘前忘了加自成交检测,结果上线第一天就触发了。从那以后,我把自成交检测写进了策略模板里,每个新策略都默认带上。你也不妨试试这个办法。