行为
模型训练与评估¶
| 周次 | Story ID | Story 描述 | 规约硬性映射 | 验收标准 | 工时 |
|---|---|---|---|---|---|
| W6 | S5-01 |
时序切分基座与特征标签对齐 读取按年 Parquet,执行 LEFT JOIN 产出未标准化的 train_dataset.parquet,实现 TimeSeriesSplit 索引划分。 |
规约 5.1 (训练数据流);规约 5.2 (严禁随机 K-Fold) | ① 产出 train_dataset.parquet,Schema 为长表且特征均为原始值;② 实现严格的 TimeSeriesSplit(n_splits=5) 索引生成器,按时间排序切分,严禁打乱;③ 单测验证各折的 Train/Val 时间范围无重叠且无未来穿越。 |
2天 |
| W6 | S5-02 |
逐折闭环引擎(标准化+共线性+训练+评估) 实现单折内部的时序隔离计算流,复用 Step 3 纯函数。 |
规约 5.2 (每折独立执行);CR-002 (复用Step3函数);规约 4.4 (严禁跨时间窗口IC计算) | ① 调用 feature_engineering.calculate_stats() 仅基于 Train 折数据计算统计量;② 调用 apply_standardization() 应用 T-1 参数,Val 折严格借用对应 Train 折参数;③ 调用 remove_collinear_features() 时,计算 Spearman IC 仅使用 Train 折标签;④ 产出每折的 AUC、NDCG 指标。 |
2天 |
| W6 | S5-03 |
Optuna 单折搜索与 1 小时硬限拦截 在最后一个折上配置 Optuna 搜索空间与超时机制。 |
章程第八章 (1小时硬限);规约 5.3 (参数范围/停止条件) | ① Optuna 目标函数配置 early_stopping_rounds=50;② 调用 study.optimize(timeout=3600) 实现强制截断,到达 1 小时无论是否收敛必须停止并取当前最优;③ 搜索范围 8 个超参数严格对齐规约 5.3 表格,严禁自行添加。 |
2天 |
| W7 | S5-04 |
四桶回测引擎(单点快照+绝对截断) 在最后折的 Val 集最后一个截面,实现绝对分桶与 DCA 组合净值模拟。 |
CR-004 (单点快照/绝对截断/空桶保留);规约 5.4 (回测指标) | ① 仅取最后折 Val 集的最后一个日期截面进行打分; ② 严格按绝对数量分桶(Top20 取 1~20 名),空桶净值曲线输出为 None;③ 实现周定投组合净值追踪:每周投入 20 元均分,计算年化收益率、最大回撤、Sharpe、止盈成功率; ④ 计算全标的池等权基准的相同指标。 |
2天 |
| W7 | S5-05 |
全量参数重算与 MLflow 归档闭环 产出最终推理级参数,执行 SHAP 归因,完成 MLflow Production 打标。 |
CR-005 (全量重算参数);规约 5.5 (MLflow 记录);规约 7.3 (config.yaml Hash) | ① 全量加载 features.parquet,重新跑一遍标准化,产出全局基准 standardization_params.parquet 存入 MLflow;② 使用最优参数在所有折上重训最终模型,产出 .txt 文件;③ 产出 SHAP summary plot 与四桶回测净值曲线图; ④ 在 MLflow Model Registry 将新模型打上 Production 标签,旧模型归档至 Archived。 |
2天 |
可优化与可复用逻辑提示¶
1. 【高优提醒】LightGBM 目标函数的对齐缺失¶
规约 5.4 要求评估 NDCG@20(排序质量指标),但规约 5.3 未明确 LightGBM 的 objective(目标函数)。
- 如果使用
binary:logloss,模型输出的是概率,无法直接完美对齐 NDCG。 -
建议实现:在 S5-03 的 Optuna 定义中,建议研发使用
lambdarank目标函数,或至少在评估阶段将模型概率输出转化为分位数后计算 NDCG。此细节无需 PM 拍板,但请研发在 Review 时重点关注,避免 NDCG 指标失真。
2. LightGBM 特征名与共线性剔除后列表的严格对齐¶
在 S5-02 逐折循环中,共线性剔除会丢弃部分特征。在将 Polars DataFrame 转换为 LightGBM Dataset 时,必须显式传入 feature_names=final_feature_list。如果不传,LightGBM 会按内部索引(0, 1, 2...)生成特征名,后续导出的 SHAP 归因图将变成无意义的 Feature_0,直接导致 M4 验收失败。
3. 回测 DCA 净值模拟的“快照隔离”¶
规约要求模拟“等权周定投组合”。在单点快照(假设 T 日为 2025-12-31)下,组合从 T+1 日开始买入,但买入的标的必须是 T 日排名分桶后的基金池。严禁在回测的 150 周内允许新基金加入组合(因为 T 日之后没有新数据来给新基金打分)。这是一个极易踩坑的业务边界。
新增/修改文件清单¶
| 操作 | 文件路径 | 简介与企业级约束 |
|---|---|---|
| 新增 | src/trainer.py |
核心模块。包含主入口 run_training_pipeline(),以及内部函数 _train_single_fold()、_evaluate_single_fold()、_run_optuna()、_backtest_single_point()。严禁出现任何硬编码超参数。 |
| 新增 | src/utils/backtest.py |
回测工具模块。包含 _simulate_dca_portfolio()(给定基金池,按周均分资金模拟定投净值)和 _calculate_portfolio_metrics()(计算年化、最大回撤、Sharpe等)。从 trainer.py 中剥离,保持单一职责。 |
| 修改 | docs/architecture_baseline.md |
新增《Step 5 时序隔离防泄露架构图》:明确展示 Train 折计算 Stats -> Val 折使用 Shifted Stats 的虚线依赖关系,以及全量重算参数的旁路流程。 |
| 修改 | .gitea/workflows/ci.yml |
增加 Step 5 所需系统依赖的安装检查(如 lightgbm, optuna, shap, scikit-learn, matplotlib),防止流水线在拉取代码后因缺包报错。 |
| 产出 | data/models/model_final.txt |
运行时产物。使用最优参数在全量 5 折上重训的最终 LightGBM 模型文件。 |
| 产出 | data/models/standardization_params.parquet |
运行时产物(CR-005 定义的全局基准版)。Schema 严格符合规约 4.3 节,供 Step 6 推理服务直读。 |
| 产出 | data/models/final_feature_list.json |
运行时产物。最后一次重训时保留的特征名列表(可能因逐折 IC 剔除而与 Step 3 预览版不同)。 |
| 产出 | mlruns/.../artifacts/shap_summary.png |
运行时产物。SHAP 特征重要性摘要图,用于解释模型决策依据。 |
| 产出 | mlruns/.../artifacts/backtest_curves.png |
运行时产物。包含 Top20、Top21-50、Top51-100、其余 四条净值曲线与等权基准曲线的对比图。 |
下级目录¶
由 Huarui Lin 更新于 4 天 之前 · 5 修订