当前位置: 首页 > news >正文

如何使用Tushare+ Backtrader进行股票量化策略回测

 

数量技术宅团队在CSDN学院推出了量化投资系列课程

欢迎有兴趣系统学习量化投资的同学,点击下方链接报名:

量化投资速成营(入门课程)

Python股票量化投资

Python期货量化投资

Python数字货币量化投资

C++语言CTP期货交易系统开发

数字货币JavaScript语言量化交易系统开发


典型股票量化回测流程

典型的股票量化策略回测流程包括以下几个步骤:

  1. 数据获取:首先需要获取所需的股票市场数据,包括股票价格、交易量、财务数据等。这些数据可以从金融数据供应商、交易所、财经网站或者专门的数据提供商处获取。

  2. 数据预处理:对获取到的数据进行预处理和清洗,以确保数据的质量和一致性。这包括去除异常值、处理缺失数据、调整股票价格(如复权处理)等。

  3. 策略开发:根据具体的量化策略目标,设计和开发相应的交易策略。这可能涉及技术指标的计算、信号生成规则的制定、风险管理规则的定义等。

  4. 回测执行:使用历史数据执行所开发的策略。按照时间顺序,逐个周期模拟交易决策,并记录每次交易的执行价格、成交量、手续费等信息。

  5. 绩效评估:根据回测结果评估策略的绩效表现。常见的评估指标包括累计收益、年化收益率、最大回撤、夏普比率等。此外,还可以进行风险敞口、交易频率等方面的分析。

如何使用Tushare获取股票数据

上述流程中,1、2我们可以使用Tushare配合Pandas库来进行,而3、4、5步骤可以使用Backtrader库来完成。接下来,我们就来介绍Tushare和Backtrader在量化回测中的使用。

Tushare是一个基于Python语言的开源金融数据接口包,提供了丰富的股票、期货、基金等金融数据获取功能。Tushare为金融从业者和开发者提供了方便快捷的数据获取和处理工具,帮助他们进行金融数据分析和量化策略开发。

要安装和使用Tushare,我们需要按照以下步骤进行操作:

1. 安装Python:首先,确保你的计算机上已经安装了Python。Tushare支持Python 3.x版本。

2. 安装Tushare包:打开命令行终端(Windows用户可以使用命令提示符或PowerShell),输入以下命令安装Tushare包:

pip install tushare

这将自动从Python包索引(PyPI)下载并安装Tushare包及其依赖项。

3. 获取Tushare的Token:在使用Tushare之前,你需要在Tushare官网(https://tushare.pro)注册一个账号,并获取API令牌(Token)。登录后,在用户中心页面可以找到你的Token。

4. 使用Tushare:在Python中引入Tushare包,并使用你的Token进行初始化。以下是一个简单的示例代码:

import tushare as ts# 初始化Tushare,替换YOUR_TOKEN为你的Token
ts.set_token('YOUR_TOKEN')# 创建Tushare接口对象
pro = ts.pro_api()# 调用Tushare接口函数,获取股票行情数据
data = pro.daily(ts_code='000001.SZ', start_date='20220101', end_date='20220131')# 打印获取的数据
print(data)

在上面的示例中,首先使用set_token函数设置你的Token,然后使用pro_api函数创建Tushare接口对象。接下来,可以使用各种Tushare接口函数(如daily)获取不同类型的金融数据。

请根据Tushare的文档(https://tushare.pro/document/2)和API参考(https://tushare.pro/document/1)查看更多的接口函数和详细用法。

需要注意,上述示例中的Tushare Pro的接口需要付费订阅才能访问高级数据。如果你想省去注册和付费的麻烦,而且只取有限的简单数据做个尝试,可以使用Tushare的免费接口。免费接口的示例代码更简单


import tushare as ts
# 获取沪深300指数从2014年1月1日到最新的行情数据
hs300 = ts.get_k_data('hs300', start='2014-01-01')

由此,我们就获取到了免费版本的沪深300指数从2014年1月1日到最新的日K线数据:

如何对数据进行可视化

在获取到沪深300的历史K线数据后,我们如果想初步计算一些技术指标,并把技术指标和历史行情展现出来,给我们下一步进行策略开发提供一些思路,应该如何实现?

对于数据可视化,有两种实现方式,一种是采用Python自带的plt库,另一种是专门处理显示K线数据的三方库:mplfinance。我们先来看第一种实现方式:

首先我们定义一个RSI函数,并输入刚才获取到的沪深300指数数据,然后,再调用plt库的相关方法,将RSI指标和历史价格,共同显示在一张图上。

# 将RSI值添加到hs300数据中
hs300['RSI'] = RSI(hs300)# 画图
plt.figure(figsize=(12,6))
plt.plot(hs300['date'], hs300['close'], label='Close') # 画出收盘价曲线
plt.legend(loc='upper left')
plt.twinx()
plt.plot(hs300['date'], hs300['RSI'], 'r', label='RSI') # 画出RSI曲线
plt.legend(loc='upper right')
plt.show()

另一种方式,我们也可以使用mplfinance库,绘制出获取到沪深300的历史K线数据的K线量价图。这里,我们留下同时绘制RSI指标的问题,给读者思考和练习。

import mplfinance as mpfhs300 = hs300.set_index('date')
hs300.index = pd.to_datetime(hs300.index)
mpf.plot(hs300, type='candle', volume=True, mav=(5,10,20), figratio=(12,6), title='HS300 Candlestick Chart')

如何使用BackTrader进行回测

Backtrader是一个功能强大的Python量化交易框架,用于开发、回测和执行交易策略。它提供了广泛的功能和工具,使得量化交易策略的开发和测试变得更加简单和高效。

Backtrader的一些主要特点和功能:

  1. 灵活的策略开发:Backtrader提供了简洁而灵活的API,使得策略的开发变得方便。你可以通过继承和扩展Backtrader的基础类来创建自定义的交易策略,并在其中定义买入、卖出信号和风险管理规则等。

  2. 多种交易工具支持:Backtrader支持多种交易工具,包括股票、期货、外汇等。你可以使用Backtrader来开发各种市场的交易策略。

  3. 多样化的交易指标和分析工具:Backtrader内置了大量的交易指标和分析工具,如移动平均线、布林带、相对强弱指标(RSI)、夏普比率等。这些工具可以帮助你分析市场趋势、计算策略绩效等。

  4. 灵活的数据回测:Backtrader提供了丰富的回测功能,可以使用历史数据对策略进行测试和优化。你可以使用不同的时间周期和数据频率进行回测,模拟真实的交易环境。同时,Backtrader还支持多线程回测,加快回测速度。

具体到Backtrader的使用,我们还是以获取到的沪深300指数历史数据、和RSI指标一起,构建量化策略的回测。首先,需要做的是把获取到的K线数据,转换成Backtrader的回测数据格式。

# Get data from tushare
df = ts.get_k_data('hs300', start='2014-01-01')
df['date'] = pd.to_datetime(df['date'])  # 将日期转换为datetime格式
df = df.set_index('date', drop=True)  # 将日期设置为索引
data = bt.feeds.PandasData(dataname=df, datetime=None,open=0, high=1, low=2, close=3, volume=4, openinterest=-1)  # 创建数据源

第二步,我们构建一个RSI策略的回测函数,在这个回测函数中,我们先计算RSI指标14周期的数值,并以RSI<30作为买入信号,RSI>70作为卖出信号。

# Define the strategy
class RSI(bt.Strategy):params = (('rsi_period', 14),)def __init__(self):self.rsi = bt.indicators.RSI(period=self.params.rsi_period)def next(self):if not self.position:if self.rsi < 30:self.buy(size=1)else:if self.rsi > 70:self.sell(size=1)

第三步,调用BackTrader库相关方法,添加回测数据、设置初始资金和手续费、输出初始资金,运行策略,后输出最终资金并绘制图表。

cerebro = bt.Cerebro()
cerebro.adddata(data)  # 添加数据源
cerebro.addstrategy(RSI)
cerebro.broker.setcash(1000000.0)  # 设置初始资金
cerebro.broker.setcommission(commission=0.001)  # 设置佣金
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())  # 输出初始资金
cerebro.run()  # 运行策略
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())  # 输出最终资金
cerebro.plot()  # 绘制图表

通过上述三步,我们就完成了数据BackTrader格式的预处理、构建策略信号逻辑函数、以及运行BackTrader回测和展示回测结果,一起来看BackTrader展示的回测结果吧。

可以看到,BackTrader所展示的回测结果很丰富,包括了历史量价和RSI指标的展示、买卖点的标记、资金曲线、回撤线以及NetValue的数值。

综上,我们就完成了从数据获取、到数据可视化、再到策略回测的整个构建过程,感兴趣的朋友,可以把示例中Tushare获取的数据替换成其他标的历史数据,也可也修改RSI策略模块逻辑,构建自己的量化交易策略。总之,本文提供的是一个通用的回测框架,更多的玩法留给我们的读者。

相关文章:

如何使用Tushare+ Backtrader进行股票量化策略回测

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…...

Guid转换为字符串

在理想情况下&#xff0c;任何计算机和计算机集群都不会生成两个相同的GUID。GUID 的总数达到了2128&#xff08;3.41038&#xff09;个&#xff0c;所以随机生成两个相同GUID的可能性非常小&#xff0c;但并不为0。GUID一词有时也专指微软对UUID标准的实现。 (1). GUID&#…...

OpenAI的搜索引擎要来了!

最近的报道和业界泄露信息显示&#xff0c;OpenAI正秘密研发一款新的搜索引擎&#xff0c;可能叫SearchGPT或Sonic&#xff0c;目标是挑战Google的搜索霸权。预计这款搜索引擎可能在5月9日即将到来的活动中正式亮相。 SearchGPT的蛛丝马迹 尽管OpenAI对SearchGPT尚未表态&…...

PaddlePaddle与OpenMMLab

产品全景_飞桨产品-飞桨PaddlePaddle OpenMMLab算法应用平台...

HBuilderX uniapp+vue3+vite axios封装

uniapp 封装axios 注&#xff1a;axios必须低于0.26.0&#xff0c;重中之重 重点&#xff1a;封装axios的适配器adapter 1.安装axios npm install axios0.26.0创建api文件夹 2.新建adapter.js文件 import settle from "axios/lib/core/settle" import buildURL…...

【网络安全产品】---应用防火墙(WAF)

what Web应用防火墙&#xff08;Web Application Firewall) WAF可对网站或者App的业务流量进行恶意特征识别及防护&#xff0c;在对流量清洗和过滤后&#xff0c;将正常、安全的流量返回给服务器&#xff0c;避免网站服务器被恶意入侵导致性能异常等问题&#xff0c;从而保障…...

C++学习第十二天(继承)

1、继承的概念以及定义 继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行拓展&#xff0c;增加功能&#xff0c;这样产生新的类&#xff0c;称派生类。继承呈现了面向对象程序设计的层次结构&#x…...

WPF DataGrid绑定后端 在AutoGeneratingColumn事件中改变列名

public void OnAutoGeneratingColumn(DataGridAutoGeneratingColumnEventArgs e){var propertyDescriptor (PropertyDescriptor)e.PropertyDescriptor;if (propertyDescriptor.IsBrowsable){e.Column.Header propertyDescriptor.DisplayName;}else{e.Cancel true;}}实体类中…...

2024 CorelDraw最新图形设计软件 激活安装教程来了

2024年3月&#xff0c;备受瞩目的矢量制图及设计软件——CorelDRAW Graphics Suite 2024 正式面向全球发布。这一重大更新不仅是 CorelDRAW 在 36 年创意服务历史中的又一重要里程碑&#xff0c;同时也展现了其在设计软件领域不断创新和卓越性能的领导地位。 链接: https://pan…...

双网口扩展IO支持8DO输出

M320E以太网远程I/O数据采集模块是一款工业级、隔离设计、高可靠性、高稳定性和高精度数据采集模块&#xff0c;嵌入式32位高性能微处理器MCU&#xff0c;集成2路工业10/100M自适应以太网模块里面。提供多种I/O&#xff0c;支持标准Modbus TCP&#xff0c;可集成到SCADA、OPC服…...

【负载均衡在线OJ项目日记】编译与日志功能开发

目录 日志功能开发 常见的日志等级 日志功能代码 编译功能开发 创建子进程和程序替换 重定向 编译功能代码 日志功能开发 日志在软件开发和运维中起着至关重要的作用&#xff0c;目前我们不谈运维只谈软件开发&#xff1b;日志最大的作用就是用于故障排查和调试&#x…...

yaml配置文件的在深度学习中的简单应用

1 .创作灵感 小伙伴们再阅读深度学习模型的代码的时候&#xff0c;经常会遇到yaml格式的配置文件。用这个配置文件是因为我们在训练模型的时候会涉及很多的参数&#xff0c;如果这些参数东一个&#xff0c;西一个&#xff0c;我们调起来的时候就会很不方便&#xff0c;所以用y…...

spring boot 核心配置文件是什么?

Spring Boot 的核心配置文件主要是 application.properties 或 application.yml&#xff08;也称为 YAML 格式&#xff09;。这两个文件通常位于项目的 src/main/resources 目录下&#xff0c;用于配置 Spring Boot 应用程序的各种属性和设置。 application.properties&#xf…...

Python的奇妙之旅——回顾其历史

我们这个神奇的宇宙里&#xff0c;有一个名叫Python的小家伙&#xff0c;它不仅聪明&#xff0c;而且充满活力。它一路走来&#xff0c;从一个小小的编程语言成长为如今全球最受欢迎的编程语言之一。今天&#xff0c;我们就来回顾一下Python的历史&#xff0c;看看它如何从一个…...

Flink面试整理-Flink的性能优化策略

Apache Flink 的性能优化是一个多方面的任务,涉及硬件资源、算法选择、配置调整等多个层面。以下是一些常见的 Flink 性能优化策略: 1. 资源分配和管理 合理配置 TaskManager 和 JobManager:根据作业的需求和可用资源,合理分配内存和 CPU 给 TaskManager 和 JobManager。适…...

SpringBoot与SpringMVC的区别

SpringBoot与SpringMVC的区别是什么&#xff1f; SpringBoot和SpringMVC是Java开发中常用的两个框架&#xff0c;它们都是由Spring框架所提供的&#xff0c;但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。 一、SpringBoot的特点&#…...

漏洞挖掘之某厂商OAuth2.0认证缺陷

0x00 前言 文章中的项目地址统一修改为: a.test.com 保护厂商也保护自己 0x01 OAuth2.0 经常出现的地方 1&#xff1a;网站登录处 2&#xff1a;社交帐号绑定处 0x02 某厂商绑定微博请求包 0x02.1 请求包1&#xff1a; Request: GET https://www.a.test.com/users/auth/weibo?…...

电脑屏幕监控软件都有哪些 | 五大好用屏幕监控软件盘点

电脑屏幕监控软件在企业管理、家庭教育等方面发挥着越来越重要的作用。 这些软件通过实时监控电脑屏幕活动&#xff0c;为用户提供了强大的管理和监控功能。 本文将为您盘点五大好用的电脑屏幕监控软件&#xff0c;帮助您更好地了解并选择适合自己的软件。 电脑屏幕监控软件都…...

数据结构-线性表-链表-2.3-2

在带头节点的单链表L中&#xff0c;删除所有值为x的结点&#xff0c;并释放其空间&#xff0c;假设值为x的结点不唯一&#xff0c; 是编写算法实现上述操作。 双指针&#xff0c;用p从头至尾扫描单链表&#xff0c;pre指向*p结点的前驱&#xff0c;若p所指结点的值为x&#x…...

【自动化测试】使用MeterSphere进行接口测试

一、接口介绍二、接口测试的过程三、接口自动化测试执行自动化流程 四、接口之间的协议HTTP协议 五、 接口测试用例设计接口文档 六、使用MeterSphere创建接口测试创建接口定义设计接口测试用例 一、接口介绍 自动化测试按对象分为&#xff1a;单元测试、接口测试、UI测试等。…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...