From 5da3ba6752288f4d3bc1550616d6f61e5cadc0f6 Mon Sep 17 00:00:00 2001 From: TPTBusiness Date: Sat, 18 Apr 2026 15:29:39 +0200 Subject: [PATCH] feat(backtest): use backtest_signal_ftmo in strategy orchestrator and optuna optimizer --- rdagent/components/coder/optuna_optimizer.py | 5 ++--- rdagent/components/coder/strategy_orchestrator.py | 10 ++++------ 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/rdagent/components/coder/optuna_optimizer.py b/rdagent/components/coder/optuna_optimizer.py index b6898dbb..3268b64e 100644 --- a/rdagent/components/coder/optuna_optimizer.py +++ b/rdagent/components/coder/optuna_optimizer.py @@ -605,16 +605,15 @@ class OptunaOptimizer: synthetic_close = (1 + combined_ret).cumprod() * 100.0 from rdagent.components.backtesting.vbt_backtest import ( - backtest_signal, + backtest_signal_ftmo, DEFAULT_TXN_COST_BPS, ) import os as _os - bt = backtest_signal( + bt = backtest_signal_ftmo( close=synthetic_close, signal=signal, txn_cost_bps=float(_os.getenv("TXN_COST_BPS", DEFAULT_TXN_COST_BPS)), - freq="1min", ) if bt.get("status") != "success": return self._default_metrics() diff --git a/rdagent/components/coder/strategy_orchestrator.py b/rdagent/components/coder/strategy_orchestrator.py index daf4004f..92ffe4d0 100644 --- a/rdagent/components/coder/strategy_orchestrator.py +++ b/rdagent/components/coder/strategy_orchestrator.py @@ -854,7 +854,7 @@ signal = signal.rolling(window=3, min_periods=1).mean().round().astype(int) # Delegate all metric computation to the single source of truth. # Same formulas as every other backtest path in the repo. from rdagent.components.backtesting.vbt_backtest import ( - backtest_signal, + backtest_signal_ftmo, DEFAULT_TXN_COST_BPS, ) @@ -868,11 +868,10 @@ signal = signal.rolling(window=3, min_periods=1).mean().round().astype(int) close_for_bt = close.reindex(signal.index).ffill() txn_cost_bps = float(os.getenv("TXN_COST_BPS", DEFAULT_TXN_COST_BPS)) - bt = backtest_signal( + bt = backtest_signal_ftmo( close=close_for_bt, signal=signal, txn_cost_bps=txn_cost_bps, - freq="1min", ) if bt.get("status") != "success": @@ -1265,7 +1264,7 @@ signal = signal.rolling(window=3, min_periods=1).mean().round().astype(int) signal = local_vars["signal"] from rdagent.components.backtesting.vbt_backtest import ( - backtest_signal, + backtest_signal_ftmo, DEFAULT_TXN_COST_BPS, ) @@ -1273,11 +1272,10 @@ signal = signal.rolling(window=3, min_periods=1).mean().round().astype(int) if close_for_bt is None: return {"sharpe_ratio": float('-inf'), "status": "rejected"} - bt = backtest_signal( + bt = backtest_signal_ftmo( close=close_for_bt, signal=signal, txn_cost_bps=float(os.getenv("TXN_COST_BPS", DEFAULT_TXN_COST_BPS)), - freq="1min", ) if bt.get("status") != "success": return {"sharpe_ratio": float('-inf'), "status": "rejected"}