Stefan Jansen《Machine Learning for Trading》2nd:量化金融 ML 工程化完全指南
posts posts 2026-06-02T03:05:00+08:00Stefan Jansen《Machine Learning for Algorithmic Trading》第 2 版配套代码库,150+ Jupyter Notebooks 覆盖 23 章,四大主题:数据源与特征工程、监督/无监督交易策略、文本 NLP 信号、深度与强化学习。覆盖端到端 ML4T 工作流与 Zipline-reloaded 回测引擎集成。技术笔记量化交易, 机器学习, PythonStefan Jansen《Machine Learning for Trading》2nd:量化金融 ML 工程化完全指南
Stefan Jansen 的《Machine Learning for Algorithmic Trading》第 2 版是少数同时给出完整代码与系统框架的工程化手册——150+ Jupyter Notebooks 覆盖 23 章、800+ 页,从数据源、特征工程、监督/无监督模型,一路走到 NLP(自然语言处理)、深度学习和强化学习的回测落地。
这本书额外把模型训练之外的三处关键环节讲透:预测如何变成多空头寸、历史数据上的验证如何落地、以及一个因子究竟是真实 alpha 还是噪音。
版本边界:仓库的
main分支已在 2026 年按新版《Machine Learning for Trading》第 3 版整体重建——章节从 23 章扩到 27 章,新增 RAG、知识图谱与 autonomous agents,环境也从 conda 换成 Docker 或uv。本文的章节矩阵与工作流对应第二版(2020)书,下表与末尾安装命令以当前main分支为准。第二版时代的 conda + Zipline 环境已不在main(installation/environment.yml已不存在),需要它需回旧 git 历史。
项目概览
| 指标 | 数值 |
|---|---|
| 仓库 | stefan-jansen/machine-learning-for-trading |
| Stars | 20,867(截至 2026-09) |
| Forks | 5,604(截至 2026-09) |
| 主要语言 | Jupyter Notebook(核心交付物)+ Python |
| 协议 | MIT License |
| 配套书籍 | 《Machine Learning for Algorithmic Trading》2nd Edition(Packt,2020) |
| 章节 | 23 章 + 1 附录(Alpha Factor Library,100+ 因子) |
| Notebooks | 150+(多数为已运行可读状态) |
| 主页 | ml4trading.io |
| 最近活跃 | 仍在维护(最近推送 2026-09) |
核心方法论:ML4T 工作流
Jansen 把量化 ML 抽象成 7 步循环,散落在各章的操作被统一到了一个可迭代的模型里:
整套工作流的设计前提:ML 模型是策略 pipeline 的一环,不是策略本身。数据源和特征工程的质量决定了模型的天花板,这也是第 2-5 章独占全书 23 章里 4 章的原因——它们处理的是 ML 模型之外、却决定模型能不能用的基础设施。
全书 23 章结构矩阵
| 部分 | 章节 | 主题 | 核心算法 / 工具 |
|---|---|---|---|
| Part 1:Data → Strategy | 1 | ML for Trading 全景 | 行业趋势、用例 |
| 2 | 市场与基本面数据 | NASDAQ ITCH、XBRL、Algoseek 分钟 bar | |
| 3 | 另类数据 | 网络爬虫、情绪信号、卫星图 | |
| 4 | 金融特征工程 | NumPy / pandas / TA-Lib / wavelets / Kalman | |
| 5 | 组合优化与绩效 | mean-variance、pyfolio | |
| Part 2:ML 基础 | 6 | ML 流程通用框架 | 训练/调优/评估 |
| 7 | 线性模型 | 风险因子、收益预测 | |
| 8 | ML4T 工作流 | Zipline 端到端回测 | |
| 9 | 时间序列 | GARCH、协整、配对交易 | |
| 10 | 贝叶斯 ML | 动态 Sharpe、配对交易 | |
| 11 | 随机森林 | 日股多空策略 | |
| 12 | 梯度提升 | 提升策略表现 | |
| 13 | 无监督学习 | 风险因子、资产配置 | |
| Part 3:NLP | 14 | 文本数据 | 情绪分析 |
| 15 | 主题建模 | 金融新闻摘要 | |
| 16 | 词嵌入 | 财报电话会议、SEC 文件 | |
| Part 4:DL & RL | 17 | 深度学习入门 | TensorFlow 2 |
| 18 | CNN | 时间序列→图像、卫星图 | |
| 19 | RNN | 多变量时间序列、情绪 | |
| 20 | 自编码器 | 条件风险因子、资产定价 | |
| 21 | GAN | 合成时序数据(TimeGAN) | |
| 22 | 深度强化学习 | 交易 agent(DQN / PPO) | |
| 23 | 结论与下一步 | 工程化路线 | |
| 附录 | 24 | Alpha 因子库 | 100+ 因子即查即用 |
关键工程实践
1. 数据:多源融合是基本功
Jansen 把数据源切成三档:
| 类型 | 代表 | 用途 |
|---|---|---|
| 市场数据 | NASDAQ ITCH、Algoseek 分钟 bar | 重建订单簿、做日内策略 |
| 基本面数据 | SEC XBRL filings、Compustat | 财务比率、行业分析 |
| 另类数据 | 财报电话会议、新闻、卫星图 | 情绪信号、宏观预测 |
# 第 2 章:重建订单簿
import pandas as pd
import numpy as np
def reconstruct_order_book(itch_messages: pd.DataFrame) -> pd.DataFrame:
"""从 NASDAQ ITCH 消息流重建 L2 order book"""
book = {'bids': {}, 'asks': {}}
snapshots = []
for _, msg in itch_messages.iterrows():
if msg['type'] == 'A': # Add order
side = 'bids' if msg['side'] == 'B' else 'asks'
book[side][msg['price']] = msg['shares']
elif msg['type'] == 'D': # Delete
side = 'bids' if msg['side'] == 'B' else 'asks'
book[side].pop(msg['price'], None)
# ... 完整实现见 ch02 notebook
return book2. 特征工程:Alpha 因子是策略的"语言"
第 4 章与第 24 章附录给出 100+ 可计算的 alpha 因子(动量、波动、价值、情绪、质量),并展示如何系统化地研究、回测、评估一个新因子。这两章是全书使用频率最高的部分——这里展示的是因子研究的标准流程,不是因子列表本身。
# 24_alpha_factor_library 中的动量因子
def momentum_factor(prices: pd.Series, lookback: int = 252) -> pd.Series:
"""12-1 月动量:过去 12 个月收益,跳过最近 1 个月"""
return (prices.shift(21) / prices.shift(lookback)) - 1# 用 Alphalens 评估因子的 IC、turnover、decay
import alphalens
factor_data = alphalens.utils.get_clean_factor_and_forward_returns(
factor=momentum_signal,
prices=stock_prices,
quantiles=5,
periods=(1, 5, 21)
)
alphalens.performance.factor_information_coefficient(factor_data).plot()
alphalens.tears.create_returns_tear_sheet(factor_data)3. 端到端回测:Zipline-reloaded
第 8 章把 ML 模型接入 Zipline 策略:
# zipline_reloaded 策略:把 ML 模型预测作为 alpha
from zipline.pipeline import Pipeline, CustomFactor
from zipline.api import attach_pipeline, pipeline_output, order_target_percent
class MLAlphaFactor(CustomFactor):
inputs = [USEquityPricing.close]
window_length = 252
def compute(self, today, assets, out, prices):
returns = (prices[1:] - prices[:-1]) / prices[:-1]
out[:] = returns.mean(axis=0)
def initialize(context):
attach_pipeline(
Pipeline(columns={'alpha': MLAlphaFactor()}),
name='ml_alpha'
)
schedule_function(rebalance, date_rules.month_start())
def rebalance(context, data):
alpha = pipeline_output('ml_alpha')
longs = alpha.dropna().nlargest(int(len(alpha) * 0.2))
shorts = alpha.dropna().nsmallest(int(len(alpha) * 0.2))
for asset in longs.index:
order_target_percent(asset, 1.0 / len(longs))
for asset in shorts.index:
order_target_percent(asset, -1.0 / len(shorts))4. 学术前沿可复现
第 18/20/21 章直击顶会论文,把"看论文"变成"跑代码":
| 论文 | 复现章节 | 核心创新 |
|---|---|---|
| Sezer & Ozbahoglu (2018) | 第 18 章 CNN | 把金融时序转成 2D 图像,用 CNN 预测涨跌 |
| Gu, Kelly & Xiu (2019) | 第 20 章自编码器 | 用 autoencoder 提取条件风险因子做资产定价 |
| Yoon, Jarrett & van der Schaar (2019) | 第 21 章 GAN | TimeGAN 生成合成金融时序,缓解小样本问题 |
一次完整任务流过系统
下面用"基于动量因子的日股多空策略"这个场景,走一遍 Jansen 工作流的 7 个步骤,看看书中的各章是怎么串起来的。
Step 1 — Idea(第 1 章):假设我们观察到美股大盘股存在中期动量效应——过去 12 个月涨幅高的股票,接下来 1 个月继续跑赢。投资范围限制在 S&P 500 成分股。
Step 2 — Data(第 2 章):从 Algoseek 分钟 bar 或 yfinance 日线获取 500 只股票过去 5 年的价格数据,存入 pandas DataFrame。第 2 章提供了多种数据源的取数代码和清洗流程。
Step 3 — Feature(第 4、24 章):基于价格数据计算 12-1 月动量因子(momentum_factor 函数)。同时计算波动率、换手率等辅助因子用于后续过滤。用 Alphalens 评估因子的 IC(信息系数)和分层收益衰减——如果 IC 均值不到 0.02 或 decay 太快,回退到 Step 1 调整假设。
Step 4 — Model(第 11 章):用随机森林把多个因子合并成一个预测信号。第 11 章详细讲了金融场景下随机森林的训练要点:用时间序列交叉验证而非随机 K-fold、如何处理类别不平衡、如何解读特征重要性。
Step 5 — Strategy(第 8 章):把随机森林的预测概率写入 MLAlphaFactor(替换上面代码中的简单动量均值),接入 Zipline 的 Pipeline API。策略规则:每月初做多预测概率最高的 20% 股票,做空最低的 20%,等权配置。
Step 6 — Backtest(第 5、8 章):在 2018-2022 的样本外数据上运行回测。用 pyfolio 生成 tear sheet,关注四个指标:样本外 Sharpe 是否显著低于样本内(过拟合信号)、max drawdown 的持续时间和幅度、月换手率(过高意味着交易成本侵蚀收益)、因子 IC 是否在回测期持续为正。
Step 7 — 迭代:如果回测结果可接受,回到 Step 3 添加新因子或替换模型(如第 12 章的梯度提升),重新走 Step 4-6。7 步构成一个持续运转的循环,这也是 Jansen 全书结构的组织逻辑。
安装与运行
安装现在有两条路径,任选其一,都要从仓库根目录执行:
git clone https://github.com/stefan-jansen/machine-learning-for-trading.git
cd machine-learning-for-trading
cp .env.example .env # 默认值即可用,无需改动
# 路径 A:Docker,自带全部依赖,无需编译器
docker compose pull ml4t
# 路径 B:本地 uv 环境
curl -LsSf https://astral.sh/uv/install.sh | sh
source $HOME/.local/bin/env
uv sync路径 B 的 uv sync 需要从源码编译 scikit-learn、shap 等未提供预编译轮子的包,因此先要装好 C/C++ 编译器(macOS 上执行 xcode-select --install),否则会以 error: command 'c++' failed 中止。第二版时代曾用的 zipline-reloaded 等项目的 conda-forge 说明,也已随这次重构过时。
与同类资源的横向对比
表格里的星级是我们对定位线的主观标记,不是可量化的 benchmark,别当作分值比较。三条线的口径:覆盖面看策略类型与数据源的宽度,深度看数学推导与实现细节的完整度,工程化看能否直接跑出可复用的 pipeline。
| 资源 | 定位 | 覆盖广度 | 深度 | 工程化 |
|---|---|---|---|---|
| Jansen 2nd(本仓库) | 教科书 + 完整代码 | ★★★★★ | ★★★★ | ★★★★★ |
| Marcos López de Prado《Advances in Financial ML》 | 学术专著 | ★★★ | ★★★★★ | ★★★ |
| Ernest Chan《Quantitative Trading》 | 入门书 | ★★ | ★★★ | ★★ |
| Hudson & Thames 开源 notebooks | 专题实现 | ★★ | ★★★★ | ★★★ |
| QuantConnect / Zipline 官方示例 | 平台文档 | ★★ | ★★ | ★★★★ |
López de Prado 的书在数学深度上更强,但代码是片段式的。Chan 的书适合零基础入门,ML 覆盖浅。Hudson & Thames 的 notebooks 在特定专题(如组合优化)上更深入,但缺少统一的叙事框架。Jansen 的定位是教科书深度加完整工程代码的双轨覆盖。
谁该用、怎么用
适合先读的人群:
- 有一定 Python 和 pandas 基础、想系统学习 ML 在量化交易中如何落地的开发者
- 已经在用 Zipline/QuantConnect,想扩展 ML 策略类型的交易者
- 金融工程或数据科学方向的学生,需要一份可运行的 ML4T 参考
不急着读的情况:
- 零编程基础,只想了解量化交易概念——先看 Ernest Chan 的入门书
- 只做主观交易,不需要 ML 模型辅助决策
- 生产环境已稳定,只缺某个特定策略的实现——直接查对应章节的 notebook 即可
推荐阅读顺序:先通读第 1 章了解全景,然后按自己关注的领域跳到对应部分——想做 NLP 策略的直接从第 14 章开始,想用强化学习的从第 22 章开始。第 2-5 章(数据与特征工程)建议所有人都看,因为这部分是跨策略类型的通用基础设施。
引用与延伸阅读
- 仓库主页:https://github.com/stefan-jansen/machine-learning-for-trading
- 配套书籍购买:https://www.amazon.com/Machine-Learning-Algorithmic-Trading-alternative/dp/1839217715
- 项目主页:https://ml4trading.io
- 作者博客:https://ML4Trading.io/
本文基于 Stefan Jansen《Machine Learning for Algorithmic Trading》2nd Edition (2020) 与对应 GitHub 仓库(开源数据复核于 2026-09)。所有 notebook 路径以仓库 main 分支为准。读者应自行评估文中提及的所有策略在真实市场的可交易性。
参与讨论
使用 GitHub 登录。欢迎补充事实、异议与实践。
讨论暂时无法加载。