量化交易入门(二十六)RSI指标实现,能盈利吗?

RSI的理论学完了,我们接着用苹果股票的历史数据来回测一下,看看这个指标靠不靠谱。

示例代码
  • import backtrader as bt
    import yfinance as yf# 定义RSI策略
    class RSIStrategy(bt.Strategy):params = (('rsi_period', 14),('rsi_upper', 70),('rsi_lower', 30),)def __init__(self):self.rsi = bt.indicators.RSI(self.data.close, period=self.params.rsi_period)def next(self):if not self.position:if self.rsi < self.params.rsi_lower:commission_info = self.broker.getcommissioninfo(self.data)cash = self.broker.get_cash() - commission_info.getsize(1, self.data.close[0])size = cash // self.data.close[0]self.buy(size=size)print(f'BUY: {size} shares')else:if self.rsi > self.params.rsi_upper:size = self.position.sizeself.close(size=size)print(f'SELL: {size} shares')def notify_order(self, order):if order.status in [order.Submitted, order.Accepted]:returnif order.status in [order.Completed]:if order.isbuy():print(f'BUY executed at {self.data.num2date(order.executed.dt).date()}, Price: {order.executed.price:.2f}, Cost: {order.executed.value:.2f}, Comm: {order.executed.comm:.2f}')elif order.issell():cost = order.executed.valueprofit = order.executed.value - order.created.size * order.created.priceprofit_percent = (profit / cost) * 100print(f'SELL executed at {self.data.num2date(order.executed.dt).date()}, Price: {order.executed.price:.2f}, Cost: {cost:.2f}, Profit: {profit:.2f}, Profit %: {profit_percent:.2f}%')elif order.status in [order.Canceled, order.Margin, order.Rejected]:print('Order Canceled/Margin/Rejected')    # 创建Cerebro引擎
    cerebro = bt.Cerebro()# 设置初始资金
    cerebro.broker.setcash(100000.0)# 下载苹果股票数据
    data = yf.download('AAPL', '2020-01-01', '2023-12-30')
    data = data.dropna()# 将数据添加到Cerebro引擎中
    data = bt.feeds.PandasData(dataname=data)
    cerebro.adddata(data)# 添加MACD策略
    cerebro.addstrategy(RSIStrategy)# 设置佣金为0.1%
    cerebro.broker.setcommission(commission=0.001)# 添加分析指标
    cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
    cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')# 运行回测
    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
    results = cerebro.run()
    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())# 获取回测结果
    strat = results[0]
    returns = strat.analyzers.returns.get_analysis()
    sharpe = strat.analyzers.sharpe.get_analysis()
    drawdown = strat.analyzers.drawdown.get_analysis()# 打印回测指标
    print('Annualized Return: %.2f%%' % (returns['rnorm100']))
    print('Sharpe Ratio: %.2f' % (sharpe['sharperatio']))
    print('Max Drawdown: %.2f%%' % (drawdown['max']['drawdown']))
    print('Max Drawdown Period: %s' % (drawdown['max']['len']))# 绘制回测结果
    cerebro.plot()
代码的详细分析
  1. 导入必要的库:backtrader和yfinance。

  2. 定义RSIStrategy类,继承自bt.Strategy:

  • 定义RSI指标的参数:计算周期(rsi_period)、超买阈值(rsi_upper)和超卖阈值(rsi_lower)。
  • 在__init__方法中,创建RSI指标实例。
  • 在next方法中,根据RSI指标的值生成买卖信号:
    • 如果当前没有持仓,且RSI低于超卖阈值,则计算可用资金并买入相应数量的股票。
    • 如果当前有持仓,且RSI高于超买阈值,则卖出所有持仓。
  • 在notify_order方法中,处理订单执行情况:
    • 如果订单状态为Submitted或Accepted,不做任何操作。
    • 如果订单状态为Completed,打印买入或卖出的详细信息,包括执行日期、价格、成本、佣金等。
    • 如果订单状态为Canceled、Margin或Rejected,打印相应的信息。

     3. 创建Cerebro引擎实例。

     4. 设置初始资金为100000美元。

     5.  从Yahoo Finance下载苹果股票的历史数据,时间范围为2020年1月1日至2023年12月30日,并将数据添加到Cerebro引擎中。

    6. 将RSIStrategy添加到Cerebro引擎中。

    7. 设置交易佣金为0.1%。

    8.  添加分析指标:Returns(回报率)、SharpeRatio(夏普比率)和DrawDown(回撤)。

    9.  运行回测,并打印回测前后的资金情况。

   10. 获取回测结果,并打印年化收益率、夏普比率、最大回撤和最大回撤期。

   11. 绘制回测结果图表。

该代码的主要功能
  1. 使用RSI指标生成买卖信号,当RSI低于超卖阈值时买入,高于超买阈值时卖出。

  2. 在买入时,根据可用资金计算买入数量,以最大化利用资金。

  3. 在订单执行时,打印详细的交易信息,包括买入/卖出日期、价格、成本、佣金等。

  4. 使用Backtrader的内置分析器计算并打印回测指标,如年化收益率、夏普比率和最大回撤等。

  5. 绘制回测结果图表,直观展示策略的表现。

运行的结果怎么样呢?

    

执行结果:
Starting Portfolio Value: 10000.00 
Final Portfolio Value: 114408.26
Annualized Return: 3.43%
Sharpe Ratio: 0.28
Max Drawdown: 19.71%
Max Drawdown Period: 208

根据回测结果,我们可以对该RSI策略的表现进行以下分析:

  1. 最终投资组合价值为114408.26美元,高于初始投资的100000美元,表明该策略取得了正收益。

  2. 年化收益率为3.43%,这个收益率相对较低,可能是因为苹果股价在回测期内上涨幅度有限所致。

  3. 夏普比率为0.28,较低,表明该策略的收益率相对于承受的风险来说不太理想。一般认为,夏普比率大于1才算是好的投资策略。

  4. 最大回撤为19.71%,持续时间达208个交易日,这说明在某些阶段该策略遭受了较大的资金损失,抗风险能力不太理想。

总的来说,这个基于RSI的简单交易策略,虽然最终取得了正收益,但收益率水平一般,风险较高。其主要问题在于:

  1. 单纯依赖RSI指标进行交易决策,缺乏其他辅助指标判断,难以完全捕捉市场时机。

  2. 缺乏风险控制和止损机制,在遇到剧烈行情时容易遭受重大损失。

  3. 没有针对不同市场状况进行策略调整和优化。

因此,为了提高该策略的效果,我们可以考虑:

  1. 增加其他技术指标和基本面分析,综合多种因素做出交易决策。

  2. 设置合理的止损和止盈位,控制单笔交易风险。

  3. 根据市场波动率、趋势等情况动态调整策略参数。

  4. 尝试对不同的时间周期、股票品种进行优化和测试。

  5. 研究先进的机器学习算法,探索更高级的量化策略。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/576138.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.28作业

#include <iostream> using namespace std; // 构造函数示例 class MyClass { private: int data; public: // 默认构造函数 MyClass() { data 0; } // 带参数的构造函数 MyClass(int value) { data value; } …

Prometheus +Grafana +node_exporter可视化监控Linux虚机

1、介绍 待补充 2、架构图 待补充 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 node_exporter &#xff1a;主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求&#xff1a;1台主服务器 n台从服务器 &#xff08;被监控的linux虚机&am…

B2902A是德科技B2902A精密型电源

181/2461/8938产品概述&#xff1a; Agilent B2902A 精密源/测量单元 (SMU) 是一款 2 通道、紧凑且经济高效的台式 SMU&#xff0c;能够源和测量电压和电流。它用途广泛&#xff0c;可以轻松、高精度地执行 I/V&#xff08;电流与电压&#xff09;测量。4 象限源和测量功能的集…

openstack 不能调度到某主机上分析

dashboard显示有足够资源创建虚拟机 创建一个1c2g20g配置的虚拟机&#xff0c;在过滤时把10-197-0-2这个主机过滤掉了&#xff0c;日志如下&#xff1a; 2024-03-25 17:52:14.087 26 DEBUG nova.scheduler.filters.disk_filter [req-8f2f32fb-1efe-4e5d-81fc-618210c7c76d 773…

第4章.精通标准提示,引领ChatGPT精准输出

标准提示 标准提示&#xff0c;是引导ChatGPT输出的一个简单方法&#xff0c;它提供了一个具体的任务让模型完成。 如果你要生成一篇新闻摘要。你只要发送指示词&#xff1a;汇总这篇新闻 : …… 提示公式&#xff1a;生成[任务] 生成新闻文章的摘要&#xff1a; 任务&#x…

RPA使用Native Messaging协议实现浏览器自动化

RPA 即机器人流程自动化&#xff0c;是一种利用软件机器人或人工智能来自动化业务流程中规则性、重复性任务的技术。RPA 技术可以模拟和执行人类在计算机上的交互操作&#xff0c;从而实现自动化处理数据、处理交易、触发通知等任务。帮助企业或个人实现业务流程的自动化和优化…

mysql--事务四大特性与隔离级别

事务四大特性与隔离级别 mysql事务的概念事务的属性事务控制语句转账示例 并发事务引发的问题脏读脏读场景 不可重复读幻读幻读场景 事务的隔离级别读未提交读已提交可重复读&#xff08;MySQL默认&#xff09; 总结 mysql事务的概念 事务就是一组操作的集合&#xff0c;他是一…

深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680; 转载自&#xff1a;设计模式深度解析&#xff1a;深入浅出的揭秘游标尺模式与迭代…

智能车主控板原理图原理讲解

智能车主控板原理图原理讲解 综述&#xff1a;本篇文章对智能车主控板的一部分电路进行原理分析&#xff0c;文末附加整体原理图。 1. 电源电路 &#xff08;1&#xff09;通过外接电池供电并通过电源模块电路&#xff0c;运用稳压芯片lm2940&#xff0c;将电源电压转化为5V…

2024年天府杯A题论文免费分享,全网首发

天府杯免费分享资料&#xff08;A题论文代码&#xff09;链接&#xff1a;https://pan.baidu.com/s/17QtYt036ORk1xGIDi0JSew 提取码&#xff1a;sxjm 摘要 在近年来&#xff0c;随着科技的快速发展和社会经济的不断进步&#xff0c;科学研究的作用和地位日益凸显。本文基于…

MYSQL数字函数:不可不知的数据处理利器

&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 &#x1f680;转载自&#xff1a;MYSQL数字函数&#xff1a;不可不知的数据处理利器 ✨ MYSQL数字…

李宏毅【生成式AI导论 2024】第5讲 让语言模型彼此合作,把一个人活成一个团队

GPD4,它也有非常强大的能力。但是GPT4如果跟其他的语言模型合作,他们其实可以发挥1加1大于二的力量。 为什么要让模型合作? 那怎么让模型彼此合作呢?有很多不同的方式。一个可能性是假设你现在手边就有一堆语言模型,他们可能有不同的能力使用,他们可能有不同的成本局来…