Technical Documentation

A股智能预测系统

基于 LightGBM 回归模型的次日涨跌预测 · 全流程技术文档

📊 数据层架构
候选池筛选
每日热度 / 换手率
stock_candidates
K线采集
东方财富 API
stock_kline_ta
Pandas TA
技术指标计算
stock_kline_ta
SnowNLP
新闻情感分析
stock_news_sentiment
数据表说明
表名 说明 更新频率 记录数
stock_candidates 候选股票池,按热度、换手率排名取前40只 每日 ≈40/天
stock_kline_ta 全市场日K线 + Pandas TA技术指标(MA、RSI、MACD、布林带、ATR等) 每日收盘后 ≈1924条/天
stock_news_sentiment 新闻情感分析结果,每条新闻产出情感分(0~1)、情感标签(利好/利空/中性) 09:00 / 13:00 / 17:00 / 21:00 ≈986条/天
stock_predictions LightGBM预测结果,含预测涨跌幅、置信度、特征快照 每日收盘后 ≈40条/天
⚙️ 特征工程(36维)
特征构成
类别 数量 特征列表 数据来源
基础 15 pct_change, close_price, volume, turnover, ma5, ma10, ma20, ma60, rsi14, macd, macd_signal, macd_hist, boll_upper, boll_mid, boll_lower, atr14, ta_score stock_kline_ta
衍生 10 ma5/ma20比值, 布林带位置, rsi动量, macd动量, 量比, 额比, ma斜率, rsi斜率, 个股vs市场涨跌, 量vs均量 原始指标加工
市场 8 市场均值, 上涨概率, 市场波动率, 最大/最小/中位涨跌, 均量, 均额 每日全市场汇总
动量 3 昨日涨跌(pct_change_1d), 3日累计涨跌(mom_3d), 5日累计涨跌(mom_5d) 历史数据滚动
1
基础指标
从 stock_kline_ta 直接读取 close_price、volume、turnover、ma5/10/20/60、rsi14、macd、macd_hist、boll、atr14、ta_score 等15个字段
2
衍生指标
通过数学变换从基础指标派生:
ma5/ma20比值、股价在布林带中的相对位置、RSI和MACD的变化量(动量)、成交量/成交额与5日均线的比值、ma5/rsi14的斜率、个股涨跌减市场均值、个股量能减市场均量
3
市场级特征
每个交易日结束后,按全市场所有股票汇总计算8个市场指标,作为当日市场整体情绪代理变量,帮助模型感知大盘环境
4
个股动量特征
利用历史涨跌数据滚动计算:昨日涨跌(反映惯性)、前3日累计涨跌、前5日累计涨跌,用于捕捉短期趋势延续性。注意:所有历史数据均使用 shift(1),即只参考截至今日(含)的数据,避免未来函数
🛡️ 数据泄露防护机制
⚠️ 时点分析:早报 8:30 运行 vs 晚间 15:30 执行
数据类型 8:30 早报时点 15:30 收盘后
昨日 K线 + 技术指标 ✓ 已确定 ✓ 可用
今日 K线(未开盘) ✗ 不存在 ✓ 已确定
昨日市场均值/波动率 ✓ 可用(昨收后计算) ✓ 可用
今日市场均值(未收盘) ✗ 不存在 ✓ 可用
标签(次日涨跌) ✓ 未来数据,标签构建用 shift(-1) ✓ 同左
标签构建原则:使用 pct_change.shift(-1) 按股票分组移位,意味着 T 日的标签 = T+1 日的涨跌幅。这保证了训练时模型只使用截至 T 日的信息来预测 T+1 日的涨跌,完全不依赖未来数据。
预测时点原则:早报 8:30 运行时,市场调整使用最近交易日(昨收后)的市场数据,而非当日数据。这样在时间轴上严格不依赖任何"未来"信息——昨收数据在 8:30 早已确定可用,而当日涨跌在早报发出时还不存在。
训练数据窗口:取最近 65 天数据(约 3 个月),每个股票每天一条记录,经标签移位后约产生 163 条有效样本(203 - 40)。数据量适中,模型不会因数据过少而欠拟合,也不会因窗口过长而引入过多远古市场规律。
🔧 模型训练流程(每日收盘后)
1
数据拉取
从 stock_kline_ta 查询最近65个交易日全市场数据,约203条原始记录
build_features_from_db(days_back=65)
2
特征构建
构建36维特征,对每只股票的 pct_change 做 shift(-1) 得到标签,删除标签为空的行,得到约163条有效样本
df['label'] = pct_change.shift(-1)
3
数据集划分
8:2 划分,130条训练,33条验证,保持时间顺序(不用随机 shuffle,保证时序合理性)
split = int(len(X) * 0.8)
4
LightGBM 回归
objective=regression,MAE 作为主要评估指标。数据量少时自动降低 num_leaves(最大8)防止过拟合,num_rounds 最多80轮
lgb.train(params, train_data, num_boost_round=num_rounds)
5
模型评估
验证集计算 MAE(平均绝对误差)、R²(决定系数)、方向准确率(预测涨跌方向是否正确)、方向加权损失(方向错误惩罚3倍)
MAE / R² / dir_acc / dir_weighted_loss
6
模型持久化
保存到 lgb_model.txt,同步写入 .meta 文件记录版本号、特征数、训练日期,便于后续热更新校验
model.save_model(MODEL_PATH)
📈 模型预测流程(每日收盘后)
1
候选股 K线查询
取候选股票池中每只股票的最新一条 K线记录(最近交易日,最晚到昨日),读入 ma5/20/60、rsi14、macd、boll、atr14、ta_score 等15个原始指标
2
市场特征注入
从参考交易日的 stock_kline_ta 全量汇总,计算该日市场均值、上涨概率、波动率等8个市场指标。这些数据在早报 8:30 运行时已经确定可用
3
历史动量计算
查询该股票前6日历史数据,滚动计算 pct_change_1d(昨日涨跌)、mom_3d(3日动量)、mom_5d(5日动量)及量比/额比
4
36维特征向量
组装所有特征,顺序与训练时完全一致,缺失值填充为0,特征数与模型不匹配时跳过该股票
features = [pct_change, close_price, volume, turnover, ma5, ..., mom_5d] # 36维
5
模型推理 + 市场调整
LightGBM 回归输出原始预测值。若预测绝对值超过3%,将30%权重分配给市场偏差(market_avg);否则仅分配10%,避免微幅预测被过度干预
pred = raw * 0.7 + market_avg * 0.3 # |raw| > 3%
6
结果写入数据库
将预测涨跌幅、置信度(基于预测绝对值动态计算50~95)、技术得分、情感均值及完整特征快照一并写入 stock_predictions 表,字段 trade_date 为 K线对应日期
🕐 每日执行时序
08:30 · 每日
发送早报
读取 stock_predictions(前日收盘后预测结果),结合板块轮动、资金流向、技术形态等生成早报,通过邮件发送给订阅用户
09:00 / 13:00 / 17:00 / 21:00 · 每日
SnowNLP 新闻情感采集
爬取东方财富等来源的A股相关新闻,经 SnowNLP 情感分析后写入 stock_news_sentiment 表,支持利好/利空/中性标签判定
15:30 · 周一至周五
每日数据采集任务(daily_job)
按顺序执行:候选池 → K线+Pandas TA → 新闻情感 → LightGBM预测 → 模型重训练
周日 20:00 · 每周
模型完整重训练(weekly_train_job)
使用最新65天全量数据重新训练 LightGBM 模型,保存新版本,确保模型参数随市场风格变化持续更新
每月
数据清理 + 别名库扩展
清理过期数据(候选池/K线保留180天、新闻保留90天);分析近期未匹配新闻自动扩展公司别名库,提升新闻匹配覆盖率
📐 模型评估指标
MAE(平均绝对误差)
预测涨跌幅与实际涨跌幅之差的绝对值的均值。单位为百分比,直接反映预测值与真实值的偏离程度。当前典型值约 2~3%
R²(决定系数)
模型解释目标变量方差的比例,取值 0~1。R² 越高说明模型对涨跌幅的解释力越强。当前典型值约 0.07~0.46(股市预测难度高,R² 通常较低)
方向准确率
预测涨跌方向(正/负)与实际涨跌方向一致的比例。当前典型值约 70~75%,意味着每4次方向判断约有3次正确
方向加权损失
方向错误时损失乘以3倍后的加权平均损失。惩罚机制使模型在方向判断上更谨慎,因为方向错误比幅度偏差危害更大
📖 术语表
pct_change
单日涨跌幅百分比,即(今日收盘价 - 昨日收盘价)/ 昨日收盘价 × 100%
MA / 均线
移动平均线,N日MA = 最近N日收盘价的算术平均,用于判断趋势方向
RSI(相对强弱指数)
衡量价格涨跌速度和幅度的振荡指标,取值0~100。RSI>70 超买,RSI<30 超卖
MACD
指数平滑异同移动平均线,由快线(DIF)、慢线(DEA)和柱状图(MACD Hist)组成,用于判断趋势转折
布林带(Bollinger Bands)
由中轨(MA20)和上下轨(±2倍标准差)组成,股价触及上轨可能超买,触及下轨可能超卖
ATR(平均真实波幅)
衡量价格波动剧烈程度的指标,ATR值越大表示波动越剧烈,常用于止损设置
ta_score
综合技术评分(0~100),由趋势、动量、波动率、RSI、MACD、布林带等多个维度加权计算得出
SnowNLP
中文情感分析库,对新闻文本输出0~1之间的情感得分,>0.6为利好,<0.4为利空,中间为中性
LightGBM
微软开源的梯度提升框架,比 XGBoost 更快更省内存,适合中等规模数据的回归/分类任务
数据泄露(Data Leakage)
训练或预测时使用了不该在当前时点获取的信息(如未来数据),导致模型虚高,实际部署失效
🚀 核心实现
Claude Code 自动化助手

Claude Code 是基于 Claude 模型的 AI 编程助手,可连接大模型自动执行数据采集、分析、报告生成等任务。

配置项
配置文件 ~/.claude/CLAUDE.md
命令前缀 / + 技能名(如 /stock-morning-report
自定义 Skills ~/.claude/commands/
常用指令: /stock-morning-report 生成早报   /news-hot 热点新闻   /news-AI AI新闻   /stock-evening-report 晚报
大模型连接方式
1
MCP Server 连接
在 Claude Code 配置文件中定义 MCP 服务器,格式如下:
{ "mcpServers": { "mysql": { "command": "npx", "args": ["-y", "@anthropic/mysql-mcp"] }, "brave-search": {...} } }
2
工具调用
Claude Code 自动扫描可用工具后,通过 tools 列表调用:
mcp__mysql__mysql_query mcp__brave-search__brave_web_search mcp__tavily-search__tavily_search
3
API Key 配置
在服务器环境变量或配置文件中设置:
SCRAPERAPI_API_KEY=xxx BRAVE_SEARCH_API_KEY=xxx ANTHROPIC_API_KEY=xxx
4
返回结果
MCP 工具返回 JSON/文本结果,Claude Code 自动解析并生成分析报告或执行后续操作
MySQL MCP 数据库连接

使用 @anthropic/mysql-mcp 连接 stockdb 数据库,直接查询股票数据。

1
连接配置
在 Claude Code 的 MCP settings 中配置数据库连接信息
2
查询示例
mcp__mysql__mysql_query sql: "SELECT ts_code, close_price, pct_change FROM stock_kline_ta WHERE trade_date = '2026-03-24' LIMIT 10"
3
常见查询
-- 查看候选池 SELECT * FROM stock_candidates ORDER BY rank LIMIT 10; -- 查看预测结果 SELECT ts_code, pred_pct, confidence FROM stock_predictions WHERE trade_date = '2026-03-24'; -- 查看新闻情感 SELECT title, sentiment, label FROM stock_news_sentiment WHERE trade_date = '2026-03-24';
stockdb.py 后台程序

核心数据采集与处理程序,位于服务器后台定时运行。

功能模块 说明 数据表
候选池筛选 按热度、换手率排名选取前40只股票 stock_candidates
K线采集 从东方财富API获取日K线数据 stock_kline_ta
技术指标 Pandas TA计算MA、RSI、MACD、布林带等 stock_kline_ta
新闻情感 SnowNLP分析新闻情感得分 stock_news_sentiment
模型预测 LightGBM回归预测次日涨跌幅 stock_predictions
模型训练 每日收盘后重训练模型 lgb_model.txt
定时任务:每日 15:30 执行 daily_job,周日 20:00 执行 weekly_train_job
通过 MCP 获取新闻

使用 ScraperAPI MCP 或 Tavily MCP 获取实时财经新闻。

1
百度搜索
mcp__baidu-search__webSearch query: "A股 今日热点新闻 2026-03-25"
2
Brave 搜索
mcp__brave-search__brave_web_search query: "stock market news China A-share" count: 10
3
Tavily 研究
mcp__tavily-search__tavily_research input: "A股市场今日热点,分析板块轮动和资金流向" model: "pro"
4
网页抓取
mcp__scraperapi__scrape url: "https://finance.eastmoney.com/" output_format: "markdown"
任务执行流程
Step 1
连接 MySQL MCP
通过 MCP 连接 stockdb 数据库,查询候选股票池和技术指标数据
Step 2
获取新闻数据
通过百度/Brave/Tavily搜索获取最新财经新闻,结合 SnowNLP 情感分析
Step 3
特征组装
组装36维特征向量(基础指标15 + 衍生指标10 + 市场指标8 + 动量指标3)
Step 4
模型推理
加载 LightGBM 模型进行回归预测,结合市场偏差调整输出
Step 5
结果输出
生成预测结果早报/晚报,发送邮件至订阅用户,或生成分析报告