量化交易:使用 python 进行股票交易回测

执行环境: Google Colab

1. 下载数据

import yfinance as yfticker = 'ZM'
df = yf.download(ticker)
df

在这里插入图片描述

2. 数据预处理

df = df.loc['2020-01-01':].copy()
  • 使用了 .loc 方法来选择索引为 ‘2020-01-01’ 以后的所有行数据。
  • 通过 .copy() 方法创建了一个这些数据的副本,确保对副本的操作不会影响原始数据框。

在这里插入图片描述

df['change_tomorrow'] = df['Adj Close'].pct_change(-1)
df.change_tomorrow = df.change_tomorrow * -1
df.change_tomorrow = df.change_tomorrow * 100
df
  • .pct_change(-1) 这部分使用了 pct_change 方法来计算当前行与后一行的变化率,传入参数 -1 表示计算与后一行的变化率。
  • 将 ‘change_tomorrow’ 列中的数值乘以 -1,将变化率转换为相反的方向。
  • 将 ‘change_tomorrow’ 列中的数值乘以 100,将变化率转换为百分比形式。

在这里插入图片描述

df = df.dropna().copy()
df

在这里插入图片描述

!pip uninstall scikit-learn
!pip install scikit-learn==1.1.3

3. 建立模型

from sklearn.ensemble import RandomForestRegressormodel = RandomForestRegressor(max_depth=20, random_state=42)
y = df.change_tomorrow
X = df.drop(columns='change_tomorrow')
model.fit(X, y)

在这里插入图片描述

model.score(X, y)

0.7973700550772351

4. 创建一个名为 Regression 的策略类

!pip install Backtesting
from backtesting import Strategyclass Regression(Strategy):limit_buy = 1limit_sell = -5def init(self):self.model = modelself.already_bought = Falsedef next(self):explanatory_today = self.data.df.iloc[[-1], :]forecast_tomorrow = self.model.predict(explanatory_today)[0]if forecast_tomorrow > self.limit_buy and self.already_bought == False:self.buy()self.already_bought = Trueelif forecast_tomorrow < self.limit_sell and self.already_bought == True:self.sell()self.already_bought = Falseelse:pass
  • limit_buylimit_sell 分别是买入和卖出的阈值
  • init 方法是初始化方法,在这里设置了模型和一个标记 already_bought,用于追踪是否已经买入
  • next 方法是每个交易周期调用的方法。在这里,首先通过 self.data.df.iloc[[-1], :] 获取了最近一天的数据作为当天的解释变量。然后使用模型 self.model 对明天的预测值进行预测,forecast_tomorrow = self.model.predict(explanatory_today)[0] 这行代码就是进行了明天的预测。
  • 如果预测值高于买入阈值且尚未买入(self.already_bought == False),则执行买入操作并将 already_bought 标记为已买入。
  • 如果预测值低于卖出阈值且已经买入(self.already_bought == True),则执行卖出操作并将 already_bought标记为未买入。

5. 创建一个交易回测的实例

!pip install scikit-optimize
from backtesting import Backtestbt = Backtest(X, Regression, cash=10000,commission = .002, exclusive_orders=True
)
  • X: 这是指定的交易数据或特征数据,用于执行交易策略的数据
  • Regression: 这是之前定义的策略类,表示将使用哪个策略来进行交易
  • cash=10000: 这个参数表示初始资金,设置为 10000
  • commission=.002: 这个参数表示交易佣金,设置为 0.2%
  • exclusive_orders=True: 这个参数表示交易订单是否独占性,设置为 True,意味着同一时间只能有一个买入或卖出订单执行

6. 进行交易回测优化的过程

stats_skopt, heatmap, optimize_result = bt.optimize(limit_buy = [0, 10],limit_sell = [-10, 0],maximize = 'Return [%]',method = 'skopt',max_tries = 500,random_state = 0,return_heatmap = True,return_optimization = True
)
  • limit_buy 的范围设置在 0 到 10 之间,而 limit_sell 的范围设置在 -10 到 0 之间,这表示优化的目标是在这个区间内找到最佳的参数值
  • maximize = 'Return [%]' 指定了要最大化的指标,这里是 ‘Return [%]’,即回报率的百分比。优化的目标是使得回报率最大化
  • method = 'skopt' 指定了优化的方法为 ‘skopt’,这是基于 scikit-optimize 库的一种优化方法
  • max_tries = 500 设置了最大尝试次数为 500 次,意味着在尝试寻找最优参数值时,会进行最多 500 次的尝试
  • return_heatmap = Truereturn_optimization = True 分别指定了返回热图和优化结果
import numpy as npdff = heatmap.reset_index()
dff = dff.pivot(index='limit_buy', columns='limit_sell', values='Return [%]')dff.sort_index(axis=1, ascending=False)\.style.format(precision=0)\.background_gradient(vmin=np.nanmin(dff), vmax=np.nanmax(dff))\.highlight_null(props='background-color: transparent; color: transparent')
  • dff = heatmap.reset_index(): 这行代码是将名为 heatmap 的数据重新设置索引,将原先的索引变为列,并将结果保存在 dff
  • 使用 pivot 方法将 dff 数据重新构造成一个以 ‘limit_buy’ 列为行索引,‘limit_sell’ 列为列索引,‘Return [%]’ 列为值的新数据框,并将结果保存在 dff
  • dff.sort_index(axis=1, ascending=False): 这行代码对列进行降序排序
  • .style.format(precision=0): 这部分代码是对样式进行格式化,将数值的显示精度设置为整数(precision=0
  • 使用了 background_gradient 方法,根据数值的范围进行颜色渐变。vminvmax 参数指定了颜色渐变的最小值和最大值,使用了 np.nanmin()np.nanmax() 函数来忽略 NaN 值并确定渐变的范围
  • 对空值(NaN 值)进行样式化处理,将其背景颜色和文本颜色设置为透明,以减少空值的影响。

在这里插入图片描述

7. 绘制优化过程中的评估结果

from skopt.plots import plot_evaluations_ = plot_evaluations(optimize_result, bins=10)
  • 参数 optimize_result 是优化过程中获得的结果,bins=10 表示将结果分成 10 份以展示评估结果的分布情况
    在这里插入图片描述

8. 绘制优化过程中目标函数的图表

from skopt.plots import plot_objective_ = plot_objective(optimize_result, n_points=10)
  • 参数 optimize_result 是优化过程中获得的结果,n_points=10 表示在图表中显示的离散点的数量为 10 个,用于展示目标函数的走势和变化情况

在这里插入图片描述

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

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

相关文章

星宿UI2.51资源付费变现小程序 支持流量主广告投放

目前&#xff0c;最新版的星宿UI是2.51版本。要搭建星宿UI&#xff0c;您需要准备备用域名、服务器和微信小程序账号。星宿UI提供了多项功能&#xff0c;包括文章展示、文章分类、资源链接下载和轮播图等。此外&#xff0c;还支持直接下载附件功能。这些功能使得星宿UI非常适合…

阶段七-Day01-SpringMVC

一、Sping MVC的介绍 1. 使用Front(前端)设计模式改写代码 1.1 目前我们的写法 目前我们所写的项目&#xff0c;持久层、业务层的类都放入到Spring容器之中了。他们之间需要注入非常方便&#xff0c;只需要通过Autowired注解即可。 但是由于Servlet整个生命周期都是被Tomca…

【开发工具】gitee还不用会?我直接拿捏 >_>

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 git的一些前置操作 如何获取本地仓库 本地仓库的操作 远程仓库操作 合并两个仓库&#xff08;通用方法&#xff09; 从远程仓库拉取文件报错 fatal:refusing to merge unrelated histories 分支操作 注意&…

详解 KEIL C51 软件的使用·建立工程

单片机要运行,就必须将程序代码下载到程序存储器内部,但是在写进单片机之前要先将你写 的程序转换成*.hex 或*.bin 的文件.不同系列的单片机都有不同的软件对其进行编绎,而 keil Cx51 是德国开发的一个专为 51 系列单片机提供的软件开发平台,基本上现在的所有 51 系列内核的单片…

雷达波形及MATLAB仿真

文章目录 前言一、雷达波形二、Matlab 仿真1、SFW 的距离分辨率和距离模糊①、MATLAB 源码②、仿真结果 三、资源自取 前言 本文对雷达波形的内容以思维导图的形式呈现&#xff0c;有关仿真部分进行了讲解实现。 一、雷达波形 思维导图如下图所示&#xff0c;如有需求请到文章…

产品的生命周期

** 没错&#xff0c;产品每次版本选代都是一次重生的机会&#xff0c;每次版本迭代都不亚于一次产品上线首发。 ** 一、产品上线首发 所谓万事开头难&#xff0c;产品上线首发的重要性不言而喻&#xff0c;产品给人的第一印象非常深刻&#xff0c;后期再去扭转非常困难&#…

腾讯云4核8G和2核4G服务器五年优惠价格表

腾讯云百科整理五年云服务器优惠活动 txybk.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频3…

The 8th China Open Source Conference Successfully Concludes

由开源社主办的第八届中国开源年会&#xff08;COSCon23&#xff09;于 2023年10月29日在成都圆满收官。本次大会&#xff0c;为期两天&#xff0c;线下参会报名逾千人次&#xff0c;在线直播观看人数总计 168610 人&#xff0c;直播观看次数达 248725 次&#xff0c;官网累计浏…

LeetCode【238】除自身意外的数组的乘积

题目&#xff1a; 思路&#xff1a; https://zhuanlan.zhihu.com/p/109306706?utm_id0 代码&#xff1a; int n nums.length;int[] l new int[nums.length];int[] r new int[nums.length];l[0] 1;r[n-1] 1;for (int i1;i<nums.length;i) {l[i] l[i-1] * nums[i-1]…

使用字典树实现一个可以自动补全的输入框

说在前面 平时我们在终端输入命令的时候是不是都可以通过tab键来进行快速补全&#xff1f;那么有没有想过怎么去实现这个自动补全的功能呢&#xff1f;今天让我们一起来使用字典树实现一个可以自动补全的输入框。 效果展示 体验地址 http://jyeontu.xyz/jvuewheel/#/JAutoComp…

Python+Qt多点最短路径(最优路径)算法实现

程序示例精选 PythonQt多点最短路径(最优路径)算法实现 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonQt多点最短路径(最优路径)算法实现》编写代码&#xff0c;代码整洁&#xff0…

Qt执行带参sql

//准备执行的sql语句&#xff0c;此为带参的sql语句query.prepare("update employee set Name:Name, Gender:Gender,Height:Height,"" Birthday:Birthday, Mobile:Mobile, Province:Province,"" City:City, Department:Department, Education:Educati…

vscode+python开发之虚拟环境和解释器切换

需求情景&#xff1a; 现在我们要开发多个项目比如&#xff1a;项目A&#xff0c;项目B、项目C&#xff0c;他们每个项目需要依赖不同的库。每个项目依赖的解释器也不一样怎么办&#xff1f; 项目A&#xff1a;需要在python3.7环境运行 依赖aadd3.2库 项目B、需要在python3.11…

C/C++轻量级并发TCP服务器框架Zinx-框架开发001: 读取标准输入,回显到标准输出

文章目录 完整代码实现参考-非项目使用项目使用的代码 - 乱-但是思路与上面的相同创建Kernel类添加删除修改epoll&#xff0c;才能写run方法创建stdin_Channel类在Kernel类中实现run方法 完整代码实现参考-非项目使用 #include <errno.h> #include <signal.h> #in…

2024上海国际智能驾驶技术展览会(自动驾驶展)

2024上海国际智能驾驶技术展览会 2024 Shanghai International Autonomous driving Expo 时间&#xff1a;2024年3月26-28日 地点&#xff1a;上海跨国采购会展中心 随着科技的飞速发展&#xff0c;智能驾驶已经成为了汽车行业的重要趋势。在这个时代背景下&#xff0c;汽车不…

Ansys Lumerical | 用于增强现实系统的表面浮雕光栅

在本示例中&#xff0c;我们使用 RCWA 求解器设计了一个斜面浮雕光栅 (SRG)&#xff0c;它将用于将光线耦合到单色增强现实 (AR) 系统的波导中。光栅的几何形状经过优化&#xff0c;可将正常入射光导入-1 光栅阶次。 然后我们将光栅特性导出为 Lumerical Sub-Wavelength Model …

数字媒体技术基础之:常见图片文件格式

在数字图像处理和图形设计领域&#xff0c;了解不同的图片文件格式及其特点是至关重要的。每种格式都有其独特的用途和优势。以下介绍一些最常见的图片文件格式。 JPEG Joint Photographic Experts Group 扩展名&#xff1a;.jpg 或 .jpeg 特点&#xff1a; 1、有损压缩&#x…

【Proteus仿真】【51单片机】拔河游戏设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用按键、LED、动态数码管模块等。 主要功能&#xff1a; 系统运行后&#xff0c;指示灯处于中间位置&#xff0c;数码管显示得分0&#xff0c;当按下…

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件 2023/11/14 14:11 手机&#xff1a;Realme Q 笔记本电脑&#xff1a;HP https://item.jd.com/100012583174.html 惠普&#xff08;HP&#xff09;战66 三代AMD版 14英寸轻薄笔记本电脑&#xff08;锐龙7nm 六核…

多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测

多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测 目录 多维时序 | MATLAB实现PSO-LSTM-Attention粒子群优化长短期记忆神经网络融合注意力机制的多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果…