成交量指标详细分析 Skill
一、指标概述
1.1 成交量在技术分析中的核心地位
在技术分析的众多工具中,成交量是最基础也是最重要的指标之一。华尔街有句经典名言——“量在价先”(Volume precedes price),这句话深刻揭示了成交量在价格运动中的先行指示作用。价格的涨跌固然重要,但如果没有成交量的配合,价格的运动往往缺乏持续性和可靠性。
成交量代表了市场参与者的交易热情和资金投入力度。一只股票如果只有价格变动而没有成交量支撑,其价格运动很可能是虚假的或不可持续的。因此,成熟的交易者总是将成交量分析作为价格分析的重要补充,二者相辅相成,缺一不可。
从市场微观结构的角度来看,成交量反映了买卖双方达成交易的规模。大量成交意味着市场对该价格水平存在广泛的共识;而成交量稀薄则表明市场参与者对该价格水平存在分歧或缺乏兴趣。这种信息对于判断市场趋势的强弱和持续性至关重要。
1.2 成交量反映市场活跃度和资金流向
成交量是衡量市场活跃度的最直接指标。高成交量意味着市场参与者众多、交易频繁、资金流动活跃;低成交量则意味着市场冷清、参与者稀少、资金流动缓慢。
通过分析成交量的变化,我们可以推断资金的流向:
- 资金流入:当价格上涨伴随成交量放大时,表明买方力量强劲,资金正在积极流入市场。这通常是上涨趋势健康的标志。
- 资金流出:当价格下跌伴随成交量放大时,表明卖方力量占优,资金正在加速撤离市场。这通常是下跌趋势加剧的信号。
- 资金观望:当成交量极度萎缩时,表明市场处于观望状态,资金暂时没有明确的方向性偏好。这往往出现在趋势的转折点附近。
此外,成交量还可以用来验证价格突破的有效性、判断趋势的成熟度以及识别潜在的反转信号。在机构投资者的交易决策中,成交量分析是不可或缺的一环。
1.3 成交量与价格的关系:量价配合与量价背离
量价关系是技术分析的核心内容之一。理想的状态是"量价配合",即成交量的变化与价格的运动方向一致。当量价出现不一致时,就形成了"量价背离",这通常是趋势即将发生转变的预警信号。
量价配合的典型场景:
- 上涨趋势中,价格上涨时成交量放大,回调时成交量缩小——这是健康的上涨趋势。
- 下跌趋势中,价格下跌时成交量放大,反弹时成交量缩小——这是健康的下跌趋势。
量价背离的典型场景:
- 价格持续创新高,但成交量逐步萎缩——上涨动力不足,可能即将见顶。
- 价格持续创新低,但成交量逐步萎缩——抛压减轻,可能即将见底。
理解量价关系是掌握成交量分析的关键,后续章节将对各种量价关系进行详细展开。
二、成交量基础计算
2.1 基本成交量数据
成交量数据是市场交易的最原始数据之一,通常包含以下两个核心字段:
- 成交量(Volume):一定时间段内成交的证券数量。
- 成交金额(Turnover/Amount):一定时间段内成交的总金额,即成交量乘以成交价格。
不同市场的成交量单位存在显著差异:
| 市场 | 成交量单位 | 说明 |
|---|---|---|
| A股 | 手 | 1手 = 100股,最小交易单位为1手 |
| 美股 | 股 | 直接以股数为单位,无"手"的概念 |
| 期货 | 手/合约数 | 每手对应固定合约规格 |
| 加密货币 | 枚/个 | 直接以币数为单位,部分平台以美元计价 |
在A股市场中,投资者需要特别注意"手"与"股"的换算关系。例如,某只股票成交量为10000手,实际成交股数为1000000股(100万股)。在分析时,通常使用"手"作为单位以便于阅读,但在计算成交金额时需要使用实际股数。
2.2 成交量移动平均
为了消除单日成交量的随机波动,技术分析中广泛使用成交量移动平均线来观察成交量的中长期趋势。
简单移动平均成交量(VMA)
简单移动平均成交量是最基础的平滑方法:
VMA(n) = Sum(Volume_i, i=1 to n) / n
其中,n为移动平均的周期参数。常用的周期包括5日、10日、20日、60日等。
示例:计算某股票5日VMA
| 日期 | 成交量(万手) |
|---|---|
| Day1 | 150 |
| Day2 | 180 |
| Day3 | 120 |
| Day4 | 200 |
| Day5 | 250 |
VMA(5) = (150 + 180 + 120 + 200 + 250) / 5 = 180万手
加权移动平均成交量(WMA)
加权移动平均赋予近期数据更高的权重:
WMA(n) = Sum(W_i × Volume_i, i=1 to n) / Sum(W_i, i=1 to n)
其中,权重 W_i 通常设为 i(即越近期的数据权重越大)。
指数移动平均成交量(EVMA)
指数移动平均使用指数衰减的权重,对近期数据更加敏感:
EVMA_today = α × Volume_today + (1 - α) × EVMA_yesterday
其中,α = 2 / (n + 1),n为平滑周期。
EVMA的优势在于它对最新数据反应更快,同时保留了历史信息的平滑效果,适合捕捉成交量趋势的快速变化。
2.3 成交量比率(VR)
成交量比率(Volume Ratio,简称量比)是衡量当日成交量相对于近期平均成交量水平的指标。
量比计算公式:
量比 = 当日开盘后成交量 / (过去N日平均成交量 × 当日已交易时间占比)
简化版本:
量比 = 当日成交量 / 过去N日平均成交量 × 100
量比的解读:
| 量比范围 | 市场含义 |
|---|---|
| < 0.5 | 极度缩量,市场冷清 |
| 0.5 - 0.8 | 缩量,交易不活跃 |
| 0.8 - 1.2 | 正常水平 |
| 1.2 - 2.0 | 温和放量,关注度提升 |
| 2.0 - 3.0 | 明显放量,资金积极介入 |
| > 3.0 | 剧烈放量,需警惕异常交易 |
量比大于1.5通常被视为成交量异常放大的信号,值得重点关注。但需要注意的是,量比过高(如超过5倍)也可能意味着多空分歧加大,后续走势不确定性增加。
2.4 完整计算示例
以下是一个完整的成交量指标计算示例。假设某股票最近10个交易日的成交量数据如下(单位:万手):
Day1: 120, Day2: 150, Day3: 180, Day4: 140, Day5: 200,
Day6: 250, Day7: 300, Day8: 220, Day9: 180, Day10: 350
计算5日VMA(Day10):
VMA(5) = (250 + 300 + 220 + 180 + 350) / 5 = 260万手
计算10日VMA(Day10):
VMA(10) = (120+150+180+140+200+250+300+220+180+350) / 10 = 209万手
计算量比(Day10,以5日为基准):
量比 = 350 / 260 = 1.35(温和放量)
计算EVMA(Day10,5日周期):
α = 2 / (5+1) = 0.333
假设EVMA(Day9) = 230
EVMA(Day10) = 0.333 × 350 + 0.667 × 230 = 116.55 + 153.41 = 269.96万手
三、参数动态调整策略
3.1 短期参数(5日)
5日成交量移动平均线反映的是过去一周的交易活跃度,适合用于:
- 短线交易:判断短期资金进出方向。
- 日内交易辅助:结合分钟线判断当日量能是否充足。
- 突破确认:当价格突破关键位置时,观察5日VMA是否同步放大。
5日VMA对成交量变化反应灵敏,适合捕捉短期的量能异动。但缺点是容易受到单日异常成交量的干扰,产生虚假信号。
使用建议:将5日VMA与10日VMA结合使用。当5日VMA上穿10日VMA时,表明短期量能开始放大,市场活跃度提升;反之则表明市场活跃度下降。
3.2 中期参数(10日、20日)
10日和20日成交量移动平均线反映的是过去2周至1个月的交易活跃度,是最常用的中期量能参考指标。
- 10日VMA:反映两周的市场平均活跃度,适合波段交易者使用。当成交量持续高于10日VMA时,表明市场处于活跃状态;当成交量持续低于10日VMA时,表明市场趋于冷清。
- 20日VMA:反映一个月的市场平均活跃度,是判断中期趋势的重要参考。20日VMA常被用作量能的"分水岭"——成交量在20日VMA上方运行视为量能充足,在下方运行视为量能不足。
使用建议:20日VMA是A股市场最常用的量能参考线之一。在判断底部区域时,如果成交量萎缩到20日VMA的50%以下,往往意味着市场已经接近地量水平,可能是底部信号。
3.3 长期参数(60日、120日)
60日和120日成交量移动平均线反映的是季度和半年度的市场活跃度,适合用于判断长期趋势和识别结构性变化。
- 60日VMA:反映一个季度的市场平均成交量水平。当短期VMA(如5日、10日)远离60日VMA时,表明市场处于极端状态(极度活跃或极度冷清),回归均值的概率较大。
- 120日VMA:反映半年的市场平均成交量水平,是判断长期量能趋势的基准线。120日VMA的走势变化往往对应着市场整体环境的变化。
使用建议:长期VMA的变化通常较为缓慢,不适合用于短线交易决策。但其趋势方向对于判断市场所处的宏观阶段(牛市/熊市/震荡市)具有重要参考价值。
3.4 不同市场的参数优化
不同市场的交易特性和参与者结构存在差异,因此成交量指标的参数需要进行针对性优化。
| 市场 | 推荐短期参数 | 推荐中期参数 | 推荐长期参数 | 说明 |
|---|---|---|---|---|
| A股 | 5日 | 10日、20日 | 60日、120日 | T+1制度,日均换手率较高 |
| 美股 | 5日 | 20日、50日 | 100日、200日 | T+0制度,机构主导,波动较大 |
| 期货 | 5日 | 10日、20日 | 60日 | 合约换月影响,需注意连续性 |
| 加密货币 | 7日 | 14日、30日 | 90日 | 24/7交易,周末流动性下降 |
A股市场特点:A股市场散户占比较高,成交量波动性较大。建议使用20日VMA作为主要参考,同时关注量比指标。在涨跌停板制度下,成交量有时会出现极端值(如涨停时无量、跌停时无量),需要特殊处理。
美股市场特点:美股市场以机构投资者为主,成交量分布相对均匀。建议使用50日VMA作为中期参考,200日VMA作为长期参考。美股的盘前盘后交易也需要纳入成交量统计。
期货市场特点:期货市场存在主力合约换月的问题,直接使用成交量数据可能导致失真。建议使用连续合约的成交量数据,或者在换月时进行数据调整。
加密货币市场特点:加密货币市场24小时不间断交易,但流动性分布不均匀(亚洲时段、欧洲时段、美洲时段各有高峰)。建议使用7日和30日作为主要周期,以覆盖完整的周度波动。
四、多周期成交量分析
4.1 日线成交量
日线成交量是最常用的成交量分析周期,反映了每个交易日的整体交易活跃度。日线成交量适合用于:
- 判断中期趋势的量能配合情况。
- 识别关键的放量突破和缩量整理信号。
- 计算中长期的成交量移动平均线。
在日线级别的分析中,重点关注成交量是否与价格运动方向一致。例如,在一轮上涨趋势中,上涨日的成交量应该大于下跌日的成交量,回调时的成交量应该明显缩小。
4.2 周线成交量
周线成交量将一周内所有交易日的成交量汇总,反映了周级别的资金进出情况。周线成交量的优势在于:
- 过滤了日内的噪音,更能反映中期资金流向。
- 周线级别的量能变化往往对应着中期趋势的转折。
- 周线放量突破的信号可靠性高于日线。
使用场景:当需要判断一波行情的级别时,周线成交量是重要的参考。如果周线成交量持续放大,表明中期资金在积极介入,行情可能具有较大的持续性。
4.3 月线成交量
月线成交量反映了月级别的资金流动情况,适合用于判断长期趋势和识别大型底部/顶部区域。
- 月线级别的地量往往对应着长期底部区域。
- 月线级别的天量往往对应着长期顶部区域。
- 月线成交量的趋势变化通常领先于价格趋势的变化。
注意事项:月线成交量的样本较少,统计意义相对有限。建议结合更长周期的量能变化进行综合判断,而非单独依赖月线数据。
4.4 分钟线成交量(5分钟、15分钟、60分钟)
分钟线成交量主要用于日内交易和精确的入场时机选择:
- 5分钟成交量:反映超短期的资金进出脉冲,适合用于日内高频交易。5分钟级别的放量往往对应着短期价格的快速变动。
- 15分钟成交量:过滤了5分钟级别的噪音,适合用于日内波段的入场时机判断。
- 60分钟成交量:反映半日级别的量能变化,是连接日内和日线分析的重要桥梁。60分钟级别的量价背离往往预示着日线级别的调整。
日内量能分布规律:在A股市场中,成交量通常呈现"U型"分布——开盘和尾盘成交量较大,中间时段成交量相对较小。这一规律在分析分钟线成交量时需要特别注意。
4.5 多周期量能共振
多周期量能共振是指不同时间周期的成交量信号同时指向同一方向的现象。当多个周期的量能信号一致时,其可靠性显著提高。
量能共振的判断方法:
- 趋势共振:日线、周线、月线的成交量趋势方向一致(如均呈放大趋势)。
- 突破共振:日线和周线同时出现放量突破信号。
- 背离共振:多个时间周期同时出现量价背离信号。
示例:某股票日线放量突破20日均线,同时周线成交量创出近4周新高,60分钟线也出现放量上攻——这就是典型的多周期量能共振,后续上涨的概率较高。
五、核心交易信号
5.1 放量与缩量
放量
放量是指当前成交量显著高于近期平均成交量水平。根据放量的程度,可以细分为:
- 温和放量:成交量是近期平均的1.2-2.0倍。这通常意味着市场关注度逐步提升,资金开始有序流入,是最健康的放量形态。
- 急剧放量:成交量是近期平均的2.0-3.0倍。这通常意味着重大消息刺激或主力资金大举介入,需要结合价格走势判断方向。
- 天量:成交量创出历史新高或近期数月新高。天量往往出现在行情的极端位置——可能是趋势加速的信号,也可能是趋势终结的信号,需要结合具体位置判断。
缩量
缩量是指当前成交量显著低于近期平均成交量水平:
- 温和缩量:成交量是近期平均的0.5-0.8倍。通常出现在上涨途中的正常回调或下跌途中的短暂反弹。
- 地量:成交量创出近期新低或历史新低。地量往往意味着市场抛压已经极度衰竭,可能是底部区域的信号。所谓"地量见地价",地量的出现往往预示着价格即将见底。
量能阈值的设定
在实际应用中,量能阈值的设定需要根据具体标的的成交量特征进行动态调整:
# 量能阈值设定示例
def set_volume_thresholds(volume_series, lookback=60):
avg_volume = volume_series.rolling(lookback).mean()
std_volume = volume_series.rolling(lookback).std()
thresholds = {
'extreme_shrink': avg_volume * 0.4, # 极度缩量
'shrink': avg_volume * 0.6, # 缩量
'normal_low': avg_volume * 0.8, # 正常偏低
'normal': avg_volume, # 正常
'normal_high': avg_volume * 1.2, # 正常偏高
'expand': avg_volume * 2.0, # 放量
'extreme_expand': avg_volume * 3.0, # 急剧放量
}
return thresholds
5.2 量价关系分析
量价关系是成交量分析的核心内容。以下五种量价关系涵盖了市场中最常见的场景:
量增价涨(健康上涨)
这是最健康的上涨形态。价格上涨的同时成交量放大,表明买方力量不断增强,市场对该价格上涨方向形成了广泛共识。
- 信号强度:强看涨信号。
- 操作建议:可积极跟进,但需注意成交量不能过度放大(超过3倍均量可能意味着短期过热)。
- 持续性:只要成交量维持在均量线上方,上涨趋势有望延续。
量增价跌(放量下跌,需警惕)
价格下跌的同时成交量放大,表明卖方力量强劲,抛压沉重。这是最危险的量价关系之一。
- 信号强度:强看跌信号。
- 操作建议:应考虑减仓或离场,避免逆势操作。
- 特殊情况:在长期下跌后的低位区域出现放量下跌,可能是恐慌性抛售的最后阶段(“最后一跌”),反而可能是底部信号。
量缩价涨(上涨动力不足)
价格上涨但成交量缩小,表明上涨缺乏资金支持,参与者在追高时趋于谨慎。
- 信号强度:弱看涨/潜在看跌信号。
- 操作建议:不宜追高,已有持仓可考虑逐步减仓。
- 持续性:这种上涨往往难以持久,随时可能出现回调。
量缩价跌(缩量下跌,可能见底)
价格下跌但成交量缩小,表明抛压正在逐步减轻,卖方力量衰竭。
- 信号强度:潜在看涨信号(需结合位置判断)。
- 操作建议:在支撑位附近出现缩量下跌时,可考虑分批建仓。
- 持续性:缩量下跌持续的时间越长,见底的可能性越大。
量平价涨 / 量平价跌
成交量基本持平,价格小幅上涨或下跌。这通常出现在趋势的整理阶段,市场暂时缺乏明确的方向。
- 信号强度:中性信号。
- 操作建议:观望为主,等待成交量出现明确的方向性变化后再做决策。
5.3 量价背离
量价背离是技术分析中最重要的预警信号之一,通常预示着当前趋势即将发生转变。
顶背离(看跌信号)
定义:价格创出新高,但成交量未能同步创出新高,反而出现萎缩。
形成过程:
- 价格从A点上涨至B点(B > A),成交量从V_A降至V_B(V_B < V_A)。
- 价格继续上涨至C点(C > B),成交量进一步降至V_C(V_C < V_B)。
市场含义:虽然价格仍在创新高,但愿意追高的资金越来越少,上涨动力正在衰竭。这通常预示着顶部即将形成。
操作建议:逐步减仓,设置止损位,避免在高位接盘。
底背离(看涨信号)
定义:价格创出新低,但成交量未能同步创出新低,反而出现萎缩。
形成过程:
- 价格从A点下跌至B点(B < A),成交量从V_A降至V_B(V_B < V_A)。
- 价格继续下跌至C点(C < B),成交量进一步降至V_C(V_C < V_B)。
市场含义:虽然价格仍在创新低,但抛售的力量正在减弱,卖方已经接近力竭。这通常预示着底部即将形成。
操作建议:在支撑位附近可考虑分批建仓,但需等待放量确认信号。
5.4 突破放量
突破放量是指价格突破关键支撑/阻力位时伴随成交量显著放大的现象。成交量是验证突破有效性的重要依据。
关键位置突破的成交量确认
- 向上突破阻力位:突破时成交量应至少达到近期平均成交量的1.5倍以上,否则突破的有效性存疑。
- 向下突破支撑位:向下突破通常不需要太大的成交量即可确认有效,但如果伴随放量,则下跌的力度和速度可能更大。
有效突破的量能标准
有效突破的量能标准:
1. 突破当日成交量 >= 1.5 × 20日平均成交量
2. 突破后3日内,成交量维持在20日平均成交量之上
3. 突破后价格未回落至突破位以下
如果突破时成交量不足(低于1.2倍均量),则可能是"假突破",价格很可能很快回落至突破位以下。
5.5 换手率与成交量结合分析
换手率(Turnover Rate)是指一定时间内股票转手买卖的频率,是衡量股票流通性强弱的重要指标。
换手率计算公式:
换手率 = 当日成交量(股) / 流通股本 × 100%
换手率的市场含义:
| 换手率范围 | 市场含义 |
|---|---|
| < 1% | 极度冷清,流动性差 |
| 1% - 3% | 正常水平 |
| 3% - 7% | 活跃,关注度较高 |
| 7% - 15% | 高度活跃,资金博弈激烈 |
| > 15% | 极度活跃,需警惕(可能存在对倒) |
将换手率与成交量结合分析,可以更准确地判断资金的参与程度。例如,同样100万手的成交量,对于流通盘10亿股的股票(换手率约1%)和流通盘1亿股的股票(换手率约10%)而言,其市场含义完全不同。
六、成交量衍生指标
6.1 OBV(能量潮指标)
OBV(On-Balance Volume)由Joseph Granville发明,是通过累积成交量的方式来衡量买卖压力的指标。
计算方法:
如果当日收盘价 > 前一日收盘价:OBV = 前一日OBV + 当日成交量
如果当日收盘价 < 前一日收盘价:OBV = 前一日OBV - 当日成交量
如果当日收盘价 = 前一日收盘价:OBV = 前一日OBV
用法解读:
- OBV上升:买方力量占优,资金持续流入,看涨信号。
- OBV下降:卖方力量占优,资金持续流出,看跌信号。
- OBV与价格背离:价格创新高但OBV未创新高——顶背离,看跌;价格创新低但OBV未创新低——底背离,看涨。
- OBV突破:OBV突破前期高点/低点,往往预示着价格将跟随突破。
6.2 VWAP(成交量加权平均价)
VWAP(Volume-Weighted Average Price)是机构投资者广泛使用的基准价格指标。
计算公式:
VWAP = Sum(典型价格 × 成交量) / Sum(成交量)
典型价格 = (最高价 + 最低价 + 收盘价) / 3
用法解读:
- 价格在VWAP上方:买方占优,市场情绪偏多。
- 价格在VWAP下方:卖方占优,市场情绪偏空。
- VWAP作为支撑/阻力:VWAP线经常充当动态支撑位或阻力位。
- 机构参考:机构交易者常以VWAP作为执行交易的基准,力求使成交均价优于VWAP。
6.3 MFI(资金流量指标)
MFI(Money Flow Index)结合了成交量和价格信息,类似于成交量加权的RSI。
计算步骤:
1. 典型价格 TP = (High + Low + Close) / 3
2. 原始资金流 MF = TP × Volume
3. 如果 TP > 前日TP,则 MF 为正资金流;否则为负资金流
4. 正资金流之和 = Sum(正MF, n)
5. 负资金流之和 = Sum(负MF, n)
6. 资金流量比率 MFR = 正资金流之和 / 负资金流之和
7. MFI = 100 - 100 / (1 + MFR)
用法解读:
- MFI > 80:超买区域,价格可能过高。
- MFI < 20:超卖区域,价格可能过低。
- MFI背离:与RSI背离类似,MFI与价格背离是重要的反转信号。
6.4 CMF(蔡金资金流量)
CMF(Chaikin Money Flow)由Marc Chaikin开发,衡量一段时间内资金流入或流出的累积量。
计算公式:
1. CLV = ((Close - Low) - (High - Close)) / (High - Low)
(当 High = Low 时,CLV = 0)
2. 资金流量 MFV = CLV × Volume
3. CMF(n) = Sum(MFV, n) / Sum(Volume, n)
用法解读:
- CMF > 0:资金净流入,买方占优。
- CMF < 0:资金净流出,卖方占优。
- CMF在零轴附近震荡:多空力量均衡。
- CMF持续为正且上升:强势上涨信号。
- CMF持续为负且下降:弱势下跌信号。
七、成交量与其他指标组合
7.1 成交量 + K线形态
将成交量分析与K线形态结合,可以显著提高形态判断的准确性:
- 放量长阳线:强烈的看涨信号,表明买方力量强劲。
- 缩量十字星:在高位出现为犹豫信号,在低位出现为可能见底。
- 放量长阴线:强烈的看跌信号,表明卖方力量强劲。
- 缩量小阳线:上涨动力不足的信号。
7.2 成交量 + 均线系统
均线系统反映价格趋势,成交量反映资金力度,二者结合可以判断趋势的可靠性:
- 放量突破均线:趋势启动的确认信号。
- 缩量回踩均线:趋势健康的回调信号,可考虑在均线附近买入。
- 放量跌破均线:趋势反转的确认信号,应考虑止损离场。
7.3 成交量 + MACD
MACD是趋势跟踪指标,结合成交量可以过滤虚假信号:
- MACD金叉 + 放量:可靠的买入信号。
- MACD死叉 + 放量:可靠的卖出信号。
- MACD金叉 + 缩量:买入信号可靠性降低,可能是假金叉。
- MACD底背离 + 成交量放大:强烈的反转买入信号。
7.4 成交量 + 布林带
布林带反映价格的波动范围,结合成交量可以判断突破的方向和力度:
- 放量突破上轨:强势突破,可能开启上涨行情。
- 缩量触及上轨:突破力度不足,可能回落。
- 缩量触及下轨:抛压减轻,可能反弹。
- 布林带收窄 + 成交量萎缩:变盘在即,需密切关注放量方向。
八、Python代码实现
8.1 成交量计算函数(支持动态参数)
import numpy as np
import pandas as pd
def calc_volume_ma(volume, windows=[5, 10, 20, 60]):
"""
计算成交量移动平均线
:param volume: pd.Series, 成交量序列
:param windows: list, 移动平均窗口列表
:return: pd.DataFrame, 包含各周期VMA
"""
result = pd.DataFrame({'volume': volume})
for w in windows:
result[f'VMA_{w}'] = volume.rolling(window=w).mean()
return result
def calc_volume_ema(volume, span=20):
"""
计算指数移动平均成交量
:param volume: pd.Series, 成交量序列
:param span: int, EMA周期
:return: pd.Series
"""
return volume.ewm(span=span, adjust=False).mean()
8.2 量比计算函数
def calc_volume_ratio(volume, n=5):
"""
计算量比指标
:param volume: pd.Series, 成交量序列
:param n: int, 对比周期
:return: pd.Series
"""
avg_volume = volume.rolling(window=n).mean().shift(1)
volume_ratio = volume / avg_volume
return volume_ratio
def classify_volume_status(volume_ratio):
"""
根据量比分类量能状态
"""
conditions = [
volume_ratio < 0.5,
(volume_ratio >= 0.5) & (volume_ratio < 0.8),
(volume_ratio >= 0.8) & (volume_ratio < 1.2),
(volume_ratio >= 1.2) & (volume_ratio < 2.0),
(volume_ratio >= 2.0) & (volume_ratio < 3.0),
volume_ratio >= 3.0,
]
labels = ['极度缩量', '缩量', '正常', '温和放量', '明显放量', '剧烈放量']
return pd.Series(np.select(conditions, labels, default='正常'),
index=volume_ratio.index)
8.3 OBV/VWAP/MFI/CMF计算函数
def calc_obv(close, volume):
"""
计算OBV能量潮指标
:param close: pd.Series, 收盘价序列
:param volume: pd.Series, 成交量序列
:return: pd.Series
"""
direction = np.sign(close.diff())
direction.iloc[0] = 0
obv = (direction * volume).cumsum()
return obv
def calc_vwap(high, low, close, volume):
"""
计算VWAP成交量加权平均价
:param high: pd.Series, 最高价
:param low: pd.Series, 最低价
:param close: pd.Series, 收盘价
:param volume: pd.Series, 成交量
:return: pd.Series
"""
typical_price = (high + low + close) / 3.0
vwap = (typical_price * volume).cumsum() / volume.cumsum()
return vwap
def calc_mfi(high, low, close, volume, period=14):
"""
计算MFI资金流量指标
"""
typical_price = (high + low + close) / 3.0
raw_money_flow = typical_price * volume
price_change = typical_price.diff()
positive_flow = pd.Series(0.0, index=typical_price.index)
negative_flow = pd.Series(0.0, index=typical_price.index)
positive_flow[price_change > 0] = raw_money_flow[price_change > 0]
negative_flow[price_change < 0] = raw_money_flow[price_change < 0]
sum_positive = positive_flow.rolling(window=period).sum()
sum_negative = negative_flow.rolling(window=period).sum()
mfr = sum_positive / sum_negative.replace(0, np.nan)
mfi = 100 - (100 / (1 + mfr))
return mfi
def calc_cmf(high, low, close, volume, period=20):
"""
计算CMF蔡金资金流量
"""
clv = ((close - low) - (high - close)) / (high - low)
clv = clv.fillna(0)
mfv = clv * volume
cmf = mfv.rolling(window=period).sum() / volume.rolling(window=period).sum()
return cmf
8.4 量价关系检测函数
def detect_volume_price_relation(close, volume, ma_window=20):
"""
检测量价关系
:param close: pd.Series, 收盘价
:param volume: pd.Series, 成交量
:param ma_window: int, 均量线周期
:return: pd.DataFrame
"""
price_change = close.pct_change()
vol_ma = volume.rolling(ma_window).mean()
vol_ratio = volume / vol_ma
result = pd.DataFrame(index=close.index)
result['price_change'] = price_change
result['vol_ratio'] = vol_ratio
conditions = [
(price_change > 0.01) & (vol_ratio > 1.2),
(price_change > 0.01) & (vol_ratio <= 0.8),
(price_change < -0.01) & (vol_ratio > 1.2),
(price_change < -0.01) & (vol_ratio <= 0.8),
(price_change.abs() <= 0.01),
]
labels = ['量增价涨', '量缩价涨', '量增价跌', '量缩价跌', '量平价平']
result['relation'] = np.select(conditions, labels, default='其他')
return result
def detect_volume_divergence(close, volume, lookback=20):
"""
检测量价背离
:param close: pd.Series, 收盘价
:param volume: pd.Series, 成交量
:param lookback: int, 回看周期
:return: pd.Series, 1=顶背离, -1=底背离, 0=无背离
"""
divergence = pd.Series(0, index=close.index)
for i in range(lookback, len(close)):
window = close.iloc[i - lookback:i + 1]
vol_window = volume.iloc[i - lookback:i + 1]
price_max_idx = window.idxmax()
price_min_idx = window.idxmin()
vol_max_idx = vol_window.idxmax()
vol_min_idx = vol_window.idxmin()
# 顶背离:价格创新高但成交量未创新高
if (window.iloc[-1] == window.max() and
vol_window.iloc[-1] < vol_window.max() * 0.8):
divergence.iloc[i] = 1
# 底背离:价格创新低但成交量未创新低
if (window.iloc[-1] == window.min() and
vol_window.iloc[-1] < vol_window.max() * 0.8):
divergence.iloc[i] = -1
return divergence
8.5 信号检测与回测框架
def generate_volume_signals(close, volume, obv, mfi, cmf):
"""
综合成交量信号生成
"""
signals = pd.DataFrame(index=close.index)
signals['close'] = close
signals['volume'] = volume
# 量比信号
vol_ratio = calc_volume_ratio(volume, n=20)
signals['vol_expand'] = (vol_ratio > 1.5).astype(int)
signals['vol_shrink'] = (vol_ratio < 0.6).astype(int)
# OBV趋势信号
obv_ma = obv.rolling(20).mean()
signals['obv_bullish'] = (obv > obv_ma).astype(int)
signals['obv_bearish'] = (obv < obv_ma).astype(int)
# MFI超买超卖信号
signals['mfi_overbought'] = (mfi > 80).astype(int)
signals['mfi_oversold'] = (mfi < 20).astype(int)
# CMF信号
signals['cmf_positive'] = (cmf > 0).astype(int)
signals['cmf_negative'] = (cmf < 0).astype(int)
# 综合信号
buy_score = (signals['vol_expand'] + signals['obv_bullish'] +
signals['mfi_oversold'] + signals['cmf_positive'])
sell_score = (signals['vol_shrink'] + signals['obv_bearish'] +
signals['mfi_overbought'] + signals['cmf_negative'])
signals['buy_signal'] = (buy_score >= 3).astype(int)
signals['sell_signal'] = (sell_score >= 3).astype(int)
return signals
def simple_backtest(signals, initial_capital=100000):
"""
简单回测框架
"""
capital = initial_capital
position = 0
trades = []
for i in range(1, len(signals)):
if signals['buy_signal'].iloc[i] == 1 and position == 0:
price = signals['close'].iloc[i]
shares = int(capital / price)
if shares > 0:
position = shares
capital -= shares * price
trades.append({'type': 'BUY', 'price': price,
'shares': shares, 'date': signals.index[i]})
elif signals['sell_signal'].iloc[i] == 1 and position > 0:
price = signals['close'].iloc[i]
capital += position * price
trades.append({'type': 'SELL', 'price': price,
'shares': position, 'date': signals.index[i]})
position = 0
# 计算最终收益
final_value = capital + position * signals['close'].iloc[-1]
total_return = (final_value - initial_capital) / initial_capital * 100
return {
'initial_capital': initial_capital,
'final_value': final_value,
'total_return_pct': round(total_return, 2),
'total_trades': len(trades),
'trades': trades,
}
8.6 可视化代码
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
def plot_volume_analysis(df, volume_col='volume', close_col='close',
title='成交量分析', ma_windows=[5, 20, 60]):
"""
成交量综合分析可视化
"""
fig, axes = plt.subplots(4, 1, figsize=(14, 12),
gridspec_kw={'height_ratios': [3, 1.5, 1, 1]},
sharex=True)
# 子图1:价格走势
axes[0].plot(df.index, df[close_col], color='#1f77b4', linewidth=1.2,
label='收盘价')
axes[0].set_title(title, fontsize=14, fontweight='bold')
axes[0].set_ylabel('价格')
axes[0].legend(loc='upper left')
axes[0].grid(True, alpha=0.3)
# 子图2:成交量与均量线
colors = ['#26a69a' if df[close_col].iloc[i] >= df[close_col].iloc[i-1]
else '#ef5350' for i in range(1, len(df))]
colors = ['#999999'] + colors
axes[1].bar(df.index, df[volume_col], color=colors, alpha=0.7,
label='成交量')
for w in ma_windows:
vma = df[volume_col].rolling(w).mean()
axes[1].plot(df.index, vma, linewidth=1, label=f'VMA({w})')
axes[1].set_ylabel('成交量')
axes[1].legend(loc='upper left')
axes[1].grid(True, alpha=0.3)
# 子图3:OBV
obv = calc_obv(df[close_col], df[volume_col])
obv_ma = obv.rolling(20).mean()
axes[2].plot(df.index, obv, color='#ff9800', linewidth=1, label='OBV')
axes[2].plot(df.index, obv_ma, color='#9c27b0', linewidth=1,
linestyle='--', label='OBV_MA(20)')
axes[2].set_ylabel('OBV')
axes[2].legend(loc='upper left')
axes[2].grid(True, alpha=0.3)
# 子图4:MFI
mfi = calc_mfi(df['high'], df['low'], df[close_col], df[volume_col])
axes[3].plot(df.index, mfi, color='#2196f3', linewidth=1, label='MFI(14)')
axes[3].axhline(y=80, color='red', linestyle='--', alpha=0.5,
label='超买(80)')
axes[3].axhline(y=20, color='green', linestyle='--', alpha=0.5,
label='超卖(20)')
axes[3].fill_between(df.index, 80, mfi, where=(mfi > 80),
color='red', alpha=0.2)
axes[3].fill_between(df.index, 20, mfi, where=(mfi < 20),
color='green', alpha=0.2)
axes[3].set_ylabel('MFI')
axes[3].set_ylim(0, 100)
axes[3].legend(loc='upper left')
axes[3].grid(True, alpha=0.3)
# 设置x轴日期格式
axes[-1].xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
axes[-1].xaxis.set_major_locator(mdates.AutoDateLocator())
fig.autofmt_xdate()
plt.tight_layout()
plt.savefig('volume_analysis.png', dpi=150, bbox_inches='tight')
plt.show()
九、实战案例
9.1 A股放量突破案例
背景:某A股上市公司股价在20元附近横盘整理了近一个月,20日均线走平。某日该股突然放量拉升,收盘价22.50元,涨幅超过10%,成交量达到20日均量的2.5倍。
分析过程:
- 突破确认:价格突破20元整数关口和20日均线,属于关键位置突破。
- 量能确认:成交量达到20日均量的2.5倍,远超1.5倍的有效突破标准,确认突破有效。
- 后续验证:突破后3日,成交量维持在20日均量之上,价格站稳22元以上,未回落至突破位以下。
- 指标验证:OBV在突破当日大幅上升,MFI从45上升至72(未进入超买区),CMF由负转正。
结论:这是一个标准的放量突破信号,突破有效,可考虑在回踩确认后买入。
操作策略:
- 激进者:突破当日尾盘买入。
- 稳健者:等待价格回踩20元支撑位且缩量企稳后买入。
- 止损位:设在19.50元(突破位下方3%)。
9.2 缩量回调买入案例
背景:某股票从15元上涨至25元后开始回调,回调过程中成交量逐步萎缩。当价格回调至20日均线(约22元)附近时,成交量已萎缩至上涨期间平均成交量的40%。
分析过程:
- 趋势判断:主升趋势完好,20日、60日均线多头排列。
- 回调性质:回调过程中成交量持续萎缩,属于健康的缩量回调,而非放量出货。
- 支撑位:价格在20日均线附近获得支撑,且该位置也是前期平台的突破位。
- 量能极端:成交量萎缩至均量的40%,已进入"地量"区域,表明抛压极度衰竭。
- 指标验证:OBV虽有所回落但仍维持在高位,MFI回落至28(接近超卖区),CMF虽为负但已开始收窄。
结论:缩量回调至关键支撑位,地量见地价的可能性较大,可考虑分批建仓。
操作策略:
- 第一批:在20日均线附近买入总仓位的30%。
- 第二批:若出现放量企稳信号(阳线+成交量放大),加仓30%。
- 第三批:若价格重新突破前高25元,加仓剩余40%。
- 止损位:设在20日均线跌破且3日未收回的位置。
9.3 量价背离预警案例
背景:某股票在3个月内从10元持续上涨至30元,涨幅达200%。在最后一个月的上涨过程中,虽然价格不断创出新高,但成交量却逐步萎缩,高点对应的成交量仅为前期高点的50%。
分析过程:
- 顶背离识别:价格创出30元新高,但成交量仅为前期高点(25元时)的50%,形成明显的量价顶背离。
- 上涨动力衰减:上涨日的平均成交量逐步下降,表明追高资金越来越少。
- K线形态:高位出现长上影线、十字星等犹豫形态。
- 指标验证:OBV未能创出新高且出现拐头向下,MFI进入超买区后开始回落,CMF持续为负。
结论:多重量价顶背离信号出现,上涨趋势即将终结,应立即采取防御措施。
操作策略:
- 持仓者:立即减仓至半仓以下,设置跟踪止损。
- 止损位:设在近期放量阳线的最低价下方。
- 观望者:暂不介入,等待趋势明确后再做决策。
- 若价格跌破20日均线且放量,清仓离场。
十、优缺点总结
优点
- 客观性:成交量是真实的市场交易数据,不受主观 interpretation 的影响,相比纯价格分析更加客观可靠。
- 先行性:成交量变化往往领先于价格变化,能够提前预警趋势的转变,为交易决策提供时间优势。
- 验证功能:成交量是验证价格信号有效性的重要工具。放量突破比缩量突破更可靠,量价配合的趋势比量价背离的趋势更可持续。
- 普适性:成交量分析适用于所有具备流动性数据的市场,包括股票、期货、外汇、加密货币等。
- 衍生指标丰富:基于成交量可以构建多种衍生指标(OBV、VWAP、MFI、CMF等),从不同角度揭示市场资金流向。
- 多周期适用:成交量分析可以在分钟线、日线、周线、月线等多个时间周期上使用,满足不同风格交易者的需求。
缺点
- 滞后性:成交量数据只有在交易日结束后才能确认,无法在盘中实时获取完整的成交量信息(虽然盘中可以查看实时成交量,但最终的成交量可能与盘中数据有较大差异)。
- 市场差异:不同市场的成交量特征差异较大,参数设置需要针对具体市场进行优化,不存在"放之四海而皆准"的参数组合。
- 异常值干扰:涨跌停、停牌复牌、大宗交易等特殊情况可能导致成交量数据失真,需要特殊处理。
- 无法单独使用:成交量分析必须与价格分析结合使用,单独依赖成交量无法做出有效的交易决策。
- 对冲工具影响:在存在期货、期权等对冲工具的市场中,成交量可能包含对冲交易的部分,不能完全反映方向性的资金流向。
- 加密货币市场的特殊性:加密货币市场的成交量数据可能受到刷量(wash trading)的影响,数据的真实性存疑。
使用建议
- 综合分析:将成交量分析与价格分析、技术指标分析相结合,构建多维度的分析框架。
- 动态调参:根据市场环境的变化动态调整成交量指标的参数,避免使用固定参数。
- 多周期验证:在多个时间周期上验证成交量信号,提高信号的可靠性。
- 注意异常情况:对涨跌停、停牌复牌等特殊情况下的成交量数据进行特殊处理。
- 风险管理:成交量信号只是辅助决策工具,不应作为唯一的交易依据。始终设置止损位,控制风险。
免责声明:本文档仅供技术分析学习和研究使用,不构成任何投资建议。实际交易中,请结合自身风险承受能力和市场环境做出独立判断。过往业绩不代表未来表现。