股票数据集机器学习训练(全免费!)

一、课题简介

可以直接当机器学习课设。

股票涨跌预测,选用了一个具有3556行数据,25个特征的真实csv数据集,我将会为此数据集在jupyter 上使用机器学习相关Python库进行数据集的读取分析,根据具体的情况进行数据预处理,步骤包含缺失值重复值检测,选取与目标涨跌%%相关的特征重新定义新数据集,标准化,pca主成分降维,拆分训练集数据和测试集数据。

我根据此数据集的复杂度选取了随机森林机器学习模型和支持向量机模型进行建模,首先进行交叉验证与网格搜索结合和网格搜索不断的训练评估,选取它们的最优参数,然后得出它们在训练集和测试集评分,用模型预测测试集,得出模型均方误差,最后绘制出预测值和实际值的对比图,加上标题和图例。

二、数据准备

首先导入pandas和numpy,再从sklearn里面导出数据拆分模块和标准化模块。还有均方误差评估模块和matplotlib画图模块,添加上能够正常显示中文的两行代码

#导入模块
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans  
from sklearn.metrics import silhouette_score  
from sklearn.metrics import mean_squared_error

from matplotlib import pyplot as plt 
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False

数据收集:

用pandas里面的read_csv来导入数据集。指定格式为gb k能够正常显示中文。data.dropna(inplace=True),将数据集中包含缺失值的行进行删除,并替代原数据集,然后显示数据集的前五行。

# 数据读取
data = pd.read_csv(
   "C:\\Users\\nhean\\Desktop\\股票数据.csv",
     encoding='gbk')
data.dropna(inplace=True)
data.head()
代码名称涨幅%%现价涨跌买价卖价总量现量涨速%%...总金额量比振幅%%均价内盘外盘内外比买量卖量开盘金额
01平安银行2.8911.050.3111.0511.062110243171250.00...23313582081.894.5611.0597303011372120.86354796514028900
12万 科A-0.6124.30-0.1524.3024.3168323686150.04...16715767040.903.8924.473392873439490.995635942508800
24国农科技0.3815.900.0615.9015.912243500.19...35690430.332.4615.91104212010.87271371600
35世纪星源-0.342.94-0.012.932.945790112750.34...170880520.862.712.9536647212531.7213909263300
46深振业A0.885.700.055.705.7141303063520.18...2369362880.715.135.741982432147870.9211931344847100

5 rows × 26 columns

打印详情可以看到有多少行数据集,有多少个特征,和有没有缺失值

#打印详情
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3556 entries, 0 to 3555
Data columns (total 26 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   代码      3556 non-null   int64  
 1   名称      3556 non-null   object 
 2   涨幅%%    3556 non-null   float64
 3   现价      3556 non-null   float64
 4   涨跌      3556 non-null   float64
 5   买价      3556 non-null   float64
 6   卖价      3556 non-null   float64
 7   总量      3556 non-null   int64  
 8   现量      3556 non-null   int64  
 9   涨速%%    3556 non-null   float64
 10  换手%%    3556 non-null   float64
 11  今开      3556 non-null   float64
 12  最高      3556 non-null   float64
 13  最低      3556 non-null   float64
 14  昨收      3556 non-null   float64
 15  市盈(动)   3556 non-null   float64
 16  总金额     3556 non-null   int64  
 17  量比      3556 non-null   float64
 18  振幅%%    3556 non-null   float64
 19  均价      3556 non-null   float64
 20  内盘      3556 non-null   int64  
 21  外盘      3556 non-null   int64  
 22  内外比     3556 non-null   float64
 23  买量      3556 non-null   int64  
 24  卖量      3556 non-null   int64  
 25  开盘金额    3556 non-null   int64  
dtypes: float64(16), int64(9), object(1)
memory usage: 722.4+ KB
检测重复值显示为零不用进行处理
#重复值检测,无重复
data.duplicated().sum()
0

用 corr() 方法计算每对属性之间的皮尔逊相关系数。相关系数范围 [-1, 1] ,越接近 1 表示有越强的正相关,越接近 -1 表示有越强的负相关。具体看每个属性与房价中位数的相关性。,为负数的可以删去

new_data1= data.drop(['代码', '名称'], axis=1)
#用 corr() 方法计算每对属性之间的皮尔逊相关系数。相关系数范围 [-1, 1] ,越接近 1 表示有越强的正相关,越接近 -1 表示有越强的负相关。
cor=new_data1.corr()
#具体看每个属性与房价中位数的相关性。
cor['涨幅%%'].sort_values(ascending=False)
幅%%     1.000000
涨跌       0.699442
振幅%%     0.364492
量比       0.263082
买量       0.231196
换手%%     0.104710
涨速%%     0.097853
买价       0.064713
外盘       0.062571
最高       0.057390
最低       0.052498
现价       0.050793
今开       0.048643
均价       0.047879
昨收       0.037048
总金额      0.035917
总量       0.033600
卖价       0.031857
市盈(动)    0.025833
内盘      -0.003812
开盘金额    -0.020553
现量      -0.028021
内外比     -0.085523
卖量      -0.171343
Name: 涨幅%%, dtype: float64

用data.drop删除与分类数无关的特征与我们要预测的涨幅%%特征,axis=1指定删除列 储存在new_data中显示头部5行

new_data = data.drop(['代码', '名称','涨幅%%','内盘','现量','卖量','内外比','开盘金额','卖量'], axis=1)
new_data.head()
现价涨跌买价卖价总量涨速%%换手%%今开最高最低昨收市盈(动)总金额量比振幅%%均价外盘买量
011.050.3111.0511.0621102430.001.2310.7811.2710.7810.747.0923313582081.894.5611.0511372123547
124.30-0.1524.3024.316832360.040.7024.5024.9023.9524.4514.7016715767040.903.8924.47343949563
215.900.0615.9015.9122430.190.2715.8016.1215.7315.84336.5335690430.332.4615.911201271
32.94-0.012.932.94579010.340.612.962.992.912.95191.01170880520.862.712.95212531390
45.700.055.705.714130300.183.065.615.885.595.659.252369362880.715.135.742147871193

拆分数据集:

我们选择new_data作为特征,'涨幅%%'作为标签,用train_test_split,按测试集占百分之二十拆分,随机种子为42号,这样重新加载不会改变拆分结果

# 特征选择
# 假设我们选择以下列作为特征,'涨幅%%'作为标签
features = new_data
labels = data['涨幅%%']
# 拆分数据集为训练集测试集
# test_size: 测试集的比例
# random_state: 随机种子,确保结果可复现
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)
# 查看分割后的数据集大小
print(X_train.shape, X_test.shape)

(2844, 18) (712, 18)

三、数据预处理

标准化:

使用StandardScaler()进行标准化,对训练集进行训练和数据转换,对测试集进行数据转换,定义转换对象,无报错成功转换

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

PCA降维:

导入pca,设置主成分为2,对标准化后的训练集进行拟合,对标准化后的训练集数据进行降维,对标准化后的测试集数据进行降维,最后打印维度,降维成功

#导入pca
from sklearn.decomposition import PCA
#设置主成分为2
pca=PCA(n_components=2)
#对标准化后的训练集进行拟合
pca.fit(X_train_scaled)
#对标准化后的训练集数据进行降维
X_train_pca=pca.transform(X_train_scaled)
#对标准化后的测试集数据进行降维
X_test_pca=pca.transform(X_test_scaled)
print('降维后训练集的维度为:',X_train_pca.shape)
print('降维后测试集的维度为:',X_test_pca.shape)
降维后训练集的维度为: (2844, 2)
降维后测试集的维度为: (712, 2)

四、建模与评估

模型选取:

鉴于这是一个拥有多个特征和三千多条数据的股票数据集,我选择的第一个模型是支持向量机它在高维数据(股票数据有多种特征)中有优势,能有效处理非线性关系,找到合适的决策边界,对股票价格走势等复杂关系进行分类或预测,第二个模型是随机森林,它可以处理大量的特征,并且能够评估特征的重要性,在复杂的股票数据中筛选出对股价波动等关键因素有重要影响的特征,还能有效减少过拟合,提高模型的泛化能力。

模型1随机森林:

使用到了交叉验证与网格搜索结合的方法,从sklearn导入cross_val_score和随机森林模块,定义一个最高分best_score,随机森林有两个参数分别为n_estimator和random_state,它们分别为n和r,遍历这2个列表,内的参数是不断调优后得到的,原理是不断地训练验证打印最高分存在best_score里面,最后输出它的最优参数

#交叉验证评估与网格搜索结合
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestRegressor
best_score=0
for n in [340,344,350]:
    for r in [1,2,5]:
        model1= RandomForestRegressor(n_estimators=n, random_state=r)
        scores=cross_val_score(model1,X_train_scaled,y_train,cv=5)
        score=np.mean(scores)
        if score>best_score:
            best_score=score
            best_params={'n_estimators':n,'random_state':r}
print('交叉验证的最高分:{:.3f}'.format(best_score))
print('最优参数:{}'.format(best_params))

交叉验证的最高分:0.950
最优参数:{'n_estimators': 350, 'random_state': 2}

根据上面的选取参数进行最终建模,打印训练集和测试集评分,用测试集进行模型预测计算出均方误差并打印

# 根据交叉验证评估得出的最优参数建模
model1 = RandomForestRegressor(n_estimators=350, random_state=2)
model1.fit(X_train_scaled, y_train)
#评估模型
print('训练集评分:{:.2f}'.format(model1.score(X_train_scaled,y_train)))
print('测试集评分:{:.2f}'.format(model1.score(X_test_scaled ,y_test)))
# 模型预测
predictions = model1.predict(X_test_scaled)
 
# 计算均方误差
svr_mse = mean_squared_error(y_test, predictions)
 
print(f"模型的均方误差: {svr_mse:.2f}")
训练集评分:0.99
测试集评分:0.93
模型的均方误差: 0.30

模型2支持向量机:

用网格搜索查找最优参数,支持向量机模型有两个参数,gamma和C,定义列表遍历他们不断地用svm训练打印得分评估,储存在best_score里面,最终打印最高得分和他的参数

#网格搜索找最优参数
from sklearn.svm import SVR
best_score=0
for gamma in [0.001,0.01,0.1,1,10]:
    for C in [90,100,120]:
        svm=SVR(gamma=gamma,C=C)
        svm.fit(X_train_scaled,y_train)
        score=svm.score(X_test_scaled,y_test)
        if score>best_score:
            best_score=score
            best_params={'gamma':gamma,'C':C}
print('模型最高分:{:.3f}'.format(best_score))
print('最优参数:{}'.format(best_params))
模型最高分:0.946
最优参数:{'gamma': 0.01, 'C': 120}

根据上面的选取参数进行最终建模,打印训练集和测试集评分,用测试集进行模型预测计算出均方误差并打印

from sklearn.svm import SVR
# 用最优参数训练支持向量回归模型
svr_model = SVR(kernel='rbf', C=120, gamma=0.01)
svr_model.fit(X_train_scaled, y_train)
 
# 模型预测
svr_predictions = svr_model.predict(X_test_scaled)
 
# 计算均方误差
svr_mse = mean_squared_error(y_test, svr_predictions)
 
print(f"SVR模型的均方误差: {svr_mse:.2f}")
#评估模型
print('训练集评分:{:.2f}'.format(svr_model.score(X_train_scaled,y_train)))
print('测试集评分:{:.2f}'.format(svr_model.score(X_test_scaled,y_test)))
SVR模型的均方误差: 0.22
训练集评分:0.97
测试集评分:0.95

五、结果分析与展示

模型分析图示:

模型1:

plt.figure(figsize=(10, 6)) 定义图的大小,plt.plot(y_test.values, label='实际值', color='blue')用测试集的值,画出实际值曲线,颜色为蓝色,plt.plot(predictions, label='预测值', linestyle='--', color='red')用预测的结果,画出预测值曲线,线型为虚线,颜色为红色方便对比观察。

# 绘制实际值与预测值对比图
plt.figure(figsize=(10, 6))
plt.plot(y_test.values, label='实际值', color='blue')
plt.plot(predictions, label='预测值', linestyle='--', color='red')
plt.xlabel('样本点')
plt.ylabel('涨幅')
plt.title('股票涨幅实际值与预测值对比')
plt.legend()
plt.grid()
plt.show()

模型2:

代码与上面一样,改变了预测值画图的这一行代码,plt.plot(svr_predictions, label='SVR预测值', linestyle='--', color='red'),绘出svr_predictions的数值曲线

# 绘制实际值与预测值对比图
plt.figure(figsize=(10, 6))
plt.plot(y_test.values, label='实际值', color='blue')
plt.plot(svr_predictions, label='SVR预测值', linestyle='--', color='red')
plt.xlabel('样本点')
plt.ylabel('收盘价')
plt.title('股票收盘价实际值与预测值对比')
plt.legend()
plt.grid()
plt.show()

市值 Market capitalization of Tencent (TCEHY) Market cap: $641.59 Billion USD 截至 2025 年 7 月,腾讯的市值为 6415.9 亿美元。根据我们的数据,这使腾讯成为全球市值排名第 17 位的最有价值公司。市值,通常称为市值,是上市公司流通股的总市值,通常用于衡量公司的价值。 收入 Revenue for Tencent (TCEHY) Revenue in 2022: $82.08 Billion USD 根据腾讯最新的财报,该公司目前的收入(TTM)为861.9亿美元。2022 年,该公司的收入为 820.8 亿美元,比 2021 年的 867.8 亿美元有所下降。收入是公司通过销售商品或服务产生的收入总额。与收益不同,不会减去任何费用。 收益 Earnings for Tencent (TCEHY) Earnings in 2022: $32.29 Billion USD 根据腾讯最新的财报,该公司目前的收益为861.9亿美元。2022 年,该公司的收益为 322.9 亿美元,低于 2021 年的 397.3 亿美元。此页面上显示的收益是公司的税前收入。 根据不同来源的日终市值 2025年7月23日,据报道,腾讯的市值为: 6383.2 亿美元(按公司计)市值 内容 地理:中国 时间段:2010年1月-2025年7月 分析单位:腾讯股票数据2025 变量 变量 描述 日期 日期 打开 开盘价。 高 当天的最高价格。 低 当天的最低价格。 关闭 收盘价,根据拆分进行调整。 adj_close 调整所有适用的拆分和股息分配后的收盘价。数据使用适当的分割乘数和股息乘数进行调整,并遵守证券价格研究中心 (CRSP) 标准。 卷 当天交易的股票数量。
阿里巴巴团最新股票数这个数据,主要包含了阿里巴巴团,即“Alibaba”)相关的新闻信息。 数据内容:该数据通常包含以下字段: 新闻标题:每条新闻的标题,简要概括新闻的核心内容。 新闻内容:新闻的正文部分,详细描述了事件的背景、发展和相关细节。 发布时间:新闻发布的具体时间戳,用于追踪新闻的时效性。 来源:新闻的发布媒体或平台,帮助用户了解信息的来源渠道。 标签:可能包含一些用于分类的标签,例如新闻的类型(财经、科技等)或情感倾向(正面、负面等)。 数据用途:阿里巴巴团最新股票数数据可以用于多种研究和应用: 自然语言处理(NLP)任务:如文本分类、情感分析、主题建模等。通过对新闻标题和内容的分析,可以训练模型来自动分类新闻类型或判断新闻的情感倾向。 新闻趋势分析:通过分析发布时间和新闻内容,可以研究阿里巴巴相关事件的舆情变化和市场反应。 数据挖掘:可以挖掘新闻中提到的关键信息,如人物、地点、事件等,用于构建知识图谱或进行关联分析。 数据特点 时效性强:由于新闻数据与时间密切相关,该数据可以帮助研究者了解特定时间段内的事件动态。 信息丰富:包含新闻的标题、正文、发布时间等多维度信息,为分析提供了丰富的素材。 应用场景广泛:适合用于学术研究、商业分析、舆情监测等多个领域。 使用建议 在使用该数据时,需要注意以下几点: 数据清洗:新闻数据可能存在噪声,如错别字、格式不一致等问题,需要进行预处理。 合规性:确保使用数据时遵守相关法律法规和数据使用协议。 数据更新:新闻是动态的,如果需要最新的信息,建议定期更新数据。 总之,阿里巴巴团最新股票数是一个具有较高价值的新闻数据,适合多种研究和应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值