Quantitative Alpha Research — 从产业逻辑到机器学习的完整因子研究闭环
两个独立但互补的 A 股量化 Alpha 研究项目,覆盖从产业假设驱动的传统多因子选股到基于 LightGBM 的非线性因子挖掘的完整研究链路。代码设计遵循买方量化研究的工程标准,包含完整的交叉验证检查工具。
| Project 1: 多因子选股 | Project 2: ML Alpha | |
|---|---|---|
| 方法 | 产业逻辑→因子→IC筛选→线性加权 | Walk-forward LightGBM→非线性模式发现 |
| 特征空间 | 54 因子 (5 维度) | 81 特征 (13 类别) |
| 核心指标 | RankIC 0.057 / Sharpe 0.438 | RankIC 0.065 / Sharpe 0.220 |
| 关键亮点 | PIT 财务对齐、成本敏感性、Grinold-Kahn | Walk-forward 验证、Bug发现故事、SHAP分析 |
| 数据源 | baostock (免费) | baostock (免费) |
quant_research/
│
├── README.md # 本文件
├── .gitignore
├── requirements.txt # Python 依赖
├── fundamental_quant/ # Project 1: 高端制造多因子选股
│ ├── main.py # 主入口(7步pipeline)
│ ├── config.py # 全局配置
│ ├── data_pipeline.py # baostock 数据获取/清洗/财务对齐
│ ├── factor_builder.py # 54因子构建 (MAD去极值+标准化)
│ ├── factor_test.py # IC/RankIC 检验+相关性分析
│ ├── backtest.py # 分层回测引擎 (含成本模型)
│ └── utils.py # 工具函数
│
├── ml_alpha/ # Project 2: ML Alpha 非线性因子挖掘
│ ├── main.py # 主入口 (LightGBM vs OLS)
│ ├── config.py # ML参数配置
│ ├── feature_eng.py # 81维特征工程
│ ├── rolling_framework.py # Walk-forward训练框架
│ ├── model_compare.py # LGB vs OLS对比+SHAP分析
│ └── backtest.py # ML信号分层回测
│
├── cv_inspector/ # 交叉验证检查工具(独立可复用)
│ └── cv_inspector.py # 6项自动检查: 窗口重叠/去重/频率/成本/PIT
│
└── data_cache/ # 数据缓存 (gitignored, 首次运行自动创建)
# 克隆仓库
git clone <your-repo-url>
cd quant_research
# 安装依赖
pip install -r requirements.txtcd fundamental_quant
python main.py首次运行将自动下载 CSI 500 成分股 2015-2025 年的日线数据和财务数据,缓存至 data_cache/。后续运行直接使用缓存。
预计运行时间: 首次 5-10 分钟(含数据下载),后续 1-2 分钟。
cd ml_alpha
python main.py注意: Project 2 依赖 Project 1 的数据管线,两个项目需在同一父目录下。首次运行前请确认已执行过 Project 1 的数据下载。
预计运行时间: 首次 8-15 分钟(含模型训练),后续 3-5 分钟。
产业趋势分析 → 因子假设构建 → IC/RankIC 显著性检验 → 复合信号 → 分层回测 → 成本敏感性
↑ ↓
└──────────────── 滚动窗口纯样本外验证 ←─────────────────────────────────┘
| 维度 | 数量 | 代表因子 | 数据来源 |
|---|---|---|---|
| 动量/反转 | 12 | ret_1m, ret_3m, wgt_mom_12m, RSI | 日线行情 |
| 波动率 | 10 | vol_1m, beta, 特质波动, 尾部风险 | 日线行情 |
| 财报质量 | 14 | ROE, 毛利率, 应计项目, CFO/利润 | 季报 (PIT对齐) |
| 估值 | 8 | PE, PB, PS, EP, PEG | 行情+财报 |
| 资金流/量价 | 10 | 换手率, Amihud, MF_Flow, OBV | 日线行情 |
| 指标 | 全样本(含选择偏差,仅参考) | 纯样本外滚动窗口 (5窗口均值) |
|---|---|---|
| 复合信号 RankIC | 0.057 | — |
| 年化收益 (含成本) | 14.21% | ~0% |
| Sharpe | 0.438 | -0.086 |
| 零成本 Top-Bottom Sharpe | 0.815 | — |
| 最大回撤 | -38.64% | — |
| 换手率 | 42%/次 (5日调仓) | — |
线性模型假设因子对收益的影响是直线——PE 从 100→90 和从 15→5 对 Alpha 的贡献相同。现实中:
- PE 从 100→90 没区别(都很贵)
- PE 从 15→5 是巨大机会
- "低 PE + 高毛利率"的组合效应 > 两者单独相加
ML 模型能自动学到这些非线性规律。
时间轴 →
2015-01 ──────── 2020-01 ── 2021-01
│ 训练 (60月) │ 测试 │ ← 窗口 1, 训练严格在测试之前
2015-07 ──────── 2020-07 ── 2021-07
│ 训练 (60月) │ 测试 │ ← 窗口 2, 6个月步长前移
... 共 10 个窗口,所有训练数据的时间严格在测试数据之前
关键修复: 开发过程中独立发现窗口步长 (6月) < 测试集长度 (12月) 导致的窗口重叠 Bug——同一天同一股票有 2 个预测值,导致年化收益从 57% (虚高) 降至 13% (真实)。此经验固化为 cv_inspector.py 的自动检查项。
| 指标 | LightGBM | OLS (线性基准) | 增量 |
|---|---|---|---|
| 样本外 RankIC | 0.065 | 0.056 | +16.3% |
| ICIR | 0.306 | 0.323 | — |
| IC 胜率 | 65.1% | 66.2% | — |
| 年化收益 (含成本) | 13.29% | -27.74% | — |
| Sharpe (含成本) | 0.220 | -0.693 | — |
| 零成本年化 | 23.37% | — | — |
| 基准对比 | 年化收益 | Sharpe | 最大回撤 |
|---|---|---|---|
| CSI500 等权 | 13.57% | 0.465 | -68.52% |
| LGB Long-Short | 13.29% | 0.220 | -63.45% |
| 排名 | 特征 | 类别 | 解读 |
|---|---|---|---|
| 1 | log_mcap | 市值 | 小盘溢价是 A 股最重要非线性 Alpha 源 |
| 2 | wgt_mom_12m | 动量 | 加权动量(近期权重更高) |
| 3 | bb_width | 技术指标 | 布林带宽度——波动率收缩信号 |
| 4 | profit_stability | 盈利稳定性 | 盈利波动越低越好 |
| 5 | earnings_yield | 盈利稳定性 | 盈利收益率——基本面确实有贡献 |
独立于项目、可复用的量化回测正确性验证工具。一次 run_all_checks() 自动执行 6 项检查:
| # | 检查项 | 防范的问题 |
|---|---|---|
| 1 | Walk-forward 窗口重叠 | 同一天多预测值导致收益虚增 |
| 2 | 预测值去重验证 | (symbol, date) 重复未处理 |
| 3 | 基准频率对齐 | 年化系数与数据频率不匹配 |
| 4 | Long-Short 成本敏感性 | 做空成本在减法中被抵消 |
| 5 | 因子选择 look-ahead | 全样本 IC 选因子导致过拟合 |
| 6 | Point-in-time 对齐 | 财报数据按 statDate 而非 pubDate |
from cv_inspector import run_all_checks
report = run_all_checks(
splits=my_splits,
predictions=my_predictions,
daily_df=my_daily_data,
factor_df=my_factors,
backtest_fn=my_backtest_function,
ic_fn=my_ic_function,
)
print(report)- 数据源: baostock (A 股免费数据,日线 + 季报财务)
- 数据处理: Pandas, NumPy, SciPy
- ML 框架: LightGBM, scikit-learn
- 可解释性: SHAP (SHapley Additive exPlanations)
- 可视化: Matplotlib, Seaborn
| 局限 | 影响 | 改进方案 |
|---|---|---|
| baostock 无历史成分股数据 | 幸存者偏差 | 升级为 AKShare/Tushare Pro |
| 财务数据 3-4 月滞后 | 信号时效性 | 引入分析师一致预期数据 |
| 换手率偏高 (ML: 97%/次) | 成本侵蚀 Alpha | 预测值 EMA 平滑 + 调仓频率降低 |
| 纯样本外窗口表现不稳定 | Sharpe 时序波动大 | 贝叶斯收缩 IC 估计 + 宏观择时 |
| 未做正式 Barra 风险归因 | 风险暴露不透明 | 接入 CNE6 风险模型 |
本项目仅供学术研究和学习参考。不构成任何投资建议。 历史回测结果不代表未来表现。A 股实际交易中存在涨跌停限制、T+1 制度、流动性约束等模型未完全考虑的因素。
MIT License