启明双偏移均值回归交易策略


创建日期: 2023-12-15 16:51:23 最后修改: 2023-12-15 16:51:23
复制: 0 点击次数: 407
1
关注
1224
关注者

启明双偏移均值回归交易策略

概述

启明双偏移均值回归交易策略(HYE Mean Reversion SMA Strategy)是一个利用简单移动平均线和相对强弱指标的均值回归交易策略。该策略运用价格偏离移动平均线一定幅度时,结合RSI指标过滤信号,产生买入和卖出信号,属于短线交易策略。

策略原理

该策略主要基于以下规则:

  1. 当2期简单移动均线相对5期简单移动均线下降3%时,视为股票价格偏离均值,产生买入信号;

  2. 当2期简单移动均线上穿5期简单移动均线时,视为价格回归均值,产生卖出信号;

  3. 结合5期RSI指标的指数移动平均线,只有当RSI低于30时才产生买入信号,当RSI高于70时才产生卖出信号,从而避免不必要的交易。

该策略主要思路是利用价格短期内的波动去捕捉均值回归机会。当价格下跌一定幅度时买入,等价格重新回到均线附近时卖出,实现盈利。同时,RSI指标可用来识别超买超卖情况,过滤掉一些噪音交易信号。

策略优势分析

该策略具有以下几点优势:

  1. 操作简单,容易实施,监控成本低;

  2. 利用价格偏离移动平均线的特征,捕捉短线均值回归机会,历史回测效果良好;

  3. RSI指标可有效过滤噪音交易,避免追高杀跌;

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

  5. 可仅做多,仅做空或双向交易,可满足不同偏好。

风险分析

该策略也存在一些风险:

  1. 回归交易依赖于价格能够回归至均线,如果发生价格剧烈变动,止损风险较大;

  2. 参数设置不当可能导致过于频繁交易或漏失机会;

  3. 策略表现与市场相关性较大,在横盘及震荡市中表现较差。

对策:

  1. 合理设置止损,控制单笔损失;

  2. 参数逐步优化,评估收益回撤比;

  3. 结合股指增强策略的适应性。

优化方向

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

  1. 测试不同的移动平均线组合,寻找最优参数;

  2. 尝试结合其他指标识别趋势,提高策略胜率;

  3. 增加止损机制,降低策略最大回撤;

  4. 优化买卖规则,提高盈利因子;

  5. 结合机器学习技术建立自适应的参数。

总结

启明双偏移均值回归交易策略是一个简单实用的短线均值回归策略。它利用价格相对移动平均线的偏差产生交易信号,同时用RSI指标过滤掉噪音,在回测中表现优异。该策略操作简单,容易实施,可根据市场环境调整参数,适合短线追踪均值回归的投资者。但也应注意回归不确定性及止损风险,需合理优化以适应不同市况。总体来说,该策略为量化交易提供了一个值得参考的均值回归策略模板。

策略源码
/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4

strategy("HYE Mean Reversion SMA [Strategy]", overlay = true )
  
//Strategy inputs
source = input(title = "Source", defval = close)
tradeDirection = input(title="Trade Direction", type=input.string,
     options=["Long Only", "Short Only", "Both"], defval="Long Only") 
smallMAPeriod = input(title = "Small Moving Average", defval = 2)
bigMAPeriod = input(title = "Big Moving Average", defval = 5)
percentBelowToBuy = input(title = "Percent below to buy %", defval = 3)
percentAboveToSell = input(title = "Percent above to sell %", defval = 3)
rsiPeriod = input(title = "Rsi Period", defval = 2)
rsiLevelforBuy = input(title = "Maximum Rsi Level for Buy", defval = 30)
rsiLevelforSell = input(title = "Minimum Rsi Level for Sell", defval = 70)
     
longOK  = (tradeDirection == "Long Only") or (tradeDirection == "Both")
shortOK = (tradeDirection == "Short Only") or (tradeDirection == "Both")

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2020, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
inDateRange = true

//Strategy calculation 
rsiValue = rsi(source, rsiPeriod)
rsiEMA   = ema(rsiValue, 5)
smallMA = sma(source, smallMAPeriod)
bigMA =  sma(source, bigMAPeriod) 
buyMA = ((100 - percentBelowToBuy) / 100) * sma(source, bigMAPeriod)[0]
sellMA = ((100 + percentAboveToSell) / 100) * sma(source, bigMAPeriod)[0]

if(crossunder(smallMA, buyMA) and rsiEMA < rsiLevelforBuy and inDateRange and longOK)
    strategy.entry("BUY", strategy.long) 

if(crossover(smallMA, bigMA) or not inDateRange)
    strategy.close("BUY")

if(crossover(smallMA, sellMA) and rsiEMA > rsiLevelforSell and inDateRange and shortOK)
    strategy.entry("SELL", strategy.short)

if(crossunder(smallMA, bigMA) or not inDateRange)
    strategy.close("SELL")

更多内容