17 KiB
Installation Guide
This guide walks you through setting up Docker to run the ML4T notebooks. Pre-built images on Docker Hub mean you can be running notebooks in minutes.
Before You Begin
Every command in this guide is typed into a terminal on your own computer, not into the GitHub website. GitHub stores the code; your terminal is where you tell your machine to fetch and run it.
| Platform | How to open a terminal |
|---|---|
| Windows | Start menu → type PowerShell → open Windows PowerShell. Some steps below need Run as administrator (right-click → Run as administrator). |
| macOS | Applications → Utilities → Terminal |
| Linux | Ctrl+Alt+T, or search for Terminal |
Commands shown in a block like this are typed at the terminal prompt, one line at a time, then Enter:
git clone https://github.com/stefan-jansen/machine-learning-for-trading.git
Type flags exactly as written. --install is two dashes attached to the word with no space
before it. wsl -- install is a different command and will not do what you want.
If a command is not found, the tool it belongs to is not installed yet. git ships with
Git for Windows and with the Xcode command-line tools on
macOS (xcode-select --install).
Platform Support
| Platform | ml4t | py312 | Benchmark | GPU |
|---|---|---|---|---|
| Linux x86_64 | ✅ | ✅ | ✅ | ✅* |
| Windows 11 (WSL2) | ✅ | ✅ | ✅ | ✅* |
| macOS Intel | ✅ | ✅ | ✅ | - |
| macOS Apple Silicon | ✅ | - | ✅ | - |
* Requires NVIDIA GPU + nvidia-container-toolkit
Which image do I need?
| Image | What it covers | Platforms |
|---|---|---|
| ml4t | All chapters (Ch01-Ch27) + all 9 case studies | amd64 + arm64 |
| ml4t-py312 | Ch05 NB01/03/07, Ch09 NB06/12, Ch10 NB01-03, Ch12 NB10, Ch14 NB06, Ch15 NB06, Ch21 deep_hedging (signatory, esig, gensim, pfhedge, tfcausalimpact) | amd64 only |
| benchmark | Ch02 storage benchmarks (DuckDB, HDF5, database clients) | amd64 + arm64 |
| rapids | Ch12 GBM GPU benchmark (RAPIDS cuML, LightGBM CUDA) | amd64 + NVIDIA GPU |
Most readers need only ml4t. The other images are for specific notebooks.
Apple Silicon users: The notebooks requiring ml4t-py312 are not runnable on ARM64 because the underlying libraries (signatory, esig) have no ARM64 builds. View the pre-executed .ipynb files on GitHub or in Jupyter instead.
Quick Start (All Platforms)
# 1. Clone the repository
git clone https://github.com/stefan-jansen/machine-learning-for-trading.git
cd machine-learning-for-trading
# 2. Copy environment template
cp .env.example .env
# 3. Pull the pre-built image from Docker Hub
docker compose pull ml4t
# 4. Start Jupyter Lab
docker compose up ml4t
# Open http://localhost:8888
# 5. Or run a notebook directly
docker compose run --rm ml4t python 01_process_is_edge/factor_regimes.py
That's it. No build step needed — Docker pulls the pre-built image (~12 GB on x86, ~3 GB on ARM64).
To build locally instead (if you prefer or need to modify the environment):
docker compose build ml4t # ~45 min on x86, ~15 min on ARM64
Platform-Specific Setup
Ubuntu / Linux
# Install Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
# Log out and back in for group membership
# Verify
docker run --rm hello-world
docker compose version
If Docker Compose is missing: sudo apt install docker-compose-plugin
Windows 11 (WSL2)
Docker Desktop on Windows runs its engine inside WSL2. WSL2 must be working before Docker Desktop can start, so complete steps 1-3 in order and do not skip the restart.
-
Check that hardware virtualization is on. WSL2 cannot run without it, and it is disabled by default on some machines. Press
Ctrl+Shift+Esc→ Performance tab → CPU, and look for Virtualization.- Enabled: continue to step 1.
- Disabled: turn it on in your BIOS/UEFI setup screen, where it is called Intel VT-x,
AMD-V, or Virtualization Technology. The key to enter setup varies by manufacturer
(commonly
F2,F10, orDelduring boot). Nothing below will work until this reads Enabled.
-
Install WSL2 and a Linux distribution. Open PowerShell as Administrator:
wsl --install -d UbuntuTwo dashes, no space:
--install, not-- install. The-d Ubuntuis required. Without it, some Windows builds install the WSL runtime but no Linux distribution, and later steps fail withWindows Subsystem for Linux has no installed distributions. -
Restart your computer. This is a required step, not a conditional one.
wsl --installenables a Windows feature that does not take effect until you reboot, and Windows does not always prompt you. If the command printedThe operation completed successfully, restart now.After the restart, Ubuntu opens and asks you to create a username and password. The password is not echoed as you type, which is expected.
-
Verify WSL2 before installing Docker. In PowerShell:
wsl --list --verboseYou should see
UbuntuwithSTATE Running(orStopped) andVERSION 2. If the list is empty, repeat step 1 and confirm you restarted. IfVERSIONreads1, runwsl --set-version Ubuntu 2. -
Increase WSL2 memory limit: WSL2 defaults to 50% of host RAM, which may not be enough for data-heavy notebooks. Create or edit
%USERPROFILE%\.wslconfig:[wsl2] memory=12GB swap=4GBThen restart WSL:
wsl --shutdownfrom PowerShell, then reopen your terminal. -
Install Docker Desktop from docker.com/products/docker-desktop
Install it only after
wsl --list --verboseshows aVERSION 2distribution. Docker Desktop started against a non-working WSL2 backend hangs on "Starting the Docker Engine…" indefinitely.- Ensure "Use WSL 2 based engine" is checked in Settings → General
- In Settings → Resources → WSL Integration, enable your Ubuntu distribution
- In Settings → Resources, allocate at least 8 GB memory and 60 GB disk
-
Verify Docker Desktop integration: Open your WSL Ubuntu terminal and run:
docker versionIf this fails with "Cannot connect to the Docker daemon", Docker Desktop's WSL integration is not enabled for your distribution. Check step 5 above.
-
Clone in WSL (not on Windows drives — much faster):
cd ~ git clone https://github.com/stefan-jansen/machine-learning-for-trading.git cd machine-learning-for-trading cp .env.example .env docker compose pull ml4t
Important: Always run docker commands from inside a WSL terminal (Ubuntu), not from Windows PowerShell or Command Prompt. Docker Desktop exposes the Docker socket to WSL distributions, but the Docker CLI in Windows may behave differently.
Tip: Keep the repo at ~/machine-learning-for-trading in WSL, not /mnt/c/.... The Windows filesystem (/mnt/c/) is dramatically slower due to the 9P protocol bridge. Access WSL files from Windows Explorer via \\wsl$\Ubuntu\home\<username>\machine-learning-for-trading.
macOS (Intel and Apple Silicon)
-
Install Docker Desktop from docker.com/products/docker-desktop
- Choose the correct chip: Intel or Apple chip
- Recommended resources: 4+ CPUs, 8+ GB memory, 64+ GB disk
-
Apple Silicon only: In Docker Desktop Settings → General, enable Use Rosetta for x86_64/amd64 emulation (needed only for the
ml4t-py312image, which most readers won't use). -
Clone and pull:
git clone https://github.com/stefan-jansen/machine-learning-for-trading.git cd machine-learning-for-trading cp .env.example .env docker compose pull ml4t
GPU Support (NVIDIA)
GPU acceleration benefits deep learning chapters (Ch05, Ch10, Ch13, Ch14, Ch21). Requires NVIDIA GPU with CUDA support.
Requirements
- NVIDIA GPU (GTX 1060 or better)
- NVIDIA Driver 525+ (for CUDA 12.x)
- Linux (native) or Windows 11 (WSL2)
- Not available on macOS
Ubuntu: Install nvidia-container-toolkit
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update && sudo apt install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
Windows WSL2
GPU passthrough works automatically with NVIDIA Driver 525+ installed on Windows and Docker Desktop with WSL2 backend.
Verify and Run
# Verify GPU is visible
docker compose --profile gpu run --rm ml4t-gpu python -c \
"import torch; print(f'CUDA: {torch.cuda.is_available()}')"
# Should print: CUDA: True
# Run with GPU
docker compose --profile gpu run --rm ml4t-gpu python 13_dl_time_series/01_core_architectures.py
Storage Benchmarks (Chapter 2)
Chapter 2 includes storage benchmarks comparing file formats and databases.
# Pull benchmark image
docker compose pull benchmark
# Start database services
docker compose --profile benchmark up -d timescaledb clickhouse questdb influxdb
# Wait for databases to be healthy
docker compose --profile benchmark ps
# Run benchmark
docker compose --profile benchmark run --rm benchmark \
python 02_financial_data_universe/21_storage_benchmark_database.py
# Stop databases when done
docker compose --profile benchmark down
Py312 Image (Specific Notebooks)
A small number of notebooks require Python 3.12 libraries not available on Python 3.14:
| Notebook | Library | Chapter |
|---|---|---|
01_timegan, 03_sigcwgan_signatures, 07_dp_gan |
signatory, torch CUDA bug on 3.14 | Ch05 |
06_path_signatures, 12_wasserstein_regimes |
signatory, esig | Ch09 |
01_word2vec, 02_asset_embeddings, 03_sentiment_evolution |
gensim | Ch10 |
10_shap_nlp_sentiment |
torch CUDA bug + shap | Ch12 |
06_conditional_autoencoder |
torch CUDA bug + shap | Ch14 |
06_fed_announcement_bsts |
tfcausalimpact (TFP BSTS) | Ch15 |
05_deep_hedging_pfhedge |
pfhedge (unmaintained, numpy<2) | Ch21 |
# x86 systems only (Linux, Windows WSL2, macOS Intel)
docker compose --profile py312 pull py312
docker compose --profile py312 run --rm py312 python 05_synthetic_data/03_sigcwgan_signatures.py
Apple Silicon: These notebooks cannot run natively. View the pre-executed .ipynb files in Jupyter or on GitHub.
Troubleshooting
Docker Desktop hangs on "Starting the Docker Engine…" (Windows)
Check the status bar at the bottom of the Docker Desktop window. If it reads RAM 0.00 GB
and CPU 0.00%, the engine's virtual machine never started, and the cause is the WSL2
backend rather than Docker itself. Work through it in this order:
- Virtualization off in firmware. Task Manager → Performance → CPU → Virtualization. If it says Disabled, enable Intel VT-x / AMD-V in BIOS/UEFI. See step 0 of the Windows setup above.
- Pending reboot. If you ran
wsl --installand did not restart, restart now. - No Linux distribution. Run
wsl --list --verbosein PowerShell. If it printshas no installed distributions, runwsl --install -d Ubuntuand restart. - WSL2 backend not selected. Docker Desktop → Settings → General → "Use the WSL 2 based engine".
Then quit Docker Desktop fully (right-click the tray icon → Quit) and start it again.
"Cannot connect to Docker daemon"
- Linux:
sudo systemctl start docker && sudo systemctl enable docker - Windows/macOS: Ensure Docker Desktop is running (system tray / menu bar)
- Windows WSL2: Make sure you are running from a WSL terminal, not PowerShell. Verify integration: Docker Desktop → Settings → Resources → WSL Integration → enable your distribution
Out of memory or container killed (WSL2)
WSL2 defaults to 50% of host RAM. Large notebooks (Ch13 deep learning, case study pipelines) may exceed this. Edit %USERPROFILE%\.wslconfig:
[wsl2]
memory=12GB
swap=4GB
Then restart: wsl --shutdown from PowerShell and reopen your terminal.
"Permission denied" on Linux
sudo usermod -aG docker $USER
# Log out and back in
Slow on Apple Silicon
If a container is slow, check if it's running under x86 emulation:
docker compose run --rm ml4t uname -m
# Should print: aarch64 (native) not x86_64 (emulated)
If you see x86_64, the image may not have an arm64 variant. The ml4t and benchmark images both have native arm64 builds.
"No space left on device"
docker system prune -a # Remove unused images/containers
docker system df # Check space usage
Build fails with network errors
# Behind a proxy:
export HTTP_PROXY=http://proxy:port
export HTTPS_PROXY=http://proxy:port
docker compose pull ml4t
Local Setup with uv (Alternative to Docker)
Docker is recommended because it guarantees a consistent environment. But if you prefer a local Python setup — for faster iteration, IDE integration, or GPU access without container overhead — uv handles everything from Python installation through dependency resolution.
What uv Does
uv is a fast Python package manager written in Rust. It replaces pip, venv, pip-tools, and pyenv in a single tool. When you run uv sync, it:
- Reads
pyproject.tomlfor dependency specifications - Reads
uv.lockfor exact pinned versions (reproducible across machines) - Creates a virtual environment in
.venv/ - Installs all packages including PyTorch with CUDA support
Setup
# Install uv
curl -LsSf https://astral.sh/uv/install.sh | sh
# Clone and enter the repository
git clone https://github.com/stefan-jansen/machine-learning-for-trading.git
cd machine-learning-for-trading
# Install all dependencies (creates .venv/, installs ~300 packages)
uv sync
# Copy environment template and add API keys
cp .env.example .env
# Edit .env — see data/README.md for API key instructions
# Verify
uv run python -c "import polars, torch, lightgbm; print('Ready')"
How pyproject.toml Works
The pyproject.toml at the repository root defines all Python dependencies:
- Core data science: NumPy, SciPy, Pandas, Polars, PyArrow
- Visualization: Plotly, Matplotlib, Seaborn
- Machine learning: scikit-learn, XGBoost, LightGBM, CatBoost, Optuna, SHAP
- Deep learning: PyTorch 2.x (with CUDA 12.8 on Linux/Windows)
- NLP: Hugging Face Transformers, sentence-transformers, FinBERT
- ML4T libraries: ml4t-data, ml4t-engineer, ml4t-models, ml4t-diagnostic, ml4t-backtest, ml4t-live (installed from PyPI)
The lockfile uv.lock pins every transitive dependency to exact versions, so uv sync produces the same environment regardless of when you install.
What Local Setup Cannot Run
A few notebooks require Docker because their dependencies have no Python 3.14 wheel or need external services:
| Notebook | Reason | Docker Image |
|---|---|---|
Ch05 03_sigcwgan_signatures |
signatory requires Python 3.12 | py312 |
Ch09 06_path_signatures |
esig requires Python 3.12 | py312 |
Ch10 01-03 (word2vec, embeddings, sentiment) |
gensim requires Python 3.12 | py312 |
Ch12 10_shap_nlp_sentiment |
torch CUDA bug on 3.14 + shap | py312 |
Ch14 06_conditional_autoencoder |
torch CUDA bug on 3.14 + shap | py312 |
Ch15 06_fed_announcement_bsts |
tfcausalimpact requires Python 3.12 | py312 |
Ch21 05_deep_hedging_pfhedge |
pfhedge requires numpy<2 | py312 |
Ch02 21_storage_benchmark_database |
requires database services | benchmark |
For these, use docker compose with the appropriate profile even if your main workflow is local.
GPU with Local Setup
PyTorch auto-detects NVIDIA GPUs when CUDA drivers are installed. No special configuration needed:
uv run python -c "import torch; print(f'CUDA: {torch.cuda.is_available()}, Device: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else \"N/A\"}')"
GPU-intensive notebooks (Ch05 GANs, Ch13 deep learning, Ch14 autoencoders, Ch21 RL) benefit from GPU but all include CPU fallback with reduced parameters.
Next Steps
- Running Notebooks — How to execute notebooks, Papermill test mode, case study pipelines
- Data Guide — Download required datasets