启明双偏移均值回归交易策略(HYE Mean Reversion SMA Strategy)是一个利用简单移动平均线和相对强弱指标的均值回归交易策略。该策略运用价格偏离移动平均线一定幅度时,结合RSI指标过滤信号,产生买入和卖出信号,属于短线交易策略。
该策略主要基于以下规则:
当2期简单移动均线相对5期简单移动均线下降3%时,视为股票价格偏离均值,产生买入信号;
当2期简单移动均线上穿5期简单移动均线时,视为价格回归均值,产生卖出信号;
结合5期RSI指标的指数移动平均线,只有当RSI低于30时才产生买入信号,当RSI高于70时才产生卖出信号,从而避免不必要的交易。
该策略主要思路是利用价格短期内的波动去捕捉均值回归机会。当价格下跌一定幅度时买入,等价格重新回到均线附近时卖出,实现盈利。同时,RSI指标可用来识别超买超卖情况,过滤掉一些噪音交易信号。
该策略具有以下几点优势:
操作简单,容易实施,监控成本低;
利用价格偏离移动平均线的特征,捕捉短线均值回归机会,历史回测效果良好;
RSI指标可有效过滤噪音交易,避免追高杀跌;
可灵活调整参数,适应不同市场环境;
可仅做多,仅做空或双向交易,可满足不同偏好。
该策略也存在一些风险:
回归交易依赖于价格能够回归至均线,如果发生价格剧烈变动,止损风险较大;
参数设置不当可能导致过于频繁交易或漏失机会;
策略表现与市场相关性较大,在横盘及震荡市中表现较差。
对策:
合理设置止损,控制单笔损失;
参数逐步优化,评估收益回撤比;
结合股指增强策略的适应性。
该策略可从以下几个方面进行优化:
测试不同的移动平均线组合,寻找最优参数;
尝试结合其他指标识别趋势,提高策略胜率;
增加止损机制,降低策略最大回撤;
优化买卖规则,提高盈利因子;
结合机器学习技术建立自适应的参数。
启明双偏移均值回归交易策略是一个简单实用的短线均值回归策略。它利用价格相对移动平均线的偏差产生交易信号,同时用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")