diff --git a/logic_state_coverage.py b/logic_state_coverage.py index edae7bb..8eda83d 100644 --- a/logic_state_coverage.py +++ b/logic_state_coverage.py @@ -151,11 +151,15 @@ def main(ds: str | None = None, plan_day: str | None = None) -> None: if name: by_seg[name] = r seg_of = {} + # 用完整的传导视图,不是只含已启动成员的那张。候选卡判"所在环节被指向"时认的就是 + # 完整这张(plan.py 的 evd["pointed"] 是两张视图取或),读数脚本必须跟它一致, + # 否则算出来的乙路覆盖比卡上真实看到的低。 + # 一只票可能挂在多个环节上,这里保留全部,只要有一个环节评析过就算对上。 try: - d = db.read_pg("SELECT ts_code, target FROM v_factor_transmission_moved " + d = db.read_pg("SELECT ts_code, target FROM v_factor_transmission " "WHERE scan_date = %s", (ds,)) for r in d.itertuples(): - seg_of[common.to_prefix(str(r.ts_code).strip())] = str(r.target) + seg_of.setdefault(common.to_prefix(str(r.ts_code).strip()), []).append(str(r.target)) except Exception as e: # noqa: BLE001 print(f" (传导视图读取失败,乙路整体缺席: {e!r})") @@ -165,7 +169,9 @@ def main(ds: str | None = None, plan_day: str | None = None) -> None: samples: dict = {} for k in codes: a = ls.from_claims(claims.get(k), ds, stale_days=config.LOGIC_STALE_DAYS) - b = ls.from_judgement(by_seg.get(seg_of.get(k, ""))) + # 一只票挂在多个环节上时,取第一个评析过的那个环节的研判。 + row = next((by_seg[t] for t in seg_of.get(k, []) if t in by_seg), None) + b = ls.from_judgement(row) c = brokers.get(k) or ls.signal(ls.PATH_BROKER, ls.SIG_NONE, why="两个窗口里算不出可比的预测") per_path[ls.PATH_CLAIM][a["signal"]] += 1