Skip to content

Colin-Fin/quant-alpha-research

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

量化 Alpha 研究项目集

Quantitative Alpha Research — 从产业逻辑到机器学习的完整因子研究闭环

Python License LightGBM

两个独立但互补的 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, 首次运行自动创建)

快速开始

1. 环境配置

# 克隆仓库
git clone <your-repo-url>
cd quant_research

# 安装依赖
pip install -r requirements.txt

2. 运行 Project 1 — 多因子选股

cd fundamental_quant
python main.py

首次运行将自动下载 CSI 500 成分股 2015-2025 年的日线数据和财务数据,缓存至 data_cache/。后续运行直接使用缓存。

预计运行时间: 首次 5-10 分钟(含数据下载),后续 1-2 分钟。

3. 运行 Project 2 — ML Alpha

cd ml_alpha
python main.py

注意: Project 2 依赖 Project 1 的数据管线,两个项目需在同一父目录下。首次运行前请确认已执行过 Project 1 的数据下载。

预计运行时间: 首次 8-15 分钟(含模型训练),后续 3-5 分钟。


Project 1: 高端制造多因子选股

研究逻辑

产业趋势分析 → 因子假设构建 → IC/RankIC 显著性检验 → 复合信号 → 分层回测 → 成本敏感性
     ↑                                                                    ↓
     └──────────────── 滚动窗口纯样本外验证 ←─────────────────────────────────┘

因子体系 (54个)

维度 数量 代表因子 数据来源
动量/反转 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日调仓)

Project 2: ML Alpha 非线性因子挖掘

为什么需要 ML

线性模型假设因子对收益的影响是直线——PE 从 100→90 和从 15→5 对 Alpha 的贡献相同。现实中:

  • PE 从 100→90 没区别(都很贵)
  • PE 从 15→5 是巨大机会
  • "低 PE + 高毛利率"的组合效应 > 两者单独相加

ML 模型能自动学到这些非线性规律

Walk-forward Validation

时间轴 →
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%

SHAP 特征重要性 Top 5

排名 特征 类别 解读
1 log_mcap 市值 小盘溢价是 A 股最重要非线性 Alpha 源
2 wgt_mom_12m 动量 加权动量(近期权重更高)
3 bb_width 技术指标 布林带宽度——波动率收缩信号
4 profit_stability 盈利稳定性 盈利波动越低越好
5 earnings_yield 盈利稳定性 盈利收益率——基本面确实有贡献

cv_inspector — 交叉验证检查工具

独立于项目、可复用的量化回测正确性验证工具。一次 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 制度、流动性约束等模型未完全考虑的因素。


License

MIT License

About

A股量化Alpha研究: 多因子选股 + LightGBM非线性因子挖掘, Walk-forward验证, 自动交叉验证检查

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages