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()
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()
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)
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}')
最后,我把今天讲的内容画成一张图,方便你理解整个知识体系:
好了,这一章的内容就到这里。记住,基础统计是量化分析的「眼睛」,没有这些数据,你就是在黑暗中摸索。下一章我们会深入「逐笔数据的清洗与预处理」,到时候我会分享一些更实用的避坑经验。
公众号:蓝海资料掘金营,微信deep3321