4、成交量分布分析:Volume Profile原理、POC识别、VA计算与实战应用
成交量分布分析,说白了就是看「谁在什么价格上买了多少」。
我刚开始做量化的时候,只看K线和均线。后来发现,同样的成交量,在不同价格区间意义完全不同。举个例子,某只股票一天成交了1000万股,如果这些成交都集中在10块钱附近,和分散在9块到11块之间,背后的市场含义天差地别。
嗯,这就是Volume Profile要解决的问题。
4.1 Volume Profile的核心原理
Volume Profile和传统成交量指标最大的区别在于:传统指标只看「总量」,Volume Profile看「分布」。
你想想看,传统成交量柱状图只告诉你每分钟或每根K线成交了多少。但Volume Profile告诉你:在10.01元成交了5000股,在10.02元成交了3000股,在10.03元成交了8000股……
我个人习惯把Volume Profile想象成「价格-成交量热力图」。横轴是成交量,纵轴是价格。每个价格水平上的成交量,就是一根横着的柱子。
核心概念:
- TPO(Time Price Opportunity):时间-价格-机会。每个价格水平上,市场参与者有多少时间窗口去交易。
- Volume at Price:每个价格水平上的总成交量。这是Volume Profile的基础数据。
- POC(Point of Control):成交量最大的那个价格水平。市场在这个价格上达成了最大共识。
- VA(Value Area):价值区域。通常取成交量占比70%的价格区间。
我在项目中遇到过一个问题:用Volume Profile分析期货合约时,不同到期日的合约数据混在一起,导致POC偏移。后来我强制按合约月份分开计算,才得到准确结果。
4.2 POC(控制点)识别
POC就是成交量最大的那个价格。听起来简单,但实际识别时要注意几个坑。
POC的数学定义:
POC = argmax(Volume_at_Price[i]) for i in range(min_price, max_price)
说白了,就是把每个价格上的成交量排个序,找最大的那个。
实战中的POC识别步骤:
- 数据准备:获取逐笔成交数据,按价格聚合。
- 价格精度处理:股票用最小变动价位(如0.01元),期货用Tick大小。
- 成交量计算:每个价格水平上的总成交量。
- POC定位:找到成交量最大的价格水平。
- 多POC处理:如果多个价格成交量接近,取中间值或加权平均。
注意:我曾经在识别POC时踩过一个坑——没有考虑「价格区间合并」。比如10.01和10.02两个价格,如果成交量都很大但相邻,应该合并成一个POC区域,而不是单独取一个点。否则会丢失市场结构信息。
POC的实战意义:
- 支撑/阻力:POC往往是多空博弈最激烈的位置,后续价格容易在此反复。
- 突破确认:价格突破POC后,如果成交量放大,说明突破有效。
- 交易区间:POC是价值区域的核心,价格围绕POC上下波动。
4.3 VA(价值区域)计算
价值区域,就是市场认为「合理」的价格区间。通常取成交量占比70%的区域。
VA的计算步骤:
- 找到POC。
- 从POC开始,向上和向下累加成交量。
- 每次加入成交量最大的相邻价格水平。
- 直到累加成交量达到总成交量的70%。
- 此时的价格区间就是VA。
嗯,这里要注意:累加顺序不是简单的从POC往上往下,而是每次选择「成交量最大的相邻价格」。这样能保证VA包含最活跃的交易区域。
def calculate_VA(volume_profile, total_volume, threshold=0.7):
# volume_profile: dict {price: volume}
# 找到POC
poc = max(volume_profile, key=volume_profile.get)
# 初始化
va_volume = volume_profile[poc]
va_prices = [poc]
# 向上和向下扩展
upper = poc
lower = poc
while va_volume / total_volume < threshold:
# 选择成交量最大的相邻价格
up_vol = volume_profile.get(upper + tick_size, 0)
down_vol = volume_profile.get(lower - tick_size, 0)
if up_vol >= down_vol:
upper += tick_size
va_prices.append(upper)
va_volume += up_vol
else:
lower -= tick_size
va_prices.append(lower)
va_volume += down_vol
return lower, upper, va_prices
我在项目中用过这个算法,但发现一个问题:如果市场出现极端行情,70%的阈值可能包含太多噪音。后来我加了动态阈值——根据波动率调整VA的百分比。波动率大时用60%,波动率小时用80%。
4.4 成交量分布实战应用
理论说完了,咱们看看实战中怎么用。
应用一:识别关键支撑阻力
POC和VA的上下边界,就是天然的支撑和阻力。我习惯在VA上边界挂卖单,VA下边界挂买单。当然,不是死板地挂,要结合市场情绪。
应用二:判断趋势强弱
- 强势上涨:价格在VA上方运行,且VA不断上移。
- 弱势反弹:价格回到VA内部,说明多头信心不足。
- 趋势反转:POC被有效突破,且成交量放大。
应用三:订单流异常预警
这个是我最常用的场景。当价格在VA内部运行时,突然出现一笔大单把价格推到VA之外,同时成交量在VA边界处异常放大——这就是订单流异常的信号。
实战技巧:
我曾经用Volume Profile做了一整套预警系统。核心逻辑是:
- 计算过去N根K线的Volume Profile
- 标记POC和VA
- 实时监控当前价格与VA的关系
- 当价格突破VA且成交量超过VA边界成交量的2倍时,触发预警
这套系统帮我抓住了好几次大行情,也避开了不少假突破。
应用四:多时间周期分析
我个人习惯同时看日线和小时线的Volume Profile。日线告诉你大方向,小时线告诉你入场点。如果日线的POC和小时线的POC重合,那这个位置的支撑/阻力就非常强。
4.5 知识体系结构图
下面这张图展示了Volume Profile的核心知识体系,我把它画成了流程图,方便你理解各个概念之间的关系。
4.6 避坑指南与个人经验
最后,分享几个我踩过的坑,希望能帮你少走弯路。
坑一:数据精度问题
我曾经用分钟级数据计算Volume Profile,结果POC总是偏移。后来发现,分钟数据已经聚合过一次,丢失了价格细节。正确的做法是用逐笔成交数据,或者至少用Tick级数据。
坑二:时间窗口选择
Volume Profile的时间窗口很关键。太短(比如5分钟)噪音大,太长(比如1周)反应迟钝。我个人习惯用1小时作为基础窗口,然后叠加日线和周线。
坑三:忽略市场结构变化
有一次我根据前一天的Volume Profile做交易,结果当天市场出了重大消息,POC完全失效。后来我加了一个「市场状态检测」模块——如果价格在短时间内突破前一天的VA,就重新计算Volume Profile。
嗯,说到底,Volume Profile是个好工具,但不是万能钥匙。它告诉你市场在哪里达成了共识,但不会告诉你共识什么时候被打破。结合订单流、市场深度和新闻情绪,才能做出更准确的判断。
公众号:蓝海资料掘金营,微信deep3321