- 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 通过
22 lines
854 B
Python
22 lines
854 B
Python
"""指数及其历史成分(v3 §9/§30:Survivorship-free Universe 的数据基础)。
|
||
|
||
index_weight:指数在某交易日的成分快照(来自指数权重表,每期含当时成分与权重)。
|
||
历史成分语义:as_of 某日的成分 = 该日(<=as_of 最近一期)快照中的股票 ——
|
||
禁止用今天的成分回测过去(未来函数/幸存者偏差红线)。
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from datetime import date
|
||
from decimal import Decimal
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class IndexWeight(BaseModel):
|
||
index_code: str = Field(pattern=r"^\d{6}\.(SH|SZ|CSI|CI)$", description="如 000300.SH / 000905.SH")
|
||
index_name: str | None = None
|
||
trade_date: date # 该快照对应交易日(成分时点)
|
||
symbol: str = Field(pattern=r"^\d{6}\.(SH|SZ|BJ)$")
|
||
weight: Decimal | None = None
|