diff --git a/config/factor_registry.yaml b/config/factor_registry.yaml index f305fe1a..6624fc3b 100644 --- a/config/factor_registry.yaml +++ b/config/factor_registry.yaml @@ -93,3 +93,29 @@ factors: versions: [] cause: IC 两窗反号+12 因子共线 0.961(盈利质量影子,09-22 终判) evidence_run: IC两窗终判 2026-09-22 + composite_quant12: + name: composite_quant12 + hypothesis: 合成层等权基线(2026-08-31 族分析 12 源固化,v2a 考场对照;#70①) + status: assessable + versions: + - v: 1 + commit: 3954a68 + params: + source: bars_daily + form: equal_weight_12src + effective_from: '2026-10-03' + effective_to: null + composite_quant12_v2a: + name: composite_quant12_v2a + hypothesis: v1 等权考场晋级 2026-09-11(ICIR 加权;#70①;szneul 变体归 #69 影子 A/B 不入册) + status: promoted + versions: + - v: 1 + commit: daaf492 + params: + source: bars_daily + weights_profile: quant12_icirfit_v1 + effective_from: '2026-10-03' + effective_to: null + promoted_at: '2026-09-11' + promotion_t: 26.32 diff --git a/tests/factor/test_monthly_batch.py b/tests/factor/test_monthly_batch.py index 363b43ad..c8036992 100644 --- a/tests/factor/test_monthly_batch.py +++ b/tests/factor/test_monthly_batch.py @@ -161,3 +161,19 @@ def test_main_exports_values_and_writes_ic_gate(tmp_path, monkeypatch): ).read_text()) assert rep["checked"] == 1 and rep["flagged"][0]["factor"] == "llm_x" assert rep["flagged"][0]["vs"] == "fund_gross_margin" + + +# —— #70① 合成层入册:真注册表加载后两名进月度批(内存命中,非 yaml-miss) —— +def test_real_config_composites_enter_plan(): + import sanguo_factor # noqa: F401 导入即注册(含合成层全链) + from sanguo_factor.monthly_batch import plan_batch, resolve_with_yaml + from sanguo_factor.version_registry import load_registry + + reg_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(sanguo_factor.__file__))), + "config", "factor_registry.yaml") + reg = load_registry(reg_path) + plan = plan_batch(reg, "2026-10-04", resolver=resolve_with_yaml(reg)) + assert "composite_quant12" in plan["factor_names"] # 等权基线 + assert "composite_quant12_v2a" in plan["factor_names"] # 生产冠军 + assert "composite_quant12" not in plan["skipped_unregistered"] diff --git a/tests/factor/test_monthly_review.py b/tests/factor/test_monthly_review.py index bacf44bf..b44874fc 100644 --- a/tests/factor/test_monthly_review.py +++ b/tests/factor/test_monthly_review.py @@ -191,3 +191,22 @@ def test_pre_gate_sample_short_is_not_correlation(eval_db, registry_yaml): as_of="2026-09-30", host="nas") pg = rep["pre_gate"]["fa_gross_margin"] assert pg["max_corr"] is None and "样本不足" in pg["corr_note"] + + +# —— #70① v2a=promoted 走衰减判定路径;v1=assessable 走观察路径 —— +def test_real_config_composite_verdict_paths(): + import sanguo_factor # noqa: F401 + from sanguo_factor.monthly_review import build_report + from sanguo_factor.version_registry import load_registry + + reg_path = os.path.join( + os.path.dirname(os.path.dirname(os.path.abspath(sanguo_factor.__file__))), + "config", "factor_registry.yaml") + reg = load_registry(reg_path) + pts = {"composite_quant12_v2a": {"t": 20.0, "ic_mean": 0.05, "count": 200}, + "composite_quant12": {"t": 19.0, "ic_mean": 0.05, "count": 200}} + rep = build_report(reg, pts, {}, as_of="2026-10-31", host="t") + v = rep["verdicts"]["composite_quant12_v2a"] + assert v["promotion_t"] == 26.32 and v["state"] == "ok" + assert "composite_quant12" in rep["observations"] # assessable=观察 + assert "composite_quant12_v2a" not in rep["observations"]