您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > Python

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

时间:2023-02-05 14:29:52  来源:今日头条  作者:启辰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% 的中性水平。 这强化了看涨偏见,反之亦然。

 

  • 每当 SuperTrend 指标低于市场价格而 RSI 高于 50% 时,就会生成买入(做多)信号。
  • 每当 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

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


 

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

总结

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



Tags:Python   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Search: Python  点击:(7)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Search: Python  点击:(5)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Search: Python  点击:(10)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Search: Python  点击:(21)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Search: Python  点击:(35)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  Search: Python  点击:(40)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  Search: Python  点击:(42)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Search: Python  点击:(91)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  Search: Python  点击:(90)  评论:(0)  加入收藏
大语言模型插件功能在携程的Python实践
作者简介成学,携程高级安全研发工程师,关注Python/Golang后端开发、大语言模型等领域。一、背景2023年初,科技圈最火爆的话题莫过于大语言模型了,它是一种全新的聊天机器人模型,...【详细内容】
2024-01-26  Search: Python  点击:(81)  评论:(0)  加入收藏
▌简易百科推荐
一篇文章教会你使用Python中三种简单的函数
所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。一、函数简介所谓函数,就是指:把某些特定功能的代码组成为一个整体,这个整体就叫做函数。二、函数定义...【详细内容】
2024-04-11  Go语言进阶学习  微信公众号  Tags:Python   点击:(7)  评论:(0)  加入收藏
一篇文章带你了解Python的分布式进程接口
在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。一、前言在Thread和Process中,应当优...【详细内容】
2024-04-11  Go语言进阶学习    Tags:Python   点击:(5)  评论:(0)  加入收藏
Python 可视化:Plotly 库使用基础
当使用 Plotly 进行数据可视化时,我们可以通过以下示例展示多种绘图方法,每个示例都会有详细的注释和说明。1.创建折线图import plotly.graph_objects as go# 示例1: 创建简单...【详细内容】
2024-04-01  Python技术    Tags:Python   点击:(10)  评论:(0)  加入收藏
Python 办公神器:教你使用 Python 批量制作 PPT
介绍本文将介绍如何使用openpyxl和pptx库来批量制作PPT奖状。本文假设你已经安装了python和这两个库。本文的场景是:一名基层人员,要给一次比赛活动获奖的500名选手制作奖状,并...【详细内容】
2024-03-26  Python技术  微信公众号  Tags:Python   点击:(21)  评论:(0)  加入收藏
Python实现工厂模式、抽象工厂,单例模式
工厂模式是一种常见的设计模式,它可以帮助我们创建对象的过程更加灵活和可扩展。在Python中,我们可以使用函数和类来实现工厂模式。一、Python中实现工厂模式工厂模式是一种常...【详细内容】
2024-03-07  Python都知道  微信公众号  Tags:Python   点击:(35)  评论:(0)  加入收藏
不可不学的Python技巧:字典推导式使用全攻略
Python的字典推导式是一种优雅而强大的工具,用于创建字典(dict)。这种方法不仅代码更加简洁,而且执行效率高。无论你是Python新手还是有经验的开发者,掌握字典推导式都将是你技能...【详细内容】
2024-02-22  子午Python  微信公众号  Tags:Python技巧   点击:(40)  评论:(0)  加入收藏
如何进行Python代码的代码重构和优化?
Python是一种高级编程语言,它具有简洁、易于理解和易于维护的特点。然而,代码重构和优化对于保持代码质量和性能至关重要。什么是代码重构?代码重构是指在不改变代码外部行为的...【详细内容】
2024-02-22  编程技术汇    Tags:Python代码   点击:(42)  评论:(0)  加入收藏
Python开发者必备的八个PyCharm插件
在编写代码的过程中,括号几乎无处不在,以至于有时我们会拼命辨别哪个闭合括号与哪个开头的括号相匹配。这款插件能帮助解决这个众所周知的问题。前言在PyCharm中浏览插件列表...【详细内容】
2024-01-26  Python学研大本营  微信公众号  Tags:PyCharm插件   点击:(91)  评论:(0)  加入收藏
Python的Graphlib库,再也不用手敲图结构了
Python中的graphlib库是一个功能强大且易于使用的工具。graphlib提供了许多功能,可以帮助您创建、操作和分析图形对象。本文将介绍graphlib库的主要用法,并提供一些示例代码和...【详细内容】
2024-01-26  科学随想录  微信公众号  Tags:Graphlib库   点击:(90)  评论:(0)  加入收藏
Python分布式爬虫打造搜索引擎
简单分布式爬虫结构主从模式是指由一台主机作为控制节点负责所有运行网络爬虫的主机进行管理,爬虫只需要从控制节点那里接收任务,并把新生成任务提交给控制节点就可以了,在这个...【详细内容】
2024-01-25  大雷家吃饭    Tags:Python   点击:(61)  评论:(0)  加入收藏
站内最新
站内热门
站内头条