"""Bar Replay(v3 §20.6,第二阶段 MVP)领域实体。 线性重放:对给定选股查询与信号规则,在交易日序列上逐日以「当日为止的数据」执行 (as_of 语义),输出每日时间线(意图 Top + 信号 + 计数),用于核对: - 未来函数:每日计算只用 <= as_of 数据(与静态研究同一引擎) - 一致性:重放某日结果 == 该日独立 select/signal 结果(亦 == 回测该调仓日意图) """ from __future__ import annotations from datetime import date from pydantic import BaseModel, Field from app.domain.entities.signal import SignalEvent class ReplayTop(BaseModel): symbol: str score: float class ReplayDay(BaseModel): as_of: date top: list[ReplayTop] = Field(default_factory=list, description="意图排名前 N(score 降序)") events: list[SignalEvent] = Field(default_factory=list, description="当日信号(<=max_output_rank)") counts: dict[str, int] = Field(default_factory=dict, description="BUY/WATCH/SELL 计数") class ReplayResult(BaseModel): start: date end: date days: list[ReplayDay] = Field(default_factory=list) top_n: int = 5