feat: report bootstrap confidence intervals
This commit is contained in:
+15
-7
@@ -11,6 +11,7 @@ from datetime import datetime, timedelta
|
||||
|
||||
from scoring.policy import SCORE_BRACKETS, SCORE_VERSION, score_in_bracket
|
||||
from ml.artifacts import validate_ml_artifact
|
||||
from backtesting.statistics import summarize_returns
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -419,6 +420,19 @@ def clear_backtest_cache():
|
||||
_BACKTEST_CACHE.clear()
|
||||
|
||||
|
||||
def _add_return_statistics(stats, period, returns):
|
||||
"""Add return summaries and a moving-block-bootstrap mean interval."""
|
||||
summary = summarize_returns(returns, block_size=min(30, len(returns)), n_resamples=400)
|
||||
stats[f"avg_{period}"] = summary["mean"]
|
||||
stats[f"median_{period}"] = summary["median"]
|
||||
stats[f"win_rate_{period}"] = summary["win_rate"]
|
||||
stats[f"avg_{period}_ci_low"] = summary["mean_ci_low"]
|
||||
stats[f"avg_{period}_ci_high"] = summary["mean_ci_high"]
|
||||
stats[f"max_gain_{period}"] = round(max(returns), 2)
|
||||
stats[f"max_loss_{period}"] = round(min(returns), 2)
|
||||
stats[f"n_{period}"] = summary["n"]
|
||||
|
||||
|
||||
def run_backtest(ml_mode=False):
|
||||
"""Return an isolated cached result keyed by all material input files."""
|
||||
signature = (
|
||||
@@ -537,13 +551,7 @@ def _compute_backtest(ml_mode=False):
|
||||
for period in ["30d", "90d", "180d", "365d"]:
|
||||
returns = [d["forward_returns"][period] for d in days_in if period in d["forward_returns"]]
|
||||
if returns:
|
||||
returns_sorted = sorted(returns)
|
||||
stats[f"avg_{period}"] = round(sum(returns) / len(returns), 2)
|
||||
stats[f"median_{period}"] = round(returns_sorted[len(returns_sorted) // 2], 2)
|
||||
stats[f"win_rate_{period}"] = round(len([r for r in returns if r > 0]) / len(returns) * 100, 1)
|
||||
stats[f"max_gain_{period}"] = round(max(returns), 2)
|
||||
stats[f"max_loss_{period}"] = round(min(returns), 2)
|
||||
stats[f"n_{period}"] = len(returns)
|
||||
_add_return_statistics(stats, period, returns)
|
||||
|
||||
# Average max drawdown within 90 days
|
||||
dd_list = []
|
||||
|
||||
Reference in New Issue
Block a user