feat(factor): 批量评估断点续跑——run_id复用+已落库因子跳过+空续跑免load直收尾;跨session CI容器重启只损失在途1因子,重挂即续 [vps]

This commit is contained in:
2026-08-25 20:56:22 +08:00
parent 3304ff46b2
commit 894c547297
3 changed files with 48 additions and 9 deletions
+27 -8
View File
@@ -43,6 +43,7 @@ def run_batch_eval(
cfg=None,
progress_cb=None,
vnpy_db_override: str | None = None,
run_id: str | None = None,
) -> dict:
"""跑一轮批量评估,结果增量写入 eval_db,返回摘要."""
from vnpy.alpha.dataset.utility import calculate_by_expression
@@ -82,11 +83,29 @@ def run_batch_eval(
universe_label = universe if symbols is None else "custom"
eval_store.init_db(eval_db)
run_id = eval_store.create_run(
eval_db, label=label, universe=universe_label,
symbols_count=bars["vt_symbol"].n_unique(), factors_total=len(factor_names),
start=start, end=end, params={"limit": limit, "symbols": symbols[:20] if symbols else None}, # 截断防 4400 只全量塞 JSON
)
if run_id is None:
run_id = eval_store.create_run(
eval_db, label=label, universe=universe_label,
symbols_count=bars["vt_symbol"].n_unique(), factors_total=len(factor_names),
start=start, end=end, params={"limit": limit, "symbols": symbols[:20] if symbols else None}, # 截断防 4400 只全量塞 JSON
)
done_before = set()
else:
# 断点续跑:复用既有 run 行,跳过已落库因子(容器被 CI 重启后无损接续)
from sanguo_factor.eval_store import get_rows as _get_rows
done_before = {r["factor"] for r in _get_rows(eval_db, run_id)}
factor_names = [f for f in factor_names if f not in done_before]
if not factor_names:
# 空续跑:全部已完成时直接收尾不炸
eval_store.finish_run(eval_db, run_id, "done", factors_done=len(done_before))
return {
"run_id": run_id,
"factors_total": len(done_before),
"factors_done": len(done_before),
"errors": [],
"elapsed_sec": round(time.time() - t0, 1),
"symbols_count": int(bars["vt_symbol"].n_unique()),
}
errors: list[str] = []
done = 0
@@ -103,11 +122,11 @@ def run_batch_eval(
if progress_cb:
progress_cb(done, len(factor_names), name)
eval_store.finish_run(eval_db, run_id, "done", factors_done=done)
eval_store.finish_run(eval_db, run_id, "done", factors_done=len(done_before) + done)
return {
"run_id": run_id,
"factors_total": len(factor_names),
"factors_done": done,
"factors_total": len(done_before) + len(factor_names),
"factors_done": len(done_before) + done,
"errors": errors,
"elapsed_sec": round(time.time() - t0, 1),
"symbols_count": int(bars["vt_symbol"].n_unique()),