63a829cc46
主要内容: - Phase 8 PROMOTE: finalist #1 (trial #324) registry 条目,自动生成 - Optuna objective warmup bug 修复 (shared/optimizer/objective.py) - studies/ 目录按用途重组为 optuna/ + finalists/ + features/ 三层 - reports/ 加入 Optuna 中文 dashboard (5 主图 + 18 slice + 15 contour) - 新增 PROJECT_GUIDE.md 项目说明文档 - 新增 build_registry_entry.py / build_optuna_dashboard.py / build_feature_datasets.py - .gitignore: 允许提交 studies/*.db (Optuna DB) 和 reports/*.html (MT5 + dashboard)
57 lines
2.0 KiB
Python
57 lines
2.0 KiB
Python
"""Inspect a finished Optuna study and print the best trial + diverse top-N."""
|
|
from __future__ import annotations
|
|
import sys
|
|
from pathlib import Path
|
|
PROJECT = Path(__file__).resolve().parent.parent
|
|
sys.path.insert(0, str(PROJECT))
|
|
|
|
import optuna
|
|
from shared.optimizer.selector import select_diverse_topn
|
|
from strategies.gold_scalper_pro.search_space import SEARCH_SPACE
|
|
|
|
|
|
def main() -> int:
|
|
db = sys.argv[1] if len(sys.argv) > 1 else str(PROJECT / "studies" / "optuna" / "gold_scalper_pro_is2025.db")
|
|
name = sys.argv[2] if len(sys.argv) > 2 else "gold_scalper_pro_is2025"
|
|
study = optuna.load_study(study_name=name, storage=f"sqlite:///{db}")
|
|
|
|
completed = [t for t in study.trials if t.state.name == "COMPLETE"]
|
|
passing = [t for t in completed if not t.user_attrs.get("violations")]
|
|
print(f"=== study: {name} ===")
|
|
print(f" total trials : {len(study.trials)}")
|
|
print(f" completed : {len(completed)}")
|
|
print(f" constraint-pass : {len(passing)}")
|
|
|
|
if not passing:
|
|
# Show the best by value anyway.
|
|
best = max(completed, key=lambda t: t.value)
|
|
print(f"\n no constraint-passing trials; best-by-value:")
|
|
_print_trial(best, "best-by-value")
|
|
return 1
|
|
|
|
print(f"\n === best (by score) ===")
|
|
_print_trial(study.best_trial, "best")
|
|
|
|
print(f"\n === diverse top-3 finalists ===")
|
|
finalists = select_diverse_topn(study, n=3, ranges=SEARCH_SPACE)
|
|
for i, t in enumerate(finalists, 1):
|
|
_print_trial(t, f"finalist #{i}")
|
|
return 0
|
|
|
|
|
|
def _print_trial(t, label: str) -> None:
|
|
a = t.user_attrs
|
|
print(f" [{label}] trial #{t.number} score={t.value:.2f}")
|
|
print(f" net={a['net_profit']:.2f} PF={a['profit_factor']:.2f} "
|
|
f"trades={a['total_trades']} DD%={a['max_equity_dd_pct']:.2%} "
|
|
f"sharpe={a['sharpe']:.2f}")
|
|
if a.get("violations"):
|
|
print(f" violations: {a['violations']}")
|
|
print(f" params:")
|
|
for k, v in t.params.items():
|
|
print(f" {k:24s}={v}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|