Files
gavindiaz 63a829cc46 phase 7-8 完成 + warmup 修复 + 产物结构化重组
主要内容:
- 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)
2026-06-27 00:28:07 +08:00

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())