第二十六章:市场操纵检测——幌骗、分层、虚假申报与模式识别
市场操纵,说白了就是有人用资金或订单优势,故意扭曲价格。我做了这么多年量化,见过太多花招了。今天咱们就聊聊最常见的几种:幌骗、分层、虚假申报,以及怎么用代码把它们揪出来。
26.1 什么是幌骗(Spoofing)?
幌骗,英文叫 Spoofing。手法很简单:挂一个大单在买一或卖一,但不打算成交。目的就是吓唬其他交易者,让他们以为这里有很强的支撑或压力。
举个例子:
- 有人在卖一挂了 1000 手卖单
- 价格开始下跌,其他散户慌了,跟着卖
- 等价格跌到目标位,他迅速撤单,然后低价买入
我在项目中遇到过一个大户,每天下午 2:55 准时在股指期货上挂 500 手卖单,然后 2:59 撤单。连续一周,我盯盘盯得眼睛都花了。后来用代码一跑,发现他的撤单率高达 97%。嗯,这基本就是幌骗没跑了。
核心特征:
- 大单挂单后快速撤单(撤单率 > 90%)
- 挂单时间极短(通常 < 3 秒)
- 挂单方向与最终成交方向相反
26.2 分层(Layering)是什么?
分层是幌骗的升级版。不是只挂一层,而是挂多层。比如:
- 在卖一到卖五,每层都挂上大单
- 制造出「上方压力重重」的假象
- 等价格被打下来,他再撤单买入
你想想看,如果只是卖一有压力,散户可能还会扛一扛。但卖一到卖五全是巨量,谁看了不慌?这就是分层的心理战术。
我记得有一次做回测,发现某只股票每天开盘前 5 分钟,盘口深度异常。卖一到卖五的总量是正常水平的 8 倍,但成交率不到 2%。后来查了一下,那段时间正好有监管处罚案例——就是分层操纵。
26.3 虚假申报
虚假申报比幌骗更隐蔽。它不是挂大单,而是频繁地挂单、撤单、再挂单。目的不是吓人,而是制造交易活跃的假象,吸引跟风盘。
特征:
- 申报量很大,但成交极少
- 撤单频率极高(每分钟撤单几十次)
- 挂单价格紧贴对手盘(比如买一挂 10.01,卖一挂 10.02)
我的经验:虚假申报的识别,关键看「申报成交比」。如果一个人申报了 1000 万,但只成交了 5 万,那基本就是在刷单。我曾经用这个指标抓出过好几个高频刷单账户。
26.4 操纵模式识别——代码实现
光说不练假把式。咱们直接上代码。下面是一个检测幌骗和分层的 Python 示例:
import pandas as pd
import numpy as np
def detect_spoofing(orderbook_df, threshold_ratio=0.9, time_window=3):
"""
检测幌骗行为
:param orderbook_df: DataFrame,包含时间、价格、挂单量、撤单量
:param threshold_ratio: 撤单率阈值
:param time_window: 挂单存活时间阈值(秒)
"""
# 计算撤单率
orderbook_df['cancel_ratio'] = (
orderbook_df['cancel_volume'] /
(orderbook_df['order_volume'] + 1e-8)
)
# 计算挂单存活时间
orderbook_df['order_lifetime'] = (
orderbook_df['cancel_time'] - orderbook_df['order_time']
).dt.total_seconds()
# 标记可疑订单
suspicious = (
(orderbook_df['cancel_ratio'] > threshold_ratio) &
(orderbook_df['order_lifetime'] < time_window) &
(orderbook_df['order_volume'] > orderbook_df['order_volume'].quantile(0.95))
)
return orderbook_df[suspicious]
# 使用示例
# df = pd.read_csv('orderbook_data.csv')
# spoofing_orders = detect_spoofing(df)
# print(f"发现 {len(spoofing_orders)} 笔可疑幌骗订单")
这段代码的核心逻辑:
- 撤单率 > 90%
- 挂单存活时间 < 3 秒
- 挂单量在当天属于前 5% 的大单
三个条件同时满足,基本就是幌骗了。
26.5 分层检测的进阶方法
分层检测比幌骗复杂一点。我们需要看的是「订单簿的斜率变化」。正常市场里,从买一到买五,价格越低挂单量越大。但分层操纵会打破这个规律。
def detect_layering(orderbook_df, depth_levels=5):
"""
检测分层操纵
:param orderbook_df: 包含各档位挂单量的 DataFrame
:param depth_levels: 检测的深度层数
"""
# 计算每层的挂单量占比
for i in range(1, depth_levels+1):
orderbook_df[f'level_{i}_ratio'] = (
orderbook_df[f'ask_volume_{i}'] /
orderbook_df['total_ask_volume']
)
# 分层特征:前两层占比异常高
orderbook_df['layering_score'] = (
orderbook_df['level_1_ratio'] +
orderbook_df['level_2_ratio']
)
# 标记异常
threshold = orderbook_df['layering_score'].quantile(0.99)
return orderbook_df[orderbook_df['layering_score'] > threshold]
避坑指南:我曾经犯过一个错误——只盯着大单看。结果发现很多正常的大户也是高撤单率,因为他们用的是算法交易,会频繁调整订单。后来我加了一个条件:挂单方向与最终成交方向必须相反。这才把误报率降下来。
26.6 知识体系总览
下面这张图,是我自己梳理的市场操纵检测框架。你可以把它当作一个检查清单:
26.7 实战中的注意事项
做操纵检测,有几个坑我踩过,分享给你:
- 别只看单一指标。撤单率高不一定是幌骗,也可能是算法交易在调整。一定要结合方向判断。
- 注意时间窗口。开盘和收盘前 5 分钟,操纵行为最集中。我一般会在这两个时段提高检测灵敏度。
- 小心误报。有些做市商也会频繁挂撤单,但人家是合规的。你需要一个白名单过滤掉做市商账户。
一个小技巧:如果你没有完整的订单簿数据,可以用逐笔成交数据反推。比如,看到连续大单成交后价格没怎么动,那大概率有人在挂单托市。我写过一套基于逐笔成交的检测逻辑,准确率大概在 75% 左右,够用了。
26.8 总结
市场操纵检测,说白了就是跟聪明钱斗智斗勇。幌骗、分层、虚假申报,这三招是散户最容易被割韭菜的地方。但只要你掌握了撤单率、挂单存活时间、申报成交比这几个核心指标,再配合代码自动化监控,就能把大部分操纵行为揪出来。
我个人习惯是每天收盘后跑一遍全市场检测,生成可疑名单。第二天开盘前再看一眼,心里有数。嗯,这套流程我用了三年,效果还不错。