Hull移动平均振荡交易策略


创建日期: 2023-10-07 15:24:31 最后修改: 2023-10-07 15:24:31
复制: 0 点击次数: 737
avatar of ChaoZhang ChaoZhang
1
关注
1241
关注者

概述

该策略是基于Hull移动平均指标的短线交易策略。策略利用Hull移动平均线的金叉死叉形成买卖信号,属于趋势跟踪策略。

策略原理

该策略主要基于Hull移动平均指标,Hull移动平均线由两个移动平均线组成。首先计算价格的中期移动平均线nma,周期为hullperiod。然后计算价格的快速移动平均线n2ma,周期为nma的一半。当n2ma上穿nma时发出买入信号,下穿nma时发出卖出信号。

为了过滤掉部分虚假信号,策略还引入了Hull线(Hull_Line)。Hull线是计算nma和n2ma之间差值的线性回归结果。当价格与Hull线发生背离时,策略会跳过买卖信号。

具体来说,策略规则如下:

  1. 计算nma,周期hullperiod

  2. 计算n2ma,周期为nma周期的一半

  3. 计算n2ma和nma的差值diff

  4. 对diff进行周期为sqrt(hullperiod)的移动平均,得到Hull线Hull_Line

  5. 当价格上穿Hull线时发出买入信号

  6. 当价格下破Hull线时发出卖出信号

  7. 如果价格与Hull线发生背离,跳过信号

  8. 以一定比例仓位入场,采用离场止损方式止损

优势分析

该策略具有以下优势:

  1. 基于Hull移动平均,能够快速捕捉趋势,顺势而为

  2. 采用Hull线过滤虚假信号,提高信号质量

  3. 回撤和盈亏比良好,适合短线操作

  4. 参数调整灵活,可适应不同市场环境

  5. 采用反转止损,可以及时止损,控制风险

  6. 结合季节性,可避开特定时间段的系统性风险

风险分析

该策略也存在一些风险:

  1. 跟踪趋势策略,无法做到全天候交易

  2. 当趋势反转时,会产生较大亏损

  3. 移动平均系统滞后,无法及时捕捉转折点

  4. 短线交易频繁,交易费用较高

  5. 参数设置不当可能导致震荡市收益下降

针对上述风险,可以采取以下措施加以控制:

  1. 采用马丁格尔止损策略,控制单笔亏损

  2. 优化参数,测试不同市场环境的参数健壮性

  3. 结合趋势判断指标,避免反转中的追涨杀跌

  4. 加大持仓时间,降低交易频率

优化方向

该策略还可从以下几个方面进行优化:

  1. 结合动量指标,确定趋势的起始点位,更好的布局入场

  2. 增加机器学习模型,辅助判断趋势方向和力度

  3. 采用自适应参数设置,根据实时市场调整参数

  4. 配置多时间周期Hull系统,不同周期配置不同的仓位

  5. 结合交易量能量指标,避开量能不足的假突破

  6. 增加基于波动率的仓位管理模块,根据波动率动态调整仓位

总结

Hull移动平均振荡交易策略整体是一个非常实用的短线跟踪策略。它利用Hull移动平均系统判断趋势方向,以达到顺势而为的目的。相比单一移动平均线系统,它具有更高的信号质量和 Parameters 灵活性。该策略优势在于快速捕捉趋势换向,以较低的回撤获利;劣势在于无法应对趋势反转。我们可以通过Parameter优化、止损策略改进、增加辅助模型等手段来控制风险,使策略在更多市场环境中稳定运行。

策略源码
/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 6h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//                               Hull Moving Average Swing Trader by SEASIDE420
strategy("Hull Moving Average Swing Trader", shorttitle="HMA_Swing_Trader", default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills=true, calc_on_every_tick=true, pyramiding=0)
hullperiod = input(title="HullMA Period", type=input.integer, defval=210, minval=1)
price = input(open, type=input.source, title="Price data")
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2020, title="From Year", minval=2017)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2017)
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => true
n2ma = 2 * wma(price, round(hullperiod / 2))
nma = wma(price, hullperiod)
diff = n2ma - nma
sqn = round(sqrt(hullperiod))
n2ma1 = 2 * wma(price[1], round(hullperiod / 2))
nma1 = wma(price[1], hullperiod)
diff1 = n2ma1 - nma1
n1 = wma(diff, sqn)
n2 = wma(diff1, sqn)
Hull_Line = n1 / n1 * n2
Hull_retracted = if n1 > n2
    Hull_retracted = Hull_Line - 2
else
    Hull_retracted = Hull_Line + 2
c1 = Hull_retracted + n1 - price
c2 = Hull_retracted - n2 + price
c4 = n1 > n2 ? color.green : color.red
c2p = plot(c2, color=color.black, linewidth=1)
c3p = plot(price, color=color.black, linewidth=1)
fill(c3p, c2p, color=c4, transp=75)
//plot(cross(c1, c2) ? c1 : na, style=plot.style_circles, color=c4, linewidth=4)
if price < c2
    strategy.close("BUY", when=window())
if price > c2
    strategy.close("SELL", when=window())
if price > c2 and price[1] > c1
    strategy.entry("BUY", strategy.long, when=window())
if price < c1 and price[1] < c2
    strategy.entry("SELL", strategy.short, when=window())  //        /L'-, 
//                               ,'-.      `   ````                 /  L '-, 
//     .                    _,--dMMMM\        `   ` ` '`..         /       '-, 
//     :             _,--,  )MMMMMMMMM),.      `     ,<>          /_      '-,' 
//     ;     ___,--. \MM(    `-'   )M//MM\          ,',.;      .-'* ;     .' 
//     |     \MMMMMM) \MM\       ,dM//MMM/     ___ < ,; `.      )`--'    / 
//     |      \MM()M   MMM)__   /MM(/MP'  ___, \  \ `  `. `.   /__,    ,' 
//     |       MMMM/   MMMMMM( /MMMMP'__, \     | /      `. `-,_\     / 
//     |       MM     /MMM---' `--'_ \     |-'  |/         `./ .\----.___ 
//     |      /MM'   `--' __,-  \""   |-'  |_,               `.__) . .F. )-. 
//     |     `--'       \   \    |-'  |_,     _,-/            J . . . J-'-. `-., 
//     |         __  \`. |   |   |         \    / _           |. . . . \   `-.  F 
//     |   ___  /  \  | `|   '      __  \   |  /-'            F . . . . \     '` 
//     |   \  \ \  /  |        __  /  \  |  |,-'        __,- J . . . . . \ 
//     |    | /  |/     __,-  \  ) \  /  |_,-     __,--'     |. .__.----,' 
//     |    |/    ___     \    |'.  |/      __,--'           `.-;;;;;;;;;\ 
//     |     ___  \  \     |   |  `   __,--'                  /;;;;;;;;;;;;. 
//     |     \  \  |-'\    '    __,--'                       /;;;;;;;;;;;;;;\ 
// \   |      | /  |      __,--'                             `--;;/     \;-'\ 
//  \  |      |/    __,--'                                   /  /         \  \ 
//   \ |      __,--'                                        /  /           \  \ 
//    \|__,--'                                          _,-;M-K,           ,;-;\ 
//                                                     <;;;;;;;;           '-;;;; 
//                                                                                  :D