基于RSI指标信号的量化交易策略


创建日期: 2023-09-14 20:26:49 最后修改: 2023-09-14 20:26:49
复制: 0 点击次数: 578
avatar of ChaoZhang ChaoZhang
1
关注
1359
关注者

本文将详细介绍一种利用RSI指标形成交易信号的量化策略。该策略对RSI指标进行处理,设定多空交易的入场与出场条件。

一、策略原理

该策略的主要交易逻辑如下:

  1. 计算RSI(14)指标,并使用EMA(28)对其进行平滑处理,得到处理后的振荡指标。

  2. 在处理后的RSI指标上计算布林带,得到上下轨。设置超买超卖区间。

  3. 当处理后RSI指标下穿入场线时,产生买入信号;上穿入场线时,产生卖出信号。

  4. 当指标进入超买超卖区间时,产生平仓信号。

通过这种方式,可以利用RSI指标的特性来捕捉反转机会。并且进行指标处理来提高信号质量和参考价值。

二、策略优势

该策略最大的优势是指标处理过程增加了参数空间,可以严格控制交易频率,避免过度交易。

另一个优势是入场条件简单直观,通过指标的明确数值来判断交易时机。

最后,超买超卖范围的设置也有助于及时止盈止损,控制单笔交易风险。

三、潜在风险

但该策略也存在以下风险:

首先,RSI指标集中于反转交易,容易在趋势中产生错误信号。

其次,参数设置不当也会导致过优化,无法适应市场结构变化。

最后,胜率较低需要承受一定亏损压力。

四、内容总结

本文主要介绍了一种利用RSI指标的量化交易策略。它通过参数调节控制交易频率,以及明确的入场出场规则进行操作。在优化参数的同时,也需要防控反转交易的风险。总体来说,它提供了一种简单直观的RSI策略模型。

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

//@version=5
//-----------------------------------------------------------------
//This simple strategy base on RSI, EMA, Bollinger Bands to get Buy and Sell Signal with detail as below:
//-----------------------------------------------------------------
//1.Define Oscillator Line
//+ Oscillator Line is smoothed by ema(28) of RSI(14) on H1 Timeframe
//2.Define Overbought and Oversold
//+ Apply Bollinger Bands BB(80,3) on Oscillator Line and calculate %b
//+ Overbought Zone marked above level 0.8
//+ Oversold Zone marked below level 0.2
//3.Buy Signal
//+ Entry Long Positon when %b crossover Point of Entry Long
//+ Deafault Point of Entry Long is 0.2
//+ Buy signal marked by Green dot
//4.Sell Signal
//+ Entry Short Position when %b crossunder Point of Entry Short
//+ Deafault Point of Entry Short is 0.8
//+ Sell signal marked by Red dot
//5.Exit Signal
//+ Exit Position (both Long and Short) when %b go into Overbought Zone or Oversold Zone
//+ Exit signal marked by Yellow dot
//-----------------------------------------------------------------
strategy(title="RSI %b Signal [H1 Backtesting]", overlay=false)

//RSI
rsi_gr="=== RSI ==="
rsi_len = input(14, title = "RSI",inline="set",group=rsi_gr)
smoothed_len = input(28, title = "EMA",inline="set",group=rsi_gr)
rsi=ta.ema(ta.rsi(close,rsi_len),smoothed_len)
//rsi's BOLLINGER BANDS
pb_gr="=== %b ==="
length = input(80, title = "Length",inline="set1",group=pb_gr)
rsimult = input(3.0, title = "Multiplier",inline="set1",group=pb_gr)
ovb = input(0.8, title = "Overbought",inline="set2",group=pb_gr)
ovs = input(0.2, title = "Oversold",inline="set2",group=pb_gr)
et_short = input(0.8, title = "Entry Short",inline="set3",group=pb_gr)
et_long = input(0.2, title = "Entry Long",inline="set3",group=pb_gr)
[rsibasis, rsiupper, rsilower] = ta.bb(rsi, length, rsimult)
//rsi's %B
rsipB = ((rsi - rsilower) / (rsiupper - rsilower))
plot(rsipB, title="rsi's %B", color=rsipB>math.min(ovb,et_short)?color.red:rsipB<math.max(ovs,et_long)?color.green:color.aqua, linewidth=1)

h1=hline(1,color=color.new(color.red,100))
h4=hline(ovb,color=color.new(color.red,100))
h0=hline(0,color=color.new(color.green,100))
h3=hline(ovs,color=color.new(color.green,100))
h5=hline(0.5,color=color.new(color.silver,0),linestyle=hline.style_dotted)

fill(h1,h4, title="Resistance", color=color.new(color.red,90))
fill(h0,h3, title="Support", color=color.new(color.green,90))

//Signal
rsi_buy=
           rsipB[1]<et_long
           and
           rsipB>et_long
rsi_sell=
           rsipB[1]>et_short
           and
           rsipB<et_short
rsi_exit=
           (rsipB[1]>ovs and rsipB<ovs)
           or
           (rsipB[1]<ovb and rsipB>ovb)
plotshape(rsi_buy?rsipB:na,title="Buy",style=shape.circle,color=color.new(color.green,0),location=location.absolute)
plotshape(rsi_sell?rsipB:na,title="Sell",style=shape.circle,color=color.new(color.red,0),location=location.absolute)
plotshape(rsi_exit?rsipB:na,title="Exit",style=shape.circle,color=color.new(color.yellow,0),location=location.absolute)
//Alert
strategy.entry("Long",strategy.long,when=rsi_buy)
strategy.close("Long",when=rsi_exit)
strategy.entry("Short",strategy.short,when=rsi_sell)
strategy.close("Short",when=rsi_exit)
//EOF