8、成交量分布:Volume Profile、POC、VA 区、成交量与价格的关系

聊到成交量分布,我得先坦白一件事。

我刚开始做量化的时候,对成交量这东西其实挺不屑的。觉得价格才是王道,量嘛,辅助看看就行。直到有一次,我在做股指期货的回测,发现一个策略在某个时间段突然失效了。我查了半天,最后发现——那段时间成交量分布极度不均匀,价格在某个区域反复摩擦,但量却集中在另一个区域。嗯,从那以后,我再也不敢小看 Volume Profile 了。

8.1 什么是 Volume Profile?

说白了,Volume Profile 就是把成交量按价格水平来分布,而不是按时间。

传统成交量图,横轴是时间,纵轴是成交量。你看得出来某个时间段成交了多少,但看不出这些成交发生在什么价格上。

Volume Profile 不一样。它把成交量按价格区间(比如每 1 个 tick 或每 0.5 元)进行统计。你一眼就能看出来:哪个价格区间成交最多,哪个价格区间成交最少。

核心概念:

  • Volume Profile:按价格分布的成交量直方图
  • POC(Point of Control):成交量最大的那个价格水平
  • VA 区(Value Area):成交量占比 70% 的价格区间
  • VAH / VAL:Value Area 的上沿和下沿

我习惯把 Volume Profile 想象成市场的「体重分布图」。价格是身高,成交量是体重。POC 就是最胖的那个身高段,VA 区就是 70% 的人集中在那几个身高段里。

8.2 POC:市场的重心

POC 是 Volume Profile 里最重要的一个点。它代表在某个时间段内,买卖双方最认可的价格水平。

为什么说它重要?

  • POC 是市场的「价值中枢」。价格偏离 POC 太远,大概率会回归。
  • POC 是支撑/阻力位。价格回到 POC 附近,往往会有反应。
  • POC 是交易量的「引力中心」。你想想看,如果大部分人都愿意在那个价格成交,说明那个价格有共识。

我记得有一次做期货的日内策略,我加了一个简单的 POC 回归逻辑:当价格偏离 POC 超过 2 个标准差时,反向开仓。回测下来,胜率从 55% 直接提到了 63%。当然,实盘的时候要注意滑点,这个后面再说。

我的习惯:

我一般用 30 分钟或 1 小时的 Volume Profile 来做日内交易。POC 每根 K 线都会更新,但变化不会太大。如果 POC 突然跳了很大一截,说明市场共识在快速转移,这时候要小心趋势反转。

8.3 VA 区:价值区域

VA 区是 Volume Profile 里成交量占比 70% 的价格区间。通常从 POC 开始,向上下两边扩展,直到累计成交量达到总成交量的 70%。

VA 区的上沿叫 VAH,下沿叫 VAL。

VA 区的意义在于:它告诉你市场在哪个价格区间内「最舒服」。价格在 VA 区内震荡,说明市场没有强烈的方向性。价格突破 VA 区,说明市场在寻找新的价值区间。

注意:

VA 区不是固定不变的。它随着时间推移会不断调整。我见过有人把昨天的 VA 区直接拿来用,结果今天价格完全不在那个区间里。嗯,这其实是个坑。VA 区最好用当天的数据来算,或者至少用最近几个交易日的滚动数据。

8.4 成交量与价格的关系

这个部分,我直接给你几个实战中验证过的规律:

现象 含义 我的处理方式
价格上涨 + 成交量放大 多头强势,趋势可能延续 顺势做多,但注意 POC 是否跟上
价格上涨 + 成交量萎缩 多头乏力,可能见顶 减仓或准备反手
价格下跌 + 成交量放大 空头强势,趋势可能延续 顺势做空,但注意 POC 支撑
价格下跌 + 成交量萎缩 空头乏力,可能见底 减仓或准备抄底
价格在 VA 区内震荡 市场无方向,高抛低吸 在 VAH 做空,在 VAL 做多
价格突破 VA 区 + 成交量放大 趋势启动,突破有效 追突破,止损设在 VA 区边缘

我曾经犯过一个错误:看到价格突破 VA 区就追,结果被假突破打脸。后来我加了一个条件——突破时成交量必须大于前一根 K 线的 1.5 倍。这个简单的过滤条件,让我的假突破率从 40% 降到了 15% 左右。

8.5 实战中的 Volume Profile 策略

给你一个我常用的策略框架:

  1. 计算当天的 Volume Profile(用 30 分钟或 1 小时数据)
  2. 标记 POC、VAH、VAL
  3. 观察价格与这三个关键位置的关系
  4. 制定交易计划

举个例子:

# 伪代码示例
def volume_profile_strategy(price, volume, bins=20):
    # 按价格分桶
    price_bins = np.linspace(min(price), max(price), bins)
    volume_by_price = np.zeros(bins)
    
    for i in range(len(price)):
        bin_idx = np.digitize(price[i], price_bins) - 1
        volume_by_price[bin_idx] += volume[i]
    
    # 找 POC
    poc_idx = np.argmax(volume_by_price)
    poc = price_bins[poc_idx]
    
    # 找 VA 区(70% 成交量)
    total_vol = np.sum(volume_by_price)
    cum_vol = 0
    left_idx = poc_idx
    right_idx = poc_idx
    
    while cum_vol < total_vol * 0.7:
        if left_idx > 0 and right_idx < bins - 1:
            if volume_by_price[left_idx - 1] > volume_by_price[right_idx + 1]:
                left_idx -= 1
            else:
                right_idx += 1
        elif left_idx > 0:
            left_idx -= 1
        else:
            right_idx += 1
        cum_vol = np.sum(volume_by_price[left_idx:right_idx+1])
    
    val = price_bins[left_idx]
    vah = price_bins[right_idx]
    
    return poc, val, vah

这个代码很简单,但够用。实际项目中,我会加上时间衰减权重——越近的成交量权重越高。因为市场是动态的,昨天的 POC 和今天的 POC 可能差很多。

8.6 避坑指南

最后,给你几个我踩过的坑:

  • 不要只看一个时间周期的 Volume Profile。我建议至少看两个:一个短周期(比如 30 分钟)做日内,一个长周期(比如日线)看大方向。
  • POC 不是永远有效的支撑/阻力。当市场出现重大消息时,POC 可能瞬间被击穿。这时候要相信价格行为,而不是死守 POC。
  • VA 区不是交易区间。很多人把 VA 区当成震荡区间来用,但 VA 区只是成交量集中的区域,不代表价格不会突破。我见过价格在 VA 区内震荡了 3 个小时,然后突然放量突破,直接拉出 2% 的行情。
  • 成交量数据要清洗。有些交易所的成交量数据有延迟或错误,尤其是期货和加密货币市场。我一般会用中位数滤波或者移动平均来平滑一下。

总结一下:

Volume Profile 不是万能药,但它是一个非常好的辅助工具。POC 告诉你市场的价值中枢,VA 区告诉你市场的舒适区间,成交量与价格的关系告诉你市场的情绪。把这三点结合起来,你的交易决策会更有依据。

我个人习惯在每天开盘前,先看一眼当天的 Volume Profile,心里有个底。然后盘中根据价格和成交量的变化,动态调整策略。嗯,说白了,就是让市场告诉你它想干什么,而不是你猜它想干什么。

Volume Profile 核心结构图 价格 成交量 POC VAH VAL ▲ POC(成交量最大) VA 区上沿(VAH) VA 区下沿(VAL) 图例 成交量柱 VA 区(70% 量) POC 线 VAH / VAL 线

交易系统化学习资料 微信Strategy888888