7、Volume Profile 结构分析:识别高成交量节点(HVN)与低成交量节点(LVN),构建交易区间

说实话,很多做订单流的朋友一开始都盯着逐笔成交看。但我觉得,Volume Profile 才是真正能让你看清市场骨架的东西。它不关心时间,只关心价格。说白了,就是告诉你——哪个价格区间,大家最愿意交易。

我个人习惯把 Volume Profile 比作市场的「地基」。地基打得牢,价格就稳;地基是空的,价格就容易塌。今天我们就来拆解这个地基,看看怎么用 HVN 和 LVN 来构建你的交易区间。

核心概念速览:
HVN(高成交量节点):价格在这里停留久,成交量大,是市场的「价值区域」。
LVN(低成交量节点):价格在这里一掠而过,成交量小,是市场的「真空地带」。

7.1 什么是 HVN 和 LVN?

先别急着上代码。我们得先理解这两个东西到底在说什么。

HVN(High Volume Node),高成交量节点。你想想看,如果某个价格上成交了巨量,说明什么?说明买卖双方在这个价格上达成了高度共识。买方觉得值,卖方也愿意卖。这个价格就是市场的「价值中枢」。价格离开这里后,往往还会回来。

LVN(Low Volume Node),低成交量节点。这个更有意思。价格在这里几乎没怎么停留,就像一阵风刮过去。为什么会这样?要么是跳空,要么是快速突破。这种地方没有支撑,也没有阻力。价格一旦再次触及,很容易直接穿过。

嗯,这里要注意:LVN 不是没用,恰恰相反,它是交易员最该盯的地方。 因为价格从 HVN 出发,冲向 LVN 时,速度最快,利润空间也最大。

我的经验: 我在实盘中见过太多人把 LVN 当支撑用,结果被瞬间打脸。记住,LVN 是「路过」的地方,不是「停留」的地方。

7.2 如何计算 Volume Profile?

计算其实不复杂。我们把价格分成一个个小格子(比如每 1 个 tick 或每 0.5 美元),然后统计每个价格上成交了多少手。

下面是我常用的一个 Python 实现。代码不长,但很实用。

import pandas as pd
import numpy as np

def calculate_volume_profile(df, price_step=0.5):
    """
    计算 Volume Profile
    :param df: 包含 'price' 和 'volume' 列的 DataFrame
    :param price_step: 价格分档步长
    :return: 每个价格区间的成交量
    """
    # 将价格离散化到最近的 price_step 整数倍
    df['price_bin'] = np.round(df['price'] / price_step) * price_step
    
    # 按价格分组求和
    vp = df.groupby('price_bin')['volume'].sum().reset_index()
    vp.columns = ['price', 'volume']
    vp = vp.sort_values('price').reset_index(drop=True)
    
    return vp

# 示例用法
# 假设你有一份逐笔成交数据
# data = pd.read_csv('trades.csv')
# vp_result = calculate_volume_profile(data, price_step=1.0)
# print(vp_result.head())

这段代码的核心就两步:离散化价格,然后按价格聚合成交量。你可能会问,price_step 设多少合适?我个人习惯用 1 个 tick 或者 0.5 美元。太小了噪音大,太大了看不清结构。

7.3 识别 HVN 和 LVN

有了 Volume Profile 数据,接下来就是找 HVN 和 LVN。方法很简单:

  • HVN:成交量最大的那个节点,或者成交量超过某个阈值(比如平均成交量的 2 倍)的节点。
  • LVN:成交量最小的节点,或者成交量低于某个阈值(比如平均成交量的 0.3 倍)的节点。

我一般会画一张图,一眼就能看出来。下面这个函数可以帮你标记出 HVN 和 LVN。

def identify_hvn_lvn(vp_df, volume_threshold_high=2.0, volume_threshold_low=0.3):
    """
    识别 HVN 和 LVN
    :param vp_df: 包含 'price' 和 'volume' 列的 DataFrame
    :param volume_threshold_high: 高成交量倍数阈值
    :param volume_threshold_low: 低成交量倍数阈值
    :return: 标记后的 DataFrame
    """
    avg_volume = vp_df['volume'].mean()
    
    vp_df['type'] = 'normal'
    vp_df.loc[vp_df['volume'] >= avg_volume * volume_threshold_high, 'type'] = 'HVN'
    vp_df.loc[vp_df['volume'] <= avg_volume * volume_threshold_low, 'type'] = 'LVN'
    
    return vp_df

# 示例
# vp_marked = identify_hvn_lvn(vp_result)
# print(vp_marked[vp_marked['type'] != 'normal'])
避坑指南: 我曾经犯过一个错误——只看绝对成交量最大的节点。结果发现那个节点是某个大单砸出来的,根本不是真正的价值区域。后来我改用「相对阈值法」,效果好了很多。建议你也试试。

7.4 构建交易区间

有了 HVN 和 LVN,交易区间就呼之欲出了。我通常这样构建:

  1. 找到主 HVN:成交量最大的那个节点,作为区间的「价值中心」。
  2. 找到上下 LVN:在主 HVN 上方和下方,找到最近的 LVN。这些是潜在的突破目标。
  3. 定义区间边界:主 HVN 上下各一个标准差(或者用肉眼观察),作为区间的上下轨。

举个例子。假设主 HVN 在 100 美元,上方最近的 LVN 在 105 美元,下方最近的 LVN 在 95 美元。那么交易区间就是 95-105 美元。价格在区间内震荡时,靠近 HVN 做多,靠近边界做空。一旦突破 LVN,就顺势追。

下面这张图展示了 Volume Profile 的核心结构:

Volume Profile 结构示意图 价格 成交量 105 100 95 LVN HVN LVN 交易区间 95-105 突破方向 突破方向

你看这张图,中间那个粗壮的绿色柱子就是 HVN,上下两个红色小柱子是 LVN。价格在 HVN 附近反复摩擦,一旦突破 LVN,就像子弹穿过真空,速度极快。

7.5 实战中的注意事项

光有理论不行,实战中坑很多。我踩过的几个,分享给你:

  • 时间窗口别乱选:Volume Profile 对时间窗口很敏感。日内的 HVN 和日线的 HVN 完全不是一回事。我一般用「当日」和「当周」两个窗口对照看。
  • 别只看一个节点:有时候会有多个 HVN 挨在一起,形成一个「价值区域」。这时候别死盯着单个节点,要看整个区域的宽度。
  • LVN 不是一定会突破:价格到了 LVN 附近,也可能折返。我通常会等价格在 LVN 附近出现「二次确认」——比如放量突破后回踩不破,再进场。
一个小技巧: 如果你发现某个 LVN 上方紧挨着一个 HVN,那这个 LVN 的突破概率极高。因为 HVN 提供了「推力」,LVN 提供了「通道」。这种结构我称之为「火箭发射台」。

7.6 代码实战:自动构建交易区间

最后,我们写一个完整的函数,自动识别 HVN、LVN,并输出交易区间。

def build_trading_zone(df, price_step=0.5, hvn_threshold=2.0, lvn_threshold=0.3):
    """
    自动构建交易区间
    :return: (zone_low, zone_high, hvn_price, lvn_above, lvn_below)
    """
    # 1. 计算 Volume Profile
    vp = calculate_volume_profile(df, price_step)
    
    # 2. 识别 HVN 和 LVN
    vp = identify_hvn_lvn(vp, hvn_threshold, lvn_threshold)
    
    # 3. 找到主 HVN
    hvn_row = vp[vp['type'] == 'HVN'].sort_values('volume', ascending=False).iloc[0]
    hvn_price = hvn_row['price']
    
    # 4. 找到上下 LVN
    above = vp[vp['price'] > hvn_price]
    lvn_above = above[above['type'] == 'LVN']['price'].min() if not above[above['type'] == 'LVN'].empty else None
    
    below = vp[vp['price'] < hvn_price]
    lvn_below = below[below['type'] == 'LVN']['price'].max() if not below[below['type'] == 'LVN'].empty else None
    
    # 5. 定义区间
    zone_low = hvn_price - price_step * 5  # 简单示例,实际可用标准差
    zone_high = hvn_price + price_step * 5
    
    return zone_low, zone_high, hvn_price, lvn_above, lvn_below

# 使用示例
# low, high, hvn, lvn_up, lvn_down = build_trading_zone(data)
# print(f"交易区间: {low:.2f} - {high:.2f}, 主HVN: {hvn:.2f}")

这段代码虽然简单,但已经能应付大部分日内交易场景了。你可以在实盘中跑一跑,看看效果。

好了,关于 Volume Profile 的结构分析,我们就聊到这里。记住一句话:HVN 是家,LVN 是路。 在家附近做震荡,在路上做突破。别搞反了。


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