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
+19
View File
@@ -72,3 +72,22 @@ def test_bad_factor_recorded_not_fatal(db, tmp_path):
assert len(out["errors"]) == 1
detail = eval_store.get_detail(eval_db, out["run_id"], "不存在的因子")
assert "error" in detail["metrics"]
def test_resume_skips_done_factors(db, tmp_path):
eval_db = str(tmp_path / "f2.db")
out1 = run_batch_eval(factor_names=["ma_20", "roc_5"], start="2018-01-01", end="2018-06-30",
eval_db=eval_db, label="t", cfg=None, vnpy_db_override=db)
from sanguo_factor import eval_store
before = eval_store.get_rows(eval_db, out1["run_id"])
out2 = run_batch_eval(factor_names=["ma_20", "roc_5", "kmid"], start="2018-01-01", end="2018-06-30",
eval_db=eval_db, label="t", cfg=None, vnpy_db_override=db, run_id=out1["run_id"])
after = eval_store.get_rows(eval_db, out1["run_id"])
assert out2["run_id"] == out1["run_id"]
assert len(after) == 3 and len(before) == 2 # 新增 kmid
rows = eval_store.get_rows(eval_db, out1["run_id"])
assert {r["factor"] for r in rows} == {"ma_20", "roc_5", "kmid"}
# 空续跑:全部已完成时直接收尾不炸
out3 = run_batch_eval(factor_names=["ma_20"], start="2018-01-01", end="2018-06-30",
eval_db=eval_db, label="t", cfg=None, vnpy_db_override=db, run_id=out1["run_id"])
assert out3["factors_done"] >= 3