机器学习:基于Sklearn、XGBoost,使用逻辑回归、支持向量机和XGBClassifier预测股票价格

在这里插入图片描述

前言

系列专栏:机器学习:高级应用与实践【项目实战100+】【2024】✨︎
在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学习模型、处理非结构化数据以及指导复杂的模型,如卷积神经网络、门控递归单元、大型语言模型和强化学习模型

在这篇文章中,我们将探讨如何通过使用ML来预测一个信号,并且该信号对于购买特定股票是否有帮助?

目录

  • 1. 相关库和数据集
    • 1.1 相关库介绍
    • 1.2 数据集介绍
  • 2. 探索性数据分析
    • 2.1 检查数据的趋势
    • 2.2 检查数据重复值
    • 2.3 检查数据的空值
    • 2.4 检查数据的分布
    • 2.5 检查数据异常值
  • 3. 特征工程
  • 4. 数据建模(RandomForestClassifier)
    • 4.1 数据准备(拆分为训练集和测试集)
    • 4.2 模型构建与评估

1. 相关库和数据集

1.1 相关库介绍

Python 库使我们能够非常轻松地处理数据并使用一行代码执行典型和复杂的任务。

  • Pandas – 该库有助于以 2D 数组格式加载数据框,并具有多种功能,可一次性执行分析任务。
  • Numpy – Numpy 数组速度非常快,可以在很短的时间内执行大型计算。
  • Matplotlib/Seaborn – 此库用于绘制可视化效果,用于展现数据之间的相互关系。
  • Sklearn – 包含多个库,这些库具有预实现的功能,用于执行从数据预处理到模型开发和评估的任务。
  • XGBoost – 包含 eXtreme Gradient Boosting 机器学习算法,是帮助我们实现高精度预测的算法之一。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sb

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from xgboost import XGBClassifier
from sklearn import metrics

import warnings
warnings.filterwarnings('ignore')

1.2 数据集介绍

我们将在这里用于执行分析和构建预测模型的数据集是特斯拉股价数据。我们将使用 2010 年 1 月 1 日至 2017 年 12 月 31 日的 OHLC(‘开盘价’、‘最高价’、‘最低价’、‘收盘价’)数据,这是特斯拉股票的 8 年数据。
使用read_csv函数读取.csv文件,加载数据。

df = pd.read_csv('Tesla.csv')
df.head()

在这里插入图片描述
从前五行中,我们可以看到某些日期的数据缺失,原因是在周末和节假日,股市仍然关闭,因此这些日子没有交易。

df.shape

输出:

(2416, 7)

由此,我们知道有 2416 行可用数据,每行都有 7 个不同的特征或列。

df.describe()

在这里插入图片描述

df.info()

在这里插入图片描述

2. 探索性数据分析

EDA是一种使用视觉技术分析数据的方法。它用于发现趋势和模式,或借助统计摘要和图形表示来检查假设。

2.1 检查数据的趋势

在对特斯拉股价数据进行 EDA 时,我们将分析股票价格在一段时间内的变动情况以及季度末如何影响股票价格。

plt.figure(figsize=(15,5))
plt.plot(df['Close'])
plt.title('Tesla Close price.', fontsize=15)
plt.ylabel('Price in dollars.')
plt.show()

在这里插入图片描述
特斯拉股票的价格呈上升趋势,如股票收盘价图所示。

2.2 检查数据重复值

df.head()

在这里插入图片描述
如果我们仔细观察,我们可以看到“关闭”列中的数据和“调整关闭”列中可用的数据是相同的,让我们检查每行是否都是这种情况。

df[df['Close'] == df['Adj Close']].shape

输出:

(2416, 7)

从这里我们可以得出结论,所有列“Close”和“Adj Close”行都具有相同的数据。因此,数据集中的冗余数据无济于事,因此,在进一步分析之前,我们将删除此列。

df = df.drop(['Adj Close'], axis=1)

2.3 检查数据的空值

现在,让我们绘制数据集中给定的连续特征的分布图。在继续之前,让我们检查数据框中是否存在空值(如果存在)。

df.isnull().sum()

输出:
在这里插入图片描述
这意味着提供的数据集中没有空值。

2.4 检查数据的分布

features = ['Open', 'High', 'Low', 'Close', 'Volume']

plt.subplots(figsize=(20,10))

for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sb.distplot(df[col])
plt.show()

输出:
在这里插入图片描述
在OHLC数据的分布图中,我们可以看到两个峰值,这意味着数据在两个区域发生了显着变化。并且 Volume 数据是左偏的。

2.5 检查数据异常值

plt.subplots(figsize=(20,10))
for i, col in enumerate(features):
    plt.subplot(2,3,i+1)
    sb.boxplot(df[col])
plt.show()

输出
连续变量的箱线图

从上面的箱线图中,我们可以得出结论,只有volume数据包含异常值,但其余列中的数据没有任何异常值。

3. 特征工程

特征工程有助于从现有特征中派生出一些有价值的特征。这些额外的功能有时有助于显著提高模型的性能,当然也有助于更深入地了解数据。

splitted = df['Date'].str.split('-', expand=True)

df['day'] = splitted[2].astype('int')
df['month'] = splitted[1].astype('int')
df['year'] = splitted[0].astype('int')

df.head()

在这里插入图片描述
现在我们又有三列,即“日”、“月”和“年”,这三列都是从数据中最初提供的“日期”列派生而来的。

df['is_quarter_end'] = np.where(df['month']%3==0,1,0)
df.head()

在这里插入图片描述
季度被定义为三个月的时间段。每家公司都会准备季度业绩并公开发布,以便人们可以分析公司的业绩。这些季度业绩对股价有重大影响,这就是我们添加此功能的原因,因为这可能对学习模型有所帮助。

df.drop('Date',axis=1,inplace=True)
data_grouped = df.groupby('year').mean()
plt.subplots(figsize=(20,10))

for i, col in enumerate(['Open', 'High', 'Low', 'Close']):
    plt.subplot(2,2,i+1)
    data_grouped[col].plot.bar()
plt.show()

输出:
在这里插入图片描述
从上面的条形图中,我们可以得出结论,从2013年到2014年,股价翻了一番。

df.groupby('is_quarter_end').mean()

在这里插入图片描述
以下是对上述分组数据的一些重要观察结果:

  • 与非季度末月份相比,季度末月份的价格更高。
  • 季度末的月份交易量较低。
df['open-close'] = df['Open'] - df['Close']
df['low-high'] = df['Low'] - df['High']
df['target'] = np.where(df['Close'].shift(-1) > df['Close'], 1, 0)

上面我们添加了一些列,这将有助于训练我们的模型。我们添加了目标特征,这是一个是否购买的信号,我们将训练我们的模型来仅预测这一点。但在继续之前,让我们使用饼图检查目标是否平衡。

plt.pie(df['target'].value_counts().values, 
		labels=[0, 1], autopct='%1.1f%%')
plt.show()

输出:
在这里插入图片描述
当我们向数据集添加特征时,我们必须确保没有高度相关的特征,因为它们对算法的学习过程没有帮助。

plt.figure(figsize=(10, 10))

# As our concern is with the highly
# correlated features only so, we will visualize
# our heatmap as per that criteria only.
sb.heatmap(df.corr() > 0.9, annot=True, cbar=False)
plt.show()

输出:
在这里插入图片描述
从上面的热图中,我们可以说 OHLC 之间存在非常明显的高度相关性,并且添加的功能彼此之间或以前提供的功能之间没有高度相关性,这意味着我们可以开始构建我们的模型。

4. 数据建模(RandomForestClassifier)

4.1 数据准备(拆分为训练集和测试集)

features = df[['open-close', 'low-high', 'is_quarter_end']]
target = df['target']

scaler = StandardScaler()
features = scaler.fit_transform(features)

X_train, X_valid, Y_train, Y_valid = train_test_split(
	features, target, test_size=0.1, random_state=2022)
print(X_train.shape, X_valid.shape)

输出:

(2174, 3) (242, 3)

在选择要训练模型的特征后,我们应该对数据进行归一化,因为归一化数据会导致模型的稳定和快速训练。在整个数据以 90/10 的比例分成两部分之后,我们可以评估模型在看不见的数据上的性能。

4.2 模型构建与评估

现在是时候训练一些最先进的机器学习模型(逻辑回归、支持向量机、XGBClassifier),然后根据它们在训练和验证数据上的性能,我们将选择哪个 ML 模型更好地服务于手头的目的。

对于评估指标,我们将使用 ROC-AUC 曲线,但为什么会这样,因为我们希望它预测的是 0 到 1 之间的连续值,而不是预测 0 或 1 的硬概率。对于软概率,ROC-AUC 曲线通常用于衡量预测的准确性。

models = [LogisticRegression(), SVC(kernel='poly', probability=True), XGBClassifier()]

for i in range(3):
    models[i].fit(X_train, Y_train)

    print(f'{models[i]} : ')
    print('Training Accuracy : ', metrics.roc_auc_score(
    	Y_train, models[i].predict_proba(X_train)[:,1]))
    print('Validation Accuracy : ', metrics.roc_auc_score(
    	Y_valid, models[i].predict_proba(X_valid)[:,1]))
    print()

输出:
在这里插入图片描述
在3个模型中,我们训练的XGBClassifier性能最高,但由于训练和验证精度的差异太大,它被修剪为过拟合。但在逻辑回归的情况下,情况并非如此。

现在,让我们为验证数据绘制一个混淆矩阵。

metrics.ConfusionMatrixDisplay.from_estimator(models[0], X_valid, Y_valid)
plt.show()

在这里插入图片描述
我们可以观察到,最先进的 ML 模型所达到的准确性并不比以 50% 的概率进行简单的猜测好。造成这种情况的可能原因是缺乏数据或使用非常简单的模型来执行股票市场预测等复杂任务。

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

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

相关文章

C语言——队列的实现

队列按照先进先出(FIFO,First In First Out)的原则管理数据。这意味着最先进入队列的元素会被最先移出,类似于排队等候服务的情况。队列通常有两个主要操作:入队(enqueue),将元素添加…

DSP实时分析平台设计方案:924-6U CPCI振动数据DSP实时分析平台

6U CPCI振动数据DSP实时分析平台 一、产品概述 基于CPCI结构完成40路AD输入,30路DA输出的信号处理平台,处理平台采用双DSPFPGA的结构,DSP采用TI公司新一代DSP TMS320C6678,FPGA采用Xilinx V5 5VLX110T-1FF1136芯片&#xff…

《QT实用小工具·五十》动态增删数据与平滑缩放移动的折线图

1、概述 源码放在文章末尾 该项目实现了带动画、带交互的折线图,包含如下特点: 动态增删数值 自适应显示坐标轴数值 鼠标悬浮显示十字对准线 鼠标靠近点自动贴附 支持直线与平滑曲线效果 自定义点的显示类型与大小 自适应点的数值显示位置 根据指定锚点…

java并发编程-AQS介绍及源码详解

介绍 AQS 的全称为 AbstractQueuedSynchronizer ,就是抽象队列同步器。 从源码上可以看到AQS 就是一个抽象类,它继承了AbstractOwnableSynchronizer,实现了java.io.Serializable接口。 public abstract class AbstractQueuedSynchronizere…

redis缓存详情

redis安装包及图形化软件: 百度链接:https://pan.baidu.com/s/1wljo7JzgrSQyqldv9d5HZA?pwdht1m 提取码:ht1m 目录 1.redis的下载及安装 1.1redis的启动与停止 1.2Redis服务启动与停止 2.redis数据类型及常用指令 2.1redis数据类型 2.2redis常用…

读天才与算法:人脑与AI的数学思维笔记15_声响的数学之旅

1. 音乐 1.1. 巴赫的作品以严格的对位著称,他十分中意对称的结构 1.2. 巴托克的作品很多都以黄金比例为结构基础,他非常喜欢并善于使用斐波纳契数列 1.3. 有时,作曲家是本能地或者不自知地被数学的模式和结构所吸引,而他们并没…

Golang | Leetcode Golang题解之第61题旋转链表

题目: 题解: func rotateRight(head *ListNode, k int) *ListNode {if k 0 || head nil || head.Next nil {return head}n : 1iter : headfor iter.Next ! nil {iter iter.Nextn}add : n - k%nif add n {return head}iter.Next headfor add > …

【项目构建】04:动态库与静态库制作

OVERVIEW 1.编译动态链接库(1)编译动态库(2)链接动态库(3)运行时使用动态库 2.编译静态链接库(1)编译静态库(2)链接静态库(3)运行时使…

matlab学习007-已知离散时间系统的系统函数并使用matlab绘制该系统的零极点图;判断系统的稳定性;幅频和相频特性曲线

目录 题目 离散时间系统的系统函数:H(z)(3*z^3-5*z^210z)/(z^3-3*z^27*z-5) 1,绘制该系统的零极点图 1)零极点图 2)代码 2,判断系统的稳定性 1)判断结果 2)代码 3,试用MATL…

C++的未来之路:探索与突破

在计算机科学的浩瀚星空中,C无疑是一颗璀璨的明星。自诞生以来,它以其强大的性能和灵活的特性,赢得了无数开发者的青睐。然而,随着技术的不断进步和应用的日益复杂,C也面临着前所未有的挑战和机遇。本文将探讨C的未来之…

腾锐D2000-8 MXM VPX,全国产,可广泛应用于边缘计算网关、入侵检测、VPN、网络监控等等应用领域

腾锐D2000-8 MXM VPX 1. 概述 XMVPX-108 是一款基于飞腾 D2000/8 处理器的低功耗逻辑运算和图形处理 VPX 刀片, 板贴 32GB DDR4 内存,搭载飞腾 X100 套片,满足通用 IO 接口功能。GPU 采用 MXM 小型插卡形式, 搭配 8GB 显卡。提供…

【16-降维技术:PCA与LDA在Scikit-learn中的应用】

文章目录 前言主成分分析(PCA)原理简介Scikit-learn中的PCA实现应用示例线性判别分析(LDA)原理简介Scikit-learn中的LDA实现应用示例总结前言 降维是机器学习中一种常见的数据预处理方法,旨在减少数据集的特征数量,同时尽量保留原始数据集的重要信息。这不仅有助于减少计…

开箱子咸鱼之王H5游戏源码_内购修复优化_附带APK完美运营无bug最终版__GM总运营后台_附带安卓版本

内容目录 一、详细介绍二、效果展示2.效果图展示 三、学习资料下载 一、详细介绍 1.包括原生打包APK,资源全部APK本地化,基本上不跑服务器宽带 2.优化后端,基本上不再一直跑内存,不炸服响应快! 3.优化前端&#xff0c…

【源码阅读】Golang中的go-sql-driver库源码探究

文章目录 前言一、go-sql-driver/mysql1、驱动注册:sql.Register2、驱动实现:MysqlDriver3、RegisterDialContext 二、总结 前言 在上篇文章中我们知道,database/sql只是提供了驱动相关的接口,并没有相关的具体实现,具…

NLP 笔记:TF-IDF

TF-IDF(Term Frequency-Inverse Document Frequency,词频-逆文档频率)是一种用于信息检索和文本挖掘的统计方法,用来评估一个词在一组文档中的重要性。TF-IDF的基本思想是,如果某个词在一篇文档中出现频率高&#xff0…

不坑盒子2024.0501版,Word朗读、Word表格计算、Word中代码高亮显示行号、Excel中正则提取内容……

通过“听”来审阅Word中的内容,能轻松找出那些容易被眼看忽视的错字。 不坑盒子2024.0501版来了,很多奇妙的事情,正在发生…… 功能一览 此版本共带来10余项变动,来看看有没有你感兴趣的吧~ 接入Azure的“语音”能力 接入“语…

Flutter笔记:Widgets Easier组件库(3)使用按钮组件

Flutter笔记 Widgets Easier组件库(3):使用按钮组件 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddre…

C语言之详细讲解文件操作(抓住文件操作的奥秘)

什么是文件 与普通文件载体不同,文件是以硬盘为载体存储在计算机上的信息集合,文件可以是文本文档、图片、程序等等。文件通常具有点三个字母的文件扩展名,用于指示文件类型(例如,图片文件常常以KPEG格式保存并且文件…

JDBC连接MySQL8 SSL

1.创建用户并指定ssl连接 grant all on . to test% identified by imooc require SSL(X509); 2.查看是否使用ssl SELECT ssl_type From mysql.user Where user"test" 3.配置用户必须使用ssl ALTER USER test% REQUIRE SSL(X509); FLUSH PRIVILEGES; 注意&#xff…

Ollamallama

Olllama 直接下载ollama程序,安装后可在cmd里直接运行大模型; llama 3 meta 开源的最新llama大模型; 下载运行 1 ollama ollama run llama3 2 github 下载仓库,需要linux环境,windows可使用wsl; 接…
最新文章