docs: clarify control parity accounting

This commit is contained in:
2026-08-05 08:56:53 +02:00
parent 1ace6688dd
commit e58d2bb2cf
2 changed files with 9 additions and 1 deletions
@@ -41,6 +41,14 @@ The daily replay uses zero outcome horizon: setup and rank observations continue
through the snapshot's last session because portfolio simulation, unlike outcome through the snapshot's last session because portfolio simulation, unlike outcome
grading, does not require 30 future bars. grading, does not require 30 future bars.
Control-parity note: a direct main-versus-branch comparison found identical
total return, CAGR, maximum drawdown, and Sharpe. The branch intentionally
changes only the first calendar year's `yearly_returns` convention: it starts
from initial capital rather than equity after the first session, so day-one
entry costs are now charged to year one. Older reports can therefore show a
different first-year contextual return without a strategy-performance
regression. New trade-detail and measurement-start fields are additive.
### Weekly-selection mechanics ### Weekly-selection mechanics
- Ordinary exits run before entries/rebalancing. - Ordinary exits run before entries/rebalancing.
@@ -69,7 +69,7 @@ def _business_days(start: date, end: date) -> list[date]:
return days return days
def test_new_simulator_options_preserve_legacy_control_path(): def test_new_simulator_option_defaults_match_explicit_defaults():
start = date(2025, 1, 6) start = date(2025, 1, 6)
ords = [start.toordinal() + offset for offset in range(8)] ords = [start.toordinal() + offset for offset in range(8)]
prices = {'AAA': _prices(ords)} prices = {'AAA': _prices(ords)}