feat(selection): M6.1 Universe 选股范围执行器(规则化 + symbols 白名单 + 历史日语义)

- quant/universe.py:filter_stocks 从 quant/service 迁出并集中(ST/上市天数/退市过滤),
  as_of 当前/历史日语义由 delist/list_date 保证;exclude_suspended 依赖停牌表未建模,
  由上层显式标注(选股结果 unimplemented)
- research.UniverseSpec 增加 symbols 白名单(非空时仅白名单内参与,再叠加其余过滤)
- quant/service re-export filter_stocks(外部引用不变);SelectionService 已共用
- tests/test_universe.py:6 例覆盖当前/历史日、ST、上市天数、退市、白名单;全量 pytest 通过
This commit is contained in:
Simon
2026-09-09 00:13:28 +08:00
parent f3586adb25
commit 25a1d9531a
4 changed files with 123 additions and 22 deletions
+10 -2
View File
@@ -16,12 +16,20 @@ from pydantic import BaseModel, Field, field_validator, model_validator
class UniverseSpec(BaseModel):
"""股票池口径。MVP:市场 + 过滤条件;指数成分等 Phase 3 扩展。"""
"""股票池口径。MVP:市场 + 过滤条件;指数成分等 Phase 3 扩展。
market: str = Field(default="CN_A", description="CN_A / CN_B / ...")
symbols 白名单:非空时仅这些股票参与(再叠加其余过滤);供自选池/测试使用。
market 目前为预留字段(stock.market 存储主板/创业板/科创板等中文枚举,过滤未启用)。
"""
market: str = Field(default="CN_A", description="CN_A / CN_B / ...(预留)")
exclude_st: bool = True
exclude_suspended: bool = True
min_listing_days: int = Field(default=250, ge=0, description="上市至少 N 个自然日")
symbols: list[str] = Field(
default_factory=list,
description="白名单(可选):非空时仅这些 symbol 参与选股/回测",
)
class FactorSpec(BaseModel):