读数脚本分开数据日与计划日

行业观点快照按计划日落库,行情与论断按数据日取,两者在生产里差一天。
原先用同一个日期取三样东西,结果是要么读不到当天快照、要么读不到行情。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
zlt 2026-09-04 11:40:56 +08:00
parent 5e72282e8d
commit 25724003d1
1 changed files with 18 additions and 5 deletions

View File

@ -18,7 +18,8 @@
同一家机构在窗口里可能发多篇先按机构取最近一篇再算中位数否则发得勤的
机构会被重复计入
跑法155 docker exec akg_factor_bridge python3 logic_state_coverage.py [数据日]
跑法155 docker exec akg_factor_bridge python3 logic_state_coverage.py [数据日] [计划日]
计划日不给就取数据日的次日
"""
from __future__ import annotations
@ -114,9 +115,20 @@ def snapshot_of(day: str) -> dict:
for _, r in df.iterrows()}
def main(ds: str | None = None) -> None:
def main(ds: str | None = None, plan_day: str | None = None) -> None:
"""ds 是数据日行情与论断按它取plan_day 是计划日(行业观点快照按它取)。
这两个日期在生产里本来就差一天计划日凌晨构建用的是上一个交易日的数据
而当天的行业观点快照按计划日落库早先这个脚本用同一个日期取三样东西
结果是要么读不到当天的快照要么读不到行情plan_day 不给就取数据日的次日
"""
ds = ds or (dt.date.today() - dt.timedelta(days=1)).isoformat()
print(f"=== 逻辑状态四态覆盖率读数 · 数据日 {ds} ===\n")
if not plan_day:
try:
plan_day = (dt.date.fromisoformat(ds) + dt.timedelta(days=1)).isoformat()
except ValueError:
plan_day = ds
print(f"=== 逻辑状态四态覆盖率读数 · 数据日 {ds} · 计划日 {plan_day} ===\n")
codes = db.read_pg("SELECT DISTINCT ts_code FROM v_factor_stock_daily "
"WHERE trade_date = %s", (ds,))["ts_code"].tolist()
@ -127,7 +139,7 @@ def main(ds: str | None = None) -> None:
brokers = broker_paths(codes, ds)
# 要的是这个计划日当天那一版快照(带迁移与陈旧两列),不是它之前的那一版——
# load_previous 读的是严格早于计划日的,用它会在快照首日读到空。当天没有就退回上一版。
snaps = snapshot_of(ds) or judgement.load_previous(ds)
snaps = snapshot_of(plan_day) or judgement.load_previous(plan_day)
print(f"甲路取到 {len(claims)} 只票的论断;丙路算得出 {len(brokers)} 只票;"
f"乙路快照 {len(snaps)} 个簇\n")
@ -194,4 +206,5 @@ def main(ds: str | None = None) -> None:
if __name__ == "__main__":
main(sys.argv[1] if len(sys.argv) > 1 else None)
main(sys.argv[1] if len(sys.argv) > 1 else None,
sys.argv[2] if len(sys.argv) > 2 else None)