3、大单识别算法:定义大单阈值、逐笔成交数据解析与大单判定逻辑
做盘口异动预警,最核心的一步是什么?
我个人觉得,就是大单识别。你想想看,如果连什么是「大单」都定义不清楚,那后面的预警全是瞎忙活。我刚开始做量化那会儿,就吃过这个亏——阈值设得太低,满屏都是预警,根本看不过来;设得太高呢,又漏掉了关键信号。
今天咱们就把这块彻底讲透。
3.1 大单阈值怎么定?两种主流思路
大单阈值没有标准答案。不同股票、不同市场环境,阈值肯定不一样。我一般用两种方法:
方法一:基于成交量的阈值
说白了,就是看单笔成交量占近期平均每笔成交量的倍数。举个例子:
# 计算过去20笔的平均成交量
avg_vol = df['volume'].rolling(20).mean()
# 定义大单:单笔成交量 > 平均值的3倍
large_order = df['volume'] > avg_vol * 3
这个3倍怎么来的?我做过回测,A股市场里,3倍标准差之外的成交,往往伴随着明显的资金意图。当然,你也可以用2.5倍或4倍,看你的灵敏度需求。
我的经验: 对于流动性差的股票(日均成交额<5000万),建议用2倍阈值。否则大单信号太少,预警形同虚设。
方法二:基于成交额的阈值
这个方法更直接——设定一个固定金额。比如单笔成交额超过50万元就算大单。为什么是50万?
- 对于散户来说,50万是一笔不小的数目
- 对于机构来说,50万刚好是试仓的常见规模
- 交易所的逐笔数据里,50万以上的成交往往伴随明显的挂单变化
我建议把两种方法结合起来用:
def is_large_order(row, avg_vol, threshold_vol=3, threshold_amt=500000):
# 同时满足成交量倍数和成交额阈值
cond1 = row['volume'] > avg_vol * threshold_vol
cond2 = row['amount'] > threshold_amt
return cond1 and cond2
注意: 千万别只用固定金额阈值。遇到贵州茅台这种高价股,50万可能就几手;遇到低价股,50万可能是几千手。一定要结合股票自身特性来调。
3.2 逐笔成交数据解析——你得看懂这些字段
逐笔成交数据,是交易所直接下发的原始数据。我当年第一次拿到这个数据时,差点被字段名搞晕。其实核心就这几个:
| 字段名 | 含义 | 我的解读 |
|---|---|---|
| Time | 成交时间(精确到毫秒) | 注意:有些接口给的是纳秒,要转换 |
| Price | 成交价格 | 这个没啥好说的 |
| Volume | 成交量(股数) | 注意单位:有的是手,有的是股 |
| Amount | 成交金额 | 一般用这个算阈值更准 |
| BuySellFlag | 买卖方向(B/S) | B是主动买,S是主动卖 |
| OrderID | 订单编号 | 可以用来合并同一笔大单的拆分 |
这里有个坑——很多新手以为BuySellFlag就是大单的方向。其实不是!
BuySellFlag只表示这笔成交是由买方主动吃单,还是卖方主动砸单。 真正的大单判定,要看这笔成交是否属于某个大额订单的一部分。
3.3 大单买入与大单卖出的判定逻辑
好,到了最核心的部分。怎么判断一笔大单是买入还是卖出?
我常用的逻辑分三步:
- 第一步:识别大单(用上面讲的阈值方法)
- 第二步:判断方向(看成交价格与买卖盘口的关系)
- 第三步:确认意图(结合前后成交序列)
第二步是关键。具体怎么判断?
def judge_large_order_direction(row, bid_price, ask_price):
"""
判断大单方向
bid_price: 当前买一价
ask_price: 当前卖一价
"""
if row['price'] >= ask_price:
# 以卖一价或更高价成交 → 主动买入
return 'BUY'
elif row['price'] <= bid_price:
# 以买一价或更低价成交 → 主动卖出
return 'SELL'
else:
# 在买卖价之间成交 → 可能是中性
return 'NEUTRAL'
嗯,这里要注意:有时候大单会被拆分成多笔小单成交。比如一个大户想买100万股,他会拆成几十笔小单,避免引起注意。这时候如果你只看单笔,根本识别不出来。
我的做法是——做订单合并:
# 按订单编号分组,合并同一订单的多笔成交
merged_orders = df.groupby('OrderID').agg({
'Volume': 'sum',
'Amount': 'sum',
'Price': 'mean',
'BuySellFlag': 'first'
})
# 对合并后的订单重新判定大单
merged_orders['is_large'] = merged_orders['Amount'] > 500000
核心要点: 大单买入 ≠ 主动买入。大单买入是指「一笔大额资金在主动吃单」,而不是「被动接盘」。被动接盘的大单,往往是机构在出货。
3.4 一张图看懂大单识别流程
我把整个逻辑画成了流程图,方便你理解:
3.5 避坑指南——我踩过的几个坑
最后分享几个实战中容易犯的错误:
- 坑一:只看单笔,不看合并。 我曾经有个策略,回测效果特别好,实盘一跑就废。后来发现是没做订单合并,大单被拆成小单后全漏了。
- 坑二:阈值设成固定值。 不同股票、不同时间段,阈值应该动态调整。早盘和尾盘的成交量特征完全不一样。
- 坑三:把主动买入当成大单买入。 主动买入只是成交方式,不代表资金意图。真正的大单买入,要看这笔成交是否改变了盘口结构。
嗯,大单识别这块就讲这么多。说白了,核心就是三件事:定阈值、看数据、判方向。把这三点吃透了,盘口异动预警就有了最坚实的基础。
公众号:蓝海资料掘金营,微信deep3321