From 021ce7dd99730a1a09843dccf2db32d6fcd0541b Mon Sep 17 00:00:00 2001 From: Bu5hm4nn Date: Tue, 24 Mar 2026 19:34:41 +0100 Subject: [PATCH] fix: anchor hedge contribution bars at zero --- app/pages/hedge.py | 21 +-------------------- tests/test_hedge_metrics.py | 11 +++++++++++ 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/app/pages/hedge.py b/app/pages/hedge.py index 42abfa2..135a4a4 100644 --- a/app/pages/hedge.py +++ b/app/pages/hedge.py @@ -33,19 +33,8 @@ def _cost_benefit_options(metrics: dict) -> dict: def _waterfall_options(metrics: dict) -> dict: steps = metrics["waterfall_steps"] - running = 0.0 - base: list[float] = [] values: list[dict[str, object]] = [] - for index, (label, amount) in enumerate(steps): - if index == 0: - base.append(0) - running = amount - elif index == len(steps) - 1: - base.append(0) - else: - base.append(running) - running += amount - + for label, amount in steps: color = "#0ea5e9" if label == "Net equity" else ("#22c55e" if amount >= 0 else "#ef4444") values.append({"value": amount, "itemStyle": {"color": color}}) @@ -56,14 +45,6 @@ def _waterfall_options(metrics: dict) -> dict: "series": [ { "type": "bar", - "stack": "total", - "data": base, - "itemStyle": {"color": "rgba(0,0,0,0)"}, - "tooltip": {"show": False}, - }, - { - "type": "bar", - "stack": "total", "data": values, }, ], diff --git a/tests/test_hedge_metrics.py b/tests/test_hedge_metrics.py index 983d8da..f4d6785 100644 --- a/tests/test_hedge_metrics.py +++ b/tests/test_hedge_metrics.py @@ -1,6 +1,7 @@ from __future__ import annotations from app.pages.common import strategy_metrics +from app.pages.hedge import _waterfall_options def test_protective_put_atm_minus_20pct_improves_equity() -> None: @@ -18,3 +19,13 @@ def test_protective_put_atm_minus_20pct_improves_equity() -> None: ("Hedge cost", -6_250.0), ("Net equity", 58_750.0), ] + + +def test_hedge_waterfall_uses_zero_based_contribution_bars() -> None: + options = _waterfall_options(strategy_metrics("protective_put_atm", -20)) + + assert len(options["series"]) == 1 + assert options["series"][0]["type"] == "bar" + values = options["series"][0]["data"] + assert values[2]["value"] == 38_000.0 + assert values[2]["itemStyle"]["color"] == "#22c55e"