machine-learning-for-trading 实操指南:如何从零跑通 101 个 Alpha 因子研究全流程
【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading
machine-learning-for-trading(《机器学习算法交易》第三版配套代码)把一条完整的量化链路串成了 27 个可运行章节:从原始数据获取、特征(因子)工程、模型训练,一直到回测、组合构建和实盘对接。它给非科班开发者最大的价值,是让你不用自己搭脚手架,就能照着"因子计算 → IC 评估 → 回测"的顺序把一套 Alpha 因子研究跑起来。如果你正想找一套能直接运行、又带评估工具的因子代码,而不想从零推导每个公式、拼凑每个回测脚本,这里就是一个现成的起点。
🔍 它到底在做什么
整个项目其实只回答一个问题:一个信号到底能不能预测未来的收益?围绕这个问题,它反复用到两个核心概念,理解了这两个概念,27 个章节就都串起来了。
第一个概念是因子(Alpha Factor)。你可以把因子想象成一台"选股雷达":它每天对每只标的打一个分数,分数越高的标的,你越期待它未来涨得更多。项目里的因子大多是从价格和成交量算出来的,比如 21 天动量(过去一个月涨幅)就是最典型的因子。第三版没有把因子做成一个孤立的表格,而是把它们收进了ml4t-engineer的**因子注册表(feature registry)**里——注册表自带公式、参数、类别这些元信息,你调registry.get("rsi")就能看到这个因子的数学定义和入参,不用翻源码。按数据来源分,因子大致落在几族里:
- 价格/成交量族:动量、趋势、波动率、流动性、微观结构
- 结构族:跨品种、期限结构、期权隐含
- 慢变量族:基本面、宏观、日历(主要用来"给快信号做条件开关")
第二个概念是信息系数(Information Coefficient,IC)。它衡量"雷达打得准不准",本质是因子值和未来收益之间的相关系数,你可以把它直接理解成"命中率":IC 越高,说明因子排名靠前的人,未来收益越真的靠前。项目用ml4t-diagnostic里的cross_sectional_ic(横截面 IC)和analyze_signal来算它,这是第 7 章07_defining_the_learning_task/05_signal_evaluation.py的核心。项目同时引用了 Kakushadze 那篇经典论文《101 Formulaic Alphas》,所以"101 个因子"在这套代码里更多是评估范式的源头:先有因子,再用 IC 和分位数收益筛掉没用的。
⚡ 从零到跑通:实操路径
下面按"环境准备 → 数据加载 → 因子计算 → 效果评估"四步走,每一步都配一段能直接复制的代码。
1. 环境准备
这一段只是把仓库拉下来并装好依赖。项目用uv管理环境,仓库根目录有pyproject.toml和uv.lock,装完就能跑。
git clone https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading cd machine-learning-for-trading uv sync运行后你会看到依赖被解析并安装,uv sync结束时不再报错即可进入下一步。
2. 数据加载
这一段加载项目自带的 ETF 真实面板数据。项目把数据加载封装成from data import load_etfs,返回一个 Polars DataFrame,含timestamp / symbol / close等列,这也是后面算因子和算收益共用的基础。
from data import load_etfs etfs = load_etfs() print(f"标的: {etfs['symbol'].n_unique()} 只 ETF, {len(etfs):,} 行")运行后你会看到类似"标的: N 只 ETF, XXX,XXX 行"的输出,确认数据非空、时间跨度覆盖到最近。
3. 因子计算
这一段算一个最基础的 21 天动量因子,也就是"选股雷达"的第一根天线。它按symbol分组、用shift(21)取 21 天前的收盘价,避免把不同标的的价格串到一起——这正是第 8 章反复强调的"时间安全(time-safety)":分组、排序、窗口对齐都不能错。
import polars as pl factor_df = ( etfs.sort(["symbol", "timestamp"]) .with_columns([(pl.col("close") / pl.col("close").shift(21).over("symbol") - 1).alias("factor")]) .filter(pl.col("factor").is_not_null()) .select(["timestamp", "symbol", "factor"]) )运行后你会得到一个三列面板(日期、标的、因子值),前 21 个交易日因子的前缀为空值被过滤掉,行数比原始数据略少。
4. 效果评估
这一段把因子值和它之后的 21 天真实收益对齐,拼成一张"评估面板",这是 IC 计算的标准输入。项目用shift(-21)(负偏移)取未来价格,这里刻意只在训练/评估边界处做,避免把未来信息泄露到因子里。
prices_df = etfs.select(["timestamp", "symbol", "close"]).rename({"close": "price"}) eval_df = ( factor_df.join(prices_df, on=["timestamp", "symbol"], how="inner") .sort(["symbol", "timestamp"]) .with_columns(fwd_21d=(pl.col("price").shift(-21).over("symbol") / pl.col("price") - 1)) )运行后你会看到一张带fwd_21d(未来 21 天收益)列的面板,把它连同因子一起交给analyze_signal/cross_sectional_ic就能出 IC 报告。
📊 评估你的因子有没有用
评估因子主要看两个指标,格式统一为"指标名 + 一句话定义 + 怎么读"。
信息系数(IC):因子值与未来收益的横截面相关系数,也就是"命中率"。怎么读:看 IC 的时间序列均值和它的标准差。IC 均值稳定为正说明方向对;但要看均值有没有明显大于 0,且不为正负乱跳。项目里cross_sectional_ic给出单日横截面值,pooled_ic给出整段时间合并值,analyze_signal还会顺带算 ICIR(IC 均值 / IC 标准差,衡量"命中率"稳不稳)。
分位数收益(Quantile Returns):把每天所有标的按因子值从小到大分成 5 组,看每组未来的平均收益。怎么读:看曲线是不是单调——因子值最高的那一组(Q5)未来收益应该最高,最低的(Q1)最低,Q5 减 Q1 的"价差(spread)"越大越好,且中间各组应平滑递增而不是断层。
给一个可以直接对号判断的阈值参考(以日频、股票/ETF 横截面、扣费前为准,具体随标的和周期浮动):
| IC 均值 | 分位收益单调性 | 建议动作 |
|---|---|---|
| < 0.02 | 不单调、价差接近 0 | 大概率是噪音,换因子或换周期 |
| 0.02 ~ 0.05 | 基本单调、Q5 稳定领先 | 可用,先小仓位验证、加成本回测 |
| > 0.05 | 单调且价差明显 | 强信号,进多因子组合与回测 |
如果 IC 在样本内漂亮、样本外直接归零,通常是过拟合或未来信息泄露,先回去查时间对齐,别急着调模型。
⚠️ 踩过的坑 & 容易忽略的细节
- 未来函数(lookahead):用
shift(-21)取未来收益、或窗口里混进了当天的收盘价,是新人最常踩的坑。→ 正确做法是严格区分"决策日只用当日及之前的信息",评估时的未来收益只用来打分,绝不回灌到因子。 - 分组/排序错位:忘记按
symbol排序或用over("symbol"),会把 A 标的的价格接到 B 标的上。→ 正确做法是任何滚动/移位前先.sort(["symbol", "timestamp"]),窗口操作用.over("symbol")。 - 幸存者偏差:用"现在还在"的标的池回测,会高估因子表现,因为退市、被剔除的票已经不在池子里。→ 正确做法是用带 point-in-time 的标的池(项目里 ETF 面板
eligibility.csv就是干这个的),只纳入当时真正可交易的标的。 - 慢变量泄露:基本面、财报数据存在披露滞后和事后修订,直接按公告日 join 会用到当时还不知道的数据。→ 正确做法是按"实际可用日"做 ASOF 对齐,这也是项目第 8 章专门强调的 point-in-time 纪律。
🚀 下一步可以怎么玩
- 想系统地挑因子,去
08_financial_features/05_feature_selection.py看"候选因子去重 + 一次只动一个旋钮"的筛选流程,再配合06_robustness_sensitivity.py做参数稳健性。 - 想从单因子到组合,顺着
case_studies/etfs/目录走一遍:03_financial_features到05_evaluation到07_gbm,看一个完整案例怎么把因子喂进模型。 - 想把信号变成策略,看
16_strategy_simulation/和17_portfolio_construction/,把评估通过的因子接进回测和组合构建。 - 想理解"为什么回测好看、实盘不行",去
19_risk_management/和18_transaction_costs/补成本和滑点,18_transaction_costs/11_cost_cliff.py专门讲"成本悬崖"。 - 想复现那套 101 因子的评估范式,重点读
07_defining_the_learning_task/05_signal_evaluation.py的 IC / ICIR / 分位价差写法,再套到自己的因子上。
machine-learning-for-trading真正的价值不在某一个因子,而在于它把"算因子 → 评估 IC → 回测 → 上实盘"整条路都铺好了,你只要照着章节走就行。挑一个你熟的标的池,先把一个动量因子从加载到 IC 报告跑通,剩下的都是重复。
【免费下载链接】machine-learning-for-tradingCode for Machine Learning for Trading, 3rd edition — from data sourcing to live execution.项目地址: https://gitcode.com/GitHub_Trending/ma/machine-learning-for-trading
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考