Machine Learning for Trading 2nd Edition — 完整教學
一句話定位:Stefan Jansen《Machine Learning for Algorithmic Trading》(ML4T 縮寫;機器學習演算法交易)2nd Edition 一整本書的官方配套程式碼倉庫,含 24 章 / 156 個 Jupyter notebook / 420MB,從原始市場資料一路走到深度強化學習(deep reinforcement learning, DRL;深度強化學習)交易代理人,是該領域 GitHub 上影響力最大的單一教學資產(17.8k stars / 5.2k forks)。
適合:想系統性學「ML 怎麼套到金融時間序列」的開發者、研究者、面試 buy-side quant ML role 的工程師、quantitative finance 大學課程助教。
不適合:想拿到「即插即用 alpha 策略」的散戶(書中所有範例都是教學用,不會直接賺錢);想跑 production live trading 的人(書本只覆蓋 backtest)。
⚠️ 重要提醒:repo 無 LICENSE 檔案,預設保留所有權利;商用、再散佈、製成內訓教材前必須先聯絡作者。
目錄
- 專案定位
- 安裝指南
- 核心架構解析
- Helper Scripts 詳細用法
- 應用場景:24 章逐章精讀
- 資安掃描報告
- FAQ — 從 issue tracker 整理的踩坑集
- 進階技巧
- 整合進其他工作流
- 重點摘要 Checklist
- 進一步閱讀
1. 專案定位
1.1 這是什麼
stefan-jansen/machine-learning-for-trading(以下簡稱 ml4t repo)是書本 Machine Learning for Algorithmic Trading: Predictive models to extract signals from market and alternative data for systematic trading strategies with Python, 2nd Edition(Packt 出版,2020-07-31)的官方程式碼倉庫。
書的核心命題:把「過去十年從學術界 → 工業界落地的現代 machine learning (ML; 機器學習) 與 deep learning (DL; 深度學習) 方法」,套到金融時間序列特有的問題上(包括 alpha factor research、portfolio optimization、backtesting、live trading 模擬),完整展示 end-to-end 的 ML for trading (ML4T) 工作流。
24 章的內容組織遵循 alpha 策略真實開發路徑:
1原始市場 + 另類資料 (Part 1)
2 ↓
3特徵工程 / alpha factor 設計 (Ch 4)
4 ↓
5strategy evaluation 框架 (Ch 5)
6 ↓
7ML 模型 (Part 2: 古典 ML,Ch 6-13)
8 ↓
9NLP 應用 (Part 3: Ch 14-16)
10 ↓
11Deep Learning / DRL (Part 4: Ch 17-22)
12 ↓
13總結 + alpha factor 工具庫 (Ch 23-24)
1.2 作者背景:為什麼是 Stefan Jansen
- 經歷:紐約 hedge fund 量化研究員、現任 Applied AI 創辦人、Packt 雙書作者(前作 Hands-On Machine Learning for Algorithmic Trading 1st edition 2018)。
- 維護的開源生態系:原版 Quantopian 倒閉後,作者把整套量化研究三件套(
zipline回測、pyfolio績效歸因、alphalens因子分析)fork 到自己的 GitHub organization,重命名為zipline-reloaded/pyfolio-reloaded/alphalens-reloaded/empyrical-reloaded,是這些工具在 Python 3.8+ 下唯一仍可運行的版本。 - 影響力:書本被 NYU、Columbia、Imperial College London 等多所大學 quantitative finance 碩士 / MFE program 列為主要參考。
- 官方資源:
- 書本網站:https://ml4trading.io
- Zipline-reloaded docs:https://zipline.ml4trading.io
- Discord 社群(書本網站底部連結)
1.3 與其他經典量化教材比較
| 教材 | 風格 | ML 含量 | 適合對象 |
|---|---|---|---|
| 本書(Jansen 2020) | hands-on Jupyter | 90%(古典 + NLP + DL + DRL) | 工程出身、要快速上手的 quant developer |
| Quantitative Trading(E. Chan, 2008/2013/2021) | 偏實務、書面 | 30%(最後幾章) | 散戶轉量化、學 mean reversion / pair trading 基本盤 |
| Advances in Financial Machine Learning(López de Prado, 2018) | 理論 + 方法論 | 70%(meta-labeling, fractional differentiation) | PhD / 已有 ML 基礎、要進階打怪的量化研究員 |
| Active Portfolio Management(Grinold & Kahn 2000) | 純理論 | 0% | 想理解 information ratio / fundamental law 的人 |
本書的賣點是「書 + 程式碼 + 章節 README markdown 三位一體」,即使沒買書,光啃 24 章 README 已經覆蓋約 60% 內容。
1.4 統計資料快照(2026-06-02)
| 指標 | 數值 |
|---|---|
| Stars | 17,844 |
| Forks | 5,183 |
| Default branch | main |
| Created | 2018-05-09 |
| Last commit | 2023-03-05 |
| Releases | 1(2021-02-27, 2nd Edition) |
| 章節數 | 24 |
| Notebook 總數 | 156 個 .ipynb |
| Python 檔案 | 29 個 .py(utils + helpers) |
| 文件 | 40 個 .md(README × 25 + 雜項) |
| Repo 大小 | 420 MB |
| 主要語言 | Jupyter Notebook |
| Primary topics | machine-learning / trading / investment / finance / data-science / deep-learning / synthetic-data / ml4t-workflow / trading-agent |
| License | None(無 LICENSE 檔) |
2. 安裝指南
2.1 三條路線總覽
installation/README.md 提供三條路徑,按推薦順序:
mamba+conda環境(推薦)— 跨 Windows / macOS / Linux;ml4t base + 3 個 OS-specific 環境檔。pip環境(macOS / Linux 限定,無 Windows 官方支援)—ml4t-base.txt。- Docker(已 deprecated 2021-04 起)— 原本 Quantopian-style zipline 必須的方案,Zipline-reloaded 解放後不再需要。
⚠️ 環境檔自 2022-04 後就沒更新;下面會列出版本漂移地雷。
2.2 推薦:mamba + conda 路線
2.2.1 前置
1# 1. 裝 miniconda(任何作業系統官方文件)
2# https://docs.conda.io/en/latest/miniconda.html
3
4# 2. 裝 mamba(conda-forge 上的快速 solver)
5conda install -n base -c conda-forge mamba
6
7# 3. clone repo
8git clone https://github.com/stefan-jansen/machine-learning-for-trading.git
9cd machine-learning-for-trading
2.2.2 創建 ml4t 主環境
1# OS 對應檔案:installation/{linux,macosx,windows}/ml4t.yml
2mamba env create -f installation/linux/ml4t.yml # Linux
3# mamba env create -f installation/macosx/ml4t.yml # macOS Intel
4# mamba env create -f installation/windows/ml4t.yml # Windows
5
6# 啟用
7conda activate ml4t
8
9# 註冊 Jupyter kernel(為了在 notebook 內切 kernel)
10python -m ipykernel install --user --name ml4t --display-name "Python 3.8 (ml4t)"
2.2.3 另外建議分開的環境
書本第 22 章 deep reinforcement learning 用較新 TensorFlow,作者建議獨立環境:
1mamba env create -f 22_deep_reinforcement_learning/environment.yml
2conda activate ml4t-rl
3python -m ipykernel install --user --name ml4t-rl --display-name "Python 3.8 (ml4t-rl)"
2.2.4 啟動 Jupyter Lab
1conda activate ml4t
2jupyter lab
2.3 pip 路線(macOS / Linux)
1# 用 pyenv 或 venv 切一個 Python 3.8 環境
2pyenv install 3.8.13
3pyenv local 3.8.13
4python -m venv .venv
5source .venv/bin/activate
6
7# 裝 OS-agnostic 套件
8pip install -r installation/ml4t-base.txt
注意:
ml4t-base.txt不含 TA-Lib(要自己 build C 程式庫)、不含 PyMC3(裝 conda 版較簡單)。整體 pip 路線維護成本較高,作者明確建議 conda 路線優先。
2.4 ⚠️ 版本漂移地雷(2024+ 必看)
installation/ml4t-base.yml 鎖死的關鍵版本:
1python=3.8 # Python 3.9+ 上 zipline-reloaded 仍可用,但部分 NLP 章節 spaCy 模型版本要對齊
2pandas<1.3 # pandas 1.4+ 刪掉 .append() → ch02 / ch14 部分 notebook 會掛
3gensim<4.0 # gensim 4.x API 大改 → ch15 LDA 部分 notebook 會掛
4nbconvert=5.6.1 # 為了避免 jupyter launch 警告,但近代 notebook 已不需要
結論:2024 年以後 clone 下來,建議 嚴格用 Python 3.8 + 環境檔 pin 版本,不要嘗試升級 pandas / numpy / gensim,否則會撞各章節的 issue tracker bug。
2.5 資料下載
書中許多 notebook 需要外部資料,主要分四類:
| 來源 | 章節 | 取得方式 |
|---|---|---|
| NASDAQ TotalView-ITCH sample | ch02 | 02_market_and_fundamental_data/01_NASDAQ_TotalView-ITCH_Order_Book/ 的 notebook 內附下載連結(NASDAQ 官方公開 sample) |
| AlgoSeek minute bars | ch02, ch12 | 書本網站提供下載:https://www.algoseek.com/ml4t-book-data.html |
| Quandl WIKI prices | ch04, ch07+ | 用 pandas-datareader 拉;Quandl WIKI 2018 後不再更新但歷史資料仍可下載 |
| SEC EDGAR XBRL | ch02, ch16 | 公開 API,notebook 內直接抓 |
| 書本配套 zip | 多章 | 書本網站提供 |
2.6 安裝流程圖
flowchart TD
A[Clone repo] --> B{選環境}
B -->|conda + mamba 推薦| C[mamba env create -f
installation/OS/ml4t.yml]
B -->|pip macOS Linux| D[pyenv 3.8.13
pip install -r ml4t-base.txt]
B -->|Docker deprecated| E[直接跳過 用 1 2]
C --> F[conda activate ml4t]
D --> F
F --> G[python -m ipykernel install --name ml4t]
G --> H{需要 DRL?}
H -->|是| I[另建 ml4t-rl 環境]
H -->|否| J[jupyter lab 開工]
I --> J
J --> K[下載 NASDAQ ITCH
AlgoSeek SEC EDGAR
章節 README 指示]
K --> L[執行 notebook]
3. 核心架構解析
3.1 24 章 4 大 Part 全貌
flowchart LR
subgraph P1["Part 1: From Data to Strategy
ch 1-5"]
C1[ch01 ML4T
idea→execution]
C2[ch02 Market &
Fundamental Data]
C3[ch03 Alternative
Data]
C4[ch04 Alpha Factor
Research]
C5[ch05 Strategy
Evaluation]
end
subgraph P2["Part 2: Classical ML
ch 6-13"]
C6[ch06 ML Process]
C7[ch07 Linear Models]
C8[ch08 ML4T Workflow
Backtesting]
C9[ch09 Time Series
ARIMA/GARCH/VAR]
C10[ch10 Bayesian ML
PyMC3]
C11[ch11 Random Forests]
C12[ch12 Gradient Boosting
LightGBM/XGBoost]
C13[ch13 Unsupervised
HRP/Manifold]
end
subgraph P3["Part 3: NLP for Trading
ch 14-16"]
C14[ch14 Text Data
spaCy/sentiment]
C15[ch15 Topic Modeling
LDA]
C16[ch16 Word Embeddings
word2vec/doc2vec]
end
subgraph P4["Part 4: Deep & RL
ch 17-24"]
C17[ch17 Deep Learning]
C18[ch18 CNN]
C19[ch19 RNN/LSTM]
C20[ch20 Autoencoders]
C21[ch21 GANs synth TS]
C22[ch22 DRL trading agent]
C23[ch23 Next Steps]
C24[ch24 Alpha Factor
Library appendix]
end
P1 --> P2 --> P3 --> P4
3.2 整本書的工作流哲學
書中所有章節都圍繞同一條 alpha 策略生命週期展開:
sequenceDiagram
participant Data as 原始資料
(market/fund/alt)
participant FE as Feature Engineering
(alpha factor)
participant Eval as Factor Evaluation
(alphalens IC)
participant Model as ML Model
(linear/boost/DL)
participant BT as Backtesting
(zipline/backtrader)
participant PF as Performance
(pyfolio)
Data->>FE: tick/OHLCV/fund metrics
FE->>Eval: factor scores 多空分組
Eval->>FE: 留下 IC 高 alphalens 分析合格
FE->>Model: 多 factor 組合
Model->>BT: 預測 trade signal
BT->>PF: portfolio time series
PF->>BT: Sharpe MDD turnover
PF-->>Data: 結論 重新挑 factor
Key point:書中反覆強調,ML 是這條流水線中間的一塊,不是全部。沒有 alphalens IC 篩過的 factor、沒有 zipline 公正回測、沒有 pyfolio 績效歸因,ML 模型再準也救不了壞策略。
3.3 重要依賴模組對應章節
| 模組 | 用途 | 出現章節 |
|---|---|---|
pandas / numpy | 資料處理基底 | 全部 |
zipline-reloaded | event-driven 回測 | ch04, ch08, ch11, ch12, ch17, ch18 |
backtrader | 簡化版回測 | ch08 |
alphalens-reloaded | factor IC / quantile 分析 | ch04, ch07, ch11, ch12, ch20, ch24 |
pyfolio-reloaded | portfolio 績效歸因 | ch05 |
empyrical-reloaded | risk metrics(Sharpe, sortino…) | ch05, ch12 |
pandas-datareader | Quandl / Yahoo / FRED 拉資料 | ch02 |
talib(TA-Lib python wrapper) | 158 個技術指標 | ch04, ch24 |
pykalman / pywt | Kalman filter / wavelet | ch04 |
statsmodels | 經典統計(OLS, ARIMA, VAR) | ch07, ch09 |
arch | GARCH 族群 | ch09 |
pymc3 | Bayesian inference / MCMC | ch10 |
scikit-learn | 古典 ML | ch06-08, ch11, ch13 |
lightgbm / xgboost / catboost | gradient boosting | ch12 |
spaCy / nltk / textblob | NLP pipeline | ch14, ch15 |
gensim | LDA / word2vec / doc2vec | ch15, ch16 |
tensorflow 2.x | DL backbone(含 ch22 DRL) | ch17-21, ch22 |
pytorch | DL 對照(少數 notebook) | ch17 |
gym / pymdptoolbox | RL 環境 | ch22 |
umap-learn / hdbscan | 非線性降維 / 密度聚類 | ch13 |
shap | 特徵重要性解釋 | ch12, ch24 |
3.4 目錄樹
1machine-learning-for-trading/
2├── 01_machine_learning_for_trading/ # 純概念 README(無 notebook)
3├── 02_market_and_fundamental_data/ # ITCH/AlgoSeek/EDGAR/Storage benchmark
4│ ├── 01_NASDAQ_TotalView-ITCH_Order_Book/
5│ ├── 02_algoseek_intraday/
6│ ├── 03_data_providers/
7│ ├── 04_sec_edgar/
8│ └── 05_storage_benchmark/
9├── 03_alternative_data/ # OpenTable / SeekingAlpha 爬蟲
10│ ├── 01_opentable/
11│ └── 02_earnings_calls/
12├── 04_alpha_factor_research/ # 5 notebook:feature eng / TA-Lib / Kalman / zipline single / alphalens
13├── 05_strategy_evaluation/ # 5 notebook:backtest demos / mean variance / Kelly
14├── 06_machine_learning_process/ # 3 notebook:workflow / mutual info / bias-variance
15├── 07_linear_models/ # 8 notebook:OLS / Fama-Macbeth / statsmodels / logistic / alphalens 評估
16├── 08_ml4t_workflow/ # 完整管線示範(含 4 個 zipline 範例)
17│ ├── 00_data/
18│ ├── 01_multiple_testing/
19│ ├── 02_vectorized_backtest.ipynb
20│ ├── 03_backtesting_with_backtrader.ipynb
21│ └── 04_ml4t_workflow_with_zipline/
22├── 09_time_series_models/ # 7 notebook:TSA / ARIMA / GARCH / VAR / 共整合 / pairs trading
23├── 10_bayesian_machine_learning/ # 5 notebook:共軛先驗 / PyMC3 / Bayesian Sharpe / 隨機波動
24├── 11_decision_trees_random_forests/ # 8 notebook:Japanese equity long-short
25├── 12_gradient_boosting_machines/ # 11 notebook:LightGBM/CatBoost intraday strategy + SHAP
26├── 13_unsupervised_learning/ # 17 notebook 4 subdir:HRP / manifold / clustering
27├── 14_working_with_text_data/ # 6 notebook:spaCy pipeline / sentiment Yelp Twitter
28├── 15_topic_modeling/ # 7 notebook:LSI / pLSA / LDA on news + earnings calls
29├── 16_word_embeddings/ # 8 notebook:word2vec / doc2vec on SEC filings
30├── 17_deep_learning/ # 5 notebook:TF/PyTorch 入門 + NN architecture optimization
31├── 18_convolutional_neural_nets/ # 13 notebook:LeNet → AlexNet → time series CNN → 衛星影像
32├── 19_recurrent_neural_nets/ # 8 notebook:univariate/multivariate LSTM + SEC 預測
33├── 20_autoencoders_for_conditional_risk_factors/ # 7 notebook:Gu/Kelly/Xiu 2020 風險因子 paper 復現
34├── 21_gans_for_synthetic_time_series/ # 3 notebook:DCGAN / TimeGAN / synthetic data 評估
35├── 22_deep_reinforcement_learning/ # 4 notebook:DP gridworld → Q-learning → Lunar Lander → trading agent
36├── 23_next_steps/ # 純結論章(無 notebook)
37├── 24_alpha_factor_library/ # 6 notebook:101 alpha + indicator zoo(書本 appendix)
38├── assets/ # 章節用到的圖片資源
39├── data/ # 範例小資料 + 下載指南
40├── figures/ # 書本所有圖表的彩色版
41├── installation/ # 三條安裝路徑
42├── utils.py # 全 repo 唯一共用 helper(MultipleTimeSeriesCV)
43└── README.md # 17.8k stars 的 main README
4. Helper Scripts 詳細用法
4.1 utils.py — 全 repo 共用 helper
整個 repo 共用的 Python helper 只有一個檔案 utils.py(< 70 行),包含兩個工具:
4.1.1 format_time(t)
把秒數轉成 HH:MM:SS 格式字串,用於 notebook 內訓練進度顯示。
1from utils import format_time
2import time
3t0 = time.time()
4# ... 訓練 ...
5print(f'Training took {format_time(time.time() - t0)}') # → "00:12:34"
4.1.2 MultipleTimeSeriesCV — 全書最重要的 cross-validation 工具
scikit-learn 內建的 TimeSeriesSplit 只處理單一時間序列,但金融資料典型是 multi-index (symbol, date) 的 panel data,且要處理 lookahead overlap(多日 forward return 標籤會跨越 train/test 界線)。
MultipleTimeSeriesCV 解決的問題:
- 對齊 multi-index panel data
- 用
lookahead參數消除 train/test 之間的 forward return 重疊 - 按交易日(不是日曆日)切分
關鍵簽名:
1class MultipleTimeSeriesCV:
2 def __init__(self,
3 n_splits=3,
4 train_period_length=126, # ~半年交易日
5 test_period_length=21, # ~1 個月
6 lookahead=None, # 目標變數 forward return 天數
7 date_idx='date',
8 shuffle=False):
9 ...
典型用法(書本 ch11–12 反覆出現):
1from utils import MultipleTimeSeriesCV
2
3cv = MultipleTimeSeriesCV(
4 n_splits=10,
5 train_period_length=252, # 1 年
6 test_period_length=63, # 1 季
7 lookahead=21, # 1 個月 forward return
8)
9
10for fold, (train_idx, test_idx) in enumerate(cv.split(X)):
11 X_train, X_test = X.iloc[train_idx], X.iloc[test_idx]
12 y_train, y_test = y.iloc[train_idx], y.iloc[test_idx]
13 model.fit(X_train, y_train)
14 preds[fold] = model.predict(X_test)
坑點:X 的 multi-index 必須有名為 'date' 的 level;如果你的 DataFrame 沒這個 level,要先 set_index(['symbol', 'date'])。
4.2 各章節的 helper 模式
整本書沒有統一的 helper module 框架,各章節獨立:
- ch11, ch12 多數 helper inline 寫在 notebook 內
- ch08
04_ml4t_workflow_with_zipline/有自己的factor_pipeline.py/algo.py等 zipline 標準 algo 檔 - ch22 DRL 用 OpenAI gym 標準介面,agent class 寫在 notebook 內
這設計反映書的教學取向:每章獨立可讀,不要求讀者跨章節導入 module。
5. 應用場景:24 章逐章精讀
每章列:核心觀念、notebook 清單、key takeaway、踩坑提醒。本節是整本書最濃縮的「目錄式」精讀,可當「下次要研究某主題時,第幾章第幾個 notebook 直接讀」的索引。
5.1 Part 1 — From Data to Strategy Development (ch 1–5)
第一部份建立 alpha 策略的工程框架,無 ML 內容但必須讀懂,後面才接得上。
Chapter 1 — Machine Learning for Trading: From Idea to Execution
核心觀念:演算法交易產業的演化(電子化 → HFT → factor investing → smart beta → quantamental → ML4T);Grinold’s Fundamental Law of Active Management:
1IR ≈ IC × √Breadth
2IR = Information Ratio
3IC = Information Coefficient (forecast 與實際結果的 rank correlation)
4Breadth = 獨立 bet 的數量
意思是「alpha 來源 = 更準的預測 × 更多的獨立機會」。整本書都圍繞這條公式打轉。
Notebook:無,純概念章節,讀 README.md 即可。
Key takeaway:
- ML4T workflow 6 個步驟:sourcing data → alpha factor research → portfolio management → strategy backtesting → live trading → performance attribution
- 三大 ML 應用:feature extraction、supervised alpha factor、asset allocation
- 區分 “ML in the loop”(每次 rebalance 重新訓練)vs “ML one-shot”(離線訓練、線上 inference)
踩坑提醒:別跳過這章;後面所有「為什麼這樣切 train/test」「為什麼 IC 是這樣定義」的答案都在這。
Chapter 2 — Market & Fundamental Data: Sources and Techniques
核心觀念:市場資料 = 交易環境的副產品;想做 ML4T 必須懂 market microstructure(市場微結構):order types、execution venues、FIX protocol、tick data 規格。Fundamental data 來自 XBRL 標記的財報。
Notebook(11 個 / 5 子目錄):
| 子目錄 / 檔案 | 主題 |
|---|---|
01_NASDAQ_TotalView-ITCH_Order_Book/01_parse_itch_order_flow_messages.ipynb | 解析 ITCH 4.1 binary order book 流 |
01_NASDAQ_TotalView-ITCH_Order_Book/02_rebuild_nasdaq_order_book.ipynb | 重建 NASDAQ 訂單簿 |
02_algoseek_intraday/ | 處理 algoseek minute bar |
03_data_providers/ | Quandl / IEX / pandas-datareader / Yahoo |
04_sec_edgar/ | SEC EDGAR XBRL 財報資料 |
05_storage_benchmark/ | HDF5 vs Parquet vs SQLite 速度比較 |
Key takeaway:
- ITCH binary 解析是 quantitative engineer 的入門儀式
- AlgoSeek 提供 ml4t-book 專用 dataset(書本網站可下載)
- 儲存層:書中結論是 HDF5 / pandas 對混合 dtype 最快、Parquet 最便攜
踩坑提醒:
- 熱門 issue #330 / #310 / #328 都是 chapter 2 的 ITCH notebook 撞 pandas
.append()棄用,要把.append(...)改成pd.concat([...], ignore_index=True) - ITCH sample 連結曾換過,2022-08 commit 已修正
Chapter 3 — Alternative Data for Trading
核心觀念:另類資料(alternative data)三大來源:
- Individuals — social media、review、search query
- Business processes — credit card transaction、supply chain
- Sensors — 衛星影像、cell tower、IoT
評估資料價值的關鍵維度:signal content、quality、frequency、reliability、entitlement / licensing。
Notebook(5 子目錄之 2 個有 code):
| 子目錄 | 主題 |
|---|---|
01_opentable/ | OpenTable 餐廳訂位資料 web scraping demo |
02_earnings_calls/ | Seeking Alpha 季報電話會議逐字稿爬取(Selenium) |
Key takeaway:
- 另類資料市場 2020+ 已超過 30 億美金 / 年
- 爬蟲的法律邊界:robots.txt + ToS + 反爬機制 + 各國資料保護法
踩坑提醒:
02_earnings_calls/scrape_test.py用 Selenium 直登 Seeking Alpha — 違反該站 ToS,不要在 production 用。書中只當教學示範。- 帳號密碼用
os.environ['SEEKING_ALPHA_USER']、os.environ['SEEKING_ALPHA_PWD']讀取 — 不是硬編碼,但你還是要先去 Seeking Alpha 註冊帳號。
Chapter 4 — Financial Feature Engineering: How to Research Alpha Factors
核心觀念:這是書本最重要的章節之一。alpha factor research workflow 包含:
- 從 OHLCV / fundamental / alt data 衍生 raw factor
- cross-sectional normalize(z-score、rank)
- 用
alphalens做 quantile 多空分組、IC 時序分析、turnover 評估 - 留下 IC > 0.05 且持續性高的 factor
Notebook(5 個):
| 檔案 | 主題 |
|---|---|
01_feature_engineering.ipynb | 經典金融特徵:return lag、moving average、volatility |
02_how_to_use_talib.ipynb | TA-Lib 158 個技術指標的 Python 包裝 |
03_kalman_filter_and_wavelets.ipynb | Kalman filter denoise、wavelet decomposition |
04_single_factor_zipline.ipynb | 用 zipline 跑單一 factor 的 long-short backtest |
06_performance_eval_alphalens.ipynb | 核心:alphalens 的 IC / quantile / sector neutral 完整工作流 |
Key takeaway:
- 學 alphalens 就是學「怎麼快速判斷一個 factor 值不值得進管線」
- Kalman filter 對 noisy price 的去噪能讓單純 moving average 變強很多
- 永遠先把 factor 經 alphalens 看過,再決定要不要 feed 給 ML
踩坑提醒:
- TA-Lib 安裝是 macOS / Linux 老問題(要先
brew install ta-lib再pip install TA-Lib) - alphalens-reloaded 跟原 alphalens API 100% 相容,但要從 conda-forge 裝
- notebook 編號跳過
05,這是原作者刻意(書本目錄沒有第 5 個 demo)
Chapter 5 — Portfolio Optimization and Performance Evaluation
核心觀念:把 alpha signal 變成 portfolio weight 的橋樑。三大方法:
- Mean-variance optimization (MVO) — Markowitz 古典解
- Kelly criterion — 賭場數學家 1956 提出,最大化 log return
- Hierarchical Risk Parity (HRP) — López de Prado 2016,繞開 covariance matrix 反矩陣的數值問題
加上 pyfolio 績效歸因(Sharpe、Sortino、Calmar、max drawdown、tear sheet)。
Notebook(5 個):
| 檔案 | 主題 |
|---|---|
01_backtest_with_trades.ipynb | 從 trade list 重建 portfolio time series |
02_backtest_with_pf_optimization.ipynb | MVO + backtest 整合 |
03_pyfolio_demo.ipynb | pyfolio tear sheet 完整 demo |
04_mean_variance_optimization.ipynb | MVO 數學 + 實作 |
05_kelly_rule.ipynb | Kelly criterion 推導 + 實證 |
Key takeaway:
- pyfolio tear sheet 是業界最常見的 portfolio 評估報告格式
- HRP 留到 ch13 才講(屬於 unsupervised learning 的應用)
- Kelly 在 leverage 受限環境下需要 fractional Kelly(取 1/2、1/4)
踩坑提醒:
- 熱門 issue #331:pyfolio demo notebook 在新 pandas 上會跳 deprecation warning,不影響執行
- MVO 的 covariance matrix shrinkage 在實證上比 sample covariance 穩定很多
5.2 Part 2 — Classical ML for Trading (ch 6–13)
第二部份是書本核心:把 古典 ML(線性、樹、boosting、貝氏、unsupervised) 套到 alpha 預測。
Chapter 6 — The Machine Learning Process
核心觀念:ML workflow 的金融版適配。重點不是 model,是「金融資料如何違反一般 ML 的 i.i.d. 假設」:時間序列、cross-section、survivorship bias、look-ahead bias。
Notebook(3 個):
| 檔案 | 主題 |
|---|---|
01_machine_learning_workflow.ipynb | 從 data → model → evaluate 的標準框架 |
02_mutual_information.ipynb | mutual information 做非線性 feature selection |
03_bias_variance.ipynb | bias-variance decomposition 視覺化 |
Key takeaway:
- 在金融資料上 cross-validation 必須用
MultipleTimeSeriesCV(utils.py),不能用KFold - mutual information 比 Pearson correlation 抓得到非線性關係
Chapter 7 — Linear Models: From Risk Factors to Return Forecasts
核心觀念:線性模型在量化金融的地位被嚴重低估。Fama-MacBeth 兩階段回歸 是 asset pricing 學界的標配;logistic regression 是 alpha factor 分類預測的最常見模型。
Notebook(8 個):
| 檔案 | 主題 |
|---|---|
01_linear_regression_intro.ipynb | OLS 基礎 |
02_fama_macbeth.ipynb | 核心:Fama-MacBeth two-pass 回歸 |
03_preparing_the_model_data.ipynb | factor data 準備 |
04_statistical_inference_of_stock_returns_with_statsmodels.ipynb | 用 statsmodels 完整跑統計推論 |
05_predicting_stock_returns_with_linear_regression.ipynb | OLS 預測 return |
06_evaluating_signals_using_alphalens.ipynb | 模型輸出當 factor 餵給 alphalens |
07_logistic_regression_macro_data.ipynb | logistic regression 預測景氣循環 |
08_predicting_price_movements_with_logistic_regression.ipynb | logistic 預測股價漲跌 |
Key takeaway:
- 線性模型是「baseline 必須建」,後面所有 boosting / NN 都要打贏這條線
- statsmodels 的統計推論比 sklearn 完整
Chapter 8 — The ML4T Workflow: From Model to Strategy Backtesting
核心觀念:把前面學的 model + factor + backtest 串成完整管線。展示 zipline 與 backtrader 兩個回測框架。
Notebook(4 個 + 多個 zipline algo 檔):
| 檔案 / 目錄 | 主題 |
|---|---|
00_data/ | 範例資料 |
01_multiple_testing/ | 多重檢驗校正(避免 data snooping) |
02_vectorized_backtest.ipynb | 向量化 backtest 教學版 |
03_backtesting_with_backtrader.ipynb | backtrader 範例 |
04_ml4t_workflow_with_zipline/ | zipline 完整 algo + custom pipeline factor |
Key takeaway:
- vectorized backtest 快但不準(不模擬訂單匹配、滑點);event-driven (zipline / backtrader) 慢但接近真實
- multiple testing correction 是量化研究最容易被忽略的細節
踩坑提醒:
- 熱門 issue #333:第 8 章
02_vectorized_backtest.ipynbsignal generation 有潛在 bug(社群討論中) - zipline ingest custom bundle 在 Windows 上 path 容易出錯
Chapter 9 — Time Series Models for Volatility Forecasts and Statistical Arbitrage
核心觀念:經典時間序列模型(ARIMA / GARCH / VAR)+ pairs trading(cointegration / Engle-Granger / Johansen)。
Notebook(7 個):
| 檔案 | 主題 |
|---|---|
01_tsa_and_stationarity.ipynb | 平穩性檢定(ADF / KPSS) |
02_arima_models.ipynb | ARIMA(p,d,q) |
03_arch_garch_models.ipynb | ARCH / GARCH 波動度模型 |
04_vector_autoregressive_model.ipynb | VAR 多變量 |
05_cointegration_tests.ipynb | 共整合檢定 |
06_statistical_arbitrage_with_cointegrated_pairs.ipynb | pair trading signal generation |
07_pairs_trading_backtest.ipynb | pair trading 回測 |
Key takeaway:
- GARCH 是 risk model 的 backbone,VaR 計算必備
- Pair trading 是統計套利最入門也最容易在實證上失效的策略(regime change)
Chapter 10 — Bayesian Machine Learning: Dynamic Sharpe Ratios and Pairs Trading
核心觀念:用 PyMC3 做 Bayesian inference,把不確定性顯式建模。
Notebook(5 個):
| 檔案 | 主題 |
|---|---|
01_updating_conjugate_priors.ipynb | 共軛先驗手算範例 |
02_pymc3_workflow.ipynb | PyMC3 工作流 |
03_bayesian_sharpe_ratio.ipynb | 核心:Bayesian Sharpe ratio 估計(含信賴區間) |
04_rolling_regression.ipynb | 動態 hedge ratio |
05_stochastic_volatility.ipynb | 隨機波動度模型 |
Key takeaway:
- Bayesian Sharpe 給出 Sharpe 的後驗分布,比點估更可信
- Stochastic volatility 模型適合做尾部風險
踩坑提醒:
- PyMC3 在 2022 後改名 PyMC,API 有變;conda 環境鎖 pymc3=3.x,不要嘗試升級
Chapter 11 — Random Forests: A Long-Short Strategy for Japanese Stocks
核心觀念:從決策樹 → bagging → random forest,套到日本股市 long-short alpha。
Notebook(8 個):
| 檔案 | 主題 |
|---|---|
00_data_prep.ipynb | 日本股市資料準備 |
00_custom_bundle/ | 把日本資料做成 zipline custom bundle |
01_decision_trees.ipynb | 單一 decision tree 教學 |
02_bagged_decision_trees.ipynb | bagging 推導 |
03_random_forest_tuning.ipynb | RF 超參數調整 |
04_japanese_equity_features.ipynb | feature engineering |
05_random_forest_return_signals.ipynb | RF 預測 return |
06_alphalens_signals_quality.ipynb | alphalens 評估 |
07_backtesting_with_zipline.ipynb | zipline 回測 |
Key takeaway:
- 日本股票市場相對美股有 alpha capacity(流動性 +)但 microstructure 差很多
- zipline custom bundle 是把外部資料變成 zipline 可吃格式的標準操作
Chapter 12 — Boosting your Trading Strategy
核心觀念:boosting 全家桶(scikit-learn GBM / XGBoost / LightGBM / CatBoost),跑 intraday 高頻 alpha。SHAP 解釋。
Notebook(11 個):
| 檔案 | 主題 |
|---|---|
01_boosting_baseline.ipynb | sklearn GBM baseline |
02_sklearn_gbm_tuning.ipynb | 超參數調整 |
03_sklearn_gbm_tuning_results.ipynb | 結果分析 |
04_preparing_the_model_data.ipynb | feature pipeline |
05_trading_signals_with_lightgbm_and_catboost.ipynb | 核心:LightGBM + CatBoost |
06_evaluate_trading_signals.ipynb | signal 品質 |
07_model_interpretation.ipynb | SHAP 特徵重要性 |
08_making_out_of_sample_predictions.ipynb | OOS 預測 |
09_backtesting_with_zipline.ipynb | zipline 回測 |
10_intraday_features.ipynb | intraday feature engineering(AlgoSeek 分鐘 bar) |
11_intraday_model.ipynb | intraday model |
Key takeaway:
- LightGBM 在金融 panel data 上幾乎永遠贏 sklearn GBM 與 XGBoost(速度 + AUC)
- SHAP 在量化 review 已是必備工具
- intraday strategy 對 transaction cost 極度敏感,回測必須加滑點 + commission
Chapter 13 — Data-Driven Risk Factors and Asset Allocation with Unsupervised Learning
核心觀念:unsupervised learning 4 大派系。
Notebook(17 個 / 4 子目錄):
| 子目錄 | 主題 |
|---|---|
01_linear_dimensionality_reduction/ | PCA / ICA / NMF |
02_manifold_learning/ | t-SNE / UMAP / Isomap |
03_clustering_algorithms/ | k-means / GMM / DBSCAN / HDBSCAN / hierarchical |
04_hierarchical_risk_parity/ | 核心:HRP(López de Prado 2016) |
Key takeaway:
- HRP 是「反 Markowitz」:不依賴 covariance matrix inversion,更穩定
- UMAP / HDBSCAN 在量化研究中對「找市場 regime」很有用
5.3 Part 3 — NLP for Trading (ch 14–16)
第三部份套 NLP 到財經文本(新聞、財報、社群、電話會議逐字稿)。
Chapter 14 — Text Data for Trading: Sentiment Analysis
核心觀念:建立 NLP pipeline(tokenize → POS tag → NER → lemmatize)、document-term matrix、各家 sentiment lexicon。
Notebook(6 個):
| 檔案 | 主題 |
|---|---|
01_nlp_pipeline_with_spaCy.ipynb | spaCy 標準 pipeline |
02_nlp_with_textblob.ipynb | TextBlob 快速 sentiment |
03_document_term_matrix.ipynb | DTM、TF-IDF |
04_news_text_classification.ipynb | 新聞分類 |
05_sentiment_analysis_twitter.ipynb | Twitter sentiment |
06_sentiment_analysis_yelp.ipynb | Yelp review sentiment |
Key takeaway:
- 金融特化 sentiment:Loughran-McDonald 字典(適合 10-K 文件)
- TextBlob 易用但商用建議自訓金融專用模型
踩坑提醒:
- 熱門 issue #336:
05_sentiment_analysis_twitter.ipynb在新 pandas 上df.info(null_counts=True)會跳 TypeError,改成df.info(show_counts=True)或省略參數
Chapter 15 — Topic Modeling: Summarizing Financial News
核心觀念:從 LSI → pLSA → LDA(Latent Dirichlet Allocation)。
Notebook(7 個):
| 檔案 | 主題 |
|---|---|
01_latent_semantic_indexing.ipynb | LSI (SVD-based) |
02_probabilistic_latent_analysis.ipynb | pLSA |
03_dirichlet_distribution.ipynb | Dirichlet 視覺化 |
04_lda_with_sklearn.ipynb | sklearn LDA |
05_lda_with_gensim.ipynb | gensim LDA(快) |
06_lda_earnings_calls.ipynb | LDA on 季報 |
07_lda_financial_news.ipynb | LDA on 財經新聞 |
Key takeaway:
- gensim 的 LDA 比 sklearn 快很多
- 主題穩定性是 LDA 在金融場景最大痛點(重新訓練主題會變)
踩坑提醒:
gensim<4.0的鎖死意味著要用舊 API;升級 gensim 4 後LdaModel介面有變
Chapter 16 — Word embeddings for Earnings Calls and SEC Filings
核心觀念:把字詞變稠密向量(word2vec / GloVe / doc2vec),在 SEC 10-K / 10-Q 文件上訓金融專用 embedding。
Notebook(8 個):
| 檔案 | 主題 |
|---|---|
01_using_pretrained_vectors.ipynb | 預訓練 vector 用法 |
02_evaluating_embeddings.ipynb | embedding 評估 |
03_financial_news_preprocessing.ipynb | 財經新聞前處理 |
04_financial_news_word2vec_tensorflow.ipynb | TF 訓練 word2vec |
05_financial_news_word2vec_gensim.ipynb | gensim 訓 word2vec |
06_sec_preprocessing.ipynb | SEC EDGAR 文件前處理 |
07_sec_word2vec.ipynb | SEC 文件 word2vec |
08_doc2vec_yelp_sentiment.ipynb | doc2vec 文件級向量 |
Key takeaway:
- 2020 年寫的;現在當然會用 BERT / FinBERT,但 word2vec 訓練成本低、能解釋性強,在小規模研究還是有用
- SEC EDGAR XBRL 解析在 ch02 做過、這裡做更深
5.4 Part 4 — Deep Learning & RL for Trading (ch 17–24)
第四部份是最炫但也最容易過擬合的章節。
Chapter 17 — Deep Learning for Trading
核心觀念:feedforward NN 基礎、TensorFlow 2 / PyTorch 對照、NN architecture optimization。
Notebook(5 個):
| 檔案 | 主題 |
|---|---|
01_build_and_train_feedforward_nn.ipynb | 從零搭 NN |
02_how_to_use_tensorflow.ipynb | TF 2.x 入門 |
03_how_to_use_pytorch.ipynb | PyTorch 對照 |
04_optimizing_a_NN_architecture_for_trading.ipynb | architecture search |
05_backtesting_with_zipline.ipynb | zipline 回測 |
Key takeaway:
- 在低 signal-to-noise 的金融資料上,NN 不一定打贏 LightGBM
- regularization(dropout、L2、early stopping)對金融 NN 比 vision 更關鍵
Chapter 18 — CNN for Financial Time Series and Satellite Images
核心觀念:CNN 兩條路:
- 把時間序列重排為 2D image,套經典 CNN
- 用衛星影像(停車場 / 油桶 / 農地)做 alpha 預測
Notebook(13 個):
| 檔案 | 主題 |
|---|---|
01_filter_example.ipynb | CNN filter 基本 |
02_digit_classification_with_lenet5.ipynb | LeNet-5 教學 |
03_image_classification_with_alexnet.ipynb | AlexNet |
04_time_series_prediction.ipynb | 1D CNN 預測 |
05_cnn_for_trading_feature_engineering.ipynb | time series → image feature |
06_cnn_for_trading_features_to_clustered_image_format.ipynb | clustering + image |
07_cnn_for_trading.ipynb | CNN 預測 return |
08_backtesting_with_zipline.ipynb | zipline 回測 |
09_bottleneck_features.ipynb | 取 bottleneck layer 當 feature |
10_transfer_learning.ipynb | transfer learning |
11_satellite_images.ipynb | 核心:衛星影像 alpha |
12_svhn_preprocessing.ipynb | SVHN 數字辨識前處理 |
13_svhn_object_detection.ipynb | SVHN 物件偵測 |
Key takeaway:
- 衛星影像 alpha 是 2010s 後期最熱的 alt data,門檻已降到一般 fund 也能跑
- transfer learning 對小資料金融場景特別合用
Chapter 19 — RNN for Multivariate Time Series and Sentiment Analysis
核心觀念:RNN / LSTM / GRU 應用在 multivariate time series 與 NLP。
Notebook(8 個):
| 檔案 | 主題 |
|---|---|
00_build_dataset.ipynb | 資料集準備 |
01_univariate_time_series_regression.ipynb | 單變量 LSTM 預測 |
02_stacked_lstm_with_feature_embeddings.ipynb | stacked LSTM 分類 |
03_stacked_lstm_with_feature_embeddings_regression.ipynb | stacked LSTM 回歸 |
04_multivariate_timeseries.ipynb | 多變量 LSTM |
05_sentiment_analysis_imdb.ipynb | IMDB sentiment |
06_sentiment_analysis_pretrained_embeddings.ipynb | 結合預訓練 embedding |
07_sec_filings_return_prediction.ipynb | 核心:用 SEC 文件 embedding 預測 return |
Key takeaway:
- LSTM 在金融時序上贏 ARIMA 不一定明顯,但贏多變量 VAR 較確定
- feature embedding(symbol / sector 當類別變數)是 panel data 的好用招式
Chapter 20 — Autoencoders for Conditional Risk Factors and Asset Pricing
核心觀念:復現 Gu, Kelly, Xiu (2020) 的 conditional autoencoder asset pricing model。
Notebook(7 個):
| 檔案 | 主題 |
|---|---|
01_deep_autoencoders.ipynb | 基礎 autoencoder |
02_convolutional_denoising_autoencoders.ipynb | denoise CAE |
03_variational_autoencoder.ipynb | VAE |
04_build_us_stock_dataset.ipynb | 建立美股資料集 |
05_conditional_autoencoder_for_asset_pricing_data.ipynb | 資料準備 |
06_conditional_autoencoder_for_asset_pricing_model.ipynb | 核心:模型訓練 |
07_alphalens_analysis.ipynb | alphalens 評估 |
Key takeaway:
- conditional autoencoder 在 latent factor 上的解釋力可贏經典 Fama-French
- 這章難度最高,建議先讀 paper
Chapter 21 — GANs for Synthetic Time Series
核心觀念:用 GAN 生成合成金融時間序列(解決資料稀缺問題)。
Notebook(3 個):
| 檔案 | 主題 |
|---|---|
01_deep_convolutional_generative_adversarial_network.ipynb | DCGAN 教學 |
02_TimeGAN_TF2.ipynb | 核心:TimeGAN(Yoon et al. 2019) |
03_evaluating_synthetic_data.ipynb | 合成資料品質評估 |
Key takeaway:
- 合成資料的 fidelity / utility tradeoff 是評估關鍵
- TimeGAN 在 backtesting 增廣資料、避免 overfit 上有用
Chapter 22 — Deep Reinforcement Learning: Building a Trading Agent
核心觀念:從 dynamic programming → Q-learning → deep Q-learning(DQN)→ 自製 trading env。
Notebook(4 個):
| 檔案 | 主題 |
|---|---|
01_gridworld_dynamic_programming.ipynb | gridworld DP |
02_gridworld_q_learning.ipynb | gridworld Q-learning |
03_lunar_lander_deep_q_learning.ipynb | OpenAI gym Lunar Lander DQN |
04_q_learning_for_trading.ipynb | 核心:自製 trading env + DQN agent |
Key takeaway:
- DRL 在量化交易實證效果尚有爭議;但「state design + reward shaping」的思路有借鑑價值
- 用獨立環境檔(
environment.yml)避開 ml4t 主環境 TF 版本衝突
踩坑提醒:
- 第 22 章的 environment 跟主環境分開(用 ml4t-rl 環境);不分會踩 TF 版本衝突
- gym 介面 2022 後改 gymnasium,書本用舊 gym API
Chapter 23 — Conclusions and Next Steps
純結論章,無 notebook。總結 ML4T 的方向:multi-modal data、transformer、causal inference、explainable AI、alternative data scaling。
Chapter 24 — Appendix: Alpha Factor Library
核心觀念:把書本所有用過 + 額外整理的 alpha factor 編成可重用 library;包含 WorldQuant 著名的 101 Formulaic Alphas 全部復現。
Notebook(6 個):
| 檔案 | 主題 |
|---|---|
00_indicator_zoo.ipynb | 技術指標集合 |
01_sample_selection.ipynb | sample selection 處理 |
02_common_alpha_factors.ipynb | 常見 alpha factor |
03_101_formulaic_alphas.ipynb | 核心:WorldQuant 101 alphas |
04_factor_evaluation.ipynb | 全部 factor alphalens 評估 |
05_alphalens_analysis.ipynb | 彙總分析 |
Key takeaway:
- 這章是 quant 面試常考內容:「WorldQuant 101 alphas 中你最熟的是哪幾個?」
- 整章是寫策略時的「factor 抄寫本」
6. 資安掃描報告
掃描時間:2026-06-02 / 掃描範圍:
*.py*.sh*.yml*.txt+ notebook 高風險模式抽樣 / 排除.git、.ipynb_checkpoints
6.1 🟢 低風險項目(教學用 repo 表現良好)
- 無硬編碼 secret:
scrape_test.py用os.environ['SEEKING_ALPHA_USER']/os.environ['SEEKING_ALPHA_PWD']讀取,未硬編碼。 - 無
eval()/exec()在 .py 程式碼(單一asttokens=2.0.5命中是套件版本字串,非執行)。 - 無
os.system/shell=True:所有外部呼叫都走標準 Python API。 - 無
pickle.load/joblib.load在共享程式碼:僅 notebook 內部使用,不會跨 user 載入不信任的 pickle。 - 無 notebook
!sudo/!pip install:清乾淨,安裝靠環境檔。
6.2 🟡 中度風險項目(需要使用者了解)
6.2.1 無 LICENSE 檔案
最大的法律風險:repo 根目錄無 LICENSE / COPYING。
| 後果 | 說明 |
|---|---|
| 預設保留所有權利 | 美國 / 國際版權法:無明示授權 = 作者保留全部權利 |
| 不能商用 | 不能拿來做 product、SaaS、付費課程 |
| 不能再散佈 | 嚴格說 fork 也只限 GitHub TOS 默許範圍 |
| 不能改製內訓教材 | 公司內訓重製教材前必須先聯絡作者取得書面授權 |
建議:商用 / 內訓前先去 ml4trading.io 聯絡 Stefan Jansen 取書面授權,或限縮為「研究 / 自學 / GitHub fork 內 modification」的範圍。
6.2.2 環境檔版本鎖死導致已知 CVE 風險
installation/*/ml4t.yml 鎖在 2021-2022 的版本:
1- python=3.8
2- pandas<1.3
3- curl=7.78.0 / 7.76.1 / 7.83.0 # 各 OS
4- libcurl=...
5- tensorflow=2.x(書本時的版本)
6- pillow=(書本時的版本)
歷史 CVE 概覽:
- Python 3.8 已於 2024-10 結束 security maintenance
- 舊版 curl / libcurl 有歷史 CVE(CVE-2023-38545, CVE-2023-23914 等)
- TensorFlow 2.4-2.6 範圍有多個 CVE
- Pillow < 9.x 有多個影像解析 CVE
建議:環境是 學習用容器,不要拿到 production 或讓不信任的人連 jupyter server;課堂環境建議在獨立 conda env 或 Docker 內。
6.2.3 第三方 conda channel 信任
ml4t-base.yml 啟用的 channel:
1channels:
2 - conda-forge # 🟢 主流,信任度高
3 - defaults # 🟢 Anaconda 官方
4 - anaconda # 🟢
5 - bashtage # 🟡 個人 channel
6 - ranaroussi # 🟡 個人 channel(yfinance 作者)
7 - powerai # 🟡 IBM PowerAI(已 EOL)
8 - fastai # 🟢
9 - jiayi_anaconda # 🟡 個人 channel
10 - districtdatalabs # 🟡 公司 channel
🟡 標記的個人 / 小組織 channel 信任度低於 conda-forge;如果該 channel 被棄置或被劫持,環境構建會失敗或可能引入惡意套件。
建議:在 corporate 環境用前,先 audit 一次 channel 列表;可考慮把所有套件改從 conda-forge 取(少數套件可能不可用,可改 pip 裝)。
6.2.4 scrape_test.py
1# 03_alternative_data/02_earnings_calls/scrape_test.py
2driver = webdriver.Chrome()
3url = 'http://seekingalpha.com/account/login'
4EMAIL = environ['SEEKING_ALPHA_USER']
5PASS = environ['SEEKING_ALPHA_PWD']
Selenium 模擬登入並爬取 — 違反 Seeking Alpha Terms of Service:
- 個人帳號被停權的可能
- 大量 request 可能觸發法律風險(CFAA 在美國)
建議:書中當教學用,不要在 production 跑。實際商用要走 Seeking Alpha 付費 API。
6.3 🔴 高風險項目
無高風險 finding。 教學 repo 該有的衛生狀況。
6.4 結論
| 項目 | 等級 | 建議 |
|---|---|---|
| 程式碼資安 | 🟢 | 通過 |
| 套件供應鏈 | 🟡 | 個人 channel 注意 |
| LICENSE | 🟡 | 商用 / 內訓前先取書面授權 |
| 環境版本 | 🟡 | 學習用 OK,不要連 production |
| 爬蟲合規 | 🟡 | 教學用 OK,不要 production |
| 高風險 finding | 🟢 | 無 |
整體判定:🟢 教學用安全可用;🟡 三個風險需要使用者知道並自行管理。
7. FAQ — 從 issue tracker 整理的踩坑集
從 open / closed issue + 熱門 comment 萃取出的高頻問題。
Q1: clone 下來跑第二章 ITCH notebook 就掛 KeyError: No object named P(issue #310 / #328 / #330)
根因:pandas 1.4+ 刪掉 DataFrame.append(),書本 notebook 還在用。
解法:把所有 store['P'].append(store['Q'].rename(...)) 改成:
1trades = pd.concat(
2 [store['P'], store['Q'].rename(columns={'cross_price': 'price'})],
3 ignore_index=True,
4 sort=False,
5).merge(stocks)
或者乾脆用環境檔鎖死的 pandas<1.3。
Q2: 第 14 章 train.info(null_counts=True) 報 TypeError(issue #336)
根因:pandas 1.5+ 改成 show_counts 參數。
解法:
1# 改前
2train.info(null_counts=True)
3# 改後
4train.info(show_counts=True)
Q3: Windows 上 conda 環境建立失敗
根因:Windows 環境檔的 curl / libcurl 版本對應不存在 conda-forge channel。
解法:
- 先試
mamba env create -f installation/windows/ml4t.yml(mamba solver 容錯比 conda 高) - 失敗的話手動裁掉 yml 內所有版本 pin,跑
conda env create -n ml4t -f ml4t-base.yml - 仍失敗就轉走 WSL2 + Linux 環境檔
Q4: PyMC3 在新環境上裝不起來
根因:PyMC3 在 2022-08 重命名為 PyMC(4.x)並大改 API。
解法:嚴格按環境檔用 pymc3=3.x;或全部跳過第 10 章。
Q5: zipline ingest 卡住
根因:Quandl 在 2018 停止更新 WIKI prices;zipline-reloaded 的 quandl bundle 預設仍指向那個 endpoint。
解法:
- 用 yahoo bundle:
zipline ingest -b yahoo - 或自製 custom bundle(書本 ch11
00_custom_bundle/有示範)
Q6: TA-Lib 在 macOS Apple Silicon 上裝不起來
根因:TA-Lib 的 C 程式庫對 ARM 編譯需要額外步驟。
解法:
1brew install ta-lib
2export TA_LIBRARY_PATH=/opt/homebrew/lib
3export TA_INCLUDE_PATH=/opt/homebrew/include
4pip install --no-binary TA-Lib TA-Lib
Q7: 第 22 章 DRL notebook 跟主環境 TF 版本衝突
根因:DRL 用較新的 TF,跟主 ml4t 環境(鎖 TF 2.x 舊版)衝突。
解法:作者本人建議建立獨立環境:
1mamba env create -f 22_deep_reinforcement_learning/environment.yml
Q8: 沒買書,光看 repo 能學到多少?
答:大概 60-70%。每章 README 把書中 narrative 濃縮重寫,notebook 把程式碼補全。缺的是書本第 1-3 章對產業背景的論述、各章節結尾的延伸閱讀注釋、附錄的數學推導完整版。建議當作「目錄 + cheat sheet」用,要深入再買書。
Q9: 書本 Python 3.8 鎖死,到 2026 還有意義嗎?
答:有,只要你的目的是學概念而不是跑 production。書本核心觀念(factor research workflow、alphalens / pyfolio 用法、LightGBM 訓練流程、DRL trading env design)跟 Python 版本無關;2026 用最新 Python + 新版套件重寫 notebook 是讀者作業。
Q10: 跟 López de Prado 的 Advances in Financial ML 比哪本好?
答:互補。
- Jansen(本書):寬廣、實作優先、code-heavy、覆蓋 NLP / DL / DRL
- López de Prado:深度、理論優先、math-heavy、聚焦古典 ML 的金融特化(meta-labeling、fractional differentiation、purged k-fold)
建議:兩本一起讀。先 Jansen 走完工作流,再 López de Prado 補理論深度。
8. 進階技巧
8.1 把書本 notebook 變成可重用的研究模板
書本 notebook 設計為「章節獨立、自包含」,但實際做研究時,你會想把 ch04 的 factor research + ch08 的 zipline workflow + ch12 的 LightGBM 串起來。建議流程:
- 在你自己的 repo 開
research/與notebooks/ - 把 ml4t 的
utils.py抓過來當基礎 - 把 ch11/12 的「資料準備 → 模型訓練 → alphalens 評估 → zipline 回測」做成 4 個獨立
.py檔 - 每個研究主題開一個 notebook,import 上面 4 個 module 串起來
- 用
MultipleTimeSeriesCV做嚴格的 walk-forward 評估
8.2 Backtest 時必做的衛生檢查
- Look-ahead bias:feature t 的計算只能用到 ≤t 的資料
- Survivorship bias:universe 必須包含 delisted 股票
- Transaction cost:commission + slippage + market impact
- Position sizing:不要 cherry-pick 賺錢的最大化權重
- Multiple testing:跑 100 個 factor 找到 5 個 IC > 0.05 不算 alpha;補 Bonferroni / FDR
- Out-of-sample:留 ≥ 20% 資料不碰、最終確認用
書本 ch08 01_multiple_testing/ 有專章。
8.3 把 LightGBM 串到 zipline pipeline 的範本
ch12 09_backtesting_with_zipline.ipynb 示範了關鍵手法:
- 離線訓 LightGBM、存模型
- 在 zipline algo 中 load 模型
- zipline
initialize()註冊 custom pipeline factor - pipeline factor 在每個 rebalance 呼叫模型 inference
before_trading_start()取得 signal,計算 target weightorder_optimal_portfolio()下單
這是業界 quant fund 標準作法的教學版本。
8.4 Alphalens IC 解讀的 5 個閾值
1IC > 0.10 頂級 alpha(罕見、可能是 look-ahead bias)
2IC > 0.05 有效 alpha(值得進管線)
3IC > 0.02 marginal(可能跟其他 factor 組合後有用)
40 ~ 0.02 噪音
5IC < 0 反向 factor 或資料錯誤
8.5 把書本的 dataset 升級到 2024+
書本資料止於 2018-2020。要把研究做到 2024+:
- 用
yfinance(ranaroussi 維護)拉 daily price - SEC EDGAR XBRL 仍可即時抓
- AlgoSeek 改買 2020+ 的新版資料集
- 自己跑爬蟲收 alternative data(注意 §6.2.4)
9. 整合進其他工作流
9.1 整合進 AI knowledge template
把這份教學丟回 AI knowledge template 的場景:
| Layer | 用途 |
|---|---|
| ai-gh-save | 已自動產生 inbox/2026-06-02-github-stefan-jansen-machine-learning-for-trading.md(標準 metadata 報告) |
| gh-tutorial-qd | 已產生本詳細教學 md + qd + plain HTML(本流程) |
| paper-search | 用「conditional autoencoder asset pricing」找 ch20 對應的 Gu/Kelly/Xiu 2020 paper 全文 |
| paper-qa-lite | 把書本 + ch20 paper 餵成 corpus,問「conditional autoencoder 在 latent factor 數量怎麼決定?」 |
| graphify | 對 ml4t repo 跑 graphify,看 notebook 間的 import 關係(不過大多 notebook 自包含,圖不會很豐富) |
| kami | 把這份教學的 §5 萃出 24 章單頁 cheat sheet(kami one-pager template) |
9.2 量化研究團隊 onboarding 流程
新人 onboarding:
- Week 1:ch01 + ch04 + ch05(理解 alpha 工作流框架)
- Week 2:ch06 + ch07 + ch08(古典 ML + backtest 框架)
- Week 3:ch11 + ch12(從決策樹到 LightGBM intraday strategy)
- Week 4:依團隊方向選 NLP(ch14-16)/ DL(ch17-21)/ DRL(ch22)
9.3 內訓教材設計範本
每章設計成 2 小時 workshop:
- 30 min:concept 講解(用該章 README 帶)
- 60 min:跟著 notebook 跑(先 demo、再讓學員手動跑)
- 30 min:學員自己改 feature / 改參數、討論結果差異
24 章可以撐 48 小時的講師時數(≈ 6 個 8 小時的訓練日)。
9.4 面試準備
buy-side ML role 的面試常問本書內容。重點章節:
- ch04 + ch07 + ch12:factor research + IC 評估 + LightGBM(最常考)
- ch08:backtest 設計考量(survivorship、look-ahead、transaction cost)
- ch10 + ch20:Bayesian Sharpe / autoencoder factor model(進階)
- ch24:WorldQuant 101 alphas(高頻常考)
10. 重點摘要 Checklist
學完整本書後應該能:
10.1 概念與框架
- 能複述 Grinold’s Fundamental Law of Active Management(IR = IC × √Breadth)
- 能解釋 alpha factor research 的完整 6 步驟工作流
- 能區分 vectorized backtest vs event-driven backtest 的優劣
- 能說明金融時間序列為什麼不能用 sklearn
KFold、必須用 walk-forward CV - 能列舉 backtest 5 大衛生檢查(look-ahead / survivorship / transaction cost / position sizing / multiple testing)
10.2 工具與生態系
- 會用
alphalens跑 IC + quantile + turnover 三件套 - 會用
pyfolio出 tear sheet - 會寫 zipline algo + custom pipeline factor + custom data bundle
- 會用 LightGBM 訓金融 panel data,並用 SHAP 解釋
- 會用
MultipleTimeSeriesCV做 panel data 的 walk-forward CV
10.3 模型與技巧
- OLS / logistic regression:能跑 Fama-MacBeth 兩階段回歸
- 時間序列:ARIMA / GARCH / VAR 能挑合適場景;能跑 cointegration test
- 樹模型:能調 random forest / LightGBM 超參數
- Bayesian:能用 PyMC3 做 Bayesian Sharpe ratio
- NLP:能用 spaCy 建 pipeline、用 gensim 訓 LDA / word2vec
- DL:能搭 feedforward / CNN / LSTM;能套 transfer learning
- DRL:能設計 trading env + 訓 DQN agent
10.4 工程與系統
- 能設計可重複的 research notebook 模板
- 能把離線訓練好的模型嵌入 zipline live signal 流程
- 能設計 alpha library(如 ch24)並維護版本
- 知道 production live trading 跟 backtest 的差距在哪
11. 進一步閱讀
11.1 同作者 / 同生態系資源
- 書本網站:https://ml4trading.io
- Zipline-reloaded docs:https://zipline.ml4trading.io
- Alphalens-reloaded GitHub:
stefan-jansen/alphalens-reloaded - Pyfolio-reloaded GitHub:
stefan-jansen/pyfolio-reloaded - Empyrical-reloaded GitHub:
stefan-jansen/empyrical-reloaded - 作者 1st edition(2018):
PacktPublishing/Hands-On-Machine-Learning-for-Algorithmic-Trading
11.2 配套書 / 延伸書
- López de Prado, Advances in Financial Machine Learning (Wiley 2018) — 古典 ML 金融特化深度版
- López de Prado, Machine Learning for Asset Managers (Cambridge 2020) — 簡潔版
- Ernest Chan, Quantitative Trading / Algorithmic Trading / Machine Trading 三部曲
- Grinold & Kahn, Active Portfolio Management (McGraw-Hill 2000) — 理論基礎
- Larry Harris, Trading and Exchanges (Oxford 2003) — market microstructure 聖經
11.3 學術 paper(書中重點引用)
- Gu, Kelly, Xiu (2020) “Autoencoder Asset Pricing Models” — ch20 復現對象
- Yoon et al. (2019) “Time-series Generative Adversarial Networks” — ch21 復現對象
- Kakushadze (2016) “101 Formulaic Alphas” — ch24 復現對象
- López de Prado (2016) “Building Diversified Portfolios that Outperform Out of Sample” — HRP 原始 paper(ch13)
11.4 開源 alpha / factor library
- Alphalens-reloaded:因子分析
- Qlib (Microsoft):替代型量化研究框架
- VectorBT:高速 vectorized backtest
- Backtesting.py:lightweight backtest 框架
- Nautilus Trader:production-grade event-driven framework
11.5 資料來源
- AlgoSeek — 書本 minute bar 提供商(買書送 sample)
- SEC EDGAR — XBRL 財報、公開
- FRED — Fed 經濟資料
- Quandl / Nasdaq Data Link — 多元 dataset
- IEX Cloud — 美股即時 + 歷史
📅 教學文件版本:2026-06-02 / 對應 repo commit ≤ 2023-03-05 / 由 AI Knowledge Template Layer 12(gh-tutorial-qd)自動產生
🔐 重要法律提醒:本 repo 無 LICENSE 檔案,所有商用、再散佈、改製成內訓教材的計畫,請先聯絡作者 Stefan Jansen 取得書面授權。本教學文件僅供個人學習與內部參考使用。
Comments