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

1from dataclasses import dataclass 

2from datetime import datetime 

3from typing import Iterable 

4from uuid import UUID 

5 

6from finbot.backtest.experiment import ExperimentRun 

7 

8 

9@dataclass(frozen=True) 

10class ExperimentComparisonRow: 

11 run_id: UUID 

12 strategy: str 

13 symbols: tuple[str, ...] 

14 start: datetime 

15 end: datetime 

16 

17 starting_cash: float 

18 ending_value: float 

19 total_return: float 

20 max_drawdown: float 

21 total_fees: float 

22 total_slippage: float 

23 

24 

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 ]