4、逐笔成交数据分析:逐笔成交的读取方法、买卖方向判断(主动买/主动卖)、挂单与成交的对应关系

各位同学,今天我们来聊聊逐笔成交数据。这东西,说白了就是市场最原始的“心跳记录”。

我刚开始做量化那会儿,整天盯着K线图看,觉得那就是一切。后来有一次,我回测一个策略,明明信号都对,实盘就是亏钱。我查了三天三夜,最后发现是成交细节出了问题。嗯,从那以后,我再也不敢小看逐笔数据了。

4.1 逐笔成交数据的读取方法

逐笔成交数据,就是交易所每撮合成一笔交易,就记录一条。它不像分钟线那样被“加工”过,是最干净、最真实的数据。

我个人习惯用Python来读取。国内主流的数据源,比如Level-2行情,都会提供逐笔成交的接口。格式大致如下:

import pandas as pd

# 假设从数据源读取到的原始数据
data = {
    '时间': ['09:30:01.123', '09:30:01.456', '09:30:02.001'],
    '价格': [10.01, 10.02, 10.01],
    '成交量': [100, 200, 150],
    '成交额': [1001, 2004, 1501.5],
    '买卖方向': ['B', 'S', 'B'],  # B=主动买, S=主动卖
    '成交编号': ['12345', '12346', '12347']
}

df = pd.DataFrame(data)
print(df.head())

这里要注意一个细节:不同数据源给的字段名可能不一样。有的叫“方向”,有的叫“BSFlag”。我在项目中遇到过,某家数据源把主动买标记为1,主动卖标记为2,结果我按0和1去判断,直接全反了。所以拿到数据后,第一件事就是检查字段定义。

避坑指南: 我曾经因为没仔细看数据说明,把主动买和主动卖搞反了,导致策略回测结果完全相反。后来我养成了一个习惯:拿到数据后,先手动核对几笔,确认方向标记的含义。

4.2 买卖方向判断:主动买 vs 主动卖

这是逐笔分析的核心。你想想看,一笔交易能成交,一定是有人想买,有人想卖。那到底谁更“主动”?

判断标准其实很简单:

  • 主动买(B):买方直接以卖一价或更高的价格买入。说白了,就是买方“抢着买”。
  • 主动卖(S):卖方直接以买一价或更低的价格卖出。就是卖方“急着卖”。

举个例子:

# 假设当前盘口
买一:10.00  1000股
卖一:10.01  800股

# 场景1:有人以10.01的价格买入500股
# 这就是主动买。因为买方直接吃了卖一的单子。

# 场景2:有人以10.00的价格卖出300股
# 这就是主动卖。因为卖方直接砸给了买一的单子。

为什么会这样?因为成交价格决定了谁更主动。如果成交价等于卖一价或更高,那就是买方主动。如果成交价等于买一价或更低,那就是卖方主动。

我建议你在代码里这样判断:

def judge_direction(row, bid_price, ask_price):
    """
    row: 逐笔成交数据行
    bid_price: 当前买一价
    ask_price: 当前卖一价
    """
    if row['成交价'] >= ask_price:
        return '主动买'
    elif row['成交价'] <= bid_price:
        return '主动卖'
    else:
        # 这种情况很少见,一般是价格刚好在中间
        return '中性'
小技巧: 有些数据源会直接给你标记好方向。但我不建议完全依赖它。我习惯自己再算一遍,双重验证。因为数据源也可能出错。

4.3 挂单与成交的对应关系

挂单是“意愿”,成交是“结果”。两者之间的关系,就像“想买”和“买到了”的区别。

我画了一张图,帮你理解这个关系:

挂单与成交对应关系图 挂单(订单簿) 卖五:10.05 2000股 卖四:10.04 1500股 卖三:10.03 1800股 卖二:10.02 1200股 卖一:10.01 800股 买一:10.00 1000股 买二:9.99 1500股 买三:9.98 2000股 撮合引擎 成交(逐笔数据) 成交1:10.01 500股 方向:主动买 对应:吃掉卖一800股中的500股 成交2:10.00 300股 方向:主动卖 对应:砸向买一1000股中的300股 成交后,挂单数量会减少 卖一剩余:300股 买一剩余:700股

你看,挂单就像是一个“蓄水池”,成交就是“放水”。每一笔成交,都会消耗掉对应的挂单。

这里有个关键点:大单拆解。主力资金为了不暴露意图,经常会把一个大单拆成很多小单。比如:

  • 一个100万股的买入,可能拆成100笔,每笔1万股
  • 时间上分散在几分钟甚至几十分钟内
  • 价格上可能在不同价位分批买入

我教你一个方法,识别这种“伪装”:

def detect_large_order(df, time_window=60, volume_threshold=50000):
    """
    检测大单拆解行为
    df: 逐笔成交数据
    time_window: 时间窗口(秒)
    volume_threshold: 成交量阈值(股)
    """
    # 按时间排序
    df = df.sort_values('时间')
    
    # 计算滚动成交量
    df['滚动成交量'] = df['成交量'].rolling(window=time_window).sum()
    
    # 标记大单
    df['是大单'] = df['滚动成交量'] > volume_threshold
    
    return df[df['是大单']]
核心要点: 逐笔成交数据是判断主力资金动向的最直接工具。通过分析主动买和主动卖的对比,结合挂单变化,你可以清晰地看到:谁在买,谁在卖,以及他们是怎么操作的。

4.4 实战应用:如何利用逐笔数据跟单

好了,理论讲完了。咱们来点实际的。

我个人习惯这样用逐笔数据:

  1. 看主动买/主动卖的比例:如果连续一段时间,主动买的成交量远大于主动卖,说明有人在吸筹。
  2. 看大单拆解痕迹:如果发现某个价格区间,频繁出现相同大小的单子(比如每次都是1万股),那很可能是主力在分批建仓。
  3. 结合挂单变化:如果卖一位置突然出现大单,然后又被快速吃掉,这往往是主力在试盘。

举个例子:

# 假设你看到这样的逐笔数据
# 时间        价格   成交量  方向
# 09:35:01   10.01   10000   B
# 09:35:03   10.01   10000   B
# 09:35:05   10.01   10000   B
# 09:35:07   10.01   10000   B
# 09:35:09   10.01   10000   B

# 连续5笔,每笔1万股,都是主动买
# 这说明什么?有人在10.01这个价位,连续吃了5万股
# 而且每次都是1万股,明显是拆过的

# 再看挂单变化
# 卖一原本有50000股,现在只剩0
# 买一原本有30000股,现在变成40000股(因为有人撤单或新增)

嗯,这里要注意:不是所有的大单拆解都是主力。有时候机构做套利也会这样操作。但如果你发现这种模式反复出现,而且伴随着股价的稳步上涨,那大概率是主力在建仓。

我的经验: 我一般会结合盘口数据一起看。如果逐笔数据显示主动买很多,但盘口的买一挂单却在减少,那说明有人在“边买边撤”,这是典型的洗盘手法。

最后,送你一句话:逐笔数据是市场的“显微镜”。用好了,你能看到别人看不到的细节。但别沉迷于细节,要时刻记得看大方向。