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 大单买入与大单卖出的判定逻辑

好,到了最核心的部分。怎么判断一笔大单是买入还是卖出?

我常用的逻辑分三步:

  1. 第一步:识别大单(用上面讲的阈值方法)
  2. 第二步:判断方向(看成交价格与买卖盘口的关系)
  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 一张图看懂大单识别流程

我把整个逻辑画成了流程图,方便你理解:

大单识别与方向判定流程图 逐笔成交数据 大单阈值判定(成交量/成交额) 是否大单? 忽略(非大单) 方向判定(价格 vs 盘口) 大单买入 大单卖出 注:大单阈值需根据股票流动性和市场环境动态调整 方向判定需结合订单合并,避免拆分单漏判

3.5 避坑指南——我踩过的几个坑

最后分享几个实战中容易犯的错误:

  • 坑一:只看单笔,不看合并。 我曾经有个策略,回测效果特别好,实盘一跑就废。后来发现是没做订单合并,大单被拆成小单后全漏了。
  • 坑二:阈值设成固定值。 不同股票、不同时间段,阈值应该动态调整。早盘和尾盘的成交量特征完全不一样。
  • 坑三:把主动买入当成大单买入。 主动买入只是成交方式,不代表资金意图。真正的大单买入,要看这笔成交是否改变了盘口结构。

嗯,大单识别这块就讲这么多。说白了,核心就是三件事:定阈值、看数据、判方向。把这三点吃透了,盘口异动预警就有了最坚实的基础。


公众号:蓝海资料掘金营,微信deep3321