Skip to main content

Weight-based backtesting engine for quantitative trading

Project description

wbt Python Package

Python API for the wbt Rust backtesting engine.

中文文档

Development Objectives

This Python subproject aims to provide a practical research-facing interface for weight-based backtesting while keeping the heavy computation in Rust.

Design priorities:

  1. Keep data input flexible for common research formats.
  2. Return analysis-friendly outputs as pandas objects.
  3. Preserve one consistent metric schema across stats outputs.
  4. Provide plotting utilities that work directly on backtest outputs.

Project Layout

This directory is an independent Python subproject.

python/
|-- pyproject.toml
|-- README.md
|-- scripts/
|-- tests/
`-- wbt/

The Rust crate remains one level up at ../Cargo.toml. maturin builds the extension module from there.

Installation And Local Setup

Requirements:

  • Rust toolchain
  • Python 3.10+
  • uv

Setup:

cd python
uv sync --extra dev
uv run maturin develop --release

Quick Start

import pandas as pd
from wbt import WeightBacktest

df = pd.DataFrame(
    {
        "dt": [
            "2024-01-02 09:01:00",
            "2024-01-02 09:02:00",
            "2024-01-02 09:03:00",
            "2024-01-02 09:04:00",
        ],
        "symbol": ["AAPL", "AAPL", "AAPL", "AAPL"],
        "weight": [0.5, 0.2, 0.0, -0.3],
        "price": [185.0, 186.0, 186.5, 184.5],
    }
)

wb = WeightBacktest(
    df,
    digits=2,
    fee_rate=0.0002,
    n_jobs=4,
    weight_type="ts",   # "ts" or "cs"
    yearly_days=252,
)

print("all:", wb.stats)
print("long:", wb.long_stats)
print("short:", wb.short_stats)

print(wb.daily_return.head())
print(wb.dailys.head())
print(wb.pairs.head())

print(wb.segment_stats("2024-01-01", "2024-12-31", kind="多空"))
print(wb.long_alpha_stats)

Accepted Inputs

The data argument accepts:

  • pandas.DataFrame
  • polars.DataFrame
  • polars.LazyFrame
  • file path as str or Path

Supported file formats from path input:

  • csv
  • parquet
  • feather
  • arrow

Required columns:

Column Type Meaning
dt datetime-like Bar end time
symbol str Instrument code
weight float Target position weight
price float Price used for return calculation

Notes:

  • Null values are not allowed.
  • weight is rounded by digits before backtest.

Main API Surface

Top-level imports (all reachable from import wbt):

from wbt import (
    # Backtest engine
    WeightBacktest, backtest,
    # Performance metrics (Rust-backed)
    daily_performance,
    top_drawdowns,
    rolling_daily_performance,
    cal_yearly_days,
    # Strategy utilities (pure Python)
    weights_simple_ensemble,
    cal_trade_price,
    log_strategy_info,
    # Reporting
    generate_backtest_report,
    # Test data
    mock_symbol_kline, mock_weights,
)

Primary class and helpers:

  • WeightBacktest(...): main backtest engine entry.
  • backtest(...): convenience wrapper returning a WeightBacktest.
  • daily_performance(returns, yearly_days=252): standalone metric utility on a daily-return array.
  • top_drawdowns(returns, top=10): top-N drawdown windows.
  • rolling_daily_performance(df, ret_col, window=252, min_periods=100, yearly_days=None): rolling-window daily performance.
  • cal_yearly_days(dts): infer yearly trading-day count from a date series.
  • weights_simple_ensemble(df, weight_cols, method="mean", only_long=False, **kwargs): ensemble multiple strategy weights (mean / vote / sum_clip).
  • cal_trade_price(df, digits=None, windows=(5, 10, 15, 20, 30, 60)): TWAP / VWAP and next-bar trade-price table grouped by symbol.
  • log_strategy_info(strategy, df): pretty-print per-symbol weight summaries via loguru.
  • generate_backtest_report(wb, output_path): render a self-contained HTML report.
  • mock_symbol_kline(...) / mock_weights(...): generators for quick experiments.

Core WeightBacktest properties and methods:

  • stats, long_stats, short_stats
  • daily_return, long_daily_return, short_daily_return
  • dailys, pairs
  • alpha, alpha_stats, bench_stats
  • segment_stats(sdt, edt, kind)
  • long_alpha_stats
  • get_symbol_daily(symbol), get_symbol_pairs(symbol)

Logging Note

cal_yearly_days and rolling_daily_performance emit warnings from Rust (e.g. short-span fallback) via the log crate. The package initializes pyo3-log at module load, so those warnings show up through Python's standard logging. If you use loguru, install an InterceptHandler once to route them into your loguru sinks.

Plotting Utilities

Two plotting surfaces are provided:

wbt.plotting — single-purpose figures

from wbt.plotting import (
    plot_backtest_overview,
    plot_colored_table,
    plot_cumulative_returns,
    plot_daily_return_dist,
    plot_drawdown,
    plot_long_short_comparison,
    plot_monthly_heatmap,
    plot_pairs_analysis,
    plot_symbol_returns,
)

wbt.report — report-grade composite charts

from wbt.report import (
    HtmlReportBuilder,
    LongShortComparisonChart,
    generate_backtest_report,
    get_performance_metrics_cards,
    plot_backtest_stats,
    plot_colored_table,
    plot_cumulative_returns,
    plot_daily_return_distribution,
    plot_drawdown_analysis,
    plot_long_short_comparison,
    plot_monthly_heatmap,
)

Typical usage:

fig1 = plot_cumulative_returns(wb.daily_return)
fig2 = plot_drawdown(wb.daily_return)
fig3 = plot_pairs_analysis(wb.pairs)

# Composite stats overview (3-in-1 layout)
fig4 = plot_backtest_stats(wb.daily_return, ret_col="total")

# Optional HTML export
html = plot_backtest_overview(wb.daily_return, to_html=True)

# Full HTML report file
generate_backtest_report(wb, "report.html")

Quality And Testing

Run checks from python/:

uv run pytest -v
uv run ruff format --check .
uv run ruff check . --no-fix
uv run basedpyright

Architecture Snapshot

repo-root/
|-- Cargo.toml
|-- src/
|   |-- lib.rs                       # PyO3 bindings (pyfunctions, _wbt pymodule)
|   `-- core/
|       |-- cal_yearly_days.rs       # Rust core for cal_yearly_days
|       |-- daily_performance.rs
|       |-- rolling_daily_performance.rs
|       |-- top_drawdowns.rs
|       `-- ...                      # backtest engine internals
`-- python/
    `-- wbt/
        |-- __init__.py              # top-level exports
        |-- _df_convert.py           # pandas <-> Arrow IPC helpers
        |-- _wbt.pyi                 # Rust extension stubs
        |-- backtest.py              # WeightBacktest class
        |-- mock.py                  # mock_symbol_kline / mock_weights
        |-- top_drawdowns.py         # adapter for _wbt.top_drawdowns
        |-- utils/                   # adapters + pure-Python utilities
        |   |-- __init__.py
        |   |-- cal_yearly_days.py
        |   |-- rolling_daily_performance.py
        |   |-- weights_simple_ensemble.py
        |   |-- cal_trade_price.py
        |   `-- log_strategy_info.py
        |-- plotting/                # single-purpose plotly charts
        |   |-- __init__.py
        |   |-- _common.py
        |   |-- returns.py
        |   |-- risk.py
        |   |-- trades.py
        |   `-- overview.py
        `-- report/                  # HTML report + composite charts
            |-- __init__.py
            |-- _generator.py
            |-- _plot_backtest.py
            `-- html_builder.py

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wbt-0.2.2.tar.gz (394.8 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

wbt-0.2.2-cp310-abi3-win_amd64.whl (21.3 MB view details)

Uploaded CPython 3.10+Windows x86-64

wbt-0.2.2-cp310-abi3-manylinux_2_28_x86_64.whl (19.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ x86-64

wbt-0.2.2-cp310-abi3-manylinux_2_28_aarch64.whl (18.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

wbt-0.2.2-cp310-abi3-macosx_11_0_arm64.whl (17.3 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

wbt-0.2.2-cp310-abi3-macosx_10_12_x86_64.whl (19.0 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file wbt-0.2.2.tar.gz.

File metadata

  • Download URL: wbt-0.2.2.tar.gz
  • Upload date:
  • Size: 394.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wbt-0.2.2.tar.gz
Algorithm Hash digest
SHA256 e46585f03e6a77d243b4daca70a987982b43a2a6466dd35460abc4e72cef97f8
MD5 1814668f7f85fc89cee0bf2f8abf231a
BLAKE2b-256 ea7566e8afc92b5291b71920f889fb19488c2d8c4a32ad41e1dcf1812f293694

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.2.tar.gz:

Publisher: release.yml on zengbin93/wbt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wbt-0.2.2-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: wbt-0.2.2-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 21.3 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wbt-0.2.2-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 525693780428e1ae025cea479d3c7bce5b358cd392f6b63c57bd17ae81308d03
MD5 2e1f245e0c6c896d02bed216e29f4ea3
BLAKE2b-256 2f8c6da903f4e99365dcf5493a375bd640d60ffd110c3c7e4eeaea6ec186baaf

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.2-cp310-abi3-win_amd64.whl:

Publisher: release.yml on zengbin93/wbt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wbt-0.2.2-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

  • Download URL: wbt-0.2.2-cp310-abi3-manylinux_2_28_x86_64.whl
  • Upload date:
  • Size: 19.6 MB
  • Tags: CPython 3.10+, manylinux: glibc 2.28+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wbt-0.2.2-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 1b9b01fecdc07ffa71ff3fe8ba064acd39213b99563a5be4b4da41c8d1f39910
MD5 c6be8b89614c9525238f31df6c07121e
BLAKE2b-256 fdf73ed498db838b7785614c6f5fc3a7d03889dddabe14f2c5afdd6822327bde

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.2-cp310-abi3-manylinux_2_28_x86_64.whl:

Publisher: release.yml on zengbin93/wbt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wbt-0.2.2-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for wbt-0.2.2-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 f0e5cad53f4b6df03ecceadb1d5b717fd0368187558425d2d30c96d74cf28457
MD5 ae13643b935885f8a5768616b255cd7c
BLAKE2b-256 3320a35d05f5cf43306bbf7649af18ba8dd74b5ed795c04a54a5157242ebd1bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.2-cp310-abi3-manylinux_2_28_aarch64.whl:

Publisher: release.yml on zengbin93/wbt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wbt-0.2.2-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: wbt-0.2.2-cp310-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 17.3 MB
  • Tags: CPython 3.10+, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wbt-0.2.2-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5b15c4b871b59cc307b5bb5d090375b9e0da9cb82fed631e28c4ab1b5442990d
MD5 0e38fbf93c0ce31f9dbafcbabc18d5c3
BLAKE2b-256 c7a14bf37a5162a56931be03de1feee012ffbe4d0fc53b6a50bf2bdd94462e98

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.2-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on zengbin93/wbt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wbt-0.2.2-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

  • Download URL: wbt-0.2.2-cp310-abi3-macosx_10_12_x86_64.whl
  • Upload date:
  • Size: 19.0 MB
  • Tags: CPython 3.10+, macOS 10.12+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wbt-0.2.2-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 2a7372d65f416b6f7fb0e015cc991e770e4c7856bbd21c339c890eed38bc691a
MD5 33756bb633afb397062919401b6bb3a4
BLAKE2b-256 d56b5ee29eafab01121ca20263cfabb340b0f62408cac35af03d26226d90a2c6

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.2-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on zengbin93/wbt

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page