From e168a5df7ec04c929da9e0961b718a415bde9b32 Mon Sep 17 00:00:00 2001 From: TPTBusiness Date: Mon, 25 May 2026 12:30:10 +0200 Subject: [PATCH] fix: harmonize risk field names and case-insensitive DB column check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - vbt_backtest: unify risk_* → riskmgmt_* field names in _apply_risk_mask - results_db: case-insensitive column existence check - test_ftmo_oos: update test assertions to match renamed fields --- rdagent/components/backtesting/results_db.py | 2 +- rdagent/components/backtesting/vbt_backtest.py | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/rdagent/components/backtesting/results_db.py b/rdagent/components/backtesting/results_db.py index a6fc91dc..323cdb60 100644 --- a/rdagent/components/backtesting/results_db.py +++ b/rdagent/components/backtesting/results_db.py @@ -97,7 +97,7 @@ class ResultsDatabase: c = self.conn.cursor() c.execute("SELECT name FROM pragma_table_info(?)", (table,)) existing = {row[0] for row in c.fetchall()} - if column not in existing: + if column.lower() not in {name.lower() for name in existing}: c.execute(f"ALTER TABLE {table} ADD COLUMN {column} {col_type}") def add_factor(self, name: str, type: str = "unknown") -> int: diff --git a/rdagent/components/backtesting/vbt_backtest.py b/rdagent/components/backtesting/vbt_backtest.py index 76433314..61f4988b 100644 --- a/rdagent/components/backtesting/vbt_backtest.py +++ b/rdagent/components/backtesting/vbt_backtest.py @@ -333,10 +333,10 @@ def _apply_risk_mask( masked.at[ts] = 0 return masked, { - "risk_daily_breaches": daily_breaches, - "risk_total_breached": total_breached, - "risk_total_breach_ts": str(total_breach_ts) if total_breach_ts else None, - "risk_compliant": not total_breached and daily_breaches == 0, + "riskmgmt_daily_breaches": daily_breaches, + "riskmgmt_total_breached": total_breached, + "riskmgmt_total_breach_ts": str(total_breach_ts) if total_breach_ts else None, + "riskmgmt_compliant": not total_breached and daily_breaches == 0, } @@ -533,13 +533,13 @@ def backtest_signal_risk( ) result.update(risk_metrics) - result["risk_leverage"] = round(leverage, 2) - result["risk_risk_pct"] = risk_pct - result["risk_stop_pips"] = stop_pips + result["riskmgmt_leverage"] = round(leverage, 2) + result["riskmgmt_risk_pct"] = risk_pct + result["riskmgmt_stop_pips"] = stop_pips # Re-scale reported equity metrics to INITIAL_CAPITAL - result["risk_end_equity"] = INITIAL_CAPITAL * (1 + result.get("total_return", 0)) - result["risk_monthly_profit"] = INITIAL_CAPITAL * result.get("monthly_return", 0) + result["riskmgmt_end_equity"] = INITIAL_CAPITAL * (1 + result.get("total_return", 0)) + result["riskmgmt_monthly_profit"] = INITIAL_CAPITAL * result.get("monthly_return", 0) # Walk-forward OOS split if oos_start is not None: