<返回更多

量化交易策略:Python 中的 SuperTrend RSI 确认策略

2023-02-05  今日头条  启辰8
加入收藏


 

RSI 和 SuperTrend 指标是我们拥有的最强大的技术工具之一,因此将它们结合起来可以获利丰厚。 本文讨论了一种依赖于这两个指标的常见策略。

RSI

RSI 无疑是最著名的动量指标,这是意料之中的,因为它具有许多优势,尤其是在区间市场中。 它也被限制在 0 到 100 之间,这使得它更容易解释。 此外,它的知名度有助于发挥其潜力。这是因为越多的交易者和投资组合经理关注 RSI,就会有越多的人根据其信号做出反应,这反过来会推高市场价格。 当然,我们无法证明这个想法,但它是直观的,因为技术分析的基础之一是它是自我实现的。

RSI 是使用一种相当简单的方法计算的。 我们首先从一个时期的价格差异开始。 这意味着我们必须从之前的收盘价中减去每个收盘价。 然后,我们将计算正差异的平滑平均值并将其除以负差异的平滑平均值。 最后的计算为我们提供了相对强度,然后将其用于 RSI 公式中以转换为 0 到 100 之间的度量。


 

要计算相对强度指数,我们需要一个 OHLC 数组(不是dataframe)。 这意味着我们将查看一个包含 4 列的数组。 因此,相对强度指数的函数是:

def adder(Data, times): for i in range(1, times + 1): new = np.zeros((len(Data), 1), dtype = float) Data = np.Append(Data, new, axis = 1) return Datadef deleter(Data, index, times): for i in range(1, times + 1): Data = np.delete(Data, index, axis = 1) return Datadef jump(Data, jump): Data = Data[jump:, ] return Datadef ma(Data, lookback, close, where): Data = adder(Data, 1) for i in range(len(Data)): try: Data[i, where] = (Data[i - lookback + 1:i + 1, close].mean()) except IndexError: pass # Cleaning Data = jump(Data, lookback) return Datadef ema(Data, alpha, lookback, what, where): 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, lookback, close, where, width = 1, genre = 'Smoothed'): # Adding a few columns Data = adder(Data, 7) # Calculating Differences for i in range(len(Data)): Data[i, where] = Data[i, close] - Data[i - width, close] # Calculating the Up and Down absolute values for i in range(len(Data)): if Data[i, where] > 0: Data[i, where + 1] = Data[i, where] elif Data[i, where] < 0: Data[i, where + 2] = abs(Data[i, where]) # Calculating the Smoothed Moving Average on Up and Down absolute values if genre == 'Smoothed': lookback = (lookback * 2) - 1 # From exponential to smoothed Data = ema(Data, 2, lookback, where + 1, where + 3) Data = ema(Data, 2, lookback, where + 2, where + 4) if genre == 'Simple': Data = ma(Data, lookback, where + 1, where + 3) Data = ma(Data, lookback, where + 2, where + 4) # Calculating the Relative Strength Data[:, where + 5] = Data[:, where + 3] / Data[:, where + 4] # Calculate the Relative Strength Index Data[:, where + 6] = (100 - (100 / (1 + Data[:, where + 5]))) # Cleaning Data = deleter(Data, where, 6) Data = jump(Data, lookback) return Data


 

查看我的每周市场情绪报告,了解当前的定位,并通过并存的复杂和简单模型来估计几个主要市场的未来方向。 通过此链接了解有关该报告的更多信息,该链接涵盖了 2022 年 7 月 8 日至 2022 年 8 月 14 日之间的分析:

超级趋势指标

在创建 SuperTrend 指标之前,我们应该了解的第一个概念是波动率。 我们有时使用平均真实范围来衡量波动率。 虽然 ATR 被认为是一个滞后指标,但它提供了一些关于当前波动率和上一时期波动率(日、周、月等)的见解。 但在此之前,我们应该了解 True Range 是如何计算的(ATR 只是该计算的平均值)。

真实范围只是三个价格差异中最大的一个:

 

 

一旦我们从上述三个中获得最大值,我们只需取真实范围的 n 个周期的平均值来获得平均真实范围。 一般来说,由于在恐慌和价格贬值期间我们看到波动性上升,因此 ATR 在这些时期很可能会走高,同样在稳定的上升趋势或下降趋势中,ATR 会趋于走低。

人们应该永远记住,这个指标是滞后的,因此必须格外小心地使用。 下面是计算 ATR 的函数代码。 确保您有一个 OHLC 历史数据数组。

def adder(Data, times): for i in range(1, times + 1): new = np.zeros((len(Data), 1), dtype = float) Data = np.append(Data, new, axis = 1) return Datadef deleter(Data, index, times): for i in range(1, times + 1): Data = np.delete(Data, index, axis = 1) return Datadef jump(Data, jump): Data = Data[jump:, ] return Datadef ma(Data, lookback, close, where): Data = adder(Data, 1) for i in range(len(Data)): try: Data[i, where] = (Data[i - lookback + 1:i + 1, close].mean()) except IndexError: pass # Cleaning Data = jump(Data, lookback) return Datadef ema(Data, alpha, lookback, what, where): 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 atr(Data, lookback, high, low, close, where, genre = 'Smoothed'): # Adding the required columns Data = adder(Data, 1) # True Range Calculation for i in range(len(Data)): try: Data[i, where] = max(Data[i, high] - Data[i, low], abs(Data[i, high] - Data[i - 1, close]), abs(Data[i, low] - Data[i - 1, close])) except ValueError: pass Data[0, where] = 0 if genre == 'Smoothed': # Average True Range Calculation Data = ema(Data, 2, lookback, where, where + 1) if genre == 'Simple': # Average True Range Calculation Data = ma(Data, lookback, where, where + 1) # Cleaning Data = deleter(Data, where, 1) Data = jump(Data, lookback) return Data


 

现在我们已经了解了 ATR 是什么以及如何计算它,我们可以进一步使用 SuperTrend 指标。 该指标旨在为趋势追随者提供进入和退出水平。 您可以将其视为移动平均线或 macD。 它的独特性是它的主要优势,虽然它的计算方法比其他两个指标复杂得多,但本质上是直观的,并不难理解。 基本上,我们有两个变量可供选择。

ATR 回顾和乘数的值。 前者只是用于计算 ATR 的周期,而后者通常是一个整数(通常为 2 或 3)。


 

首先要做的是计算价格柱的最高点和最低点的平均值,然后我们将加上或减去所选乘数乘以 ATR 的平均值,如上面的公式所示。 这将为我们提供两个数组,基本上波段和基本下波段,它们构成了 SuperTrend 指标的第一个构建块。 下一步是使用以下公式计算最终的上频带和最终的下频带。


 


 

它可能看起来很复杂,但其中大部分条件都是重复的,无论如何,我将在下面提供 Python/ target=_blank class=infotextkey>Python 代码,以便您可以使用该函数并根据您的交易偏好对其进行优化。 最后,使用前面的两个计算,我们可以找到 SuperTrend。


 

def supertrend(Data, multiplier, atr_col, close, high, low, where): Data = adder(Data, 6) for i in range(len(Data)): # Average Price Data[i, where] = (Data[i, high] + Data[i, low]) / 2 # Basic Upper Band Data[i, where + 1] = Data[i, where] + (multiplier * Data[i, atr_col]) # Lower Upper Band Data[i, where + 2] = Data[i, where] - (multiplier * Data[i, atr_col]) # Final Upper Band for i in range(len(Data)): if i == 0: Data[i, where + 3] = 0 else: if (Data[i, where + 1] < Data[i - 1, where + 3]) or (Data[i - 1, close] > Data[i - 1, where + 3]): Data[i, where + 3] = Data[i, where + 1] else: Data[i, where + 3] = Data[i - 1, where + 3] # Final Lower Band for i in range(len(Data)): if i == 0: Data[i, where + 4] = 0 else: if (Data[i, where + 2] > Data[i - 1, where + 4]) or (Data[i - 1, close] < Data[i - 1, where + 4]): Data[i, where + 4] = Data[i, where + 2] else: Data[i, where + 4] = Data[i - 1, where + 4] # SuperTrend for i in range(len(Data)): if i == 0: Data[i, where + 5] = 0 elif (Data[i - 1, where + 5] == Data[i - 1, where + 3]) and (Data[i, close] <= Data[i, where + 3]): Data[i, where + 5] = Data[i, where + 3] elif (Data[i - 1, where + 5] == Data[i - 1, where + 3]) and (Data[i, close] > Data[i, where + 3]): Data[i, where + 5] = Data[i, where + 4] elif (Data[i - 1, where + 5] == Data[i - 1, where + 4]) and (Data[i, close] >= Data[i, where + 4]): Data[i, where + 5] = Data[i, where + 4] elif (Data[i - 1, where + 5] == Data[i - 1, where + 4]) and (Data[i, close] < Data[i, where + 4]): Data[i, where + 5] = Data[i, where + 3] # Cleaning columns Data = deleter(Data, where, 5) return Data


 

上图显示了具有 10 个周期的超级趋势(由 ATR 周期表示)和 1.25 乘数的 EURUSD 的每小时值。

我们应该理解该指标的方式是,当它高于市场价格时,我们应该寻求做空,当它低于市场价格时,我们应该寻求做多,因为我们预期牛市趋势。 请记住,SuperTrend 是趋势跟踪指标。 这里的目的是在开始时捕捉趋势,并在趋势结束时关闭。


 

制定和评估战略

现在,我们的工作是拥有一个包含 OHLC 数据的数组,以及 RSI 和 SuperTrend 的列。 我们可以通过遵循此代码来做到这一点,我们已经导入了必要的历史数据。

# 指标参数 lookback_rsi = 13 lookback_supertrend = 10 multiplier = 3# Adding a few columns my_data = adder(my_data, 10)# Calling the RSI function my_data = rsi(my_data, lookback_rsi, 3, 4)# Calling the ATR function to be used in the SuperTrend my_data = atr(my_data, lookback_supertrend, 1, 2, 3, 5, genre = 'Smoothed')# Calling the SuperTrend Indicator my_data = supertrend(my_data, multiplier, 5, 3, 1, 2, 6)


 

该策略基于 SuperTrend 的翻转,条件是 RSI 高于其 50% 的中性水平。 这强化了看涨偏见,反之亦然。

 

 


 

def signal(Data, close, rsi_column, supertrend_column, buy, sell): Data = adder(Data, 10) for i in range(len(Data)): if Data[i, rsi_column] > 50 and Data[i, close] > Data[i, supertrend_column] and Data[i - 1, close] < Data[i - 1, supertrend_column]: Data[i, buy] = 1 elif Data[i, rsi_column] < 50 and Data[i, close] < Data[i, supertrend_column] and Data[i - 1, close] > Data[i - 1, supertrend_column]: Data[i, sell] = -1 return Data

默认形式的策略不太可能提供有价值的信号,必须进行调整以捕获更好的信号。 也许进一步的研究可能会显示出更好的信号?


 

如果您想了解如何自己创建各种算法,请关注我。

总结

总而言之,我想做的是简单地为客观技术分析的世界做出贡献,它正在促进更透明的技术和策略,这些技术和策略在实施之前需要进行回溯测试。 这样,技术分析就会摆脱主观和没有科学根据的坏名声。

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>