From 2d8b91b709e9358f49cd6c22f5b2e74699da99fe Mon Sep 17 00:00:00 2001 From: Youssef Aitousarrah Date: Sun, 12 Apr 2026 18:04:04 -0700 Subject: [PATCH] =?UTF-8?q?learn(iterate):=202026-04-12=20=E2=80=94=20surf?= =?UTF-8?q?ace=20worst-performing=20strategies=20in=20ranker=20context;=20?= =?UTF-8?q?LLM=20now=20sees=20news=5Fcatalyst=20(0%=207d=20win=20rate)=20a?= =?UTF-8?q?nd=20social=5Fhype=20(14.3%)=20as=20explicit=20penalties?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- .../dataflows/discovery/analytics.py | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/tradingagents/dataflows/discovery/analytics.py b/tradingagents/dataflows/discovery/analytics.py index 2ea17f5d..124a44d2 100644 --- a/tradingagents/dataflows/discovery/analytics.py +++ b/tradingagents/dataflows/discovery/analytics.py @@ -375,20 +375,38 @@ class DiscoveryAnalytics: f"Historical 30-day win rate: {overall_30d.get('win_rate', 0)}% ({overall_30d.get('count')} tracked)" ) - # Top performing strategies + # Top and bottom performing strategies by_strategy = stats.get("by_strategy", {}) if by_strategy: - lines.append("\nBest performing strategies (7-day):") + qualified = [ + (k, v) + for k, v in by_strategy.items() + if v.get("win_rate_7d") is not None + and (v.get("wins_7d", 0) + v.get("losses_7d", 0)) >= 5 + ] sorted_strats = sorted( - [(k, v) for k, v in by_strategy.items() if v.get("win_rate_7d")], - key=lambda x: x[1].get("win_rate_7d", 0), - reverse=True, - )[:3] + qualified, key=lambda x: x[1].get("win_rate_7d", 0), reverse=True + ) - for strategy, data in sorted_strats: + lines.append("\nBest performing strategies (7-day):") + for strategy, data in sorted_strats[:3]: wr = data.get("win_rate_7d", 0) + avg_ret = data.get("avg_return_7d", 0) count = data.get("wins_7d", 0) + data.get("losses_7d", 0) - lines.append(f" - {strategy}: {wr}% win rate ({count} samples)") + lines.append( + f" - {strategy}: {wr}% win rate, avg {avg_ret:+.1f}% return ({count} samples)" + ) + + lines.append( + "\nWORST performing strategies (7-day) — penalize these heavily in scoring:" + ) + for strategy, data in sorted_strats[-3:]: + wr = data.get("win_rate_7d", 0) + avg_ret = data.get("avg_return_7d", 0) + count = data.get("wins_7d", 0) + data.get("losses_7d", 0) + lines.append( + f" - {strategy}: {wr}% win rate, avg {avg_ret:+.1f}% return ({count} samples)" + ) return "\n".join(lines) if lines else "No historical data available yet"