0002-Sprint4规划会议 » 历史记录 » 版本 1
Huarui Lin, 2026-04-25 15:56
| 1 | 1 | Huarui Lin | # Sprint 4 规划会议 Agenda:业务标签生成与绝对边界防线落地 |
|---|---|---|---|
| 2 | |||
| 3 | **会议目标**:拒绝“随手写个循环算收益”的草台班子做法,将 S4 转化为“严格遵循闭式向量化公式、绝对物理隔离特征、死锁索引边界”的数学管线;敲定 DCA 标签与 S5 特征空间的解耦契约,输出首版 S4 架构决策记录(ADR)。 |
||
| 4 | **参会角色**:项目经理(PM)、算法/研发工程师、基础架构/运维工程师、数据资产管理员(特邀)。 |
||
| 5 | **会议时长**:60 分钟 |
||
| 6 | **强制准入条件**:全员已精读《最终设计规约 v3.2.4》第 3 章节(标签系统数学定义)及第 2.3 章节(短缺失占位行收益置 NULL 的业务防御)。 |
||
| 7 | |||
| 8 | --- |
||
| 9 | ## 议程一:架构对齐与企业级业务价值定义(15 mins) |
||
| 10 | |||
| 11 | **主导人**:PM、算法工程师 |
||
| 12 | |||
| 13 | **讨论焦点**: |
||
| 14 | 1. **S4 价值重塑与“反直觉”防御**:明确本 Sprint 的核心不是“算标签”,而是“防越界”。规约 D-2 死锁了 150 周与 20% 止盈线,但真正的工程灾难潜伏在 0-based 与 1-based 索引错位(会吃掉第 150 周合法样本)以及 Segment 物理断裂处。S4 的业务价值在于为下游 LambdaRank 提供绝对纯净、无时序穿越的标签锚点。 |
||
| 15 | 2. **NFRs(非功能性需求)确认**: |
||
| 16 | - **算力底线**:确认在处理 S2 产出的 270 万行纯净净值数据时,S4 严禁加载特征宽表(防 OOM 铁律),内存波峰需限制在极低水位。 |
||
| 17 | - **可审计性**:确认对于 `label=0`(未达标)与 `label=150`(边界达标)的特殊样本,日志需具备可追溯性,不打印明细,但需输出截面级统计摘要。 |
||
| 18 | |||
| 19 | ## 议程二:跨团队依赖与前置契约敲定(15 mins) |
||
| 20 | |||
| 21 | **主导人**:PM、研发工程师 |
||
| 22 | **讨论焦点**: |
||
| 23 | 1. **数据血缘契约**: |
||
| 24 | - **[需确认]** S4 的唯一合法输入源为 `data/processed/s2_{year}.parquet`。明确 `scan_parquet` 后必须立即 `.select(["fund_id", "net_value_date", "segment_id", "cumulative_net_value"])`。**[红线重申]** 严禁拉入 `weekly_return` 列,严禁关联任何 S3 特征文件,违者一票否决。 |
||
| 25 | 2. **物理存储契约**: |
||
| 26 | - **[需确认]** S4 产出必须严格落盘为 4 列(`fund_id`, `net_value_date`, `segment_id`, `label`),强依赖 `PhysicalStorageContract.sink_parquet_strict()` 与 `validate_schema_symmetry()`。 |
||
| 27 | 3. **数学常量契约**: |
||
| 28 | - **[需确认]** 确认 `STOP_LOSS_THRESHOLD = 0.20` 与 `MAX_LABEL_WEEKS = 150` 已硬编码于 `core/constants.py`,严禁从 `config.yaml` 读取。 |
||
| 29 | |||
| 30 | ## 议程三:核心 Story 拆解与 ADR(架构决策记录)输出(20 mins) |
||
| 31 | |||
| 32 | **主导人**:研发工程师 |
||
| 33 | **讨论焦点**(不深挖代码实现,仅定技术路线与防御边界): |
||
| 34 | 1. **DCA 闭式向量化公式落地(S4-02)**: |
||
| 35 | - **[需决策]** 确认“倒数累加范式”(`inv_nv -> cum_inv -> weeks -> returns`)为唯一合法路径。明确在此闭包内,Python `for` 循环属于“死刑级”禁止项。对于输入数组的纯净性断言(`np.isfinite` 且 `> 0`),如果触发,是直接抛出阻断异常,还是记录 Warning 并输出全 0? |
||
| 36 | 2. **Segment 物理断裂与防穿越防线(S4-01)**: |
||
| 37 | - **[需决策]** S4 必须按 `segment_id` 拆分计算。明确在 `group_by().map_groups()` 闭包内,NumPy 数组的索引强制从 0 起始。严禁跨 Segment 拼接净值序列。 |
||
| 38 | 3. **0-based 转 1-based 索引偏移拦截(S4-03)**: |
||
| 39 | - **[需决策]** 针对规约 7.1 节的骨架代码,确认 `hit_indices[0] + 1` 的偏移逻辑。讨论是否需要针对“刚好 150 周达标但序列长度仅 150”的极端边界做单元测试强卡点(防 `IndexError`)。 |
||
| 40 | 4. **按年流式落盘闭环(S4-04)**: |
||
| 41 | - **[可复用逻辑指出]** 确认复用 S2/S3 的统筹器按年循环拓扑,落盘后必须立即触发 Schema 对称差校验(4列契约)。 |
||
| 42 | |||
| 43 | ## 议程四:M4 验收标准终审与技术债预防(10 mins) |
||
| 44 | |||
| 45 | **主导人**:PM |
||
| 46 | **讨论焦点**: |
||
| 47 | 1. **Done 标准无歧义对齐**:逐条过审 M4 的硬卡点(纯向量化覆盖率 100%、边界 `assert` 覆盖率 100%、4 列 Schema 门禁生效)。 |
||
| 48 | 2. **技术债预防登记**: |
||
| 49 | - 识别本 Sprint 可能引入的“临时妥协”(例如:若个别 Segment 净值序列首行存在非正数导致断言抛出,是否需要降级为返回 0 并记录日志?),必须在 Redmine 提前建单登记清理 Deadline,严禁带入 Sprint 5(S5 标准化阶段)。 |
||
| 50 | |||
| 51 | --- |
||
| 52 | |||
| 53 | **会议产出物要求**: |
||
| 54 | 会后需由研发工程师在 Gitea `/docs` 目录下提交首份 `adr/004-s4-label-generation-and-math-boundary.md`,记录本次会议敲定的 DCA 闭式公式实施路径、Segment 隔离策略及索引错位防御机制。 |