量化交易入门(四十一)ASI指标Python实现和回测

2024-04-04 13:28

本文主要是介绍量化交易入门(四十一)ASI指标Python实现和回测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

老规矩先上图,看看ASI指标使用苹果数据回测后的结果如何。

一、策略运行结果

执行的结果:
Starting Portfolio Value: 100000.00 
Final Portfolio Value: 92514.82
Annualized Return: -1.93%
Sharpe Ratio: -0.27
Max Drawdown: 25.34%
Max Drawdown Period: 441

唉,好像亏钱了,测试了这么多个指示,这个指标好像亏得最多。让我们一起分析一下这个结果:

  1. 初始资产组合价值为100,000美元,最终资产组合价值为92,514.82美元。这意味着在回测期间,策略的总体表现为亏损,资产组合价值下降了7,485.18美元。

  2. 年化收益率为-1.93%,表明该策略在回测期间的平均年度收益率为负。这意味着投资者使用该策略平均每年会损失1.93%的资金。

  3. 夏普比率为-0.27。夏普比率衡量投资组合的风险调整后收益,数值越高表示风险调整后的表现越好。负的夏普比率表明该策略的表现差于无风险利率(如国债收益率),投资者承担了额外的风险却获得了更低的回报。

  4. 最大回撤为25.34%,表示从策略的历史最高点到最低点的最大跌幅。这意味着投资者在最糟糕的情况下会损失25.34%的资金。

  5. 最长回撤期为441个交易日。这表示策略从最高点跌至最低点所需的时间。较长的回撤期可能表明策略从损失中恢复的时间较长。

综合来看,该ASI策略在回测期间表现不佳,年化收益率为负,夏普比率为负,最大回撤超过25%,回撤期较长。这表明该策略在回测期间承担了较高的风险,但未能获得相应的回报。

 二、代码实现

基于ASI指标对苹果股票进行回测。以下是完整的代码:

import backtrader as bt
import yfinance as yfclass DMIStrategy(bt.Strategy):params = (('period', 14),('up_trend_threshold', 25),('down_trend_threshold', 25),)def __init__(self):self.dmi = bt.indicators.DMI(period=self.params.period)self.crossover_dmi = bt.indicators.CrossOver(self.dmi.plusDI, self.dmi.minusDI)def next(self):if not self.position:if self.dmi.plusDI[-1] > self.params.up_trend_threshold and self.crossover_dmi > 0:commission_info = self.broker.getcommissioninfo(self.data)cash = self.broker.get_cash()size = int(cash / (self.data.close[0] * (1 + commission_info.p.commission)))self.order = self.buy(size=size)print(f'BUY: {size} shares')else:if self.dmi.minusDI[-1] > self.params.down_trend_threshold and self.crossover_dmi < 0:self.order = self.close()print(f'SELL: {self.position.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(DMIStrategy)# 设置佣金为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. 定义ASI指标:

    • ASI指标用于衡量市场的积累/派发强度,结合了价格和成交量信息。
    • __init__方法中,添加了一个用于计算ASI指标EMA(指数移动平均)的line。
    • next方法中,计算当前的ASI值。如果收盘价和成交量同时上涨或下跌,则ASI值为它们的乘积;否则,ASI值为0。
  3. 定义交易策略:

    • __init__方法中,创建了ASI指标的实例,并初始化了订单变量。
    • next方法中,根据ASI指标的值来决定买入或卖出。如果当前ASI值大于0且前一个ASI值小于等于0,则买入;如果当前ASI值小于0且前一个ASI值大于等于0,则卖出。
    • 在买入时,根据可用资金和佣金计算可以买入的股票数量,并下单买入。
    • 在卖出时,平仓所有持仓。
    • notify_order方法中,处理订单的执行情况。打印买入和卖出的详细信息,包括执行日期、价格、成本、利润等。
  4. 创建Cerebro引擎,设置初始资金为100,000美元。

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

  6. 将ASI交易策略添加到Cerebro引擎中。

  7. 设置佣金为0.1%。

  8. 添加分析指标:年化收益率、夏普比率和最大回撤。

  9. 运行回测,打印回测前后的资产组合价值。

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

  11. 绘制回测结果图表。

这个示例展示了如何使用Backtrader框架和自定义指标(ASI)来构建交易策略并进行回测。通过分析回测结果,可以评估策略的性能,包括收益率、风险调整后收益(夏普比率)和回撤等指标。

需要注意的是,这只是一个简单的示例,实际应用中需要根据具体情况进行策略优化和风险控制。在做出任何实际的投资决策之前,建议进行全面的研究和分析。

经过系列的文章我们学习到了python的入门,量化的基本知识,Backtrader回测框架以及各种技术指标,以及通过这些技术指标进行的回测。我们应该对量化交易入门有了一定的了解。这个系列的博文就到此结束了。我将在5月份开启量化交易实战系列博文,请大家继续关注,一起学习提高。

这篇关于量化交易入门(四十一)ASI指标Python实现和回测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875900

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详