其他分享
首页 > 其他分享> > 量化策略:如何用RSI²领先指标侦测趋势反转

量化策略:如何用RSI²领先指标侦测趋势反转

作者:互联网

相对强弱指数(RSI)是技术分析领域最流行的指标之一。在本文中,我们将优化RSI指标,创建一个帮助判断趋势反转的领先信号。接下来,我们基于此创新(称为RSI²)创建交易策略并进行回溯检验。

相对强弱指数

RSI是最著名的动能指标之一,它有很多优势,可以应用到不同的资产。RSI的取值范围限制在0到100,这使它更易于解释。

当更多的交易员和基金经理关注RSI,就会有更多的人根据RSI的信号做出反应,从而反过来影响市场价格。当然,我们无法证明这个想法,这仅仅是一种直觉性解释,技术分析的基础之一就是它是自我实现的。

威尔斯怀尔德于1978年提出了该指标,回溯期使用14,取值范围是0-100,通常将30和70视为超卖区间和超买区间。RSI一般有4种解读方式:

RSI的计算方法非常简单。首先计算收盘价的一阶差分,然后用正差的移动平滑除以负差的移动平滑,最后计算相对强度并转换为0到100的取值。

在这里插入图片描述
在这里插入图片描述

上图显示了EURUSD的RSI(14)。

以下代码显示了如何计算指数移动平均和RSI:

def ema(Data, alpha, lookback, what, where):  
      
    # alpha is the smoothing factor  
    # window is the lookback period  
    # what is the column that needs to have its average calculated  
    # where is where to put the exponential moving average  
      
    alpha = alpha / (lookback + 1.0)  
    beta  = 1 - alpha  
      
    # First value is a simple SMA  
    Data = ma(Data, lookback, what, where)  
      
    # Calculating first EMA  
    Data[lookback + 1, where] = (Data[lookback + 1, what] * alpha) + (Data[lookback, where] * beta)# Calculating the rest of EMA  
    for i in range(lookback + 2, len(Data)):  
            try:  
                Data[i, where] = (Data[i, what] * alpha) + (Data[i - 1, where] * beta)  
          
            except IndexError:  
                pass  
    return Datadef rsi(Data, rsi_lookback, what1, what2):  
      
    rsi_lookback = (rsi_lookback * 2) - 1 # From exponential to smoothed  
            
    # Get the difference in price from previous step  
    delta = []  
     
    for i in range(len(Data)):  
        try:  
            diff = Data[i, what1] - Data[i - 1, what1]   
            delta = np.append(delta, diff)                    
        except IndexError:  
            pass  
          
    delta = np.insert(delta, 0, 0, axis = 0)                 
    delta = delta[1:]   
      
    # Make the positive gains (up) and negative gains (down) Series  
    up, down = delta.copy(), delta.copy()  
    up[up < 0] = 0  
    down[down > 0] = 0  
      
    up = np.array(up)  
    down = np.array(down)  
      
    roll_up = up  
    roll_down = down  
      
    roll_up = np.reshape(roll_up, (-1, 1))  
    roll_down = np.reshape(roll_down, (-1, 1))  
      
    roll_up = adder(roll_up, 3)  
    roll_down = adder(roll_down, 3)  
      
    roll_up = ema(roll_up, 2, rsi_lookback, what2, 1)  
    roll_down = ema(abs(roll_down), 2, rsi_lookback, what2, 1)  
      
    # Calculate the SMA  
    roll_up = roll_up[rsi_lookback:, 1:2]  
    roll_down = roll_down[rsi_lookback:, 1:2]  
    Data = Data[rsi_lookback + 1:,]  
      
    # Calculate the RSI based on SMA  
    RS = roll_up / roll_down  
    RSI = (100.0 - (100.0 / (1.0 + RS)))  
    RSI = np.array(RSI)  
    RSI = np.reshape(RSI, (-1, 1))  
    RSI = RSI[1:,]  
      
    Data = np.concatenate((Data, RSI), axis = 1)
    
    return Data

RSI平方指标(RSI²)

RSI与价格之间有很强的相关性,如下表所示,该表显示了三种主要货币对的RSI(14)与收盘价的相关系数。

在这里插入图片描述

如果我们可以预测RSI,就可以预测下一根K线的波动。但是,这并不是那么简单,我们无法准确预测未来的RSI,因为它是是根据价格进行计算的。

要计算RSI²,我们将RSI函数再次应用到原始的RSI上,如以下代码所示:

rsi_lookback = 10  
Data = rsi(Data, rsi_lookback, where_your_closing_price_is, 0)  
Data = rsi(Data, rsi_lookback, where_your_rsi_is, 0)

在这里插入图片描述

上图显示了USDCHF的RSI(红色线)和RSI²(绿色线)。

为什么要计算价格与RSI的相关性?因为当RSI²达到超买/超卖水平时,它通常会反转方向并跟随原始RSI。考虑到原始RSI与价格之间高度相关,我们可以假设,当原始RSI不在极端水平时,RSI²可以为我们提供帮助。如上图所示,当RSI²处于超买超卖区间,可以预测原始RSI的未来波动。

fig, ax = plt.subplots(2, figsize = (10, 5))

ax[0].grid()  
ax[0].plot(Data[-500:, close], color = 'black', label = 'USDCHF')  
ax[0].set_facecolor((0.92, 0.92, 0.92))  
ax[0].legend()

ax[1].plot(Data[-500:, rsi], color = 'darkred', label = 'RSI')  
ax[1].plot(Data[-500:, rsi_sq], color = 'olivedrab', label = 'RSI²')  
ax[1].grid()  
ax[1].axhline(y = upper_barrier, color = 'black', linewidth = 1)  
ax[1].axhline(y = lower_barrier, color = 'black', linewidth = 1)  
ax[1].set_facecolor((0.92, 0.92, 0.92))   
ax[1].legend()

# Note that the close variable refers to the column where you keep the closing price, while the rsi and the rsi_sq variables refer to the original RSI and the RSI-square columns respectively

如何使用RSI²

RSI²有两种使用方式,与常规RSI相似。第一种方法是超买/超卖技术,当RSI²达到极端水平时,应该建立反向交易;第二种方法是寻找背离。让我们看下面的图,以了解如何检测RSI²背离。

在这里插入图片描述

上图显示EURUSD的RSI(10)和RSI²。

第二种技术是超买超卖技术,在这种情况下,我们几乎使用了两个RSI指标,因此可以获得双重确认。

在这里插入图片描述

回溯检验

我们根据RSI²创建简单的交易策略:

def signal(Data, rsi_original, rsi_square, buy, sell):  
    for i in range(len(Data)):  
              
        if Data[i, rsi_original] < lower_barrier and Data[i - 1, rsi_original] > lower_barrier and Data[i, rsi_square] < lower_barrier and Data[i - 1, rsi_square] > lower_barrier:  
            Data[i, buy] = 1  
              
        if Data[i, rsi_original] > upper_barrier and Data[i - 1, rsi_original] < upper_barrier and Data[i, rsi_square] > upper_barrier and Data[i - 1, rsi_square] < upper_barrier:  
            Data[i, sell] = -1

回测检验使用2010年1月至2020年12月的小时图K线,ATR风险管理系统,理论风险回报率为0.50。这种风险管理技术并非最优的,但正如我在其它文章中经常提到,我想给策略留出足够的喘息时间来测试指标的潜力。这就是为什么有时候胜率很高但策略无法盈利的原因。

将RSI的回溯期设置为3,这样可以提供更多的信号和更好的结果。

多货币对测试结果:

在这里插入图片描述

多货币对净值曲线:

在这里插入图片描述

RSI²策略在EURUSD生成的交易信号:

在这里插入图片描述

结论

为什么写这篇文章?必须指出,上述方法并不能保证获利,如果您关注我的文章,您会注意到我将重点放在探索如何盈利上,而不是告诉你这个策略能盈利。在实际交易中,您应该在策略中引入自己的见解和研究,才能实现长期盈利的目标。

来源:Medium
作者:Sofien Kaabar
翻译校对:数据黑客
原文标题:The RSI² Leading Indicator. Detecting Trend Exhaustion Early in Trading


数据黑客官网

数据黑客:专注金融大数据,聚合全网最好的资讯和教程,提供开源数据接口。

我们聚合全网最优秀的资讯和教程:

  1. 金融大数据
  2. 机器学习/深度学习
  3. 量化交易
  4. 数据工程
  5. 编程语言,Python,R,Julia,Scala,SQL

我们提供开源数据接口:

  1. 下载国内和国外海量金融数据
  2. API接口,将数据整合到您的平台

标签:RSI,反转,lookback,down,侦测,Data,roll,rsi
来源: https://blog.csdn.net/weixin_42731853/article/details/112002847