在量化 交易与算法开发领域,FVG(Fair Value Gap,公允价值缺口) 正在成为一个越来越热门的概念。它源于Smart Money Concepts(SMC)与ICT交易方法论,代表价格在快速波动中留下的“未被交易的空白区域”。
很多开发者常陷入“概念我都懂,但代码不会写”的困境。今天,我们就从代码实现的角度,聊聊FVG选择与编程中那些你应该知道的常识。
一、到底什么是FVG?
从K线图上看,FVG是一个三根K线形成的形态。当中间K线的最高价/最低价,与前后两根K线的高低点完全不重叠时,就形成了一个价格缺口。
判断逻辑很清晰:
· 看涨FVG:当前K线最低价 > 前二根K线最高价(价格向上跳空)
· 看跌FVG:当前K线最高价 < 前二根K线最低价(价格向下跳空)
这个缺口代表市场在那个价位上存在“订单失衡”——买方或卖方过于强势,导致大量订单未能成交。价格往往会在后续回补(或称“填充”)这些缺口,因此FVG常常成为潜在的支撑/阻力区域。
二、编程实现:核心是“三根K线”的选择
把FVG翻译成代码,本质上就是一个模式匹配问题。以下是用Python实现的FVG检测核心逻辑:
defdetect_fvg(df):"""检测Fair Value Gap"""fvgs=[]foriinrange(1,len(df)-1):prev_high=df['High'].iloc[i-1]prev_low=df['Low'].iloc[i-1]curr_high=df['High'].iloc[i]curr_low=df['Low'].iloc[i]next_high=df['High'].iloc[i+1]next_low=df['Low'].iloc[i+1]# 看涨FVG: 前一根高点 < 后一根低点ifprev_high<next_low:fvgs.append({'type':'bullish','top':next_low,# 缺口上沿'bottom':prev_high,# 缺口下沿'index':i})# 看跌FVG: 前一根低点 > 后一根高点elifprev_low>next_high:fvgs.append({'type':'bearish','top':prev_low,'bottom':next_high,'index':i})returnfvgs实际开发中你需要注意几个关键选择:
数据结构的选型:推荐使用Pandas或Polars处理OHLC数据,配合shift()函数可以大幅简化代码。
连续FVG的处理:当多个FVG连续出现时,是否将它们合并 为一个更大的区域?这是一个重要的设计选择。
多时间框架的支持:高时间框架的FVG往往比低时间框架的更具参考价值。建议在架构设计时就把“多周期FVG检测”作为一个可配置选项。
填充状态的追踪:一个FVG被“填充”(价格回到缺口区域内)后,它的参考价值会发生变化。需要在数据中记录每个FVG的filled状态。
三、FVG选择的进阶常识
FVG也分强弱——不是所有缺口都值得同等对待:
· 普通FVG:纯价格失衡,强度一般
· IFVG(反向FVG):被填充后发生反转的FVG,强度更高
· Order Block + FVG:当FVG与订单块区域重合时,参考价值大幅提升
信号质量可以量化。你可以为每个FVG计算一个质量评分,综合考量缺口大小、成交量配合、是否与Order Block重合等因素,然后只选择评分高于阈值的FVG进行交易。
切记:FVG检测本身并不复杂,真正的挑战在于多周期上下文解读——同一个FVG在1分钟图和1小时图上意义完全不同。
四、写在最后
从概念到代码,FVG的实现门槛其实不高。但“写出来”和“写好”之间,隔着的是对数据结构、算法 效率和交易逻辑的深入理解。希望这篇文章能帮你少走一些弯路。