QuantJourney Backtester

QuantJourney Backtester

Share product feedback

Thank you.

Your note is now in the QuantJourney inbox.

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 & architecture

Quantitative 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 systems

Quantitative 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 & performance

Optimization 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 engineering

Machine 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.

Strategy conventions ↗

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

  1. 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
  2. Branch off an up-to-date main
    git checkout main && git pull upstream main
    git checkout -b feat/short-description
  3. 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
  4. Make the change, then run the checks
    pytest -q
    ruff check . && ruff format --check .
    ./strategy.sh <name> --check   # for a new strategy
  5. 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
Pull-request checklist
  • pytest -q passes
  • ruff 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