ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-12-31 09:59:13  阅读:317  来源: 互联网

标签:RSI 反转 lookback down 侦测 Data roll rsi


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

相对强弱指数

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

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

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

  • 价格进入超卖/超买区域,意味着会发生短期修正。
  • 指标与价格发生背离意味着趋势会反转。
  • 在指标上绘制趋势线以找到反应水平。
  • 穿越中位线50意味着当前趋势可能改变。

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²背离。

  • 当原始RSI跟随价格并形成较低的低点而RSI²处于较高的低点时,就会形成看涨背离,价格倾向于上涨。
  • 当原始RSI跟随价格并创出更高的高点而RSI²创出更低的高点时,就会形成看跌背离,价格倾向于下跌。

在这里插入图片描述

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

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

  • 当原始RSI和RSI²同时处于超卖水平,预期短期价格会反弹修正。
  • 当原始RSI和RSI²同时处于超买水平,预期短期价格会回落修正。

在这里插入图片描述

回溯检验

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

  • 当原始RSI和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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有