波动动量与容量加权趋势交叉策略

VMI VWPC ATR RMA 波动加速度指标 容量加权价格中心 趋势跟踪
创建日期: 2025-07-14 14:35:54 最后修改: 2025-07-14 14:35:54
复制: 0 点击次数: 46
avatar of ianzeng123 ianzeng123
2
关注
83
关注者

波动动量与容量加权趋势交叉策略 波动动量与容量加权趋势交叉策略

概述

波动动量与容量加权趋势交叉策略是一种基于市场熵的量化交易系统,通过识别市场从低波动到高波动的转变点进行交易决策。该策略结合了两个关键指标:波动动量指标(VMI)和容量加权价格中心(VWPC)。VMI测量波动率加速度,用于在市场从平静过渡到活跃阶段时进场,并在波动达到混沌阈值时退出;而VWPC则作为一个基于交易量的趋势过滤器,通过典型价格来确定整体市场方向。这种组合方法旨在捕捉市场从低波动到高波动的转变,同时确保交易方向与整体趋势一致。

策略原理

该策略的核心原理是利用市场波动性变化周期和趋势方向进行交易决策。具体来说:

  1. 波动动量指标(VMI)计算

    • 首先计算当前的平均真实范围(ATR)及其变化
    • 区分上升加速度(ATR上升)和下降加速度(ATR下降)
    • 使用移动平均(RMA)平滑这些加速度值
    • 计算相对强度,并将其转换为0-100范围内的VMI值
  2. 容量加权价格中心(VWPC)计算

    • 基于典型价格(高、低、收盘价的平均值)和交易量计算
    • 通过加权典型价格与对应交易量,得到一个强调高交易量价格水平的指标
    • 这一指标可视为市场的”重心”,帮助确定整体趋势方向
  3. 交易逻辑分两个阶段实施

    • 准备阶段(“Armed”条件):检查VMI是否在近期内处于平静区域(低于设定的平静区阈值)
    • 触发阶段(“Fire”条件):当VMI向上穿越平静区阈值时触发
    • 入场条件:同时满足趋势方向(价格高于VWPC为上涨趋势,反之为下跌趋势)和上述两个阶段条件
    • 出场条件:当VMI达到混沌区阈值(表示波动达到高峰)时平仓

策略允许配置交易方向(只做多、只做空或双向交易),以及优化各项参数以适应不同市场环境。

策略优势

深入分析该策略代码,可以总结出以下优势:

  1. 基于市场周期的交易时机选择:该策略通过VMI指标识别市场从低波动到高波动的转变点,这往往代表着新的价格走势的开始,有助于在趋势初期入场。

  2. 结合交易量的趋势确认:VWPC通过加入交易量权重,提供了比简单移动平均线更具代表性的趋势指标,减少了虚假信号。

  3. 明确的入场和出场条件:策略具有清晰的入场逻辑(波动开始增加)和出场逻辑(波动达到极值),避免了主观判断。

  4. 适应性强:通过参数优化,该策略可以适应不同的市场环境和交易品种。特别是VMI的平静区和混沌区阈值可以根据市场特性进行调整。

  5. 风险管理集成:策略内置了仓位管理(默认使用账户15%的资金)和反向交易限制(pyramiding=0),有助于控制风险。

  6. 可视化辅助:策略在图表上绘制了VWPC趋势线和入场/出场信号,便于交易者直观理解市场状态和策略逻辑。

  7. 计算效率高:通过使用ta.rma和ta.barssince等内置函数,策略的计算效率较高,适合实时交易应用。

策略风险

尽管该策略具有多项优势,但也存在以下潜在风险:

  1. 波动性假突破风险:市场可能出现短暂的波动性增加后迅速回落的情况,导致错误信号。解决方法是调整VMI平静区阈值或增加确认条件。

  2. 趋势判断延迟:VWPC作为趋势指标可能存在一定滞后性,在市场急剧转向时可能不能及时反应。可以考虑结合短期动量指标进行辅助判断。

  3. 参数敏感性:策略性能对参数设置(特别是VMI长度和阈值)较为敏感,不同市场环境可能需要不同的参数组合。建议通过回测对不同市场环境进行参数优化。

  4. 交易频率不确定性:由于策略基于波动性变化,在不同市场阶段,交易信号的频率可能差异很大,影响整体收益率和回撤控制。

  5. 交易成本影响:尽管策略考虑了交易佣金(0.075%),但在实际交易中,滑点和其他交易成本可能进一步影响策略绩效。

  6. 依赖交易量数据:VWPC指标依赖交易量数据,在某些市场或时间段,交易量数据可能不准确或不可靠,影响指标准确性。

策略优化方向

通过深入剖析代码,可以提出以下优化方向:

  1. 加入波动性过滤器:可以引入一个基于历史波动性的动态阈值调整机制,使VMI的平静区和混沌区阈值能够根据市场整体波动水平自动调整,提高策略适应性。

  2. 增强趋势确认机制:可以在VWPC基础上增加多时间框架趋势确认,或结合其他趋势指标(如方向性指标ADX),提高趋势判断的准确性。

  3. 优化出场机制:当前策略仅在VMI达到混沌区时出场,可以考虑加入止损和目标利润水平,或者基于波动率的动态止损策略,以更好地控制风险和锁定利润。

  4. 增加交易量过滤:可以添加交易量确认条件,只在交易量增加的情况下入场,避免在低流动性环境下交易。

  5. 加入时间过滤器:某些市场在特定时间段可能存在波动性模式,可以增加时间过滤条件,避开已知的低效率交易时段。

  6. 参数自适应机制:可以开发一个基于近期市场表现自动调整参数的机制,使策略能够更好地适应市场变化。

  7. 优化资金管理:可以实现基于波动率的动态仓位管理,在不同波动环境下调整交易规模,平衡风险和收益。

总结

波动动量与容量加权趋势交叉策略是一种结合波动性分析和趋势追踪的量化交易系统。它通过VMI指标捕捉市场从平静到活跃的转变点进行入场,并在波动达到高峰时退出;同时使用VWPC指标确保交易方向与整体趋势一致。该策略的核心优势在于能够捕捉市场波动周期的重要转折点,并结合交易量信息过滤趋势方向,提高交易质量。

然而,该策略也面临波动性假突破、趋势判断延迟和参数敏感性等挑战。通过引入动态阈值调整、增强趋势确认机制、优化出场逻辑和实现自适应参数等方式,可以进一步提升策略的稳健性和适应性。

最终,该策略提供了一个基于市场熵和波动性周期的交易框架,适合在各种市场环境中应用,但交易者仍需根据具体交易品种和市场特性进行参数优化和策略调整,以达到最佳效果。

策略源码
/*backtest
start: 2024-07-14 00:00:00
end: 2025-07-12 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":200000}]
*/

// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TiamatCrypto

//@version=5
strategy("Market Entropy Strategy V2.5", 
         overlay=true, 
         initial_capital=10000, 
         default_qty_type=strategy.percent_of_equity, 
         default_qty_value=15, // Slightly more aggressive allocation
         commission_type=strategy.commission.percent,
         commission_value=0.075,
         pyramiding=0) // Allow only one trade in one direction

// --- General Settings ---
trade_direction = input.string("Both", "Trade Direction", options=["Long", "Short", "Both"], group="General Settings")

// --- Inputs for Optimization ---
// VMI Settings
vmi_length = input.int(14, "VMI Length", group="VMI Settings")
atr_period = input.int(10, "ATR Period for VMI", group="VMI Settings")
vmi_calm_zone = input.int(25, "VMI Calm Zone (Entry Level)", group="VMI Settings", step=5)
vmi_chaos_zone = input.int(85, "VMI Chaos Zone (Exit Level)", group="VMI Settings", step=5)

// VWPC Settings
vwpc_length = input.int(50, "VWPC Filter Length", group="VWPC Trend Filter")
setup_lookback = input.int(10, "How far to look for 'Armed' (candles)", group="Entry Logic")

// --- Indicator #1: Volatility Momentum Index (VMI) ---
current_atr = ta.atr(atr_period)
atr_change = current_atr - current_atr[1]
up_accel = atr_change > 0 ? atr_change : 0
down_accel = atr_change < 0 ? -atr_change : 0
avg_up_accel = ta.rma(up_accel, vmi_length)
avg_down_accel = ta.rma(down_accel, vmi_length)
rs_vmi = avg_down_accel == 0 ? 0 : avg_up_accel / avg_down_accel
vmi = avg_down_accel == 0 ? 100 : avg_up_accel == 0 ? 0 : 100 - (100 / (1 + rs_vmi))

// --- Indicator #2: Volume-Weighted Price Center (VWPC) ---
// Function to calculate VWPC
f_vwpc(length) =>
    sum_price_volume = 0.0
    sum_volume = 0.0
    // We use the typical price, which better represents the candle
    typical_price = (high + low + close) / 3
    for i = 0 to length - 1
        sum_price_volume += typical_price[i] * nz(volume[i])
        sum_volume += nz(volume[i])
    sum_volume == 0 ? typical_price : sum_price_volume / sum_volume

vwpc = f_vwpc(vwpc_length)

// --- Strategy Logic ---

// Trend Definition
is_uptrend = close > vwpc
is_downtrend = close < vwpc

// Phase 1: "Armed" Condition (Setup)
// We check if VMI WAS in the calm zone in the recent past
was_calm_recently = ta.barssince(vmi < vmi_calm_zone) < setup_lookback

// Phase 2: "Fire" Condition (Trigger)
// VMI is currently crossing the Calm Zone upwards
trigger_fire = ta.crossover(vmi, vmi_calm_zone)

// Combination for ENTRY
buy_signal = is_uptrend and was_calm_recently and trigger_fire
sell_signal = is_downtrend and was_calm_recently and trigger_fire

// Condition for EXIT ("Exhaustion")
// The same condition applies for both long and short - peak chaos
exit_signal = ta.crossover(vmi, vmi_chaos_zone)

// --- Executing Orders ---
// Entry Conditions
allow_longs = trade_direction == "Long" or trade_direction == "Both"
allow_shorts = trade_direction == "Short" or trade_direction == "Both"

// Entries
if (buy_signal and allow_longs)
    strategy.entry("Buy", strategy.long, comment="Enter LONG (Armed->Fire)")

if (sell_signal and allow_shorts)
    strategy.entry("Sell", strategy.short, comment="Enter SHORT (Armed->Fire)")

// Exits
if (strategy.position_size > 0 and exit_signal)
    strategy.close("Buy", comment="Exit LONG (Chaos)")

if (strategy.position_size < 0 and exit_signal)
    strategy.close("Sell", comment="Exit SHORT (Chaos)")

// --- Plotting on the chart for visual inspection ---
plot(vwpc, "VWPC Center of Gravity", color=color.new(color.yellow, 0), linewidth=2)
plotshape(buy_signal and allow_longs, "LONG Entry", shape.labelup, location.belowbar, color=color.new(color.aqua, 0), text="ENTRY ↑", textcolor=color.white, size=size.small)
plotshape(sell_signal and allow_shorts, "SHORT Entry", shape.labeldown, location.abovebar, color=color.new(color.fuchsia, 0), text="ENTRY ↓", textcolor=color.white, size=size.small)

// Plotting the exit signal for a better overview
exit_marker_y_pos = strategy.position_size > 0 ? high : low
plotshape(series=(exit_signal and strategy.position_size != 0 ? exit_marker_y_pos : na), title="Exit", style=shape.xcross, location=location.absolute, color=color.new(color.orange, 0), size=size.tiny, text="END")
相关推荐