wbt 0.2.1

Weight-based backtesting engine for quantitative trading
# wbt v0.2.1

> Release date: 2026-05-17
> Crate tag: `crate-v0.2.1` · Python tag: `v0.2.1`

## Summary

PATCH release fixing a pandas 3.0 compatibility regression in
`wbt.report.plot_cumulative_returns`. No public API changes.

## Fixes

- **pandas 3.0 compatibility**: `plot_cumulative_returns` previously asserted
  `dret.index.dtype == "datetime64[ns]"`. pandas 3.0 changed the default
  datetime precision from `ns` to `us`, so any caller passing a freshly
  constructed `DatetimeIndex` on pandas 3.0 hit `AssertionError`. The check is
  now `pd.api.types.is_datetime64_any_dtype(...)`, accepting any datetime64
  precision (`ns` / `us` / `ms` / `s`) on both pandas 2.x and 3.x.

  Regression covered by parametrized test
  `test_plot_cumulative_returns_accepts_any_datetime_precision`.

## Dependency changes

- `pyproject.toml`: pandas dep raised from unconstrained to `>=2.2` (explicit
  floor — pandas 3.x already resolves on Python ≥ 3.11).
- `pandas-stubs` (dev) split by Python marker: `>=3.0` for Python ≥ 3.11,
  `>=2.3,<3` for Python 3.10. Mirrors pandas itself, which dropped Python 3.10
  in the 3.x line.

## Compatibility

- `BREAKING CHANGE`: none.
- Python: requires ≥ 3.10 (unchanged).
- Rust: edition 2024, `pyo3 = 0.28` / `numpy = 0.28` (unchanged).

## Release checklist outcome

- **§1 SemVer**: bug-fix only, no API surface change → PATCH bump (`0.2.0 → 0.2.1`).
- **§2 Lint/typecheck**: `cargo fmt --check`, `cargo clippy -D warnings`,
  `cargo test --lib` (142 passed), `ruff check`, `ruff format --check`,
  `basedpyright` all clean.
- **§3 Tests**: `pytest` 235 passed / 1 skipped under pandas 3.0.2 with
  `-W error` (no deprecation warnings).
- **§4 LLM review**: scoped to single-file change in
  `python/wbt/report/_plot_backtest.py:188` + new parametrized test. No new
  findings beyond v0.2.0 known issues (unchanged).
- **§5 doc-vs-code**: no doc updates required; the assertion message was
  internal.

## Known issues (carried forward from v0.2.0)

Unchanged from v0.2.0; see `docs/release_notes/v0.2.0.md` for the list
(cal_trade_price defensive copy, log_strategy_info input guard,
cal_yearly_days timezone clarification).