Built by researchers and engineers
QuantJourney Backtester is developed by a small team of four — researchers and engineers who use the engine for their own work first, and publish it because backtesting tools should be held to the standards of evidence they claim to produce.
The team
Jakub
Research & architectureQuantitative research, portfolio architecture and research infrastructure. Owns the engine architecture, the validation methodology — permutation tests, walk-forward, Deflated Sharpe — and the research guides published on this site.
Alexander
Strategies & live systemsQuantitative strategies, live trading systems and machine learning. Owns the strategy catalog — fifty-plus runnable examples across weights, orders and futures — and the execution semantics that keep backtests honest about fills, costs and margin.
Tomasz
Optimization & performanceOptimization methods and strategy performance analysis. Owns the walk-forward and Optuna integration — fold geometry, explicit pre-OOS purging, nested search — and the performance analytics behind the 80+ portfolio metrics.
Patryk
ML & data engineeringMachine learning engineering with deep expertise in time-series data. Owns the data pipelines and feature infrastructure — the layer that decides whether every number downstream can be trusted at all.
Open to contributions
Contributing to the engine
The engine is Apache 2.0 and developed in the open on GitHub. Every pull request gets a maintainer review and a response; accepted work is credited. A change may be merged as-is, adapted first, or re-applied through the QuantJourney source of truth — either way you hear back. Small, focused pull requests are reviewed fastest: one strategy, or one fix, per PR.
New example strategies
The most valued contribution: small, self-contained, teaching one idea clearly. Subclass
Backtester, implement _compute_signals/_compute_weights (or
_compute_orders), keep it runnable under ./strategy.sh <name> --check.
Bug fixes
Describe the incorrect behavior and, where possible, add a test that fails before the fix. Minimum diff — cleanup belongs in a separate PR.
Report an issue ↗Documentation
Clarifications, typos, better explanations — including these research guides. Docs PRs are as welcome as code.
Browse docs ↗Ideas & feedback
Not every contribution needs code. Open an issue for a proposal, a question, or a data point that would improve the engine.
Open a discussion ↗From fork to pull request
- Fork & clone
Fork on GitHub, then add the upstream remote.
git clone https://github.com/<you>/quantjourney-bt.git cd quantjourney-bt git remote add upstream https://github.com/QuantJourneyOrg/quantjourney-bt.git - Branch off an up-to-date main
git checkout main && git pull upstream main git checkout -b feat/short-description - Set up the reviewed environment
Use the frozen lockfile — never install into system/Homebrew Python.
uv sync --frozen --extra dev --extra data --extra wf --extra typecheck - Make the change, then run the checks
pytest -q ruff check . && ruff format --check . ./strategy.sh <name> --check # for a new strategy - Commit, push, open the PR
Present-tense message; push to your fork; GitHub offers Compare & pull request against
QuantJourneyOrg/quantjourney-bt. Describe what the change does and confirm the checks pass.git commit -m "Add Bollinger squeeze example strategy" git push origin feat/short-description
pytest -qpassesruff check .clean;ruff format --check .and the mypy baseline gate pass- New strategies pass
./strategy.sh <name> --check - No credentials, API keys, tokens or private paths included
- Simplified assumptions (borrow, financing, liquidity, impact) are stated in the docstring — documented, not hidden
- The change is focused and described in the PR