feat(portfolio): M8.2 Portfolio Engine 模块化(等权收敛 + 约束显式标注)
- research.PortfolioSpec(weighting=equal;max_position_pct/max_industry_weight_pct 预留) + ResearchSpec.portfolio;config_snapshot 自动记录组合配置 - quant/portfolio.py:equal_weight_budget(与既有等权回测语义一致,行为收敛到本模块)+ unimplemented_notes(设置约束即在结果中显式标注未建模,禁止假装支持) - TopKBacktestRunner 预算与 unimplemented 改用 portfolio 模块;默认配置数值不变 (一致性/quant 引擎回归通过);tests 补约束标注与 config_snapshot;全量 pytest 通过
This commit is contained in:
@@ -45,6 +45,20 @@ class SelectionSpec(BaseModel):
|
||||
top_n: int = Field(default=30, ge=1, le=1000)
|
||||
|
||||
|
||||
class PortfolioSpec(BaseModel):
|
||||
"""组合构建(v2 §16)。MVP:等权;单股/行业上限等约束字段预留,
|
||||
未建模约束在回测结果 unimplemented 中如实标注(禁止假装支持)。
|
||||
"""
|
||||
|
||||
weighting: str = Field(default="equal", pattern="^(equal)$")
|
||||
max_position_pct: float | None = Field(
|
||||
default=None, gt=0, le=1, description="单股最大权重(预留,未建模)"
|
||||
)
|
||||
max_industry_weight_pct: float | None = Field(
|
||||
default=None, gt=0, le=1, description="行业最大权重(预留,未建模)"
|
||||
)
|
||||
|
||||
|
||||
class CostSpec(BaseModel):
|
||||
"""交易成本模型(单边比例)。
|
||||
|
||||
@@ -71,6 +85,7 @@ class ResearchSpec(BaseModel):
|
||||
rebalance: str = Field(default="monthly", pattern="^(weekly|monthly)$")
|
||||
period: tuple[date, date]
|
||||
costs: CostSpec = CostSpec()
|
||||
portfolio: PortfolioSpec = PortfolioSpec()
|
||||
initial_capital: float = Field(default=1_000_000.0, gt=0)
|
||||
|
||||
@field_validator("period")
|
||||
|
||||
Reference in New Issue
Block a user