fix: remove leakage from legacy ML evaluation
This commit is contained in:
+15
-7
@@ -28,7 +28,7 @@ MAC_MINI_HOST = "bizzle@bizzles-mac-mini-1"
|
||||
MAX_ITERATIONS = 50
|
||||
CONVERGENCE_WINDOW = 5
|
||||
CONVERGENCE_THRESHOLD = 0.01 # 1% improvement
|
||||
TARGET_COST_IMPROVEMENT = 20.0 # 20% cost basis improvement = exceptional
|
||||
TARGET_COST_IMPROVEMENT = 20.0 # Backward-compatible name: terminal wealth objective
|
||||
MIN_SIGNAL_COUNT = 30 # Minimum strong buy signals for valid results
|
||||
ML_TIMEOUT = 600 # 10 minutes
|
||||
|
||||
@@ -49,6 +49,11 @@ def log(msg, color=""):
|
||||
print(f"{C.DIM}[{ts}]{C.RESET} {color}{msg}{C.RESET}")
|
||||
|
||||
|
||||
def objective_score(results):
|
||||
"""Return the equal-capital portfolio objective used for model selection."""
|
||||
return float(results.get("terminal_wealth_improvement_pct", 0.0))
|
||||
|
||||
|
||||
def run_cmd(cmd, timeout=120, check=True):
|
||||
"""Run a shell command and return stdout."""
|
||||
result = subprocess.run(
|
||||
@@ -160,11 +165,12 @@ def print_header():
|
||||
|
||||
|
||||
def print_results(results, iteration):
|
||||
cost_imp = results.get("cost_basis_improvement_pct", 0)
|
||||
color = C.GREEN if cost_imp > 15 else C.YELLOW if cost_imp > 10 else C.RED
|
||||
objective = objective_score(results)
|
||||
color = C.GREEN if objective > 15 else C.YELLOW if objective > 10 else C.RED
|
||||
print(f"""
|
||||
{C.BOLD}--- Iteration {iteration} Results ---{C.RESET}
|
||||
Cost Improvement: {color}{C.BOLD}{cost_imp:.1f}%{C.RESET}
|
||||
Terminal Wealth vs DCA: {color}{C.BOLD}{objective:.1f}%{C.RESET}
|
||||
Legacy Cost Basis Delta: {results.get('cost_basis_improvement_pct', 0):.1f}%
|
||||
Avg Cost (Model): ${results.get('avg_cost_basis_model', 0):,.2f}
|
||||
Avg Cost (DCA): ${results.get('avg_cost_basis_dca', 0):,.2f}
|
||||
Strong Signals: {results.get('strong_buy_signal_count', 0)}
|
||||
@@ -244,7 +250,7 @@ def main():
|
||||
|
||||
print_results(results, iteration)
|
||||
|
||||
current_score = results.get("cost_basis_improvement_pct", 0)
|
||||
current_score = objective_score(results)
|
||||
signal_count = results.get("strong_buy_signal_count", 0)
|
||||
is_best = current_score > best_score and signal_count >= MIN_SIGNAL_COUNT
|
||||
|
||||
@@ -252,12 +258,14 @@ def main():
|
||||
best_score = current_score
|
||||
with open(best_config_path, "w") as f:
|
||||
json.dump(config, f, indent=2)
|
||||
log(f"NEW BEST! Cost Improvement: {best_score:.1f}%", f"{C.BOLD}{C.GREEN}")
|
||||
log(f"NEW BEST! Terminal Wealth Improvement: {best_score:.1f}%", f"{C.BOLD}{C.GREEN}")
|
||||
|
||||
iter_data = {
|
||||
"iteration": iteration,
|
||||
"timestamp": datetime.now(timezone.utc).isoformat(),
|
||||
"cost_improvement": current_score,
|
||||
"objective_improvement": current_score,
|
||||
"objective": "equal_periodic_contribution_terminal_wealth",
|
||||
"avg_30d_return": results.get("avg_quality_score_strong_buy", 0),
|
||||
"avg_90d_return": results.get("pct_quality_strong_buy", 0),
|
||||
"signal_count": signal_count,
|
||||
@@ -312,7 +320,7 @@ def main():
|
||||
========================================================{C.RESET}
|
||||
|
||||
Total Iterations: {len(history)}
|
||||
Best Cost Improvement: {C.BOLD}{best_score:.1f}%{C.RESET}
|
||||
Best Terminal Wealth Improvement: {C.BOLD}{best_score:.1f}%{C.RESET}
|
||||
Best Config: {best_config_path}
|
||||
Iteration Log: {ITERATIONS_LOG}
|
||||
""")
|
||||
|
||||
Reference in New Issue
Block a user