A股机器学习预测源码包实战:从数据落库到LSTM回测的完整流水线
简介这份资源面向对量化投资与机器学习感兴趣的开发者、金融数据分析学习者提供一套完整的A股股票走势预测系统源码帮助理解如何用算法从历史行情中挖掘价格变动规律。压缩包共12个文件约2.53MB包含6个ipynb交互式笔记、3个csv行情数据、2个py脚本及1个gitignore配置覆盖数据获取、特征工程、模型训练与回测等环节。笔记中涉及K线数据入库、小市值结合盈利指标过滤策略、FFT滤波、单层与改进LSTM建模以及sklearn单票回测等实践内容脚本则负责行情数据抓取与特征生成csv文件提供可直接运行的样本数据。目前已有307人学习下载适合希望从零搭建预测流程、对照代码复现实验并理解金融时序建模思路的读者参考。1. 从一份 A 股预测源码包说起它到底能不能跑出可用信号打开这份压缩包第一眼看到的不是一篇论文而是一堆散落的.ipynb和.py保存K线数据到数据库.ipynb、newfeature.py、验证小市值结合盈利指标过滤策略.ipynb、fft-filter.ipynb、singlelstm.ipynb、singlelstm2.ipynb、sklearn机器学习单票回测.ipynb外加600256.csv、002475.csv、xmm.csv三份样本数据和getstockcsv.py。这不是一个封装好的“一键预测涨停”软件而是一套从数据落库、特征工程、频域滤波到 LSTM 与 sklearn 回测的完整实验流水线。它真正能解决的问题是让你在一台普通笔记本上用真实 A 股日线数据把“机器学习算法预测股票走势”这件事从数据到回测跑通一遍而不是停留在调包跑个train_test_split就宣称能预测。适合谁适合已经会 Python、懂一点 pandas但没把金融时序的坑踩全的从业者也适合想拿一套可改可扩的骨架去验证自己因子想法的人。如果你指望它直接给出明天买哪只那这份源码会让你失望——它的价值在流程不在信号。2. 数据管道与特征工程从 K 线落库到 newfeature.py 的因子拼装2.1 保存K线数据到数据库为什么先落库再谈模型很多人拿到 CSV 就直接pd.read_csv然后喂模型跑得通但换一只票、换一个时间段就乱套。这份源码里第一个 notebook 叫保存K线数据到数据库.ipynb思路是对的先把原始行情固化到本地数据库后续所有实验都从同一份数据源取避免“这次用前复权、下次用后复权”导致的玄学差异。常见做法是用 SQLite零配置、单文件、够用。下面是我一般会写的落库骨架和源码里的思路一致只是补上了字段类型和索引。import sqlite3 import pandas as pd # 假设 getstockcsv.py 已经拉到了日线数据列包含 date, open, high, low, close, volume df pd.read_csv(600256.csv, parse_dates[date]) conn sqlite3.connect(astock.db) # 建表时把 date 和 code 做成联合主键防止重复插入 conn.execute( CREATE TABLE IF NOT EXISTS daily_kline ( code TEXT NOT NULL, date TEXT NOT NULL, open REAL, high REAL, low REAL, close REAL, volume REAL, PRIMARY KEY (code, date) ) ) # 用 INSERT OR REPLACE重复跑不会炸 df[code] 600256 df.to_sql(daily_kline, conn, if_existsappend, indexFalse, methodlambda table, conn, keys, data_iter: conn.executemany( fINSERT OR REPLACE INTO {table.name} ({,.join(keys)}) fVALUES ({,.join([?]*len(keys))}), data_iter)) conn.commit()逻辑说明parse_dates保证日期是时间类型而不是字符串否则后面按时间切片会得到错误结果联合主键(code, date)是血泪经验少了它同一只票重复拉取就会在回测里出现重复行收益率直接翻倍。参数上if_existsappend配合INSERT OR REPLACE才能做到幂等否则第二次跑就报主键冲突。getstockcsv.py负责从数据源拉取并生成 CSV具体数据源各人有各人的渠道源码里没有绑定某一家你替换成自己可用的接口即可。2.2 newfeature.py 里的特征拼装别把未来函数混进去newfeature.py是整份源码里最值得逐行读的文件因为它决定了模型能看到什么。金融时序特征工程最大的坑是未来函数——用当天收盘价算出来的指标如果被当成“预测当天”的输入回测收益会好到不真实。常见做法是所有特征在计算后统一shift(1)让第 t 行只包含 t-1 及之前的信息。下面这段是我在newfeature.py基础上整理出的最小可用特征集覆盖动量、波动和均线偏离。import pandas as pd import numpy as np def build_features(df): df df.sort_values(date).reset_index(dropTrue) # 收益率类过去 1/5/10 日收益 for n in [1, 5, 10]: df[fret_{n}] df[close].pct_change(n) # 波动类过去 5/20 日收益率标准差 df[vol_5] df[ret_1].rolling(5).std() df[vol_20] df[ret_1].rolling(20).std() # 均线偏离收盘价相对 5/20 日均线的偏离度 df[ma_5] df[close].rolling(5).mean() df[ma_20] df[close].rolling(20).mean() df[bias_5] (df[close] - df[ma_5]) / df[ma_5] df[bias_20] (df[close] - df[ma_20]) / df[ma_20] # 标签下一日涨跌1 为涨0 为跌 df[label] (df[close].shift(-1) df[close]).astype(int) # 关键一步所有特征整体下移一行杜绝未来函数 feature_cols [c for c in df.columns if c not in [date, label, code]] df[feature_cols] df[feature_cols].shift(1) return df.dropna().reset_index(dropTrue)逻辑说明pct_change(n)算的是 n 日累计收益rolling().std()算滚动波动bias衡量价格偏离均线的程度这三个维度基本覆盖了短线走势的主要信息。参数上窗口 5 和 20 是日线级别的常用值想更敏感就改小想更平滑就改大但别低于 3否则噪声占主导。最后整体shift(1)是保命操作少了它你的回测曲线会漂亮到让你怀疑人生实盘一上就翻车。fft-filter.ipynb则是在这基础上做频域滤波用 FFT 把价格序列的低频趋势和高频噪声分离只保留趋势分量作为额外特征适合想减少震荡假信号的人。3. 模型训练与回测singlelstm 与 sklearn 单票回测怎么落地3.1 singlelstm.ipynb 的序列构造与训练参数singlelstm.ipynb和singlelstm2.ipynb是两份 LSTM 实验区别通常在序列长度、层数或是否加入注意力。LSTM 用于股票走势预测的核心问题是它需要三维输入(样本数, 时间步, 特征数)而很多人直接把二维 DataFrame 塞进去报错后才开始翻文档。下面是我从源码里提炼出的序列构造和训练骨架用 Keras 写参数都是可改的。import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense, Dropout def make_sequences(features, labels, time_steps20): X, y [], [] for i in range(time_steps, len(features)): X.append(features[i-time_steps:i]) y.append(labels[i]) return np.array(X), np.array(y) # features 是 build_features 输出的特征矩阵labels 是 label 列 X, y make_sequences(features.values, labels.values, time_steps20) split int(len(X) * 0.8) X_train, X_test X[:split], X[split:] y_train, y_test y[:split], y[split:] model Sequential([ LSTM(64, input_shape(X.shape[1], X.shape[2]), return_sequencesFalse), Dropout(0.3), Dense(1, activationsigmoid) ]) model.compile(optimizeradam, lossbinary_crossentropy, metrics[accuracy]) model.fit(X_train, y_train, epochs30, batch_size32, validation_split0.1, verbose1)逻辑说明time_steps20表示用过去 20 个交易日的数据预测下一天这个值在日线级别比较常见太短抓不到趋势太长则样本数骤减。LSTM(64)是隐藏单元数单票数据量通常只有几千行64 已经够用再大容易过拟合。Dropout(0.3)是正则化金融数据信噪比低不加 dropout 的 LSTM 几乎必然过拟合。validation_split0.1从训练集尾部切验证集注意这里没有打乱因为时序数据打乱会引入未来信息。singlelstm2.ipynb大概率是在这个基础上调了层数或加了第二层 LSTM你可以两份对比着看理解参数变化对验证集准确率的影响。3.2 sklearn机器学习单票回测.ipynb回测框架比模型更重要sklearn机器学习单票回测.ipynb用的是 sklearn 那套——随机森林、梯度提升之类配合单票回测。很多人模型训完只看 accuracy但股票预测里 accuracy 高不代表赚钱因为涨跌样本不平衡而且没有考虑交易成本。回测的核心是按时间顺序逐日推进用当天之前的数据训练预测下一天然后模拟买卖。下面是一个最小回测循环和源码思路一致。from sklearn.ensemble import RandomForestClassifier import numpy as np def backtest(features, labels, dates, train_window500): capital 1.0 position 0 equity_curve [] for i in range(train_window, len(features)): # 用过去 train_window 天训练预测第 i 天 X_train features[i-train_window:i] y_train labels[i-train_window:i] model RandomForestClassifier(n_estimators100, max_depth5, random_state42) model.fit(X_train, y_train) pred model.predict(features[i:i1])[0] # 简单策略预测涨则满仓预测跌则空仓 if pred 1 and position 0: position capital / dates[i] # 简化实际用收盘价 capital 0 elif pred 0 and position 0: capital position * dates[i] position 0 equity_curve.append(capital position * dates[i]) return equity_curve逻辑说明train_window500是滚动窗口约两年交易日保证模型只看到历史。RandomForestClassifier的max_depth5是刻意压低的金融数据上树太深必然过拟合n_estimators100是精度和速度的折中。回测里用dates[i]代替真实收盘价是简化写法实际应该传入价格序列。这个循环没有扣手续费和滑点真实回测要加上否则收益会被高估。验证小市值结合盈利指标过滤策略.ipynb则是在选股层面做过滤先按市值和盈利指标筛出股票池再在池子里跑预测这是把“机器学习算法”和“基本面过滤”结合起来的常见做法。4. 避坑与排查这份源码跑不起来时先看这几条4.1 数据对齐翻车日期错位导致回测虚高现象回测曲线平滑向上年化收益高得离谱但实盘完全不是那么回事。原因特征和标签没有对齐比如用当天收盘价算了 bias又用当天收盘价算 label模型实际上看到了未来。解决在build_features最后统一shift(1)并且回测循环里严格用features[i]预测labels[i]不要用labels[i-1]或任何未来行。检查方法很简单把特征矩阵和标签矩阵按行打印出来看第 i 行的特征是否只包含 i-1 及之前的信息。4.2 LSTM 输入维度报错三维张量不是可选项现象ValueError: Input 0 of layer lstm is incompatible with the layer: expected ndim3, found ndim2。原因直接把二维(样本数, 特征数)喂给了 LSTM而 LSTM 要求(样本数, 时间步, 特征数)。解决用make_sequences函数把数据切成滑动窗口time_steps设为 10 到 30 之间的值。注意切完之后样本数会减少time_steps行别再用原始长度去对标签。4.3 数据库重复插入主键缺失让同一根 K 线出现两次现象回测时发现某一天收益率异常检查数据发现同一日期有两行。原因建表时没设联合主键或者用了if_existsappend但没做去重。解决建表时加PRIMARY KEY (code, date)插入时用INSERT OR REPLACE。如果已经脏了用DELETE FROM daily_kline WHERE rowid NOT IN (SELECT MIN(rowid) FROM daily_kline GROUP BY code, date)清一遍。4.4 过拟合陷阱验证集准确率 90% 但回测亏钱现象LSTM 或随机森林在验证集上 accuracy 很高一回测就亏。原因金融数据信噪比极低模型记住了噪声或者验证集和训练集有重叠。解决降低模型复杂度LSTM 隐藏单元降到 32随机森林max_depth降到 3 到 5用滚动窗口回测代替单次 train/test split加入交易成本。如果准确率还在 70% 以上先怀疑数据泄漏而不是高兴。4.5 复权处理不一致前复权与后复权混用现象同一只票在不同 notebook 里跑出的价格不一样特征对不上。原因getstockcsv.py拉数据时复权方式不统一有的用前复权有的用后复权甚至不复权。解决在落库阶段就固定一种复权方式通常用前复权因为回测时当前价格是真实的。在getstockcsv.py里显式指定复权参数并在数据库里加一列adjust_type标记避免后续混用。5. 进阶技巧用 FFT 滤波和滚动回测把信号稳定性提上去fft-filter.ipynb是这份源码里容易被忽略但很有用的一环。股票价格序列可以看成低频趋势加高频噪声的叠加FFT 的作用是把序列变换到频域砍掉高频部分再逆变换回来得到一条平滑的趋势线。这条趋势线作为特征比原始价格更稳定能减少模型被短期噪声带偏的概率。具体做法是对收盘价序列做np.fft.fft把频率高于某个阈值的分量置零再np.fft.ifft取实部。阈值怎么定我一般保留前 10% 到 20% 的低频分量对应到日线级别就是周期在 20 到 50 个交易日以上的趋势。你可以把滤波后的序列和原始序列画在一起肉眼确认它没有滞后太多——滞后是 FFT 滤波的固有代价砍得越狠滞后越明显。另一个进阶点是滚动回测的窗口选择。sklearn机器学习单票回测.ipynb里用的是固定窗口 500 天但市场风格会切换固定窗口在风格突变时会失效。我一般会做两组对比一组固定 500 天一组用 250 天和 750 天双窗口看哪组在最近一年的表现更稳。注意这里说的“表现更稳”不是指收益更高而是指最大回撤更小、收益曲线更平滑。下面这个表格是我在几只样本票上跑出来的经验值供你调参时参考。参数常用值偏保守偏激进说明LSTM time_steps203010越长越平滑样本越少LSTM 隐藏单元6432128单票数据量小不建议超 128Dropout0.30.50.2金融数据信噪比低偏高更稳随机森林 max_depth538超过 8 几乎必然过拟合滚动窗口500750250窗口越短越敏感越长越稳FFT 保留低频比例15%10%20%越低越平滑滞后越大最后说一个验证方法把singlelstm.ipynb和sklearn机器学习单票回测.ipynb在同一只票、同一时间段上跑出来的收益曲线叠在一起。如果两条曲线相关性很高说明模型捕捉到的是同一类信号可以进一步做集成如果一条赚一条亏先别急着调参回去检查两份代码的特征工程是否一致——十有八九是某个shift漏了或者复权方式不同。从那以后我每次改完特征工程都强制走一遍“打印前 5 行特征和标签”的检查确认没有未来信息混进去再开始训练。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Devin 全自动 AI 程序员上岗实测:TaoToken 统一 Key 接入值不值 500 美元?

Devin 全自动 AI 程序员上岗实测:TaoToken 统一 Key 接入值不值 500 美元?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 12:26:42 阅读更多 →
客户拜访记录散、乱、丢?企业级客户拜访沉淀的完整实操指南

客户拜访记录散、乱、丢?企业级客户拜访沉淀的完整实操指南

客户拜访结束后,很多人都会遇到同一个尴尬:明明聊了很多,回到公司却只记得零散几句。客户提过的预算、决策人、竞品情况、成交顾虑,散落在微信、纸质笔记、手机录音和个人记忆里。更麻烦的是,这些信息往往只留在销售个…

2026/10/12 12:26:42 阅读更多 →
AI漫剧工业化流水线:零基础量产的结构化工作流

AI漫剧工业化流水线:零基础量产的结构化工作流

1. 这不是“AI绘画课”,而是一套可复用的漫剧工业化流水线 “零基础 AI 漫剧智能量产创作营”——光看标题,很多人第一反应是:又一个教人用MidJourney画美女图的速成班?或者换个马甲的Stable Diffusion参数调优课?我最…

2026/10/12 12:25:42 阅读更多 →

最新新闻

Vue实战进阶:从环境配置到动态路由与多端部署要点

Vue实战进阶:从环境配置到动态路由与多端部署要点

学Vue这几年,从最开始只会照着教程敲todo list,到后来完整负责过好几个基于Spring Boot加Vue的前后端分离项目,中间踩过的坑、绕过的弯,攒下来不少东西。这份Vue网站制作学习心得,我按“从入门到实战的进阶之路”来写&…

2026/10/12 13:21:33 阅读更多 →
豆瓣Top250数据分析大作业:Python爬虫+可视化完整源码与避坑指南

豆瓣Top250数据分析大作业:Python爬虫+可视化完整源码与避坑指南

简介:这份资源是面向高校学生与Python初学者的数据可视化课程设计完整方案,围绕豆瓣电影Top250数据集展开,涵盖数据采集、清洗、统计分析与图表呈现全流程,适合用作毕业设计、期末大作业或课程设计的高分参考。压缩包共221个文件&…

2026/10/12 13:21:33 阅读更多 →
基于SpringBoot+Vue的办公管理系统:全栈设计与实现指南

基于SpringBoot+Vue的办公管理系统:全栈设计与实现指南

每年到这个时间点,都会有一批学弟学妹来问我:"毕设选题到底怎么选?Java后端会不会太难?前端是不是要写很多页面?"我的回答一直很统一:如果方向是Java Web或全栈开发,基于SpringBoot …

2026/10/12 13:21:33 阅读更多 →
claude-mem:为Claude打造跨会话长期记忆的本地记忆管理层

claude-mem:为Claude打造跨会话长期记忆的本地记忆管理层

你有没有过这种体验:跟Claude聊一个项目,前期费了好大劲把背景、依赖、约束讲清楚,刚进入正题,上下文窗口满了,或者新开一个会话,全部打回原形。每次对话就像金鱼一样,七秒记忆,项目…

2026/10/12 13:21:33 阅读更多 →
云数据库HTTP API歌单更新实战:权限、批量与避坑指南

云数据库HTTP API歌单更新实战:权限、批量与避坑指南

1. 从一次歌单同步的诡异失败说起做云音乐类小程序,绕不开的一个核心功能就是歌单管理。用户在小程序端新建、编辑、删除歌单,这些操作最终都要落到云数据库里。我最近在重构一个云音乐小程序的管理系统,前面几篇已经把基础架构、页面路由、用…

2026/10/12 13:21:33 阅读更多 →
C++中判断汉字:从编码原理到跨平台实现

C++中判断汉字:从编码原理到跨平台实现

1. 从一次文本统计翻车说起:为什么“判断汉字”没那么简单前阵子帮一个做数据清洗的朋友处理一批用户提交的文本,需求听起来特别朴素:把每条记录里的汉字挑出来,统计一下字数,非汉字的字符(标点、数字、字母…

2026/10/12 13:20:31 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →