slug: ml-alpha displayName: 机器学习选股模型 version: 1.0.0 summary: 基于XGBoost/LightGBM的A股多因子选股预测系统,实现15+特征工程、滚动窗口训练、分组回测、IC评估,支持时间序列交叉验证和特征重要性分析。 tags: - finance - machine-learning - stock-selection - xgboost - quantitative-finance license: MIT
ML-Alpha 是一个基于机器学习的A股多因子选股预测系统。系统使用XGBoost、LightGBM和Ridge回归三种模型,通过15+因子特征工程和滚动窗口训练,预测股票未来收益率并进行分组回测验证。
所有数据均来自 akshare 真实接口,不使用任何随机或伪造数据。
构建20个选股因子,覆盖5大类别: | 类别 | 因子 | 数量 | |------|------|------| | 技术特征 | MA5/MA20/MA60比率、RSI、MACD直方图、布林带位置 | 6 | | 量价特征 | 量比、换手率变化、成交额/量比率 | 3 | | 基本面特征 | PE分位数、PB分位数、ROE、毛利率 | 4 | | 动量特征 | 1月/3月/6月动量、5日反转 | 4 | | 波动率特征 | 20日波动率、偏度、峰度 | 3 |
所有特征计算后进行截面z-score标准化。
cd ml-alpha
pip install -r requirements.txt
# 使用指定股票池
python predict.py --tickers 600519,000858,601318 --start 20220101 --end 20250101
# 使用沪深300成分股,XGBoost模型,5日预测周期
python predict.py --index hs300 --model xgboost --horizon 5
# 使用中证500成分股,训练所有模型对比
python predict.py --index zz500 --model all --horizon 10
# 自定义训练窗口
python predict.py --tickers 600519,000858 --model lightgbm --horizon 20 --train-months 18
| 参数 | 说明 | 默认值 |
|---|---|---|
| --tickers | 股票代码列表(逗号分隔) | - |
| --index | 指数简称(hs300/zz500/sz50/zz1000) | - |
| --start | 开始日期 YYYYMMDD | 20200101 |
| --end | 结束日期 YYYYMMDD | 20250101 |
| --model | 模型类型(xgboost/lightgbm/ridge/all) | xgboost |
| --horizon | 预测周期(1/5/10/20日) | 5 |
| --train-months | 训练窗口月数 | 12 |
| --n-groups | 分组数量 | 5 |
| --output-dir | 输出目录 | ./output |
| --save-models | 保存模型 | False |
运行完成后,在 output 目录下生成:
output/
├── report_xgboost.html # HTML评估报告(含图表)
├── predictions_xgboost.csv # 预测结果CSV
├── report_lightgbm.html # LightGBM报告(--model all时)
├── predictions_lightgbm.csv
├── report_ridge.html # Ridge报告
├── predictions_ridge.csv
└── models/ # 模型文件(--save-models时)
└── xgboost_latest.pkl
┌──── 配置信息 ────────────────────────────────────┐
│ 股票池: 指数 hs300 │
│ 日期范围: 20220101 ~ 20250101 │
│ 模型: xgboost │
│ 预测周期: 5 天 │
│ 训练窗口: 12 个月 │
└────────────────────────────────────────────────────┘
评估结果摘要:
平均IC: 0.0342
IC信息比率: 0.4521
IC胜率: 58.3%
多空年化收益: 12.5%
夏普比率: 1.23
最大回撤: 8.7%
平均换手率: 35.2%
A: akshare需要逐只股票请求历史数据,大股票池(如沪深300的300只股票)需要较长时间。建议: - 使用较少的股票(--tickers 指定少量股票) - 缩短日期范围 - 每只股票请求间隔0.1秒避免被限流
A: 通常IC(Spearman秩相关系数)的评判标准: - IC > 0.05: 优秀,具有较强预测力 - 0.03 < IC < 0.05: 良好,有一定预测力 - 0.01 < IC < 0.03: 一般,预测力较弱 - IC < 0.01: 模型预测力不足
IC信息比率(ICIR = mean(IC)/std(IC))> 0.5 通常被认为是可以接受的。
A: 模型在每个调仓日(月末),使用过去N个月的数据训练,然后预测下个月的收益。这模拟了真实的投资决策流程,避免了使用未来数据(look-ahead bias)。例如 train_months=12 表示用过去12个月的数据训练,预测下个月。
A: 预测周期取决于投资策略的持仓时间: - horizon=1: 日频策略,适合短线交易 - horizon=5: 周频策略,适合波段交易 - horizon=10: 两周策略,适合中短期持仓 - horizon=20: 月频策略,适合中长期持仓 较短的预测周期换手率较高但可能捕捉更多短期信号,较长的周期换手率低但需要更长的数据验证。
A: ML模型的预测能力在不同市场环境下会有变化。通常在趋势明确的市场中表现较好,在震荡市或急转市场中可能失效。建议关注滚动IC曲线,当IC持续为负时,应考虑暂停使用模型或调整策略。回测结果仅供参考,不保证未来收益。
A: 可能的原因包括:股票已退市、停牌时间过长、akshare接口暂时不可用、网络问题等。系统会跳过失败的股票并继续处理其他股票,不影响整体流程。
更多技能请访问小葱技能站7w4.net。
predict.py (CLI)
│
├── data.py ────── akshare获取数据 → 面板数据
│ ├── 日线行情(OHLCV)
│ ├── 基本面数据(PE/PB)
│ └── 数据清洗(去极值/标准化/前向填充)
│
├── features.py ── 构建20个因子 → 特征面板
│ ├── 技术因子(MA/RSI/MACD/BOLL)
│ ├── 量价因子(量比/换手率/资金流向)
│ ├── 基本面因子(PE/PB分位数/ROE/毛利率)
│ ├── 动量因子(1m/3m/6m动量/反转)
│ └── 波动率因子(std/skew/kurt)
│
├── models.py ──── 滚动窗口训练 → 预测结果
│ ├── XGBoost回归
│ ├── LightGBM回归
│ ├── Ridge回归
│ └── TimeSeriesSplit交叉验证
│
├── backtest.py ── 分组回测 → 组合收益
│ ├── 5组分组
│ ├── 多空对冲
│ └── 换手率计算
│
├── evaluation.py ─ 评估指标 → 评估结果
│ ├── IC/Spearman相关
│ ├── 分组单调性
│ ├── Sharpe/MaxDD
│ └── 特征重要性
│
└── report.py ──── 图表生成 → HTML报告
├── 累积收益曲线
├── 热力图
├── 特征重要性图
├── 滚动IC曲线
└── 散点图
这个Skill质量较高,是一套完整的机器学习选股工具,特征丰富、模型多样、评估全面,文档说明详细。主要优点是功能完整、使用方便,图表报告直观。主要不足是回测没有考虑手续费等交易成本,实际收益可能不如回测结果好看;获取数据较慢,容易受网络影响。总体而言,这是一个专业度较高的量化选股工具,适合有量化基础的开发者使用。