Coverage for src/finbot/backtest/comparison.py: 100%
20 statements
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 17:12 +0000
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-21 17:12 +0000
1from dataclasses import dataclass
2from datetime import datetime
3from typing import Iterable
4from uuid import UUID
6from finbot.backtest.experiment import ExperimentRun
9@dataclass(frozen=True)
10class ExperimentComparisonRow:
11 run_id: UUID
12 strategy: str
13 symbols: tuple[str, ...]
14 start: datetime
15 end: datetime
17 starting_cash: float
18 ending_value: float
19 total_return: float
20 max_drawdown: float
21 total_fees: float
22 total_slippage: float
25def compare_experiments(runs: Iterable[ExperimentRun]) -> list[ExperimentComparisonRow]:
26 return [
27 ExperimentComparisonRow(
28 run_id=run.metadata.run_id,
29 strategy=run.metadata.config.strategy,
30 symbols=run.metadata.config.symbols,
31 start=run.metadata.config.start,
32 end=run.metadata.config.end,
33 starting_cash=run.result.starting_cash,
34 ending_value=run.result.ending_value,
35 total_return=run.result.total_return,
36 max_drawdown=run.result.max_drawdown,
37 total_fees=run.result.total_fees,
38 total_slippage=run.result.total_slippage,
39 )
40 for run in runs
41 ]