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

news2024/11/22 10:16:54

执行环境: 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 个,用于展示目标函数的走势和变化情况

在这里插入图片描述

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

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

相关文章

PCA9698的IIC转接GPIO控制N路灯

PCA9698验证灯的办法和PCA9535验证6路数字继电器&#xff0c;编译成ko直接Insmod&#xff0c;然后查看/dev/节点有了吗&#xff1f;然后用iictool命令往对应iic地址上面写数据&#xff0c;看看灯亮灭或者听继电器开关声响&#xff0c;至于写多少&#xff0c;研究芯片手册上面参…

Spark SQL编程

1. Spark SQL概述 1.1 什么是Spark SQL Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同&#xff0c;Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部&#xff0c;Spark SQL使用这些额外的信息来执行额外的优化。与Spa…

Mac M2/M3 芯片环境配置以及常用软件安装-前端

最近换了台新 Mac&#xff0c;所有的配置和软件就重新安装下&#xff0c;顺便写个文章。 一、环境配置 1. 安装 Homebrew 安装 Homebrew【Mac 安装 Homebrew】 通过国内镜像安装会比较快 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Ho…

IDEA接口调试插件不好找?这款免费用!

IDEA插件市场中的API调试插件不是收费&#xff08;Fast Request &#xff09;就是不好用&#xff08;apidoc、apidocx等等&#xff09;今天给大家介绍一款国产的API调试插件&#xff1a;Apipost-Helper&#xff0c;完全免费且好看好用&#xff01; 这款插件由Apipost团队开发的…

【Qt之QWizard】使用2,示例分析

效果图 根据首页的选择不同&#xff0c;进入不同的选项。 以下是代码。 示例 .h #ifndef LICENSEWIZARD_H #define LICENSEWIZARD_H#include <QWizard>QT_BEGIN_NAMESPACE class QCheckBox; class QLabel; class QLineEdit; class QRadioButton; QT_END_NAMESPACEcla…

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

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

科学上网导致Adobe软件运行弹出This non-genuine Adobe app will be disabled soon,尝试解决办法

之前介绍用防火墙拦截Adobe软件的出站规则可以解决软件的非正版弹窗&#xff0c;但是有的用户却不行是为什么&#xff0c;原因是使用了代理网络。因为Adobe此时跑的不是本地的流量而是代理的流量。所以防火墙拦截就不起作用了。 首先是之前介绍过的拦截方法&#xff0c;如果你没…

网络安全-学习手册

前言 前几天发布了一篇 网络安全&#xff08;黑客&#xff09;自学 没想到收到了许多人的私信想要学习网安黑客技术&#xff01;却不知道从哪里开始学起&#xff01;怎么学 今天给大家分享一下&#xff0c;很多人上来就说想学习黑客&#xff0c;但是连方向都没搞清楚就开始学习…

Spring-Spring之AOP底层原理解析---实践(动态代理)

动态代理 代理模式的解释&#xff1a;为其他对象提供一种代理以控制对这个对象的访问&#xff0c;增强一个类中的某个方法&#xff0c;对程序进行扩展。 cglib动态代理 方式一&#xff1a; public class UserService {public void test() {System.out.println("test..…

k8s自定义Endpoint实现内部pod访问外部应用

自定义endpoint实现内部pod访问外部应用 endpoint除了可以暴露pod的IP和端口还可以代理到外部的ip和端口 使用场景 公司业务还还没有完成上云&#xff0c; 一部分云原生的&#xff0c;一部分是实体的 业务上云期间逐步实现上云&#xff0c;保证各个模块之间的解耦性 比如使…

IEEE--DSConv: Efficient Convolution Operator 论文翻译

论文地址:https://arxiv.org/pdf/1901.01928v1.pdf 目录 摘要 1 介绍 2 相关工作 3 DSConv层 4 量化过程 5 分布偏移 6 优化推断 7 训练 8 结果 8.1 ImageNet 8.2 内存和计算负载 8.3 转移性 9 结论 摘要 我们引入了一种卷积层的变体&#xff0c;称为DSConv&…

网络编程 —— TCP 和 UDP 编程详解

目录 网络编程主要函数介绍 1. socket 函数 2. bind 函数 3. listen 函数 4. accept 函数 5. connect 函数 6. send 函数 7. recv 函数 8. recvfrom 函数 9. sendto 函数 TCP 和 UDP 原理上的区别 TCP 编程 服务端代码&#xff1a; 客户端代码&#xff1a; UDP 编…

如何进行iOS技术博客的备案?

​ 如何进行iOS技术博客的备案&#xff1f; 标题&#xff1a;iOS技术博客备案流程及要求解析 摘要&#xff1a; 在本篇问答中&#xff0c;我们将为iOS技术博主介绍如何进行备案。如果你的iOS应用只包含简单的页面&#xff0c;并通过蓝牙进行数据采集和传输&#xff0c;那么你…

0基础学习VR全景平台篇第121篇:认识视频剪辑软件Premiere

上课&#xff01;全体起立~ 大家好&#xff0c;欢迎观看蛙色官方系列全景摄影课程&#xff01; 大家好&#xff0c;这节课是带领大家认识认识我们的剪辑软件Premiere&#xff0c;一般简称是PR。 &#xff08;PR界面&#xff09; 我们首先打开PR&#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]…

python数据处理作业4:使用numpy数组对象,随机创建4*4的矩阵,并提取其对角元素

每日小语 真理诚然是一个崇高的字眼&#xff0c;然而更是一桩崇高的业绩。如果人的心灵与情感依然健康&#xff0c;则其心潮必将为之激荡不已。——黑格尔 难点&#xff1a;如何创建&#xff1f;取对角元素的函数是什么&#xff1f; gpt代码学习 import numpy as np# 随机创…

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

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

Databend 与海外某电信签约:共创海外电信数据仓库新纪元

为什么选择 Databend 海外某电信面临的主要挑战是随着业务量的增加&#xff0c;传统的 Clickhouse Hive 方案在数据存储和处理上开始显露不足。 原来的大数据分析采用的 Clickhouse Hive 方案进行离线的实时报表。但随着业务量的上升后&#xff0c;Hive的数据存储压力变大&…

微服务基础,分布式核心,常见微服务矿建,SpringCloud概述,搭建SpringCloud微服务项目详细步骤,含源代码

微服务基础 系统架构的演变 随着会联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的应用架构已经无法应对&#xff0c;分布式服务架构以及微服务架构势在必行&#xff0c;必须一个治理系统确保架构有条不紊的演进 单体应用框架 Web应用程序发展的早期&…

Jenkins中强制停止停不下来的job

# Script console 执行脚本 Jenkins 的提供了 script console 的功能&#xff0c;允许你写一些脚本&#xff0c;来调度 Jenkins 执行一些任务。 我们就可以利用 script console 来强制停止 job 执行。 首先进入 Jenkins 的 script console 页面&#xff1a; script console 路…