多层次趋势分析型ATR波动区间量化策略

ATR SMA EMA Pivot Trend Analysis JESSE LIVERMORE
创建日期: 2025-07-17 15:55:10 最后修改: 2025-07-17 15:55:10
复制: 3 点击次数: 66
avatar of ianzeng123 ianzeng123
2
关注
83
关注者

多层次趋势分析型ATR波动区间量化策略 多层次趋势分析型ATR波动区间量化策略

概述

这个基于杰西·利弗莫尔(Jesse Livermore)交易哲学的量化策略是一个多层次趋势跟踪系统,通过识别和分析不同层级的市场趋势来进行交易决策。该策略关注价格行为中的关键支撑与阻力位,结合ATR指标来定义价格变动阈值,从而在保持趋势方向的同时,过滤掉市场噪音。系统采用精细化的趋势状态分类方法,将市场动态划分为六种不同状态:主要上升趋势、主要下降趋势、自然反弹、自然回调、次级反弹和次级回调。通过这种分层方法,策略能够在不同市场环境下保持适应性,捕捉长期趋势中的高概率交易机会。

策略原理

该策略的核心是基于杰西·利弗莫尔的交易理念,将市场趋势分为多个层次进行动态跟踪。策略实现了六种不同的趋势状态,分别用数字0-6表示:

  • NONE(0): 无明确趋势状态
  • MAIN_DOWN(1): 主要下降趋势
  • NATURAL_REBOUND(2): 下降趋势中的自然反弹
  • SECONDARY_RETRACEMENT(3): 次级回调
  • SECONDARY_REBOUND(4): 次级反弹
  • NATURAL_RETRACEMENT(5): 上升趋势中的自然回调
  • MAIN_UP(6): 主要上升趋势

策略使用两种关键参数来判断价格变动的重要性: 1. 枢轴距离百分比(pivot_distance_percentage):默认为0.5%,定义了价格变动需要达到的最小幅度才被视为有效突破 2. 倍数调节器:分为主要枢轴倍数(major_pivot_multiplier,默认为6)和次要枢轴倍数(minor_pivot_multiplier,默认为3),用于调整不同趋势层级的敏感度

此外,策略还支持使用ATR(Average True Range)作为动态波动阈值的选项,通过atr_period参数(默认14周期)和atr_pivot_multiplier参数(默认为1)来计算波动区间。

策略的交易逻辑基于趋势状态的连续性确认: - 当趋势状态从任何状态连续两个周期确认为MAIN_UP(主要上升趋势)时,触发做多信号 - 当趋势状态从任何状态连续两个周期确认为MAIN_DOWN(主要下降趋势)时,平仓所有多头头寸

这种连续确认机制有效地减少了假突破带来的交易风险,确保只在趋势明确建立后才进行交易。

策略优势

  1. 多层次趋势分析:通过细分六种不同的趋势状态,该策略能够更精确地捕捉市场结构变化,比简单的趋势跟踪系统提供更丰富的市场信息。

  2. 自适应波动阈值:策略支持固定百分比和基于ATR的动态阈值两种模式,使其能够在不同波动率环境下保持稳定性能。ATR方法在高波动市场中特别有效,可以自动调整对价格变动的敏感度。

  3. 减少假突破交易:通过要求趋势状态的连续确认,策略有效过滤了许多短暂的价格波动,只在趋势明确建立后才入场,提高了交易信号的可靠性。

  4. 风险控制机制:策略内置了完善的风险控制逻辑,当市场趋势发生显著变化时自动平仓,这有助于保护已有利润并限制潜在损失。

  5. 基于经典交易理念:该策略借鉴了杰西·利弗莫尔这位传奇交易者的市场理念,特别是他关于市场趋势分层和关键转折点的洞见,这些原则经受了时间的考验。

  6. 资金管理优化:策略采用了仓位比例管理方法(默认使用95%的可用资金),这种方法比固定仓位更适合长期资金增长,能够随着账户规模的变化自动调整头寸大小。

策略风险

  1. 趋势变化滞后反应:由于策略需要连续两个周期确认趋势状态才触发交易,可能导致在快速反转市场中入场或出场较晚,错过最佳价格点位。

  2. 参数敏感性:策略的性能高度依赖于多个关键参数的设置,如枢轴距离百分比、主要枢轴倍数和次要枢轴倍数。不同市场环境可能需要不同的参数组合,过度优化可能导致过拟合风险。

  3. 单边策略局限性:当前策略设计为仅做多模式(Long only),在持续下跌的熊市环境中可能面临较长时间的资金闲置或连续亏损。

  4. 缺乏止损机制:代码中没有明确的止损策略,仅依靠趋势状态变化来平仓,在极端市场条件下可能无法及时控制损失。

  5. 资金利用率问题:默认使用95%的资金进行交易,虽然提高了潜在收益,但也同时增加了风险敞口,尤其是在高波动市场中。

  6. 趋势定义复杂性:六种趋势状态的转换逻辑较为复杂,可能导致在某些边界条件下产生不稳定的状态切换,引发不必要的交易。

策略优化方向

  1. 增加做空功能:当前策略仅支持做多操作,可以扩展为同时支持做多和做空,充分利用下跌市场的机会。实现方法是在MAIN_DOWN状态连续确认时不仅平仓多头,还可以考虑建立空头头寸。

  2. 引入止损机制:可以结合ATR设计动态止损点位,例如在入场点位下方设置2-3倍ATR的止损,以防止单笔交易亏损过大。

  3. 优化参数自适应性:可以基于历史波动率或市场结构变化,设计参数的动态调整机制,使策略能够自动适应不同的市场环境。例如,在高波动期间自动增加枢轴距离百分比,在低波动期间减小该值。

  4. 增加过滤条件:结合其他技术指标如移动平均线、相对强弱指数(RSI)或MACD作为辅助过滤条件,进一步提高交易信号的质量。例如,只在价格位于长期移动平均线上方时考虑做多信号。

  5. 优化资金管理:可以实现基于波动率的仓位调整,在高波动环境中自动减少仓位比例,在低波动环境中适当增加仓位,平衡风险和收益。

  6. 加入时间过滤器:针对不同的交易时段设置不同的交易规则,避开流动性差或波动异常的时间段,如市场开盘和收盘前后的高波动期。

  7. 实现部分平仓逻辑:可以设计分批平仓机制,在趋势减弱但尚未完全逆转时,先行平掉部分头寸锁定利润,剩余部分继续持有等待趋势进一步发展。

总结

基于杰西·利弗莫尔交易哲学的多层次趋势分析策略提供了一个系统化的方法来识别和跟踪市场趋势。通过将市场动态分解为六种不同的趋势状态,并结合ATR动态波动阈值,该策略能够在保持长期趋势方向的同时,有效过滤短期市场噪音。该策略的主要优势在于其多层次趋势识别能力和自适应波动阈值设计,适合中长期趋势跟踪交易者使用。

然而,策略也存在一些局限性,如仅支持做多、缺乏明确止损机制以及参数敏感性问题。通过增加做空功能、引入止损策略、优化参数自适应性、添加额外过滤条件、改进资金管理方法以及加入时间过滤器等方向的优化,该策略有望进一步提升其在不同市场环境下的稳定性和盈利能力。最终,这个基于经典交易智慧的现代量化策略,为交易者提供了一个既尊重市场规律又具备技术严谨性的交易系统。

策略源码
/*backtest
start: 2024-07-17 00:00:00
end: 2025-07-15 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"SOL_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/
// © bozhang_ox

//@version=6
strategy("Trading strategy Jesse Livermore", overlay=true, fill_orders_on_standard_ohlc = true, initial_capital = 1000000, default_qty_type=strategy.percent_of_equity, default_qty_value = 95)

// Input parameters
pivot_distance_percentage = input.float(0.5, title="Pivot Distance Percentage")
major_pivot_multiplier = input.int(6, title="Major Pivot Multiplier")
minor_pivot_multiplier = input.int(3, title="Minor Pivot Multiplier")
use_atr_pivot_distance = input.bool(false, title="Use ATR for Pivot Distance")
atr_period = input.int(14, title="ATR Period")
atr_pivot_multiplier = input.float(1, title="ATR Pivot Multiplier")

// Calculate ATR
atr = ta.atr(atr_period)

// Helper function to calculate pivot distance ratio
pivot_distance_ratio = use_atr_pivot_distance ? (atr * atr_pivot_multiplier) / close : pivot_distance_percentage / 100

// Trend states
NONE = 0
MAIN_UP = 6
MAIN_DOWN = 1
NATURAL_REBOUND = 2
NATURAL_RETRACEMENT = 5
SECONDARY_REBOUND = 4
SECONDARY_RETRACEMENT = 3

// Variables to track trends
var float main_up_max = na
var float main_down_min = na
var float natural_rebound_max = na
var float natural_retracement_min = na
var int trend = NONE
var int prev_trend = NONE
var int prev_prev_trend = NONE


// Initialize variables
if na(main_up_max)
    main_up_max := -1e10
if na(main_down_min)
    main_down_min := 1e10
if na(natural_rebound_max)
    natural_rebound_max := -1e10
if na(natural_retracement_min)
    natural_retracement_min := 1e10

// Trend logic
if trend == MAIN_UP
    if close > close[1] or (main_up_max - close < close[1] * pivot_distance_ratio * major_pivot_multiplier)
        trend := MAIN_UP
        main_up_max := math.max(main_up_max, close)
    else
        trend := NATURAL_RETRACEMENT
        natural_retracement_min := close
else if trend == MAIN_DOWN
    if close < close[1] or (close - main_down_min < close[1] * pivot_distance_ratio * major_pivot_multiplier)
        trend := MAIN_DOWN
        main_down_min := math.min(main_down_min, close)
    else
        trend := NATURAL_REBOUND
        natural_rebound_max := close
else if trend == NATURAL_REBOUND
    if close > close[1]
        if close <= main_up_max
            if close - natural_rebound_max <= close[1] * pivot_distance_ratio * minor_pivot_multiplier
                trend := NATURAL_REBOUND
                natural_rebound_max := math.max(natural_rebound_max, close)
            else
                trend := MAIN_UP
                main_up_max := close
        else
            trend := MAIN_UP
            main_up_max := close
    else
        if natural_rebound_max - close <= close[1] * pivot_distance_ratio * major_pivot_multiplier
            trend := NATURAL_REBOUND
        else if close < natural_retracement_min
            trend := NATURAL_RETRACEMENT
            natural_retracement_min := close
        else
            trend := SECONDARY_RETRACEMENT
else if trend == NATURAL_RETRACEMENT
    if close < close[1]
        if close >= main_down_min
            if natural_retracement_min - close <= close[1] * pivot_distance_ratio * minor_pivot_multiplier
                trend := NATURAL_RETRACEMENT
                natural_retracement_min := math.min(natural_retracement_min, close)
            else
                trend := MAIN_DOWN
                main_down_min := close
        else
            trend := MAIN_DOWN
            main_down_min := close
    else
        if close - natural_retracement_min <= close[1] * pivot_distance_ratio * major_pivot_multiplier
            trend := NATURAL_RETRACEMENT
        else if close > natural_rebound_max
            trend := NATURAL_REBOUND
            natural_rebound_max := close
        else
            trend := SECONDARY_REBOUND
else if trend == SECONDARY_REBOUND
    if close <= natural_rebound_max and close >= natural_retracement_min
        trend := SECONDARY_REBOUND
    else if close < natural_retracement_min
        trend := NATURAL_RETRACEMENT
        natural_retracement_min := close
    else
        trend := NATURAL_REBOUND
        natural_rebound_max := close
else if trend == SECONDARY_RETRACEMENT
    if close >= natural_retracement_min and close <= natural_rebound_max
        trend := SECONDARY_RETRACEMENT
    else if close > natural_rebound_max
        trend := NATURAL_REBOUND
        natural_rebound_max := close
    else
        trend := NATURAL_RETRACEMENT
        natural_retracement_min := close
else
    if close > close[1]
        trend := MAIN_UP
        main_up_max := close
    else
        trend := MAIN_DOWN
        main_down_min := close

// Execute trades based on trend changes
if prev_trend != prev_prev_trend
    if trend == MAIN_UP and prev_trend == MAIN_UP
        strategy.entry("Long Entry", strategy.long, comment="Long Entry")
    else if trend == MAIN_DOWN and prev_trend == MAIN_DOWN
        strategy.close("Long Entry", qty_percent = 100, comment = "Long Close")

// Update previous trend
prev_prev_trend := prev_trend
prev_trend := trend
相关推荐