feat(factor): 评估结果存储 factor_eval.db——runs/results两表,metrics按周期JSON,SANGUO_FACTOR_EVAL_DB可覆盖 [vps]
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
# tests/factor/test_eval_store.py
|
||||
"""eval_store:建库/建run/UPSERT落盘/查询过滤/finish."""
|
||||
import sys, os
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")))
|
||||
|
||||
from sanguo_factor import eval_store
|
||||
|
||||
|
||||
def _rows():
|
||||
return [
|
||||
{"factor": "alpha2", "category": "alpha101", "expression": "(-1)*ts_corr(...)",
|
||||
"metrics": {"1": {"ic_mean": 0.05}, "turnover": 0.3}},
|
||||
{"factor": "kmid", "category": "alpha158", "expression": "(close-open)/open",
|
||||
"metrics": {"1": {"ic_mean": -0.02}, "turnover": 0.6}},
|
||||
]
|
||||
|
||||
|
||||
def test_roundtrip(tmp_path):
|
||||
db = str(tmp_path / "factor_eval.db")
|
||||
eval_store.init_db(db)
|
||||
run_id = eval_store.create_run(db, label="冒烟", universe="custom", symbols_count=50,
|
||||
factors_total=2, start="2024-01-01", end="2024-12-31",
|
||||
params={"periods": [1, 5, 10]})
|
||||
eval_store.save_results(db, run_id, _rows())
|
||||
eval_store.finish_run(db, run_id, "done", factors_done=2)
|
||||
|
||||
runs = eval_store.list_runs(db)
|
||||
assert len(runs) == 1 and runs[0]["run_id"] == run_id and runs[0]["status"] == "done"
|
||||
|
||||
rows = eval_store.get_rows(db, run_id)
|
||||
assert len(rows) == 2
|
||||
assert rows[0]["metrics"]["1"]["ic_mean"] == 0.05
|
||||
|
||||
assert eval_store.get_detail(db, run_id, "kmid")["category"] == "alpha158"
|
||||
assert eval_store.get_detail(db, run_id, "nope") is None
|
||||
|
||||
|
||||
def test_filter_by_category_and_search(tmp_path):
|
||||
db = str(tmp_path / "factor_eval.db")
|
||||
eval_store.init_db(db)
|
||||
run_id = eval_store.create_run(db, label="x", universe="all_a", symbols_count=1,
|
||||
factors_total=2, start="", end="", params={})
|
||||
eval_store.save_results(db, run_id, _rows())
|
||||
assert len(eval_store.get_rows(db, run_id, category="alpha101")) == 1
|
||||
assert len(eval_store.get_rows(db, run_id, search="corr")) == 1 # 搜表达式
|
||||
assert len(eval_store.get_rows(db, run_id, search="kmid")) == 1 # 搜因子名
|
||||
|
||||
|
||||
def test_upsert_same_run(tmp_path):
|
||||
db = str(tmp_path / "factor_eval.db")
|
||||
eval_store.init_db(db)
|
||||
run_id = eval_store.create_run(db, label="x", universe="all_a", symbols_count=1,
|
||||
factors_total=1, start="", end="", params={})
|
||||
eval_store.save_results(db, run_id, [_rows()[0]])
|
||||
eval_store.save_results(db, run_id, [{**_rows()[0], "metrics": {"1": {"ic_mean": 0.09}}}] * 1)
|
||||
rows = eval_store.get_rows(db, run_id)
|
||||
assert len(rows) == 1 and rows[0]["metrics"]["1"]["ic_mean"] == 0.09
|
||||
Reference in New Issue
Block a user