The Problem
Quantitative teams often need a production‑grade, multi‑asset back‑testing and live‑trading engine that supports both Python and C# strategies, integrates alternative data, and can be deployed behind a Docker pipeline. Building or adapting such a stack from scratch adds engineering overhead and risks inconsistent behavior across environments.
What This Does
Lean is an event‑driven algorithmic‑trading engine (≈6 280 files) that ships with plug‑in points for alphas, risk management, universes, and indicators. The code base is split between Algorithm.Python/ (519 files) and Algorithm.CSharp/ (4 326 files), with shared infrastructure in Common/ (1 883 files), Engine/ (233 files), and Indicators/ (232 files). Data handling lives in Data/ (1 145 files) and the tooling layer is under ToolBox/ (56 files). A modular design means each component can be replaced or extended without rewriting the whole system; the framework already includes dozens of sample alphas (e.g., Algorithm.CSharp/Alphas/MeanReversionLunchBreakAlpha.cs) and consolidators (ClassicRangeConsolidatorAlgorithm.cs).
How It Is Wired
- Entry point:
Algorithm.Python/main.pyis the Python‑side launch file; C# projects typically use a generatedMain.csthat references the same engine APIs. - Engine core:
Engine/orchestrates the event loop, order execution, and brokerage model interaction. It pulls market data fromData/and feeds it through warm‑up / indicator pipelines inIndicators/. - CLI integration:
ToolBox/contains the Lean CLI that translates user commands (backtest, live‑deploy) into calls to the engine; the CLI is the primary way to invoke runs outside of IDEs. - CI/CD:
.travis.ymldrives Travis CI, runningdotnet teston the C# side andpython -m pytest(or equivalent) on the Python side; the workflow files under.github/workflows/(e.g.,regression-tests.yml,syntax-tests.yml) further gate changes. - External touches: The engine writes backtest results and logs to a user‑specified directory (often mounted via Docker volumes) and can push live data to a QuantConnect brokerage endpoint; it does not persist user‑code beyond the run session unless explicitly saved.
How To Use It
Setup
- Clone the repository:
git clone https://github.com/moses-y/Lean.git - Build the development container (or a plain Docker image) using the provided Dockerfile:
docker build -t lean -f .devcontainer/Dockerfile .
- For C# development, ensure the NuGet config at
.nuget/NuGet.configis restored (dotnet restore).
Configuration
- Environment variables such as
LEAN_DATA_DIR(used by the engine to locate historical data) are documented in the Dockerfiles and can be overridden in.envfiles or the CI matrix. - API keys for live‑trading venues are supplied through the QuantConnect dashboard; the repo itself does not commit secrets.
Running it
- Backtest (Python):
lean backtest Algorithm.Python/main.py– the CLI reads the algorithm, materialises the engine, and streams results to stdout/a log file. - Backtest (C#): Open the
.slnin Visual Studio or rundotnet run --project Algorithm.CSharp/BasicTemplateAlgorithm.csprojafter restoring packages. - Tests: CI runs the 1 091 test files under
Tests/on every push; locally you can invokedotnet testorpython -m pytest Tests/depending on language.
Real‑World Use
A quant wanting a mean‑reversion strategy on equities can copy Algorithm.CSharp/Alphas/MeanReversionLunchBreakAlpha.cs into a new project, adjust the universe selection, and run lean backtest to generate a performance report within minutes. The same logic can be prototyped in Python by placing a mirrored algorithm under Algorithm.Python/ and leveraging the same indicator libraries (Indicators/), ensuring parity between prototyping and production‑grade back‑tests.
Code Health & Issues
- Static‑analysis: The repository shows no structural red flags – tests (1 091 files), CI (Travis + GitHub Actions), license, and lockfile are all present where expected.
- Language balance: C# dominates (4 326 files) with a smaller Python footprint (519 files); mixed‑language projects may need extra tooling to keep both runtimes in sync.
- Missing mapping: The internal call graph between
Engine/,Indicators/, and the algorithm entry points has not been formally documented; changing deep integration points may require tracing through the event‑loop code manually.
The Bottom Line
Lean delivers a fully‑featured, multi‑language algorithmic‑trading engine with strong CI, Docker‑ready builds, and a rich set of plug‑in components. It is well‑suited for teams that need a professional‑grade back‑testing and live‑trading platform without building the stack from scratch, provided they are comfortable navigating a large C#‑centric code base and possibly writing thin Python wrappers. Organizations already invested in the QuantConnect ecosystem will find the least friction; others should budget time to map the engine‑algorithm interfaces before large‑scale customization.