# Alpha101 量化因子实现与回测 **Repository Path**: mark_detail/alpha101 ## Basic Information - **Project Name**: Alpha101 量化因子实现与回测 - **Description**: 实现 WorldQuant 经典 Alpha101 量价因子库。包含因子计算、数据清洗、标准化及回测验证流程。旨在探索中高频量化策略与因子挖掘,支持多因子组合与绩效分析。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-11-11 - **Last Updated**: 2026-11-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Alpha101 因子库 基于 WorldQuant「101 Formulaic Alphas」的 **A 股多因子计算与回测系统**。用 C++17 实现全部 101 个 alpha 因子,封装为 C 动态库,再由 Python 通过 `ctypes` 调用完成分层回测与交互式可视化看板。 - **计算引擎**:C++17 静态库 `alpha_core` + C 接口动态库 `alpha101_c.dll` - **因子规模**:101 个因子(`alpha001` ~ `alpha101`),覆盖 6 大类别 - **回测与看板**:等权分位多空回测 + ECharts 交互式看板(自包含 HTML) --- ## 目录结构 ``` Alpha101/ ├── CMakeLists.txt # 构建配置(自动收集 101 个因子源文件) ├── include/ # C++ 核心头文件 │ ├── data_manager.h # 数据管理(截面 / 时序) │ ├── factor_base.h # 因子抽象基类 │ ├── operators.h # 算子库(时序 / 横截面) │ ├── alpha_helpers.h # 因子通用辅助函数 │ └── alpha_001.h ~ alpha_101.h # 101 个因子声明 ├── src/ # C++ 核心实现 │ ├── data_manager.cpp │ ├── factor_base.cpp │ ├── operators.cpp │ ├── alpha_helpers.cpp │ └── alpha_001.cpp ~ alpha_101.cpp # 101 个因子实现 ├── c_api/ # C 接口动态库(对外) │ ├── include/ # alpha_context.h + alpha_NNN_c.h │ └── src/ # alpha_context_c.cpp + alpha_NNN_c.cpp ├── backtest/ # Python 回测与可视化 │ ├── alpha_client.py # ctypes 封装 C DLL │ ├── full_backtest.py # 全量 101 因子分层回测 │ ├── dashboard.py # 交互式看板生成器 │ ├── echarts_visualizer.py # ECharts 可视化工具 │ ├── main.py # 早期单日多因子对比示例 │ └── factor_reports/ # 回测结果 / 看板输出 ├── data/ # 数据 │ ├── load_data.py # baostock 下载 A 股日线 │ └── raw_a_stock_daily_baostock.csv # 约 588 万行日线数据 ├── scripts/ # 因子代码生成器 │ ├── generate_alphas.py # 生成 alpha011 ~ alpha101 │ └── categories.json # 101 个因子的分类标注 └── tests/ # 单元 / 接口测试 ├── test_operators.cpp # 算子单测 └── test_alpha_c_api.cpp # C 接口联调 ``` --- ## 架构与数据流 ``` ┌────────────────────────────────────────┐ │ Python 回测层 │ │ full_backtest.py → dashboard.py │ │ │ ctypes 调用 │ └─────────┼──────────────────────────────┘ ▼ ┌────────────────────────────────┐ │ C 接口动态库 alpha101_c.dll │ │ alpha_context_create/destroy │ │ alpha_NNN_compute(101 个) │ │ get_daily_return │ └────────────────┬───────────────┘ ▼ ┌────────────────────────────────┐ │ 核心静态库 alpha_core │ │ DataManager (截面/时序管理) │ │ FactorBase (因子基类) │ │ operators / alpha_helpers │ │ alpha_001 ~ alpha_101 │ └────────────────┬───────────────┘ ▼ raw_a_stock_daily_baostock.csv ``` - **分层设计**:核心算法(C++ 静态库)→ C 接口(不透明指针 `AlphaContext` 隐藏实现、保证 ABI 稳定)→ Python(回测 / 可视化)。 - **因子统一接口**:每个因子继承 `FactorBase`,实现 `compute(const DataManager&, const std::string& end_date)`,返回 `股票代码 → 因子值`。 --- ## 快速开始 ### 1. 环境要求 | 组件 | 版本 / 说明 | |---|---| | 编译器 | MinGW 环境的 `gcc/g++`(如 [w64devkit](https://github.com/skeeto/w64devkit)) | | CMake | ≥ 3.14 | | 构建工具 | Ninja(或其他 CMake 生成器) | | Python | 3.10+(需 `pandas`、`numpy`) | | 数据 | `data/raw_a_stock_daily_baostock.csv`(项目已内置,或自行下载) | ### 2. 构建 C++ 库 ```bash # 指定 MinGW 编译器(以 w64devkit 为例,路径按本机调整) export CC=/d/w64devkit/bin/gcc CXX=/d/w64devkit/bin/g++ # 配置 + 构建 cmake -B cmake-build-w64 -G Ninja cmake --build cmake-build-w64 ``` 构建产物:`cmake-build-w64/bin/alpha101_c.dll`(以及两个测试程序 `test_operators.exe`、`test_alpha_c_api.exe`)。 ### 3. 运行回测 ```bash cd backtest python full_backtest.py \ --start 2026-01-01 \ --end 2026-07-02 \ --out factor_reports/backtest_results.json ``` 常用参数: | 参数 | 说明 | 默认 | |---|---|---| | `--factors` | 因子序号,如 `1,2,3` 或 `1-10`;缺省为全部 101 个 | 全部 | | `--start/--end` | 回测区间(`YYYY-MM-DD`) | `2026-01-01` ~ `2026-07-02` | | `--top-pct` | 多头 / 空头分位比例 | `0.2` | | `--min-stocks` | 单日有效股票数下限 | `100` | | `--out` | 结果 JSON 输出路径 | `factor_reports/backtest_results.json` | 脚本内置**逐因子 checkpoint**(每完成一个因子即写盘),中途中断不会丢失已算结果。 ### 4. 生成交互式看板 ```bash cd backtest python dashboard.py \ --results factor_reports/backtest_results.json \ --out factor_reports/alpha101_dashboard.html ``` 生成的 HTML **自包含**(已内联 ECharts),双击即可在浏览器打开,支持: - 按分类筛选 + 关键字搜索 - 指标总表排序(累计收益 / 年化 / 最大回撤 / 夏普 / Rank IC / IC IR / IC 胜率) - 多因子累计净值曲线叠加对比 - 分类聚合柱状图 + 年化 vs 回撤散点图(气泡 = 夏普) - 单因子详情(累计曲线 + 日度多空收益) --- ## Python API 速览 ```python from alpha_client import Alpha101Client client = Alpha101Client( "cmake-build-w64/bin/alpha101_c.dll", # C 动态库路径 "data/raw_a_stock_daily_baostock.csv" # 行情数据路径 ) # 计算单个因子(n 取值 1 ~ 101),返回 DataFrame:列 [code, alphaNNN] df = client.compute_factor(1, "2026-01-05") # alpha001 # 获取某日全市场 T 日收益率:列 [code, returns] ret = client.get_daily_return("2026-01-06") # 所有因子名 names = Alpha101Client.factor_names() # ["alpha001", ..., "alpha101"] ``` > `compute_factor` 内部调用 `alpha_NNN_compute` 并在返回后自动释放 C 侧内存。 --- ## 回测方法学 - **信号构造**:每个交易日 T,计算全市场因子值并做横截面排名。 - **多空组合**:做多「因子值最高 20%」,做空「因子值最低 20%」(`--top-pct` 可调),等权持有。 - **收益口径**:持有至 T+1,日度多空收益 = 多头组平均收益 − 空头组平均收益,逐日复利。 - **分组稳健性**:使用 `rank(method='first')` 分配唯一排名后精确取前后 `N×top_pct` 只股票,避免因子值大量并列时(如二值 sign 因子)出现空组导致 NaN。 ### 关键指标 | 指标 | 说明 | |---|---| | 累计收益 | 多空组合区间复利累计收益 | | 年化收益 | 按 252 交易日年化 | | 最大回撤 | 累计净值曲线最大回撤 | | 夏普比率 | 年化(√252),无风险利率取 0 | | Rank IC | 因子值与 T+1 收益的 Spearman 秩相关均值 | | IC IR | IC 均值 / IC 标准差 | | IC 胜率 | IC > 0 的交易日占比 | --- ## 因子分类 101 个因子按启发式划分为 6 类(见 `scripts/categories.json`): | 分类 | 数量 | 代表因子 | |---|---|---| | 横截面相关性 | 24 | alpha002, alpha006, alpha044 | | 量价关系 | 16 | alpha005, alpha008, alpha011 | | 动量/反转 | 10 | alpha004, alpha009, alpha101 | | 趋势/均线 | 10 | alpha021, alpha041, alpha046 | | 波动率 | 5 | alpha001, alpha007, alpha034 | | 多因子复合 | 36 | alpha028, alpha036, alpha100 | --- ## 数据说明 - 数据源:**baostock**,A 股日线(前复权),覆盖沪深主板、创业板、科创板(代码前缀 `60/00/30/68`)。 - CSV 列:`date, open, high, low, close, volume, amount, turnover, pct_chg, code`。 - 重新下载:`python data/load_data.py`(内置断点续传、指数退避重试)。 --- ## 已知近似与限制 本项目无行业分类、股本 / 市值等字段,部分因子在实现时做了**合理近似**: | 原始定义 | 本项目近似 | |---|---| | `indneutralize(x, g)` 行业中性化 | 无行业数据,退化为恒等映射 | | `cap`(市值) | 用成交额 `amount` 近似(与流通市值横截面高度正相关) | | 分数窗口(如 `0.25 * rank(...)`) | 窗口四舍五入为整数 | 此外,回测为教学 / 研究用途,未计交易成本、涨跌停与停牌影响,结果仅供因子有效性参考,不构成投资建议。 --- ## 测试 ```bash # 构建后运行(位于 cmake-build-w64/bin/) ./test_operators # 算子 / 因子单测(静态库直连) ./test_alpha_c_api # C 接口封装层联调 ``` --- ## 技术栈 - **C++17**:核心因子与算子、`std::unordered_map` / `std::vector` 内存管理 - **CMake + Ninja**:构建系统 - **C 接口**:不透明指针 + `extern "C"`,保证跨语言 ABI 稳定 - **Python**:`ctypes`、`pandas`、`numpy` - **ECharts**:交互式可视化看板