feat: 参数寻优新增买入持有基准对比 — 两个寻优接口返回同口径 buy_hold(run_buy_hold_benchmark),全局最佳/最优结果总收益旁展示 [买入持有:xx.xx%],涨红跌绿

This commit is contained in:
GitHub
2026-09-04 22:42:13 +08:00
parent 9b9d123105
commit 5476ba0f33
4 changed files with 58 additions and 1 deletions
+3
View File
@@ -360,6 +360,9 @@ class OptimizeAllResult(BaseModel):
best: OptimizeAllRankEntry | None = None
per_strategy: dict[str, OptimizeAllRankEntry] = {} # 策略名 → 最优点
total_grid_points: int = 0 # 所有策略网格点合计
# 买入持有基准(同区间/同费率/同资金;含 total_return 等 6 项指标),
# 供前端在全局最佳旁直观对比「策略 vs 买入不动」。老版本结果可能缺省。
buy_hold: dict[str, Any] | None = None
# ── 已保存策略(策略库 / StrategyLibrary)───────────────────────────────────────
+21 -1
View File
@@ -1184,6 +1184,7 @@ def _run_multi_strategy_evaluate(
def _run_optimize(df: pd.DataFrame, req: OptimizeBacktestRequest) -> dict[str, Any]:
"""执行参数网格寻优并返回清洗后的结果字典(后台线程内调用)。"""
from easy_tdx.backtest.benchmark import run_buy_hold_benchmark
from easy_tdx.backtest.optimizer import ParamGridOptimizer
optimizer = ParamGridOptimizer(
@@ -1197,7 +1198,17 @@ def _run_optimize(df: pd.DataFrame, req: OptimizeBacktestRequest) -> dict[str, A
workers=req.workers,
)
result = optimizer.run()
return result.to_dict()
out = result.to_dict()
# 买入持有基准(同区间/同费率/同资金,与一条龙评估同口径),
# 供前端在最优结果旁直观对比「策略 vs 买入不动」。
out["buy_hold"] = run_buy_hold_benchmark(
df,
cash=req.cash,
commission=req.commission,
slippage=req.slippage,
execution=req.execution,
)
return out
def _optimize_one_strategy(
@@ -1263,6 +1274,7 @@ def _run_optimize_all(df: pd.DataFrame, req: OptimizeAllBacktestRequest) -> dict
``workers`` 为 0 或 1 时串行。进程池在函数内 ``with`` 创建/销毁,对前端
轮询与 task_runner 透明。
"""
from easy_tdx.backtest.benchmark import run_buy_hold_benchmark
from easy_tdx.backtest.strategies import get_registry
from easy_tdx.backtest.strategies.presets import STRATEGY_PRESETS
@@ -1338,6 +1350,14 @@ def _run_optimize_all(df: pd.DataFrame, req: OptimizeAllBacktestRequest) -> dict
best=best,
per_strategy=per_strategy,
total_grid_points=total_grid,
# 买入持有基准(同区间/同费率/同资金),供前端在全局最佳旁直观对比
buy_hold=run_buy_hold_benchmark(
df,
cash=req.cash,
commission=req.commission,
slippage=req.slippage,
execution=req.execution,
),
)
return result_obj.model_dump()