如果你想从 0 build 一个量化因子框架,GitHub 上有 3 个项目是必看的:
🥇 wilsonfreitas/awesome-quant (⭐29k) — Quant 工具索引
🥈 stefan-jansen/ml4trading (⭐20k) — 教科书级 27 章 + Ch 8 因子工程
🥉 quantopian/alphalens (⭐4.4k) — 因子评估金标准
3 个项目是 pipeline 关系:awesome-quant 告诉你用什么,ml4trading 教你怎么build,alphalens 告诉你好不好。
⭐ 29,148 · 904 commits · 2026-08-25 更新 · 7.1 MB · 3.9k forks
这是一个 curated link list,本质是一份高度结构化的 markdown。它把 quant 工具按 19 个分类组织:
跟你"如何创建量化因子"直接相关,我从 760 行的 README 里抽出 Factor Analysis 章节:
[name](url) - language - description.agents/skills/ 和 .claude/skills/ — 已经为 AI 工具准备好了 agent skillstopic.py 自动从 GitHub 抓取每个项目的 topicscranscrape.py 从 CRAN 抓 R 包⭐ 20,630 · 1 GB · 611 commits · 27 章 + 9 case studies
Ch 8 (Financial Feature Engineering) 是整本 3rd edition 的核心之一 — 它把"做一个因子"这件事从"指标收集"提升为"假设驱动的特征工程"。
书的 27 章完整 pipeline:
01-04 数据基础设施 (process, market, microstructure, alt data)
05 合成数据生成
06-07 策略定义 / 学习任务定义
08 ⭐ 金融特征工程 ← 本文重点
09 模型驱动特征 (PCA / 隐因子)
10 文本特征
11 ML pipeline
12-15 各种 ML/DL 方法
16-20 回测 / 组合 / 成本 / 风险
21-26 RL / RAG / 知识图谱 / agent / live trading / MLOps
27 系统化 edge
| 节 | 因子族 | 核心 Notebook | 业务含义 |
|---|---|---|---|
| 8.1 | 经济驱动配置 | — | horizon alignment + driver hypothesis + role separation |
| 8.2 | 价格衍生特征 | 01_price_volume_features | trend / reversal / volatility / liquidity / microstructure |
| 8.3 | 结构性 + 跨合约 | 03_structural_cross_instrument | carry / relative value / lead-lag / 期权隐含 |
| 8.4 | 上下文 + 慢变量 | 04_fundamentals_macro_calendar | SEC XBRL / FRED 宏观 / 日历 (PIT 严格) |
| 8.5 | 聚合 + 隐结构 | — | 何时用 PCA / autoencoder (引出 Ch 9, 14) |
| 8.6 | 特征组合 + 搜索控制 | 05_feature_selection | gating / scaling / one-knob-at-a-time |
| 8.6 | 鲁棒性 + 事件研究 | 06_robustness_sensitivity + 07_event_studies | 参数鲁棒 + 事件驱动验证 |
# 8.2 价格衍生因子
uv run python 08_financial_features/01_price_volume_features.py
# 8.3 结构性 + 跨合约
uv run python 08_financial_features/03_structural_cross_instrument_features.py
# 内存峰值 ~7.4 GB RSS (AlgoSeek S&P 500 options surface)
# 8.4 基本面 + 宏观 + 日历 (PIT)
uv run python 08_financial_features/04_fundamentals_macro_calendar.py
# 8.6 特征选择 + 鲁棒性
uv run python 08_financial_features/05_feature_selection.py
uv run python 08_financial_features/06_robustness_sensitivity.py
# 测试模式 (Papermill)
uv run pytest tests/test_notebooks.py -v -k "08_financial_features"
⭐ 4,426 · 90 MB · 2020-04 最后 commit · 522 commits
alphalens 的核心是 create_full_tear_sheet() — 一行代码出 4 大评估报告。让我从源码看:
# alphalens/tears.py line 489-526
@plotting.customize
def create_full_tear_sheet(factor_data, long_short=True,
group_neutral=False, by_group=False):
""" 4 大评估 """
plotting.plot_quantile_statistics_table(factor_data) # 分位统计表
create_returns_tear_sheet(factor_data, long_short,
group_neutral, by_group) # 1) 收益分析
create_information_tear_sheet(factor_data, group_neutral,
by_group) # 2) IC 分析
create_turnover_tear_sheet(factor_data) # 3) 换手率
| 评估 | 核心指标 | 数学 | 解读 |
|---|---|---|---|
| ① 分位统计 | quantile mean / std / count | 分5档,算每档 mean 收益 | 因子是否单调分档 |
| ② 收益分析 | 分位累计收益 / 多空对冲 | long top - short bottom | 多空 alpha 是否显著 |
| ③ IC 分析 | Information Coefficient (Rank IC) | corr(factor, forward_return) / spearman | 预测能力 (核心指标) |
| ④ 换手率 | 因子分位变化率 | 逐期分位变化的占比 | 交易成本预估 |
import alphalens
# Step 1: 准备数据 (MultiIndex: date + asset)
factor_data = alphalens.utils.get_clean_factor_and_forward_returns(
my_factor, # 你的因子 Series
pricing, # 行情 DataFrame
quantiles=5, # 分5档
groupby=ticker_sector, # 可选: 行业分组
groupby_labels=...
)
# Step 2: 一键出全套评估
alphalens.tears.create_full_tear_sheet(factor_data)
stefan-jansen/alphalens-reloaded (已修复 pandas 2.x 兼容)。
matplotlib / numpy / pandas / scipy / seaborn / statsmodels。最新版需要 Python 3.9+ 和 pandas 1.5+。
| Rank IC | 评级 | 业务含义 |
|---|---|---|
| > 0.10 | 极强 | 顶级 alpha,可能很快衰减 |
| 0.05 - 0.10 | 强 | 可上线 |
| 0.02 - 0.05 | 中 | 可纳入多因子模型 |
| < 0.02 | 弱 | 单独难用,需配合其他因子 |
| 接近 0 | 无信号 | 不要浪费交易成本 |
这是 3 个项目**真正**的协同工作流 (我从 3 个 README 提炼的):
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ 1. awesome-quant │ │ 2. ml4trading │ │ 3. alphalens │
│ (工具索引) │ │ Ch 8 因子工程 │ │ (因子评估) │
│ │ │ │ │ │
│ - 选因子库 │ ──→ │ - 写特征规格 │ ──→ │ - 算 IC │
│ - 选回测框架 │ │ - 7 大因子族 │ │ - 分位回测 │
│ - 选数据源 │ │ - 9 大核心概念 │ │ - 换手率 │
│ - 选 MCP/agent │ │ - PIT 严格 │ │ - 1 行出 tear sheet│
└──────────────────┘ └──────────────────┘ └──────────────────┘
What to use How to build How good is it
# === 阶段 1: 选工具 (awesome-quant) ===
# 看 Factor Analysis 章节, 决定用:
# - 因子定义: 自己写 (Ch 8 教)
# - 评估: alphalens
# - 回测: vectorbt
# - 数据: yfinance 或 tushare
# === 阶段 2: 写因子 (ml4trading Ch 8) ===
import pandas as pd
import numpy as np
def momentum_lowvol_factor(prices, lookback=60, vol_lookback=20):
"""Ch 8 思路: 6 月动量 + 20 日低波 → signal × state 交互"""
# Step 1: signal - 6 月动量
momentum = prices.pct_change(lookback)
# Step 2: state - 20 日波动率
volatility = prices.pct_change().rolling(vol_lookback).std()
# Step 3: 组合 (gating: 低波时信号更强)
z_mom = (momentum - momentum.rolling(252).mean()) / momentum.rolling(252).std()
z_vol = (volatility - volatility.rolling(252).mean()) / volatility.rolling(252).std()
factor = z_mom * np.exp(-z_vol) # 低波时动量权重更大
return factor.shift(1) # PIT: 昨天计算,今天用
# === 阶段 3: 评估 (alphalens) ===
import alphalens
pricing = ... # 你的行情数据
my_factor = momentum_lowvol_factor(pricing)
factor_data = alphalens.utils.get_clean_factor_and_forward_returns(
my_factor, pricing, quantiles=5
)
alphalens.tears.create_full_tear_sheet(factor_data)
# → 1 行出 IC + 分位收益 + 换手率
| # | 陷阱 | 怎么避开 | 对应项目 |
|---|---|---|---|
| 1 | Look-ahead bias (未来数据) | 所有因子都 .shift(1) 隔一天;PIT join 用 merge_asof |
Ch 8 反复强调 + alphalens tear sheet 自动检测 |
| 2 | Survivorship bias (生存者偏差) | 用 Point-in-Time universe (含已退市股票), 不要只取当前存在的 |
Ch 8.4 + alphalens get_clean_factor |
| 3 | Multiple testing (过拟合陷阱) | 100+ 因子中必然有几个 IC > 0.05 是噪声; 用 Bonferroni / FDR 校正 |
Ch 8.6 "feature search control" |
| 4 | Turnover 不管 → 交易成本吃掉 alpha | Rank IC 0.05 但换手率 100% 月 = 净 alpha 可能为负; tear sheet 必看换手率图 |
alphalens create_turnover_tear_sheet |
| 5 | 短时间窗口 / 单一 regime 过拟合 | 至少 5 年数据 + 跨 regime 测试 (牛/熊/震荡) |
Ch 8.6 06_robustness_sensitivity |
| 6 | 非平稳特征 (regime shift) | macro 特征要带 PIT timestamp + reporting lag 不要用最新已修订值 |
Ch 8.4 专门讲 PIT |
| 7 | 看 IC 不看 PnL → "IC 高 ≠ 赚钱" | tear sheet 必看 long-short 累计收益 + 最大回撤; IC 0.03 + 大回撤 = 不可用 |
alphalens 4 大报告全看 |
基于 3 个项目的研究,我建议的最小可运行 pipeline:
# === Step 1: 选工具 (5 min, 看 awesome-quant) ===
# 决定: alphalens-reloaded + pandas + numpy + yfinance
# === Step 2: 数据准备 (1 小时, PIT 严格) ===
import yfinance as yf
pricing = yf.download("AAPL", start="2015-01-01")["Close"]
# 必须 PIT: 用昨天的价格,不能用今天未收盘的
# === Step 3: 写因子 (4 小时, 跟 Ch 8 思路) ===
def my_factor(prices, lookback=60):
return prices.pct_change(lookback).shift(1) # 1 步 PIT
factor = my_factor(pricing)
# === Step 4: 评估 (10 min, alphalens 一行) ===
import alphalens_reloaded as alphalens # 用维护版
factor_data = alphalens.utils.get_clean_factor_and_forward_returns(
factor, pricing, quantiles=5
)
alphalens.tears.create_full_tear_sheet(factor_data)
# → 看 4 大图: 分位收益 / IC / 换手率
# === Step 5: 决策 (1 min) ===
# IF Rank IC > 0.02 AND 换手率 < 30%/月 AND 多空 PnL 显著
# → 可纳入多因子模型
# ELSE → 换参数 / 换逻辑 / 丢弃
| 项目 | URL | 角色 |
|---|---|---|
| wilsonfreitas/awesome-quant | https://github.com/wilsonfreitas/awesome-quant | 选项目 |
| stefan-jansen/machine-learning-for-trading | https://github.com/stefan-jansen/machine-learning-for-trading | build 因子 |
| quantopian/alphalens | https://github.com/quantopian/alphalens | 评估 |
| stefan-jansen/alphalens-reloaded | https://github.com/stefan-jansen/alphalens-reloaded | alphalens 维护版 (推荐) |
| BerkinChen/AlphaEval | https://github.com/BerkinChen/AlphaEval | 5 种算法自动挖因子 |
| microsoft/qlib | https://github.com/microsoft/qlib | 微软量化平台 (A 股) |
| 项目 | 角色 | 核心机制 | 关键代码 | 学习价值 |
|---|---|---|---|---|
| awesome-quant | 索引器 | 19 大类 curated link list | topic.py 自动抓 topics | 全景认知 |
| ml4trading Ch 8 | 教科书 | 9 学习目标 + 7 节 + 9 个核心概念 | 01-07 notebook .py + .ipynb | 方法论 |
| alphalens | 评估器 | create_full_tear_sheet 4 大报告 | tears.py 732 行 | 评估 |
3 个项目互为补充, 0 重叠:索引 → 教学 → 评估,形成完整 pipeline。
完 · 2026-08-25 · Chase's Personal Page · 3 个 GitHub 真实项目机制拆解