6、成交量分布(Volume Profile):成交量分布图构建、价值区域(VA)计算、POC识别、高成交量节点(HVN)与低成交量节点(LVN)

成交量分布,英文叫 Volume Profile,简称 VP。这东西说白了,就是把成交量按价格切开来展示。不是按时间,是按价格。

我刚开始做订单流系统时,对 VP 的理解也停留在「好看」的层面。直到有一次做股指期货的回测,发现单纯靠时间维度的成交量指标,信号总是慢半拍。后来把 VP 加进去,整个策略的胜率提升了将近 12 个百分点。嗯,从那以后,VP 就成了我系统里的标配模块。

6.1 成交量分布图构建

构建 VP 图,核心就两步:切价格区间,然后统计每个价格区间的成交量。

价格区间怎么切?我个人习惯用 Tick 数据来切。每个 Tick 都有成交价和成交量,我们把价格四舍五入到最小变动价位,然后累加成交量。

举个例子,假设最小变动价位是 0.5:

// 伪代码:构建成交量分布
class VolumeProfile {
    constructor(tickSize = 0.5) {
        this.tickSize = tickSize;
        this.profile = new Map(); // 价格 -> 成交量
    }

    addTrade(price, volume) {
        // 将价格对齐到最小变动价位
        const alignedPrice = Math.round(price / this.tickSize) * this.tickSize;
        const current = this.profile.get(alignedPrice) || 0;
        this.profile.set(alignedPrice, current + volume);
    }

    build(trades) {
        for (const trade of trades) {
            this.addTrade(trade.price, trade.volume);
        }
        return this.profile;
    }
}

这里有个坑,我踩过。如果你用分钟级 K 线数据来构建 VP,精度会差很多。因为一根 K 线里可能有多个价格成交,你没法知道每个价格具体成交了多少。所以,构建 VP 一定要用逐笔成交数据,这是底线。

⚠️ 注意:如果数据源只提供 K 线,别硬做 VP。可以用 Tick 回放或者分笔成交数据来替代。用 K 线估算 VP,误差大到没法用。

6.2 价值区域(VA)计算

价值区域,Value Area,简称 VA。它代表的是「大部分成交量发生的价格区间」。通常我们用 VA 来识别市场认可的合理价格范围。

计算 VA 的标准方法是:从 POC 开始,向两边扩展,直到累计成交量达到总成交量的 70%。

具体步骤:

  1. 先找到 POC(成交量最大的价格)
  2. 从 POC 向上和向下各取一个价格节点
  3. 比较上下两个节点的成交量,取较大的那个
  4. 重复第 3 步,直到累计成交量 ≥ 总成交量的 70%
function calculateVA(profile, totalVolume) {
    const poc = findPOC(profile);
    const sortedPrices = [...profile.keys()].sort((a, b) => a - b);
    const pocIndex = sortedPrices.indexOf(poc);

    let upperIndex = pocIndex;
    let lowerIndex = pocIndex;
    let cumulativeVolume = profile.get(poc);
    const targetVolume = totalVolume * 0.7;

    while (cumulativeVolume < targetVolume) {
        const upperVol = profile.get(sortedPrices[upperIndex + 1]) || 0;
        const lowerVol = profile.get(sortedPrices[lowerIndex - 1]) || 0;

        if (upperVol >= lowerVol) {
            upperIndex++;
            cumulativeVolume += upperVol;
        } else {
            lowerIndex--;
            cumulativeVolume += lowerVol;
        }
    }

    return {
        vaHigh: sortedPrices[upperIndex],
        vaLow: sortedPrices[lowerIndex],
        poc: poc
    };
}

VA 的阈值不一定是 70%。我见过有人用 68%,也有人用 72%。我个人习惯用 70%,因为这是市场微观结构里一个比较公认的平衡点。你想想看,如果阈值设得太高,VA 区间会变得很宽,失去参考意义;设得太低,又容易漏掉关键价格区域。

💡 小技巧:在回测时,可以试试 65%、70%、75% 三个阈值,看看哪个对你的策略最友好。没有绝对正确的值,只有最适合你策略的值。

6.3 POC(Point of Control)识别

POC,全称 Point of Control,就是成交量最大的那个价格。它是整个 VP 图里最显眼的那个「山峰」。

识别 POC 其实很简单:遍历所有价格节点,找到成交量最大的那个。

function findPOC(profile) {
    let pocPrice = null;
    let maxVolume = 0;

    for (const [price, volume] of profile) {
        if (volume > maxVolume) {
            maxVolume = volume;
            pocPrice = price;
        }
    }

    return pocPrice;
}

但这里有个细节:如果多个价格节点的成交量相同怎么办?

我遇到过这种情况,尤其是在流动性极好的品种上。我的处理方式是:取这些价格的平均值,或者取中间的那个价格。具体用哪个,取决于你的策略风格。做趋势跟踪的,倾向于取中间价;做均值回归的,可能更关注两端的 POC。

POC 的意义在于:它是市场参与者「最认可」的价格。价格在 POC 上方运行时,多头占优;在 POC 下方运行时,空头占优。这个逻辑很简单,但非常实用。

6.4 高成交量节点(HVN)与低成交量节点(LVN)

HVN 和 LVN,这两个概念是 VP 分析里的进阶内容。

HVN(High Volume Node):成交量显著高于平均水平的节点。它代表市场在这个价格上达成了大量交易,通常意味着这里有强支撑或强阻力。

LVN(Low Volume Node):成交量显著低于平均水平的节点。它代表市场在这个价格上「跳过去了」,没有太多交易。价格再次经过这里时,阻力会很小,容易快速通过。

怎么判断「显著」?我一般用标准差:

function classifyNodes(profile) {
    const volumes = [...profile.values()];
    const avg = volumes.reduce((a, b) => a + b, 0) / volumes.length;
    const std = Math.sqrt(
        volumes.reduce((sum, v) => sum + (v - avg) ** 2, 0) / volumes.length
    );

    const hvnThreshold = avg + std;
    const lvnThreshold = avg - std * 0.5;

    const result = { hvn: [], lvn: [] };

    for (const [price, volume] of profile) {
        if (volume >= hvnThreshold) {
            result.hvn.push({ price, volume });
        } else if (volume <= lvnThreshold) {
            result.lvn.push({ price, volume });
        }
    }

    return result;
}

这里有个经验:LVN 的阈值我设得比 HVN 宽松一些。因为低成交量节点本身数量就少,如果阈值太严格,可能一个都识别不出来。我曾经在黄金期货上试过,把 LVN 阈值设成 avg - std,结果一个 LVN 都没找到。后来改成 avg - std * 0.5,才抓到几个关键的「真空区」。

实战应用:

  • HVN 区域:适合做反转策略,价格到了 HVN 附近,大概率会停顿或反转
  • LVN 区域:适合做突破策略,价格突破 LVN 后,往往会快速移动
  • POC + VA:判断当前价格是否处于「合理估值」区间

6.5 知识体系总览

下面这张图,是我自己整理 VP 模块时画的。它把整个成交量分布的知识结构串起来了:

成交量分布 (Volume Profile) 知识体系 📊 成交量分布图构建 价格对齐 → 逐笔累加 → 分布图 🎯 价值区域(VA)计算 POC扩展 → 70%阈值 → VA区间 🔍 POC(控制点)识别 最大成交量 → 多峰处理 → 方向判断 ⚡ HVN 与 LVN 标准差分类 → 支撑阻力 → 突破信号 🛠️ 实战应用 反转策略 (HVN) | 突破策略 (LVN) | 估值判断 (POC+VA)

从这张图能看出来,VP 的四个核心模块是层层递进的。先有分布图,才能算 VA 和 POC,最后才能识别 HVN 和 LVN。每个模块都有它独特的应用场景,组合起来就是一个完整的成交量分析框架。

我曾经在构建这套系统时,踩过一个坑:把 VP 模块做得太复杂,加了各种平滑、滤波、归一化。结果回测效果反而变差了。后来我意识到,VP 的核心价值在于「原始数据的呈现」,而不是过度加工。你想想看,成交量本身就是最原始的市场行为,加太多人工处理,反而会丢失信息。

所以,我的建议是:先把基础的 VP 图跑通,把 POC 和 VA 算准,再考虑 HVN 和 LVN 的识别。一步一步来,别想一口吃成胖子。

避坑指南:

  • 数据源:一定要用逐笔成交数据,别用 K 线估算
  • 价格对齐:最小变动价位要设对,否则分布图会「歪」
  • VA 阈值:70% 是基准,但可以根据品种微调
  • HVN/LVN 阈值:用标准差,别用固定值

好了,成交量分布这部分就讲到这里。记住,VP 不是万能的,但它能给你一个独特的视角——从价格维度看成交量。这个视角,很多传统指标给不了你。


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