Skip to main content

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

All plotting functions are single-purpose figures that consume a BacktestResult (from wb.to_result()) with zero data transformation — each field maps straight to a plotly trace. There are no composite (subplot) charts; the HTML report composes single figures into a CSS grid instead.

from wbt.plotting import (
    plot_colored_table,        # stats as a colored table
    plot_cumulative_returns,   # cumulative curves (voladj=True for vol-normalized)
    plot_daily_return_dist,    # daily-return histogram
    plot_drawdown,             # drawdown + cumulative (dual-axis single figure)
    plot_drawdowns_table,      # top-drawdowns detail table
    plot_key_trades,           # yearly best/worst key trades
    plot_monthly_heatmap,      # monthly-return heatmap
    plot_pairs_hold_dist,      # holding-bars distribution by direction
    plot_pairs_pnl_dist,       # pnl-ratio distribution by direction
    plot_rolling_metrics,      # rolling sharpe/return/vol over time (252d window)
    plot_segment_comparison,   # recent-1y vs full-sample metric table
    plot_stats_comparison,     # 多空/多头/空头/基准/超额 metric comparison table
    plot_symbol_returns,       # per-symbol cumulative returns
    plot_verdict,              # is_good_strategy verdict + yearly metrics
    plot_yearly_returns,       # yearly absolute vs excess returns (grouped bars)
)

Typical usage:

result = wb.to_result()

fig1 = plot_cumulative_returns(result, keys=["多空", "多头", "空头", "基准"])
fig2 = plot_cumulative_returns(result, voladj=True)   # vol-normalized
fig3 = plot_drawdown(result)
fig4 = plot_pairs_pnl_dist(result)

# Optional HTML export
html = plot_cumulative_returns(result, to_html=True)

# Full HTML report file (composes single figures into a tabbed CSS grid)
generate_backtest_report(df, "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                       # pure Rust crate entry; Python bindings are off by default
|   |-- python.rs                    # PyO3 bindings (enabled by the python feature)
|   `-- 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

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.6.0.tar.gz (2.3 MB view details)

Uploaded Source

Built Distributions

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

wbt-0.6.0-cp310-abi3-win_amd64.whl (21.0 MB view details)

Uploaded CPython 3.10+Windows x86-64

wbt-0.6.0-cp310-abi3-manylinux_2_28_x86_64.whl (19.2 MB view details)

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

wbt-0.6.0-cp310-abi3-manylinux_2_28_aarch64.whl (17.6 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.28+ ARM64

wbt-0.6.0-cp310-abi3-macosx_11_0_arm64.whl (17.0 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

wbt-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl (18.7 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for wbt-0.6.0.tar.gz
Algorithm Hash digest
SHA256 00d0aecdff1a6a9fb9467f11982437128275d5cfac03f4c18975b7a9140d84aa
MD5 c530f3e376a6448ef09b5c32b9f177f1
BLAKE2b-256 eb3ee01b53f9d80a1a67e48e78a0971bc266ec671d35cb59b302797d5d73e0aa

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: wbt-0.6.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 21.0 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.6.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 d62c82be3c509c43b8dfbaa836dfd9cad0616d3ea00e1a3bac197d732b361bc9
MD5 7b4f1568fad64cc7a3524e64cb8db641
BLAKE2b-256 76ef7bcab397f79c8e96067fc94e7ea94187ae6e4e48d7485d87951dc23d6660

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: wbt-0.6.0-cp310-abi3-manylinux_2_28_x86_64.whl
  • Upload date:
  • Size: 19.2 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.6.0-cp310-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 fd6f770cddfae6ea278aea5d649fc936857d710def7c061d5411fee97b3144c1
MD5 b9d95dc577820168317078a5e96dc284
BLAKE2b-256 20d94208b7acda1566ce5f79e9d06f756a37c63a953d7511b49e80f4be25af00

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for wbt-0.6.0-cp310-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1bba46095a078edeaa77eb6479f90c022802c00822c5c3e4ef23f75e7648b987
MD5 1aeaff231a94cfc78bd664303c3c1c30
BLAKE2b-256 4e0a46563f0484ac744c5724f686114c5af93a2c8d95c263b7a2f459ab8a1d9f

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: wbt-0.6.0-cp310-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 17.0 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.6.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d60c8d1a7ef1b83654b28b4ea2791594a5f3a52e626bddc739f310385e8cec60
MD5 bedc6dc1f3a85af9e7b54ed556b3862a
BLAKE2b-256 ac8f166a2ebf64de123c67a8ed4bba52a5e81143aca9805ed050c64a281a2ffb

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: wbt-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl
  • Upload date:
  • Size: 18.7 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.6.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 b9504be0f5b2bf1554d13914e6b5dc3acf44e0192b8745550553cdea4d31d1c0
MD5 c366635bc7aa0aec27369a613034c80e
BLAKE2b-256 693be8285be0ae8082ecb24cfdc2d8166345bc22ee3271dc7a44e8bc71b4b397

See more details on using hashes here.

Provenance

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