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.1.tar.gz (390.9 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.1-cp310-abi3-win_amd64.whl (21.3 MB view details)

Uploaded CPython 3.10+Windows x86-64

wbt-0.2.1-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.1-cp310-abi3-manylinux_2_28_aarch64.whl (18.0 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

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

Uploaded CPython 3.10+macOS 11.0+ ARM64

wbt-0.2.1-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.1.tar.gz.

File metadata

  • Download URL: wbt-0.2.1.tar.gz
  • Upload date:
  • Size: 390.9 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.1.tar.gz
Algorithm Hash digest
SHA256 3205d8aa8587791c6bb14435f7b780dbd9fe522200813491b8993f05bd1989b0
MD5 f039287be8d8f1abbaaa5aeae69c29bc
BLAKE2b-256 d05f52699b296274de843fb01237b749cb255bdf79fbbff378714be016805f53

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.1.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.1-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: wbt-0.2.1-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.1-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 5af5438f5064adac95524d1e547ddd25ead8abced3461d844ce8ba69231ebea7
MD5 8362aa38d4ed3a71c12ddf97a23e77a8
BLAKE2b-256 c06c828bc711186a639a9d49031f6340f99f0b603d8425a0af573d048acac5c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.1-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.1-cp310-abi3-manylinux_2_28_x86_64.whl.

File metadata

  • Download URL: wbt-0.2.1-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.1-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 23731027d52fdf0d51900ea832d28d42a14e11284afc0b9292d692fad31f86fd
MD5 d28f50d88ccbcf114d13a16a79f8fc44
BLAKE2b-256 4c4f4320f3bca1b6c29aec0589dc966553ee2dbd781615b9c058647c87be1c50

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.1-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.1-cp310-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for wbt-0.2.1-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bcc390787aa8a3fb2fa0a893a0e494ebaace18c84060c3423dcba886a788ba72
MD5 1b3394d4fefbf3f66dc5780deea89670
BLAKE2b-256 b18d74d19852b47cf242d1cc583b77d671450d718db0f187af15311b459143a7

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.1-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.1-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: wbt-0.2.1-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.1-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3a812169bb8dbe2b29c267396a285596b205065951b0017213e4631b36b68467
MD5 acac96b39474edf9696d5c98532aca1b
BLAKE2b-256 ff4f2cd8f15eb1d6d50bf63498e04b8a032b442eb4b1f6e947def87468be8c41

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.1-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.1-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

  • Download URL: wbt-0.2.1-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.1-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 93fc55cc833f6779cf5f36345d7c241457d1d05db4f2a530241403f534a67259
MD5 d7cb1cabafde700010ee8ad44ad0adaa
BLAKE2b-256 fe3e611b1d5fc39b1c00883c97f9b595df8ddf101293e59aed78433dc00f1345

See more details on using hashes here.

Provenance

The following attestation bundles were made for wbt-0.2.1-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