- index_weight 表(migration f5e0d1c2b3a4,MySQL 已应用;index_code+date+symbol 唯一) + IndexWeight 实体 + IndexConstituentRepository(members_at:取 <=as_of 最近一期快照, Survivorship-free / 无未来成分;latest_date) - UniverseSpec.index_code + universe.filter_stocks members 交集 + resolve_members; Research/Selection/Signal/Replay 服务注入 index repo(历史成分过滤,选股/回测共用) - tests/test_index_universe.py:快照历史成分(成分变更不入早期结果)、幂等、 空快照期空集、index_code 过滤下 as_of 一致性;全量 pytest 通过
19 lines
583 B
Python
19 lines
583 B
Python
"""指数成分 Repository Protocol(B1)。"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from collections.abc import Sequence
|
||
from datetime import date
|
||
from typing import Protocol
|
||
|
||
from app.domain.entities.index import IndexWeight
|
||
|
||
|
||
class IndexConstituentRepository(Protocol):
|
||
def upsert_many(self, rows: Sequence[IndexWeight]) -> int: ...
|
||
|
||
def members_at(self, index_code: str, as_of: date) -> set[str]:
|
||
"""as_of 当日成分:取 <=as_of 最近一期快照的股票集合(历史成分语义)。"""
|
||
|
||
def latest_date(self, index_code: str) -> date | None: ...
|