17、订单簿操纵检测:Spoofing、Layering、Wash Trading 识别

做量化交易这些年,我见过最离谱的事,就是有人明目张胆地在订单簿上「画图」。你以为看到的深度和挂单是真实的?不一定。今天咱们就来聊聊订单簿上的三大骗术:Spoofing、Layering 和 Wash Trading。说白了,就是怎么识别那些「假单子」和「假交易」。

17.1 什么是 Spoofing?—— 虚晃一枪的挂单

Spoofing,中文常叫「幌骗」。手法很简单:挂一个大单在买一或卖一附近,制造出强烈的支撑或压力假象。等价格真的被吸引过去,立马撤单,反手吃掉对手的流动性。

我曾在某个山寨币的订单簿上看到过这种操作。卖一挂了 200 个 BTC,价格纹丝不动。等买盘被吓退、价格跌了 0.5%,那 200 个 BTC 瞬间消失,紧接着就是一波快速拉升。嗯,这就是典型的 Spoofing。

核心特征: 大单挂出 → 价格朝预期方向移动 → 大单迅速撤单 → 反向成交。

17.2 Layering —— 层层叠叠的假深度

Layering 是 Spoofing 的升级版。不是只挂一层,而是挂好几层。比如在卖一到卖五,每层都挂上不同数量的大单,看起来像是一堵「卖压墙」。实际上,这些单子都是同一个账户或关联账户挂的,目的就是吓唬人。

我记得有一次分析某期货合约的 Level 2 数据,发现卖一到卖五的挂单量几乎呈等差数列递减。正常人谁会这么挂?明显是程序在刷单。等真正的买盘被吓跑,这些层级的单子会逐层撤掉,价格瞬间崩盘。

层级 正常挂单 Layering 挂单
卖一 50 手 200 手
卖二 30 手 180 手
卖三 20 手 150 手
卖四 10 手 120 手
卖五 5 手 100 手

你看,正常挂单是越远越少,Layering 是越远越多。这本身就是个危险信号。

17.3 Wash Trading —— 自己跟自己玩

Wash Trading 就更直接了。同一笔资金,左手倒右手,制造虚假的成交量。交易所为了刷交易量排名,或者庄家为了吸引跟风盘,经常干这种事。

怎么识别?看两个指标:

  • 买卖方向高度对称:同一时间戳下,买一和卖一几乎同时成交,且数量相等。
  • 价格无波动:成交价长期卡在某个固定价位,比如 100.00 反复成交。
我的经验: 我曾经写过一个检测脚本,专门抓取「同一账户 ID 在 1 秒内同时买入和卖出同一品种」的记录。结果发现某个小交易所 30% 的成交量都是 Wash Trading。嗯,从那以后我再也不碰那个平台了。

17.4 检测算法实战

下面给出一段 Python 伪代码,用于实时检测 Spoofing 和 Layering。你想想看,核心逻辑其实就三点:

  1. 监控大单的存活时间
  2. 统计撤单率
  3. 分析挂单层级间的相关性
def detect_spoofing(orderbook, threshold_volume=100, time_window=0.5):
    """
    检测 Spoofing:大单存活时间 < 0.5 秒,且撤单后价格反向移动
    """
    suspicious_orders = []
    for order in orderbook.orders:
        if order.volume > threshold_volume:
            lifespan = order.cancel_time - order.place_time
            if lifespan < time_window:
                # 检查撤单后价格是否反向
                price_move = orderbook.price_after_cancel - orderbook.price_before_cancel
                if price_move * order.side < 0:  # 反向移动
                    suspicious_orders.append(order)
    return suspicious_orders

def detect_layering(orderbook, depth_levels=5, correlation_threshold=0.95):
    """
    检测 Layering:相邻层级挂单量高度相关
    """
    volumes = [orderbook.get_volume_at_level(i) for i in range(1, depth_levels+1)]
    # 计算相邻层级的相关系数
    correlations = []
    for i in range(len(volumes)-1):
        corr = np.corrcoef(volumes[i], volumes[i+1])[0,1]
        correlations.append(corr)
    if all(c > correlation_threshold for c in correlations):
        return True  # 疑似 Layering
    return False
注意: 检测算法不能只看单一指标。我曾经遇到过一种情况:某个高频做市商确实会挂多层大单,但人家是真实成交的。所以一定要结合「撤单率」和「成交率」综合判断。单看挂单量,容易误伤。

17.5 知识体系总览

下面这张图,是我自己整理的知识结构。你看一眼,心里就有数了。

订单簿操纵检测 Spoofing(幌骗) Layering(层叠) Wash Trading(洗售) 大单快速挂撤 价格反向移动 存活时间 < 0.5s 多层大单同向 层级量高度相关 撤单率 > 80% 买卖同时成交 价格无波动 同一账户ID 检测方法:存活时间 + 撤单率 + 层级相关性 + 成交对称性 综合判断,单一指标容易误伤做市商 建议结合 Level 2 数据 + 账户关联分析

17.6 避坑指南

我曾经踩过一个坑:只盯着大单撤单率看,结果把一家正规做市商给误报了。后来发现,人家撤单是因为市场波动太大,风控系统自动撤的。所以,检测操纵行为一定要结合「撤单后的价格行为」来判断。

  • 不要只看撤单率: 高撤单率不一定就是 Spoofing,也可能是做市商在调整报价。
  • 注意时间窗口: 0.5 秒以内的撤单才值得怀疑。超过 1 秒的,大概率是正常行为。
  • 关联账户分析: Wash Trading 往往涉及多个账户,需要做网络分析。
一句话总结: 订单簿上的数字,不一定都是真的。学会识别 Spoofing、Layering 和 Wash Trading,是量化交易者的基本功。别等到被假单子骗了,才后悔没早点学。