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

执行环境: Google Colab

1. 下载数据

import yfinance as yf

ticker = '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 RandomForestRegressor

model = 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 Strategy

class Regression(Strategy):
  limit_buy = 1
  limit_sell = -5

  def init(self):
    self.model = model
    self.already_bought = False

  def 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 = True
    elif forecast_tomorrow < self.limit_sell and self.already_bought == True:
      self.sell()
      self.already_bought = False
    else:
      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 Backtest

bt = 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 np

dff = 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 个,用于展示目标函数的走势和变化情况

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenGL_Learn11(光照)

目录 1. 光照 2. 环境光照 3. 漫反射光照 4. 代码实战 1. 光照 在OpenGL中主要分以下几个光照类型 环境光照(Ambient Lighting)&#xff1a;即使在黑暗的情况下&#xff0c;世界上通常也仍然有一些光亮&#xff08;月亮、远处的光&#xff09;&#xff0c;所以物体几乎永远不…

VScode+python开发,多个解释器切换问题

内容&#xff1a;主要VScode使用多个解释器 环境准备 VScode编辑器&#xff0c;两个版本python解释器 python3.7.2 python3.11.6 问题&#xff1a; 目前我们的电脑安装了python3.7.2、python3.11.6两个解释器&#xff0c;在vscode编辑器中&#xff0c;无法切换解释器使用如…

pytorch tensor数据类型转换为python数据

一、item() input: x torch.tensor([1.0]) x.item()output: 1.0二、tolist() input: a torch.randn(2, 2) a.tolist() a[0,0].tolist()output: [[0.012766935862600803, 0.5415473580360413],[-0.08909505605697632, 0.7729271650314331]]0.012766935862600803

FPGA UDP RGMII 千兆以太网(4)ARP ICMP UDP

1 以太网帧 1.1 1以太网帧格式 下图为以太网的帧格式: 前导码(Preamble):8 字节,连续 7 个 8’h55 加 1 个 8’hd5,表示一个帧的开始,用于双方 设备数据的同步。 目的 MAC 地址:6 字节,存放目的设备的物理地址,即 MAC 地址 源 MAC 地址:6 字节,存放发送端设备的…

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

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

安防监控EasyCVR视频汇聚平台使用海康SDK播放出现花屏是什么原因?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

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

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

在 Electron上安装better-sqlite3出错

错误问题 一直卡npm install --global windows-build-tools --vs2015 这一步 解决 安装&#xff1a;pnpm install better-sqlite3 --save安装命令 pnpm i -D electron-rebuild 手动运行&#xff1a;node_modules/.bin/electron-rebuild -f -w better-sqlite3 我直接在packa…

后端接口性能优化分析-数据库优化

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码&#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&…

246:vue+openlayers 绘制多边形,drawend获取最大幅宽

第246个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中绘制多边形,drawend获取最大幅宽。这里利用turf的turf.distance和openlayers的getExtent获取坐标值。 距离赤道越近,幅宽会越大一些,这里面利用了Math.abs来做绝对值的判断处理。 直接复制下面的 vue+open…

计算机毕设 机器学习股票大数据量化分析与预测系统 - python 计算机毕设

文章目录 0 前言1 课题背景2 实现效果UI界面设计web预测界面RSRS选股界面 3 软件架构4 工具介绍Flask框架MySQL数据库LSTM 5 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业…

基于springboot实现体育场馆运营平台项目【项目源码】计算机毕业设计

基于springboot实现体育场馆运营平台演示 系统开发平台 在该数码论坛系统中&#xff0c;Eclipse能给用户提供更多的方便&#xff0c;其特点一是方便学习&#xff0c;方便快捷&#xff1b;二是有非常大的信息储存量&#xff0c;主要功能是用在对数据库中查询和编程。其功能有比…

Fourier分析导论——第5章——实数据R上的Fourier变换(E.M. Stein R. Shakarchi)

第5章 实数域ℝ上的Fourier变换 The theory of Fourier series and integrals has always had major difficulties and necessitated a large math- ematical apparatus in dealing with questions of con- vergence. It engendered the development of methods of summa…

PSP - 蛋白质复合物结构预测 Template 的 Multichain Mask 2D (二维多链掩码)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/134406459 在 蛋白质复合物结构预测 中&#xff0c;AlphaFold2 Multimer 的 Multichain Mask 2D 对于 模版特征 (Template) 的影响较大&#xff0…

创建具有负载平衡和集群的可扩展 Node.js 应用程序

创建具有负载平衡和集群的可扩展 Node.js 应用程序 负载平衡是提高应用程序性能、可扩展性和可用性的一项重要技术。当客户端向负载均衡器发出请求时&#xff0c;负载均衡器根据预定义的规则将请求分发到不同的实例。 可以使用cluster集群模块或 PM2 等工具根据负载均衡器的流…

若依前后分离版框架下Springboot java引入Mqtt接受发送消息

**这只是其中一种而且是粗浅的接、发消息。 同步机制还要跟搞物联网的同事沟通确认去看看能不能实现 或者是设备比较多的情况下 不会去使用同步机制 首先pom文件 引入依赖 ** <dependency><groupId>org.eclipse.paho</groupId><artifactId>org.eclipse…

​TechSmith Camtasia 2024破解版功能介绍及使用教程

在现在的网络互联网时代&#xff0c;越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频&#xff0c;也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音&#xff0c;做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

如何将微软 Office 宏转换为 ONLYOFFICE 宏

想要将微软 Office VBA 宏转换为可在 ONLYOFFICE 中无缝使用的宏&#xff1f;嗯&#xff0c;虽然这种需求并没有直接的解决方案&#xff0c;不过我们也会在本文中介绍 VBA 宏的转换步骤——正好我们手上也有一个来自用户的实际案例可供参考。 VBA 宏 以下是原始的 VBA 宏代码&…

ubuntu18.04配置Java环境与安装RCS库

一、安装包 安装包 二、JAVA环境 java无需安装&#xff0c;只需要下载解压&#xff0c;然后配置正确的路径到环境变量种即可使用。 1.创建文件JAVA mkdir JAVA 2.将安装包复制到该文件夹下&#xff0c;并解压缩 tar -zxvf tar -zxvf jdk1.8.0_191.tar.gz 3.在home路径下…