| # ML-Alpha-Research-System |
|
|
| 基于 **Qlib** 的量化研究系统:因子接入(GP / QuantaAlpha / 自定义面板)+ **可插拔策略框架** + Qlib 原生实验 + 研究报告。 |
|
|
| ## 架构 |
|
|
| ``` |
| 已挖掘因子 (GP/QuantaAlpha/Parquet) 策略层 回测 & 报告 |
| ───────────────────────────────── ────────── ───────────── |
| factor_panel / JSON library ──► 6+ 内置策略 (TopK/多空/加权...) ──► qlib SimulatorExecutor |
| QuantaAlpha API + LLM ──► LLM 策略规划 (选因子+选策略) ──► outputs/backtest/ |
| qlib expression / pred.pkl ──► 策略套件对比 (suite) |
| ``` |
|
|
| ## 与你之前版本的关系 |
|
|
| | 旧脚本 | 问题 | 新方案 | |
| |--------|------|--------| |
| | `factor_engine/legacy/3.因子挖掘.py` | 硬编码 parquet 路径 | `QlibTensorDataEngine` + `config/settings.py` | |
| | `factor_engine/legacy/因子挖掘2.0.py` | 相关性惩罚、分块读取 | 合并到 `factor_engine/gp/fitness.py` | |
| | `factor_engine/legacy/因子挖掘06_17.py` | 严格防重复 | 合并到 `factor_engine/gp/` | |
| | `scripts/run_model_train.py` | 自定义 LightGBM,非 qlib 实验 | `scripts/run_qrun.py` + workflow YAML | |
| | 无 bin 转换 | 无法接入自建数据 | `data_pipeline/convert_to_qlib_bin.py` + `scripts/dump_bin.py` | |
|
|
| ## 快速开始 |
|
|
| ### 1. 安装依赖 |
|
|
| ```bash |
| pip install -r requirements.txt |
| export MLFLOW_ALLOW_FILE_STORE=true # mlflow 文件后端 |
| ``` |
|
|
| ### 2. 准备 Qlib 数据 |
|
|
| **方式 A:官方样例(最快)** |
|
|
| ```bash |
| python -m qlib.cli.data qlib_data --target_dir data/qlib_data/cn_data --region cn |
| ``` |
|
|
| > 官方样例覆盖约 **2000-01-04 ~ 2020-09-25**。`config/base.yaml` 切分已对齐。 |
|
|
| **方式 B:自建 Parquet/CSV → qlib .bin** |
|
|
| ```bash |
| # 1) 把你的 parquet 列名映射写在 config/base.yaml dump.column_aliases |
| # 2) 转换并 dump |
| python data_pipeline/convert_to_qlib_bin.py --parquet /path/to/your_data.parquet |
| |
| # 或仅对已有 per-symbol CSV 目录 dump |
| python data_pipeline/convert_to_qlib_bin.py |
| ``` |
|
|
| `dump_bin.py` 来自 [qlib 官方脚本](https://github.com/microsoft/qlib/blob/main/scripts/dump_bin.py),支持 `dump_all` / `dump_update` 增量更新。 |
|
|
| ### 策略回测(核心 — 因子接入 + 多策略) |
|
|
| **前提**:已有挖掘好的因子(GP parquet、QuantaAlpha JSON、pred.pkl 均可),无需在本项目里再跑挖掘。 |
|
|
| ```bash |
| # 列出所有内置策略 |
| python scripts/run_backtest.py --list-strategies |
| |
| # 单策略:GP 因子面板 → TopK Dropout |
| python scripts/run_backtest.py \ |
| --strategy topk_dropout \ |
| --signal-path outputs/gp_mining/qlib_gp_run_0/ML_Features_qlib.parquet \ |
| --start 2019-04-01 --end 2020-09-24 |
| |
| # 策略套件对比(一次跑 4 个策略) |
| python scripts/run_backtest.py \ |
| --suite long_only_core \ |
| --signal-source gp_panel |
| |
| # QuantaAlpha 因子库 JSON → IC 加权合成信号 |
| python scripts/run_backtest.py \ |
| --strategy score_weighted_topk \ |
| --signal-source quantaalpha_library |
| ``` |
|
|
| **内置策略**(`config/strategies.yaml`): |
|
|
| | 策略 | 说明 | |
| |------|------| |
| | `topk_dropout` | Qlib TopK 逐步换仓(默认基线) | |
| | `long_short_quantile` | 多空分位组合 | |
| | `score_weighted_topk` | Softmax 分数加权 TopK | |
| | `rank_weighted` | 排名衰减加权 | |
| | `dynamic_risk_topk` | 动态风险预算 TopK | |
| | `enhanced_indexing` | 增强指数化(需 risk model) | |
|
|
| **QuantaAlpha LLM 策略**(OpenAI 兼容 API): |
|
|
| ```bash |
| export OPENAI_API_KEY=sk-... |
| export OPENAI_BASE_URL=https://your-provider/v1 |
| export CHAT_MODEL=deepseek-v3 |
| |
| # LLM 自动选因子 + 选策略 + 回测 |
| python scripts/run_llm_strategy.py \ |
| --library data/factors/all_factors_library.json |
| |
| # 仅生成 LLM 策略计划(不回测) |
| python scripts/run_llm_strategy.py --factor-panel outputs/gp_mining/.../ML_Features_qlib.parquet --dry-run |
| ``` |
|
|
| 配置见 `config/quantaalpha.yaml`。 |
|
|
| # 列出已注册因子 |
| python scripts/run_factor.py list |
| |
| # 计算单个因子(qlib 自动算) |
| python scripts/run_factor.py compute --name momentum_5d |
| |
| # 计算全部 enabled 因子 |
| python scripts/run_factor.py compute --all |
|
|
| # 单因子 IC 分析 |
| python scripts/run_factor.py analyze --name momentum_5d --segment test |
|
|
| # 单因子回测(IC + TopK 策略) |
| python scripts/run_factor.py backtest --name momentum_5d |
|
|
| # 批量单因子回测 |
| python scripts/run_factor.py backtest --all |
| |
| # 命令行追加新因子到 config/factor_registry.yaml |
| python scripts/run_factor.py add \ |
| --name my_alpha \ |
| --expression "Rank($close) - Rank($volume)" \ |
| --description "价量排名差" |
|
|
| # 多因子合并面板 → 策略回测 |
| python scripts/run_factor.py export-panel |
| python scripts/run_backtest.py --signal-source registry_all --strategy topk_dropout |
| ``` |
| |
| 因子公式记录在 **`config/factor_registry.yaml`**,想到新因子直接加进去即可。 |
| |
| ### 3. GP 因子挖掘(可选) |
| |
| ```bash |
| python scripts/run_gp_mining.py |
| # 或自定义参数 |
| RUN_ID=my_run POPULATION_SIZE=200 GENERATIONS_PER_RUN=20 python scripts/run_gp_mining.py |
| ``` |
| |
| 输出:`outputs/gp_mining/<RUN_ID>/` |
| - `factor_zoo.csv` / `top_factors.csv` — 候选因子库 |
| - `ML_Features_qlib.parquet` — GP 特征矩阵 |
| - `factor_formulas.csv` — 因子公式 |
|
|
| ### 4. 导出 GP → Qlib DatasetH |
|
|
| ```bash |
| python scripts/build_gp_dataset.py --run-id my_run |
| ``` |
|
|
| 生成: |
| - `gp_qlib_handler.pkl` — 供 workflow 加载 |
| - `gp_qlib_dataset.pkl` — DatasetH 快照 |
| - `gp_qlib_features.parquet` — 特征面板 |
|
|
| ### 5. 运行 Qlib 实验(核心) |
|
|
| **Alpha158 Baseline(官方风格对照组)** |
|
|
| ```bash |
| python scripts/run_qrun.py --config config/workflows/workflow_alpha158_baseline.yaml |
| ``` |
|
|
| **GP 因子 + LightGBM** |
|
|
| ```bash |
| python scripts/run_qrun.py \ |
| --config config/workflows/workflow_gp_lightgbm.yaml \ |
| --run-id my_run |
| ``` |
|
|
| 实验产物写入 `mlruns/`,包含: |
| - `pred.pkl` / `label.pkl` — 预测与标签 |
| - `sig_analysis.pkl` — IC / Rank IC 分析 |
| - `report_normal_1day.pkl` — 回测绩效 |
| - `port_analysis_1day.pkl` — 组合分析 |
|
|
| ### 6. 生成研究报告 |
|
|
| ```bash |
| # GP 因子诊断(ICIR 排名、相关性热力图、进化曲线) |
| python scripts/generate_report.py --run-id my_run |
| |
| # 含 qlib 实验结果(需 recorder id) |
| python scripts/generate_report.py \ |
| --run-id my_run \ |
| --experiment-name ml_alpha_gp \ |
| --recorder-id <RECORDER_ID> |
| ``` |
|
|
| 报告输出:`outputs/reports/`,包含 IC 时序、IC 分布、分位数收益、累计收益/回撤、因子相关性热力图、GP 进化曲线等。 |
|
|
| ### 7. 一键全流程 |
|
|
| ```bash |
| python scripts/run_full_pipeline.py --run-id my_run |
| # 从 parquet 开始(含 bin dump) |
| python scripts/run_full_pipeline.py --run-id my_run --parquet /path/to/data.parquet |
| # 仅跑 baseline 对照 |
| python scripts/run_full_pipeline.py --baseline-only |
| ``` |
|
|
| ## 配置体系(不再硬编码) |
|
|
| | 文件 | 用途 | |
| |------|------| |
| | `config/base.yaml` | Qlib 路径、时间切分、dump 映射、回测参数、实验 URI | |
| | `config/gp_mining.yaml` | GP 种群/代数/惩罚参数 | |
| | `config/settings.py` | 统一加载 YAML + 环境变量覆盖 | |
| | `config/factor_registry.yaml` | **你的因子公式库**(qlib expression,自动计算/单因子回测) | |
| | `config/strategies.yaml` | 策略注册表、预设套件、信号源模板 | |
| | `config/quantaalpha.yaml` | LLM API / QuantaAlpha 因子库配置 | |
|
|
| 环境变量: |
|
|
| ```bash |
| QLIB_PROVIDER_URI=data/qlib_data/cn_data |
| QLIB_MARKET=csi300 |
| RUN_ID=my_experiment |
| POPULATION_SIZE=300 |
| GENERATIONS_PER_RUN=50 |
| MLFLOW_ALLOW_FILE_STORE=true |
| ``` |
|
|
| ## Web 可视化平台 (`web_development/`) |
| |
| 期货仿真交易 UI + **按功能模块在线启动** + Qlib 因子研究桥接。 |
| |
| ```bash |
| # 一键启动后端 + 前端,并加载 Qlib 研究模块 |
| python scripts/launch_platform.py --enable-research |
|
|
| # 或分别启动 |
| cd web_development/backend && uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload |
| cd web_development/frontend && npm install && npm run dev |
| ``` |
| |
| | 页面 | 路径 | 说明 | |
| |------|------|------| |
| | 服务控制台 | `/services` | 按模块启动/停止:行情、期货策略、Qlib 研究、前端 | |
| | 因子研究 | `/research` | 查看因子注册表、算子库、A 股策略列表 | |
| | 仪表盘/交易 | `/`, `/trading` 等 | 期货仿真(wenjie 原功能) | |
| |
| API 桥接:`/api/platform/*`(模块控制)、`/api/research/*`(因子/策略研究)。 |
| |
| ## 核心模块 |
| |
| | 模块 | 说明 | |
| |------|------| |
| | `config/settings.py` | 集中配置,路径/ RUN_ID 从 env 读取 | |
| | `data_pipeline/convert_to_qlib_bin.py` | Parquet → per-symbol CSV → .bin | |
| | `scripts/dump_bin.py` | qlib 官方 bin dump 工具 | |
| | `data_pipeline/gp_dataset_builder.py` | GP 特征 → StaticDataLoader → DataHandlerLP | |
| | `factor_engine/gp/` | GP 算子、适应度、进化、QlibTensorDataEngine | |
| | `factor_engine/gp_handler.py` | GPFactorHandler(workflow YAML 加载 pickle) | |
| | `experiments/workflow_runner.py` | task_train + Recorder 封装 | |
| | `scripts/run_qrun.py` | 实验入口 | |
| | `reports/analysis.py` | IC/回测/因子/GP 可视化 | |
| | `factor_engine/formula_registry.py` | 因子公式注册表:加载/计算/缓存/合并 | |
| | `scripts/run_factor.py` | 因子公式 CLI(compute/analyze/backtest/add) | |
| | `strategies/` | 策略注册表、内置策略、统一回测 runner | |
| | `integrations/quantaalpha/` | LLM client、因子库解析、LLM 策略规划 | |
| | `data_pipeline/factor_loader.py` | 统一因子/信号加载(GP/QuantaAlpha/qlib expr) | |
| | `scripts/run_backtest.py` | 策略回测 CLI | |
| | `scripts/run_llm_strategy.py` | QuantaAlpha LLM 策略 | |
| |
| ## 面试亮点 |
| |
| 1. **因子与策略解耦**:挖掘在外部完成,本项目专注因子接入 + 策略回测 |
| 2. **可插拔策略框架**:6+ 内置策略 + YAML 注册表 + 策略套件对比 |
| 3. **QuantaAlpha LLM 集成**:OpenAI 兼容 API 自动选因子、选策略、跑回测 |
| 4. **Qlib 原生回测**:SimulatorExecutor + Exchange 完整仿真 |
| 5. **配置驱动**:`settings.py` + YAML + 环境变量 |
| |
| ## QuantaAlpha 集成 |
| |
| [QuantaAlpha](https://github.com/QuantaAlpha/QuantaAlpha) 因子库 JSON 可直接接入: |
| |
| ```bash |
| # 1. 把 QuantaAlpha 产出的 all_factors_library*.json 放到 data/factors/ |
| # 2. 配置 OPENAI_API_KEY(LLM 策略模式)或直接 IC 加权合成信号 |
| python scripts/run_backtest.py --signal-source quantaalpha_library --strategy topk_dropout |
| ``` |
| |
| ## 目录结构 |
| |
| ``` |
| ML-Alpha-Research-System/ |
| ├── config/ |
| │ ├── base.yaml |
| │ ├── gp_mining.yaml |
| │ ├── settings.py |
| │ └── workflows/ # qlib 实验 YAML |
| ├── data_pipeline/ |
| │ ├── convert_to_qlib_bin.py |
| │ └── gp_dataset_builder.py |
| ├── experiments/ |
| │ └── workflow_runner.py |
| ├── factor_engine/ |
| │ ├── gp/ # GP 因子挖掘 |
| │ ├── gp_handler.py # Qlib handler |
| │ └── legacy/ # 原始脚本 |
| ├── strategies/ # 策略框架 |
| │ ├── registry.py |
| │ ├── runner.py |
| │ └── builtins/ |
| ├── integrations/ |
| │ └── quantaalpha/ # LLM API + 因子库 |
| ├── scripts/ |
| │ ├── run_backtest.py # 策略回测 |
| │ ├── run_llm_strategy.py # LLM 策略 |
| │ ├── run_qrun.py # qlib 实验 |
| │ ├── run_full_pipeline.py |
| │ └── launch_platform.py # Web 平台一键启动 |
| ├── web_development/ # 期货 UI + 服务控制台 + 研究桥接 |
| │ ├── backend/ # FastAPI + platform/research API |
| │ └── frontend/ # Vue3 仪表盘 / 服务控制台 / 因子研究 |
| ├── reports/ |
| │ └── analysis.py |
| ├── mlruns/ |
| └── outputs/ |
| ├── backtest/ |
| ├── gp_mining/ |
| └── reports/ |
| ``` |
| |