Files
qlib/backend/app/domain/entities/index.py
T
Simon 9cc4bfccac feat(universe): B1-1 指数历史成分(index_weight)+ Universe 按 as_of 成分过滤
- 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 通过
2026-09-09 07:27:13 +08:00

22 lines
854 B
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""指数及其历史成分(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