量化策略:如何用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
数据黑客:专注金融大数据,聚合全网最好的资讯和教程,提供开源数据接口。
我们聚合全网最优秀的资讯和教程:
- 金融大数据
- 机器学习/深度学习
- 量化交易
- 数据工程
- 编程语言,Python,R,Julia,Scala,SQL
我们提供开源数据接口:
- 下载国内和国外海量金融数据
- API接口,将数据整合到您的平台
标签:RSI,反转,lookback,down,侦测,Data,roll,rsi 来源: https://blog.csdn.net/weixin_42731853/article/details/112002847