4、逐笔数据基础统计:成交量分布统计、成交笔数统计、单笔均量计算、大单/中单/小单划分标准、买卖力量对比(主动买 vs 主动卖)

各位同学,欢迎来到逐笔数据实战的第一章。说实话,我做了这么多年量化,最怕的就是有人一上来就问我:「老师,能不能直接给我一个能赚钱的策略?」

急什么?地基都没打牢,房子盖再高也得塌。今天咱们就把逐笔数据的基础统计彻底讲透。你想想看,如果你连「谁在买、谁在卖、买了多少笔」都搞不清楚,后面那些高阶玩法根本玩不转。

4.1 成交量分布统计——先看「量」在哪

成交量分布,说白了就是看一天当中,哪些价格区间成交最多。我个人习惯把这个叫做「价格-成交量热力图」。为什么重要?因为主力资金进场和离场,一定会留下痕迹——量堆在哪,资金就在哪。

核心逻辑: 成交量分布 = 每个价格档位上的累计成交量。它能告诉你市场的「共识区间」在哪。

我在项目中遇到过这样一个案例:某只股票全天成交清淡,突然在某个价格区间爆出巨量。很多人以为是散户跟风,其实那是机构在偷偷吸筹。怎么发现的?就是靠成交量分布统计。

代码实现其实很简单,我们直接用 pandas 的 groupby 就能搞定:

import pandas as pd

# 假设 df 是逐笔成交数据,包含 price 和 volume 两列
volume_distribution = df.groupby('price')['volume'].sum().sort_index()

# 可视化一下
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 6))
plt.bar(volume_distribution.index, volume_distribution.values, width=0.01)
plt.title('成交量分布图')
plt.xlabel('价格')
plt.ylabel('成交量')
plt.show()
小技巧: 我一般会把成交量分布做成「累积分布曲线」,这样能更直观地看到「80%的成交量集中在哪10%的价格区间」。

4.2 成交笔数统计——「笔数」比「量」更敏感

成交量是「量」,成交笔数是「次数」。这两个指标结合起来,能看出很多门道。

举个例子:同样是成交100万股,如果只用了10笔就完成,那大概率是机构在操作;如果用了1000笔才完成,那多半是散户在折腾。你想想看,是不是这个道理?

# 统计每分钟的成交笔数
df['minute'] = df['time'].dt.floor('1min')
trade_count = df.groupby('minute')['volume'].count()

# 统计每分钟的成交量
volume_per_min = df.groupby('minute')['volume'].sum()

# 合并看看
summary = pd.DataFrame({
    '成交笔数': trade_count,
    '成交量': volume_per_min
})
注意: 成交笔数统计有个坑——交易所的逐笔数据有时候会把一笔大单拆成多笔小单来报。我曾经因为这个原因,把一个机构的吸筹行为误判成了散户交易。后来怎么解决的?我加了一个「相邻同方向合并」的预处理步骤。

4.3 单笔均量计算——判断「谁在动手」

单笔均量 = 总成交量 ÷ 总成交笔数。这个指标太重要了,它直接反映了「参与者的资金实力」。

单笔均量范围 典型参与者 我的经验判断
< 500股 散户 基本可以忽略,除非出现极端密集
500 - 2000股 中户/小游资 有一定参考价值,但别太当真
2000 - 10000股 大户/机构 重点关注,尤其是连续出现时
> 10000股 主力/机构大单 必须标记,这往往是行情的起点或终点
# 计算单笔均量
avg_trade_size = df['volume'].mean()
print(f'今日单笔均量: {avg_trade_size:.0f} 股')

# 按分钟计算单笔均量
minute_avg = df.groupby('minute')['volume'].mean()
我的习惯: 我会把单笔均量做成「滚动窗口」的形式,比如过去5分钟的单笔均量。这样能实时捕捉到「资金风格切换」的信号。

4.4 大单/中单/小单划分标准——没有「万能公式」

这个问题我经常被问到:「老师,大单到底怎么定义?」说实话,没有标准答案。不同股票、不同行情、不同策略,划分标准都不一样。

但我可以给你一个「实战经验公式」:

  • 小单: 单笔成交量 < 该股票日均单笔均量的 0.5 倍
  • 中单: 单笔成交量在 0.5 倍 ~ 2 倍之间
  • 大单: 单笔成交量 > 该股票日均单笔均量的 2 倍

为什么要用「日均单笔均量」作为基准?因为不同股票的流动性差异太大了。茅台的一笔大单可能是1000万,而一只小盘股的大单可能只有50万。用绝对数值去划分,会出大问题。

# 动态划分大中小单
daily_avg = df['volume'].mean()  # 日均单笔均量

df['order_type'] = '小单'
df.loc[df['volume'] >= daily_avg * 0.5, 'order_type'] = '中单'
df.loc[df['volume'] >= daily_avg * 2, 'order_type'] = '大单'

# 统计各类订单的占比
order_stats = df['order_type'].value_counts(normalize=True)
print(order_stats)
避坑指南: 我曾经在创业板某只股票上直接用「固定阈值」划分大单,结果发现全天都是「大单」。后来一查,原来这只股票单价才3块钱,10000股才3万块。从那以后,我再也不敢用绝对数值了。

4.5 买卖力量对比——主动买 vs 主动卖

这才是逐笔数据的精髓所在。普通行情软件只能看到「成交价」,但逐笔数据能告诉你「这笔成交是谁主动发起的」。

判断标准很简单:

  • 主动买: 买方以卖一价或更高价格成交,说明买方更着急
  • 主动卖: 卖方以买一价或更低价格成交,说明卖方更着急

嗯,这里要注意:有些数据源会直接给你一个「买卖方向」字段,但有些需要你自己算。怎么算?看成交价和买卖盘口的对比。

# 假设 df 包含 price, bid_price(买一价), ask_price(卖一价)
# 判断买卖方向
def judge_direction(row):
    if row['price'] >= row['ask_price']:
        return '主动买'
    elif row['price'] <= row['bid_price']:
        return '主动卖'
    else:
        return '中性'  # 盘口内成交,一般是撮合

df['direction'] = df.apply(judge_direction, axis=1)

# 统计买卖力量对比
buy_volume = df[df['direction'] == '主动买']['volume'].sum()
sell_volume = df[df['direction'] == '主动卖']['volume'].sum()
ratio = buy_volume / sell_volume if sell_volume > 0 else float('inf')

print(f'主动买: {buy_volume}, 主动卖: {sell_volume}, 比值: {ratio:.2f}')
实战要点: 我一般不看「绝对差值」,而是看「比值的变化趋势」。如果主动买/主动卖的比值从1.0突然跳到1.5,那说明买方开始发力了。如果从1.0跌到0.6,那就要小心了。

最后,我把今天讲的内容画成一张图,方便你理解整个知识体系:

逐笔数据基础统计知识体系 逐笔成交数据 成交量分布统计 价格-量能热力图 成交笔数统计 次数比量更敏感 单笔均量计算 判断参与者实力 大/中/小单划分 动态阈值法 买卖力量对比 主动买 vs 主动卖 应用场景:主力资金追踪 | 盘口异动监控 | 量化策略信号 核心原则:先统计,再分析,最后做决策

好了,这一章的内容就到这里。记住,基础统计是量化分析的「眼睛」,没有这些数据,你就是在黑暗中摸索。下一章我们会深入「逐笔数据的清洗与预处理」,到时候我会分享一些更实用的避坑经验。


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