Skip to content

backtest: implement metrics and vectorized backtester#10

Merged
marwinsteiner merged 5 commits intomainfrom
phase-4/metrics-vectorized-v2
Feb 22, 2026
Merged

backtest: implement metrics and vectorized backtester#10
marwinsteiner merged 5 commits intomainfrom
phase-4/metrics-vectorized-v2

Conversation

@marwinsteiner
Copy link
Copy Markdown
Owner

Summary

  • metrics.py: Performance metrics on numpy arrays — Sharpe, Sortino, Calmar, max drawdown, drawdown series, annualized return/vol, win rate, profit factor, total return. summarize_backtest() convenience builder. TradeRecord and BacktestResult frozen Pydantic models.
  • vectorized.py: vectorbt-inspired backtester operating on numpy arrays. Signal conventions (1=long, -1=short, 0=flat), equity curve computation, per-trade PnL extraction with commission and slippage models. run_vectorized_backtest()BacktestResult.
  • Review fixes: profit_factor returns float('inf') for all-winners (was incorrectly 0.0). Added ConfigDict(ser_json_inf_nan='constants') for JSON round-trip. Sortino docstring documents population-based convention. Added total-loss and empty-equity edge-case tests.

Stats

  • 5 commits, 1,762 lines added
  • 97 tests (62 metrics + 35 vectorized), all passing
  • Full suite: 611 passed, 10 skipped
  • ruff clean

Test plan

  • All 97 backtest tests pass
  • Full test suite (611 passed, 10 skipped)
  • ruff check clean
  • JSON serialization round-trip tested
  • Edge cases: empty arrays, single elements, total loss, all-winners

Create src/sysls/backtest/ and tests/backtest/ packages in
preparation for metrics and vectorized backtester modules.
Pure, stateless metric functions operating on numpy arrays:
- compute_returns / compute_log_returns
- sharpe_ratio, sortino_ratio, calmar_ratio
- max_drawdown, drawdown_series
- total_return, annualized_return, annualized_volatility
- win_rate, profit_factor

Also defines TradeRecord and BacktestResult Pydantic models,
plus summarize_backtest convenience function.
60 tests covering all metric functions with known inputs/outputs,
edge cases (empty arrays, single element, all zeros, division by
zero), Pydantic model construction, immutability, and JSON
serialization round-trips.
profit_factor now returns float('inf') for all-winners (was incorrectly
0.0). Added ConfigDict(ser_json_inf_nan='constants') for JSON round-trip.
Added tests: total-loss annualized return, empty equity summarize.
Updated Sortino docstring to document population-based convention.
vectorbt-inspired backtester operating on numpy arrays: signal
conventions (1=long, -1=short, 0=flat), equity curve computation,
per-trade PnL extraction, commission and slippage models.
run_vectorized_backtest() returns BacktestResult via summarize_backtest.
35 tests covering long/short, commissions, slippage, edge cases.
@marwinsteiner marwinsteiner merged commit 607e057 into main Feb 22, 2026
1 check passed
@marwinsteiner marwinsteiner deleted the phase-4/metrics-vectorized-v2 branch February 22, 2026 11:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant