ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于多种机器学习算法的股票价格预测Python源码实战:逻辑回归、ANN、随机森林、SVM全流程解析

基于多种机器学习算法的股票价格预测Python源码实战:逻辑回归、ANN、随机森林、SVM全流程解析 简介这份资源面向计算机、人工智能、通信工程等专业的在校学生与项目实战学习者提供一套基于多种机器学习算法进行股票价格预测的Python完整实现可用于毕业设计、课程设计或期末大作业参考。包内共20个文件以6个py源码、5个csv与3个xlsx数据文件为主另含bat批处理脚本、dot决策树结构图、png可视化结果及md说明文档压缩包约3.66MB结构清晰便于按模块查阅。项目覆盖人工神经网络、逻辑回归、随机森林、支持向量机等算法的建模与对比并配有训练测试数据、归一化数据及预测结果文件方便读者直接运行、复现实验并观察不同算法的预测表现。目前已有328人学习下载代码均经测试运行成功答辩评审平均分达96.5分适合在此基础上修改扩展完成算法对比、结果可视化与论文撰写等任务。1. 从一份 96.5 分的股票预测毕设说起这套源码到底能跑出什么股票价格预测这个题目每年毕业季都会被翻出来做一遍但真正能把人工神经网络、逻辑回归、随机森林三条线都跑通、还留下完整数据管道的项目并不多。我手上这份基于多种机器学习算法进行股票价格预测python实现源码数据.zip解压后第一眼看到的不是一堆散乱脚本而是Logistic.py、ANN.py、random forest.py、SVM.py四个模型文件并列外加clean.bat、graph.bat两个批处理入口以及从小组作业数据-2021.xlsx一路派生到normalized_train_test.csv、predict_result.csv的完整中间产物。它解决的不是预测明天涨跌这种玄学问题而是把一份原始行情表格经过清洗、归一化、训练测试切分喂给四种算法最后输出可对比的预测结果和可视化图。适合正在做机器学习课程设计、期末大作业或者想找一个能直接改参数、换数据就能复现的实战基线的人。评审 96.5 分这个数字背后真正值钱的是那条从clean.bat到result.py的流水线而不是某个模型的准确率小数点。2. 数据管道拆解从 xlsx 到 normalized_train_test.csv 的每一步拿到这份源码最忌讳的就是直接python ANN.py一把梭。四个模型脚本都依赖同一套预处理产物如果中间某个 csv 缺失或列名对不上报错会指向模型文件让你误以为是算法写错了。所以先把数据管道捋清楚比调参重要得多。2.1 原始数据长什么样clean.bat 到底干了什么小组作业数据-2021.xlsx是唯一的原始输入小组作业数据-2021_bak.xlsx是它的备份说明作者在清洗前留了后悔药。clean.bat是一个 Windows 批处理入口通常里面就一行调用 Python 清洗脚本或者直接调用 pandas 做列筛选和缺失值处理。我一般会先手动打开 xlsx 看一眼列结构确认日期列、收盘价列、成交量列的名字因为后面所有脚本都靠列名索引。# clean.bat 典型内容先看它调了哪个 py type clean.bat # 输出类似python clean_data.py # 如果没有 clean_data.py说明清洗逻辑内嵌在某个模型脚本里如果clean.bat指向的脚本不存在别慌常见做法是把清洗逻辑补在result.py或单独建一个preprocess.py。清洗的核心动作无非三件去掉停牌日产生的空行、把日期列转成 datetime 并排序、把不需要的字符串列如股票代码剔除。做完之后应该得到一个行数略少于原始 xlsx 的干净表。2.2 归一化与 train_test 切分normalized_train_test.csv 的生成逻辑normalized_train_test.csv这个名字透露了两个动作归一化 训练测试合并存储。很多同学在这里翻车是因为把归一化放在了切分之后导致测试集的信息泄漏到训练集。正确顺序是先按时间切分再对训练集 fit 归一化参数然后 transform 测试集。但这份源码为了简化大概率是对全量数据做了 MinMax 归一化再切分这在课程设计里能过但在严谨场景下是踩坑点。import pandas as pd from sklearn.preprocessing import MinMaxScaler # 读取清洗后的数据 df pd.read_csv(train_test.csv) # 假设特征列是 Open/High/Low/Close/Volume目标列是 Close 的下一日 feature_cols [Open, High, Low, Close, Volume] scaler MinMaxScaler() df[feature_cols] scaler.fit_transform(df[feature_cols]) # 按 8:2 切分shuffleFalse 保证时间顺序 split int(len(df) * 0.8) train, test df[:split], df[split:] train.to_csv(normalized_train_test.csv, indexFalse)这段代码的关键参数是shuffleFalse时间序列绝对不能随机打乱否则模型会偷看未来数据。MinMaxScaler把每列压到 0 到 1 之间对神经网络尤其重要因为 ANN 对输入尺度敏感不归一化的话梯度会炸。normalized_predict.csv则是预测阶段对新输入做同样变换后的产物注意它必须复用训练阶段的 scaler不能重新 fit。2.3 四个模型脚本的输入输出约定Logistic.py、ANN.py、random forest.py、SVM.py这四个文件输入都是normalized_train_test.csv输出各自写一份预测结果最后由result.py汇总成predict_result.csv和predict.csv。SBS.py从名字看是 Sequential Backward Selection做特征筛选的可能被某个模型调用。RF.dot、RF.png、RF_old.dot是随机森林的可视化产物graph.bat负责调用 graphviz 把 dot 转成 png。文件角色输入输出clean.bat清洗入口xlsxtrain_test.csvLogistic.py逻辑回归模型normalized_train_test.csv预测列ANN.py神经网络模型normalized_train_test.csv预测列random forest.py随机森林模型normalized_train_test.csv预测列SVM.py支持向量机模型normalized_train_test.csv预测列result.py结果汇总各模型输出predict_result.csvgraph.bat可视化RF.dotRF.png提示先跑clean.bat再确认normalized_train_test.csv存在且列数正确最后才动模型脚本。顺序错了报错信息会误导你半天。3. 四个模型逐个跑通逻辑回归、ANN、随机森林、SVM 的参数与坑数据管道通了之后四个模型脚本可以独立运行互不依赖。但每个脚本都有自己的脾气尤其是 ANN 和随机森林参数设错直接导致结果不可用。这一章按先跑通再调优的顺序把每个模型的入口、关键参数和常见报错过一遍。3.1 逻辑回归做股票预测为什么它还能用Logistic.py用的是逻辑回归但股票价格是连续值逻辑回归本职是分类。所以这里大概率是把预测问题转成了涨/跌二分类或者用回归模式跑。如果是分类标签需要从收盘价差分生成 0/1如果是回归得用LinearRegression而不是LogisticRegression。看代码时先确认这一点否则准确率会低得离谱。from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score import pandas as pd df pd.read_csv(normalized_train_test.csv) # 构造二分类标签下一日收盘价高于当日为 1否则为 0 df[label] (df[Close].shift(-1) df[Close]).astype(int) df df.dropna() X df[[Open, High, Low, Volume]] y df[label] split int(len(df) * 0.8) model LogisticRegression(max_iter1000) model.fit(X[:split], y[:split]) pred model.predict(X[split:]) print(Accuracy:, accuracy_score(y[split:], pred))max_iter1000是必须调的默认 100 次迭代在归一化数据上经常不收敛会报ConvergenceWarning。逻辑回归的损失函数是对数损失对异常值敏感所以前面归一化没做好这里准确率会掉到 50% 附近跟抛硬币差不多。常见做法是先用它做基线别指望它跑赢随机森林。3.2 ANN 神经网络层数、激活函数与过拟合ANN.py是这份源码里最需要调参的文件。股票数据噪声大网络层数多了立刻过拟合训练集准确率 99%测试集惨不忍睹。我一般先用一层隐藏层、神经元数量取特征数的 2 到 3 倍试水。from sklearn.neural_network import MLPRegressor import pandas as pd from sklearn.metrics import mean_squared_error df pd.read_csv(normalized_train_test.csv) X df[[Open, High, Low, Volume]] y df[Close] split int(len(df) * 0.8) # hidden_layer_sizes(64,) 表示一层 64 个神经元 model MLPRegressor(hidden_layer_sizes(64,), activationrelu, solveradam, max_iter2000, early_stoppingTrue, random_state42) model.fit(X[:split], y[:split]) pred model.predict(X[split:]) print(MSE:, mean_squared_error(y[split:], pred))early_stoppingTrue是防过拟合的关键它会自动留出验证集验证损失不降就停。random_state42保证每次跑结果一致不然答辩时两次结果对不上很尴尬。activationrelu比tanh收敛快但输出层如果是回归默认是 identity不用改。如果 MSE 一直在 0.01 以上下不来检查归一化是不是漏了 Volume 列成交量量级和价格差几个数量级不归一化 ANN 直接废。3.3 随机森林n_estimators 与 RF.dot 可视化random forest.py跑起来最省心但n_estimators设多少有讲究。设 10 棵树结果抖动大设 1000 棵跑一次几分钟课程设计答辩等不起。我一般设 100 到 200 之间兼顾稳定和速度。RF.dot和RF.png是随机森林里某棵树的可视化graph.bat负责转换。from sklearn.ensemble import RandomForestRegressor import pandas as pd from sklearn.metrics import r2_score df pd.read_csv(normalized_train_test.csv) X df[[Open, High, Low, Volume]] y df[Close] split int(len(df) * 0.8) model RandomForestRegressor(n_estimators150, max_depth8, random_state42, n_jobs-1) model.fit(X[:split], y[:split]) pred model.predict(X[split:]) print(R2:, r2_score(y[split:], pred))max_depth8是限制树深不限制的话每棵树长到叶子只有一个样本过拟合没商量。n_jobs-1用满所有 CPU 核能快不少。graph.bat里通常是dot -Tpng RF.dot -o RF.png前提是系统装了 graphviz 并配了环境变量没装的话RF.png不会生成但不影响预测结果。3.4 SVM 与 SBS 特征筛选小样本下的取舍SVM.py和SBS.py经常一起出现SBS 做后向特征消除帮 SVM 挑特征。股票数据样本量通常几千行SVM 用 RBF 核还能跑但参数C和gamma不调的话要么欠拟合要么过拟合。from sklearn.svm import SVR from sklearn.feature_selection import SequentialFeatureSelector from sklearn.linear_model import LinearRegression import pandas as pd df pd.read_csv(normalized_train_test.csv) X df[[Open, High, Low, Volume]] y df[Close] split int(len(df) * 0.8) # SBS 特征筛选cv3 三折交叉验证 sbs SequentialFeatureSelector(LinearRegression(), n_features_to_select3, cv3) sbs.fit(X[:split], y[:split]) X_sel sbs.transform(X) model SVR(C1.0, gammascale) model.fit(X_sel[:split], y[:split]) pred model.predict(X_sel[split:])n_features_to_select3表示从 4 个特征里选 3 个SBS 会告诉你哪个特征最没用。gammascale是 sklearn 的默认自适应值比手动设 0.1 稳。SVM 训练慢如果数据超过一万行建议先抽样再跑不然答辩现场等它收敛很煎熬。注意四个模型脚本的输出列名要统一result.py汇总时如果列名对不上predict_result.csv会缺列或错位。跑完每个脚本后打开输出 csv 确认列名一致。4. 避坑与排查跑这套源码最容易翻车的五个地方这份源码在作者机器上跑通了不代表在你机器上能直接跑。环境差异、路径写法、库版本都会导致翻车。下面五条是我实际拆解时遇到或预判到的高频问题按现象 → 原因 → 解决整理。4.1 现象运行 clean.bat 一闪而过train_test.csv 没生成原因批处理里调用的 Python 脚本路径是相对路径而你在别的目录双击了 bat或者系统 Python 没加入 PATHpython命令不识别。解决在 bat 所在目录打开 cmd手动执行python clean_data.py看报错确认python --version能输出版本号不行就重装 Python 并勾选 Add to PATH。4.2 现象ANN.py 报 ConvergenceWarningMSE 居高不下原因max_iter默认 200 不够或者归一化没做Volume 列量级压过了价格列。解决把max_iter提到 2000 以上加early_stoppingTrue检查normalized_train_test.csv里每列的最大值是否都在 1 附近如果 Volume 列还是几千说明归一化漏了它。4.3 现象random forest.py 跑完 R2 是负数原因max_depth没限制树长得太深在测试集上完全过拟合或者训练测试切分时shuffleTrue时间顺序被打乱。解决设max_depth在 5 到 10 之间确认切分代码里shuffleFalse时间序列不能随机打乱。4.4 现象graph.bat 执行后 RF.png 不出现原因系统没装 graphviz或者装了但dot命令不在 PATH 里。解决去 graphviz 官网下载安装包安装时勾选 Add to PATH重启 cmd 后执行dot -V确认版本。实在搞不定就跳过可视化不影响预测结果。4.5 现象result.py 汇总时报 KeyError 或列错位原因四个模型脚本输出的 csv 列名不一致有的叫pred有的叫prediction有的多了一列索引。解决统一在每个模型脚本里用to_csv(xxx.csv, indexFalse)列名固定为pred打开 result.py 看它读的是哪几个文件、按什么列合并逐个对齐。5. 从跑通到改出花换数据、调参数与答辩演示的实用技巧跑通只是起点这套源码真正的价值在于它是一个可替换数据、可调参数的基线框架。答辩时老师最爱问换个股票还能不能用这时候你现场改一行数据路径、重跑一遍比背十页 PPT 都管用。5.1 换一份股票数据要改哪几个地方原始数据是小组作业数据-2021.xlsx换成你自己的行情表需要保证列名和它一致。如果列名不同改clean.bat调用的清洗脚本里的列名映射或者在 pandas 读取后统一df.columns [Date,Open,High,Low,Close,Volume]。日期列格式也要统一pd.to_datetime能兼容大部分格式但遇到2021/1/1和2021-01-01混用会报错先统一成一种。# 换数据后的快速校验 import pandas as pd df pd.read_excel(你的数据.xlsx) print(df.columns.tolist()) print(df.shape) print(df.isnull().sum()) # 确认无空值、列名匹配后再跑 clean.bat5.2 参数调优的优先级先动哪个后动哪个四个模型里随机森林的n_estimators和max_depth对结果影响最大优先调ANN 的hidden_layer_sizes次之逻辑回归和 SVM 在归一化做好的前提下默认参数就能出合理结果。调参时用固定random_state每次只改一个参数记录 R2 或 MSE 变化别一次改三个否则不知道是谁的功劳。模型优先调参建议范围影响随机森林max_depth5-10过拟合控制随机森林n_estimators100-200稳定性ANNhidden_layer_sizes(32,)-(128,)拟合能力ANNearly_stoppingTrue防过拟合SVMC0.1-10惩罚强度逻辑回归max_iter1000收敛5.3 答辩演示的稳妥流程答辩现场最怕现场跑代码翻车。我的习惯是提前把normalized_train_test.csv、predict_result.csv、RF.png都生成好演示时只跑result.py做汇总展示或者直接打开predict_result.csv讲结果对比。如果老师要求现场跑先跑随机森林它最快最稳ANN 留到最后万一卡住就说神经网络训练较慢结果已提前保存。从那以后我每次答辩前都强制走一遍断网 清空输出目录 重跑的流程确认不依赖任何临时文件。希望帮到你。本文还有配套的精品资源点击获取
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进