跳到正文

目录

Stefan Jansen《Machine Learning for Trading》2nd:量化金融 ML 工程化完全指南

Stefan 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 环境已不在 maininstallation/environment.yml 已不存在),需要它需回旧 git 历史。

项目概览

指标数值
仓库stefan-jansen/machine-learning-for-trading
Stars20,867(截至 2026-09)
Forks5,604(截至 2026-09)
主要语言Jupyter Notebook(核心交付物)+ Python
协议MIT License
配套书籍《Machine Learning for Algorithmic Trading》2nd Edition(Packt,2020)
章节23 章 + 1 附录(Alpha Factor Library,100+ 因子)
Notebooks150+(多数为已运行可读状态)
主页ml4trading.io
最近活跃仍在维护(最近推送 2026-09)

核心方法论:ML4T 工作流

Jansen 把量化 ML 抽象成 7 步循环,散落在各章的操作被统一到了一个可迭代的模型里:

整套工作流的设计前提:ML 模型是策略 pipeline 的一环,不是策略本身。数据源和特征工程的质量决定了模型的天花板,这也是第 2-5 章独占全书 23 章里 4 章的原因——它们处理的是 ML 模型之外、却决定模型能不能用的基础设施。

全书 23 章结构矩阵

部分章节主题核心算法 / 工具
Part 1:Data → Strategy1ML for Trading 全景行业趋势、用例
2市场与基本面数据NASDAQ ITCH、XBRL、Algoseek 分钟 bar
3另类数据网络爬虫、情绪信号、卫星图
4金融特征工程NumPy / pandas / TA-Lib / wavelets / Kalman
5组合优化与绩效mean-variance、pyfolio
Part 2:ML 基础6ML 流程通用框架训练/调优/评估
7线性模型风险因子、收益预测
8ML4T 工作流Zipline 端到端回测
9时间序列GARCH、协整、配对交易
10贝叶斯 ML动态 Sharpe、配对交易
11随机森林日股多空策略
12梯度提升提升策略表现
13无监督学习风险因子、资产配置
Part 3:NLP14文本数据情绪分析
15主题建模金融新闻摘要
16词嵌入财报电话会议、SEC 文件
Part 4:DL & RL17深度学习入门TensorFlow 2
18CNN时间序列→图像、卫星图
19RNN多变量时间序列、情绪
20自编码器条件风险因子、资产定价
21GAN合成时序数据(TimeGAN)
22深度强化学习交易 agent(DQN / PPO)
23结论与下一步工程化路线
附录24Alpha 因子库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 book

2. 特征工程: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 章 GANTimeGAN 生成合成金融时序,缓解小样本问题

一次完整任务流过系统

下面用"基于动量因子的日股多空策略"这个场景,走一遍 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-learnshap 等未提供预编译轮子的包,因此先要装好 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 登录。欢迎补充事实、异议与实践。