Phase 5 plan replay backtest
This commit is contained in:
+39
-2
@@ -12,6 +12,7 @@ if str(ROOT) not in sys.path:
|
||||
|
||||
from src.services.backtest import (
|
||||
BACKTEST_MODE_ENTRY_THEN_OUTCOME,
|
||||
BACKTEST_SUBJECT_PLAN_REPLAY,
|
||||
BacktestCostConfig,
|
||||
BacktestQualityGate,
|
||||
BacktestReplayConfig,
|
||||
@@ -55,6 +56,26 @@ def build_backtest_mode_from_env(env=None) -> str:
|
||||
return value or BACKTEST_MODE_ENTRY_THEN_OUTCOME
|
||||
|
||||
|
||||
def build_backtest_subject_type_from_env(env=None) -> str:
|
||||
env = os.environ if env is None else env
|
||||
value = str(env.get("BACKTEST_SUBJECT_TYPE") or "").strip()
|
||||
return value or BACKTEST_SUBJECT_PLAN_REPLAY
|
||||
|
||||
|
||||
def build_backtest_trading_plan_id_from_env(env=None) -> Optional[int]:
|
||||
env = os.environ if env is None else env
|
||||
value = env.get("BACKTEST_TRADING_PLAN_ID")
|
||||
if value is None or value == "":
|
||||
return None
|
||||
return int(value)
|
||||
|
||||
|
||||
def build_backtest_candidate_model_code_from_env(env=None) -> Optional[str]:
|
||||
env = os.environ if env is None else env
|
||||
value = str(env.get("BACKTEST_CANDIDATE_MODEL_CODE") or "").strip()
|
||||
return value or None
|
||||
|
||||
|
||||
def build_replay_config_from_env(env=None) -> BacktestReplayConfig:
|
||||
env = os.environ if env is None else env
|
||||
defaults = BacktestReplayConfig()
|
||||
@@ -85,6 +106,9 @@ def run_backtest_once(
|
||||
require_quality_gate: bool = False,
|
||||
output_json: bool = False,
|
||||
backtest_mode: str = BACKTEST_MODE_ENTRY_THEN_OUTCOME,
|
||||
subject_type: str = BACKTEST_SUBJECT_PLAN_REPLAY,
|
||||
trading_plan_id: Optional[int] = None,
|
||||
candidate_model_code: Optional[str] = None,
|
||||
replay_config: Optional[BacktestReplayConfig] = None,
|
||||
timeframe_set: Optional[dict] = None,
|
||||
) -> int:
|
||||
@@ -93,16 +117,26 @@ def run_backtest_once(
|
||||
limit=limit,
|
||||
cost_config=cost_config,
|
||||
quality_gate=quality_gate,
|
||||
subject_type=subject_type,
|
||||
trading_plan_id=trading_plan_id,
|
||||
candidate_model_code=candidate_model_code,
|
||||
mode=backtest_mode,
|
||||
replay_config=replay_config,
|
||||
timeframe_set=timeframe_set,
|
||||
)
|
||||
summary = summarize_backtest_outcomes(outcomes)
|
||||
quality_gate_result = evaluate_backtest_quality(summary, gate=quality_gate)
|
||||
summary = summarize_backtest_outcomes(outcomes, subject_type=subject_type)
|
||||
quality_gate_result = evaluate_backtest_quality(
|
||||
summary,
|
||||
gate=quality_gate,
|
||||
sample_basis="executed" if subject_type == BACKTEST_SUBJECT_PLAN_REPLAY else "total_plus_executed",
|
||||
)
|
||||
payload = {
|
||||
"passed": not require_quality_gate or quality_gate_result["passed"],
|
||||
"backtest_run_id": run_id,
|
||||
"result_count": len(outcomes),
|
||||
"subject_type": subject_type,
|
||||
"trading_plan_id": trading_plan_id,
|
||||
"candidate_model_code": candidate_model_code,
|
||||
"timeframe_set": timeframe_set,
|
||||
"summary": summary,
|
||||
"quality_gate": quality_gate_result,
|
||||
@@ -133,6 +167,9 @@ def main(env=None) -> int:
|
||||
require_quality_gate=build_require_quality_gate_from_env(env=env),
|
||||
output_json=output_json,
|
||||
backtest_mode=build_backtest_mode_from_env(env=env),
|
||||
subject_type=build_backtest_subject_type_from_env(env=env),
|
||||
trading_plan_id=build_backtest_trading_plan_id_from_env(env=env),
|
||||
candidate_model_code=build_backtest_candidate_model_code_from_env(env=env),
|
||||
replay_config=build_replay_config_from_env(env=env),
|
||||
timeframe_set=build_backtest_timeframe_set_from_env(env=env),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user