第29章:交易量分析的Python实战:使用Pandas处理交易量数据。可视化交易量模式。

说实话,交易量这个指标,很多新手容易忽略。大家总盯着K线、均线,觉得价格才是王道。但我做了这么多年量化,越来越觉得——交易量才是市场的“呼吸”。价格可以骗人,但交易量很难造假。

这一章,我们就用Python来解剖交易量。我会带着你,用Pandas处理数据,再用可视化把交易量的“脾气”给画出来。

29.1 为什么交易量分析这么重要?

你想想看,价格涨了,但交易量很小,说明什么?说明没多少人参与,这个上涨很可能是虚的。反过来,价格跌了,交易量暴增,那才是真恐慌。

我个人习惯,把交易量看作“燃料”。没有燃料的行情,走不远。我在项目中遇到过好几次,看着价格突破新高,兴奋得不行,结果一查交易量,萎缩得厉害。嗯,后来果然回调了。

核心观点: 交易量是价格的确认信号。量价齐升,趋势可靠;量价背离,小心反转。

29.2 用Pandas加载和清洗交易量数据

实战开始。我们先从CSV文件里把数据读进来。假设你手头有某只股票的历史日线数据,包含日期、开盘价、收盘价、最高价、最低价、交易量。

import pandas as pd
import numpy as np

# 读取数据
df = pd.read_csv('stock_data.csv', parse_dates=['date'])
df.set_index('date', inplace=True)

# 看一眼数据长什么样
print(df.head())

数据读进来之后,第一件事就是检查有没有缺失值。交易量数据偶尔会出问题,比如某天停牌,交易量就是0或者NaN。

# 检查缺失值
print(df['volume'].isnull().sum())

# 处理缺失值:用前一天的交易量填充,或者直接删除
df['volume'].fillna(method='ffill', inplace=True)

# 如果交易量为0,也建议处理掉
df = df[df['volume'] > 0]
注意: 我曾经遇到过数据源把停牌日的交易量写成0,结果计算指标时出了大问题。所以,0交易量的数据一定要谨慎处理,最好直接剔除。

29.3 计算交易量相关指标

光看原始交易量还不够,我们需要加工一下。常用的指标有这几个:

  • 交易量移动平均(Volume MA):平滑交易量,看趋势。
  • 交易量比率(Volume Ratio):当日交易量 / 过去N日均量,判断是否异常放量。
  • 资金流向(Money Flow):结合价格和交易量,看资金是流入还是流出。
# 计算20日交易量移动平均
df['volume_ma20'] = df['volume'].rolling(window=20).mean()

# 计算交易量比率(当日量 / 20日均量)
df['volume_ratio'] = df['volume'] / df['volume_ma20']

# 计算资金流向(简单版)
# 如果收盘价高于开盘价,视为资金流入
df['money_flow'] = np.where(df['close'] > df['open'], 
                            df['volume'] * df['close'], 
                            -df['volume'] * df['close'])

# 看看结果
print(df[['volume', 'volume_ma20', 'volume_ratio', 'money_flow']].tail())

这里有个小技巧。我建议把交易量比率大于1.5的标记为“放量”,小于0.5的标记为“缩量”。这样一眼就能看出异常。

# 标记放量和缩量
df['volume_signal'] = '正常'
df.loc[df['volume_ratio'] > 1.5, 'volume_signal'] = '放量'
df.loc[df['volume_ratio'] < 0.5, 'volume_signal'] = '缩量'

29.4 可视化交易量模式

数据算完了,接下来就是画图。我个人喜欢把价格和交易量放在一起看,这样能直观地发现量价关系。

下面这张SVG图,展示了交易量分析的核心逻辑:

交易量分析核心逻辑 原始交易量数据 Pandas清洗与指标计算 交易量移动平均 交易量比率 资金流向 可视化交易量模式

好,接下来我们用Matplotlib画一个实战图。把价格曲线和交易量柱状图叠在一起看。

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

# 选取最近100个交易日
plot_df = df.tail(100)

fig, ax1 = plt.subplots(figsize=(12, 6))

# 左轴:价格
ax1.plot(plot_df.index, plot_df['close'], color='blue', linewidth=2, label='收盘价')
ax1.set_ylabel('价格', color='blue')
ax1.tick_params(axis='y', labelcolor='blue')

# 右轴:交易量
ax2 = ax1.twinx()
# 用颜色区分涨跌
colors = ['red' if c > o else 'green' for c, o in zip(plot_df['close'], plot_df['open'])]
ax2.bar(plot_df.index, plot_df['volume'], color=colors, alpha=0.3, label='交易量')
ax2.set_ylabel('交易量', color='gray')
ax2.tick_params(axis='y', labelcolor='gray')

# 加上20日均量线
ax2.plot(plot_df.index, plot_df['volume_ma20'], color='orange', linewidth=1.5, linestyle='--', label='20日均量')

# 格式化x轴
ax1.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=45)

# 标题和图例
plt.title('价格与交易量分析', fontsize=16)
fig.legend(loc='upper left', bbox_to_anchor=(0.1, 0.9))

plt.tight_layout()
plt.show()
我的经验: 画图时,把交易量柱状图的透明度调低一点(alpha=0.3),这样价格线不会被遮挡。另外,用红绿颜色区分涨跌日,一眼就能看出放量上涨还是放量下跌。

29.5 识别典型交易量模式

实战中,有几种交易量模式特别值得关注。我列个表,你对照着看:

模式名称 特征 含义
放量突破 价格突破关键阻力位,交易量显著放大 趋势确认,后续大概率继续上涨
缩量上涨 价格持续上涨,但交易量逐渐萎缩 上涨动力不足,可能即将回调
放量下跌 价格大跌,交易量暴增 恐慌性抛售,短期可能见底
缩量横盘 价格窄幅波动,交易量极度萎缩 市场在等待方向,变盘前兆

怎么用代码识别这些模式?其实不难。我们写几个条件:

# 识别放量突破:价格创20日新高,且交易量比率 > 1.5
df['新高'] = df['close'] > df['close'].rolling(20).max().shift(1)
df['放量突破'] = df['新高'] & (df['volume_ratio'] > 1.5)

# 识别缩量上涨:连续3日上涨,但交易量连续3日下降
df['涨'] = df['close'] > df['close'].shift(1)
df['连续涨'] = df['涨'].rolling(3).sum() == 3
df['量缩'] = df['volume'] < df['volume'].shift(1)
df['连续缩量'] = df['量缩'].rolling(3).sum() == 3
df['缩量上涨'] = df['连续涨'] & df['连续缩量']

# 看看结果
print(df[df['放量突破']][['close', 'volume', 'volume_ratio']].tail())
print(df[df['缩量上涨']][['close', 'volume']].tail())
避坑指南: 我曾经在回测中直接用了“放量突破”信号做买入,结果发现很多假突破。后来加了过滤条件——突破后必须站稳3天,才确认是真突破。记住,交易量信号不能单独用,一定要结合价格形态。

29.6 实战小技巧:交易量分布分析

除了看时间序列,我还喜欢分析交易量的价格分布。说白了,就是看看在哪个价格区间成交最多。这个在判断支撑位和阻力位时特别有用。

# 将价格分成10个区间
price_bins = pd.cut(df['close'], bins=10)
volume_by_price = df.groupby(price_bins)['volume'].sum().sort_values(ascending=False)

print('交易量最大的价格区间:')
print(volume_by_price.head(3))

这个结果能告诉你,市场的主要成交密集区在哪里。如果当前价格跌破了这个密集区,那下面的支撑可能很弱。反过来,如果价格在密集区上方,那这个区域就成了强支撑。

好了,这一章的内容就到这里。交易量分析是个大话题,但核心就是一句话:量在价先。你回去把代码跑一遍,看看自己手里的股票,有没有出现放量突破或者缩量上涨的情况。实践出真知。

无相订单流研究社 微信Lucian808555