← 返回文档中心 · 来源:Languangxun/stock-analyzer · 同步于 2026-09-27

范围:GUI 单股分析链路(消融选型 → 策略缓存 → 信号 → 回测 → 预测/置信度), 以及研究脚本 backtests/backtest_strategy_ablation.py(同口径)。逐项核对 「是否使用了未来数据 / 是否在同一数据上做选择与评估 / 是否存在多重比较」。

一、已修复:验证段参与选型门槛(数据泄漏,中高)

  • 位置:run_ablation._eval_task → _ablation_recent(rows, sigs, rp, n) (研究脚本同)。
  • 问题:消融窗口 ABL_BARS=1000,验证段为最后 max(200, n//4)=250 根 (split=750)。_ablation_recent 取「截至最新 250 根」——恰好就是验证段; pick_ablation_consistent 又在近端子窗上按 Calmar/PF/胜率/年化 rank 取 前 25% 作为一致性门槛。等于用验证段做候选筛选,验证段指标(工具→信号胜率 里的「验证」行)偏乐观;候选约 30 个/档,多次比较会进一步放大选择偏差。
  • 修复:近端子窗改为取训练段末尾(_ablation_recent(..., split, ...), 即 split 前 250 根),选型(含门槛)只用 split 之前的数据,验证段完全留出。 GUI 与 backtest_strategy_ablation.py 同步;RECENT_ABL_BARS 注释更新。
  • 影响:部分个股的选中策略会变化(门槛窗口从 750~1000 移到 500~750), 策略缓存 5 日内仍沿用旧选型,属预期;重跑消融即生效。

二、已确认无前视的路径(核查通过)

路径 结论
_sig_l1_pattern 距离样本窗口 k+W <= i-W,次日出清结果 j+1 <= i-W+1 < i,仅用信号日及以前数据 ✓
_composite_signals / _composite_precompute 指标均为因果 EMA/MA/滚动量;筹码 chip_snapshots 用评估窗之前热身、网格不含未来价 ✓
_bt_events / _bt_simulate T 日收盘信号→T+1 成交;止损用 T-1 ATR;无当日盘中-收盘偷价 ✓
三档推荐 只用训练集 Calmar(_tc),验证集仅报告 ✓
调仓/定时刷新 信号重算用截至当前 rows,预测只用历史样本的前向收益 ✓

三、已知但保留的偏差(不能完全消除,已在 UI/文档标注)

  1. 全局权重与阈值是同一批全A数据上调的(IND_W、SIGNAL_SCORE_SELL、 BUY_TH 等)。单股选型叠加全局调参属”双重使用数据”,靠横截面 rank 加权、 交易活跃度下限(_MIN_TR=8)和 5 日策略缓存缓解,但绝对收益水平仍偏乐观。
  2. 策略缓存 5 日(STRAT_TTL):同一只股票以重叠窗口反复选型, 缓存期内指标是样本内结果;报告已标注”缓存至…”。
  3. 置信度是样本质量启发式(_calculate_confidence:样本数/相似度方差/ 权重/层级完整性),不是命中率校准值;不应解读为”70% 概率正确”。 建议展示口径理解为”样本质量分”。
  4. 研究回测的 75/25 分段:验证段只做报告、不参与选型(修复后成立), 但研究脚本的多股票汇总仍受”全市场窗口重合”影响,跨股票不独立。

四、复核方法

  • 代码走查:上述函数逐个核对索引窗口与执行时点;
  • 快速对照:对同一批股票,分别用「截至 ver-1」与「含验证段」重算选型, 修复后选型仅依赖 split 前数据(本次未跑全库 A/B,建议下次全样本回测时 对比 pick_notes 分布确认)。
  • 复现:python backtests/backtest_strategy_ablation.py --limit 200。

五、结论

唯一明确的泄漏是”验证段充当近端门槛”,已在 GUI + 研究脚本同步修复; 其余为统计上不可完全消除的样本内偏置,已在展示层/文档提示。历史回测数值 (README 第三节)在修复后应重跑一次以获得干净口径(本报告不包含重跑)。


二轮复检(v6.1.5 热修⑦,2026-09-26 晚)

触发:修复「设置不生效」(遗留行 W_WINDOW, TOPK = 10, 10 覆盖 ini,界面显示 W=20 实际跑 10)与「样本窗口重叠」(去重间隔 W//2 → 相邻样本窗口重叠一半)后复检。

六、新修复项与过拟合关系

项 性质 说明
W_WINDOW/TOPK 与 CFG 同步 口径一致性(原参数失效) 修复前消融/选型实际跑 W=10,而界面与文档按 W=20;现两者一致,并按 W=20 重跑消融→三档选型→每只股导出
样本去重间隔 W//2 → W 伪重复(pseudo-replication) 原相邻样本窗口重叠 50%,同一次行情事件被当成多个独立样本计入融合权重与置信度样本数;现窗口互不重叠(不足才逐级放宽)
漏斗一致性(候选≥最终) 参数有效性 防止「候选 10 / 最终 30」这类取不满的配置
calc_chips 桶数 120→360 仅展示 不进入信号/回测路径(信号引擎桶数未动)

七、二轮复检结果(重跑后)

  • 消融(W=20 口径):research/ablation_v6.1.5_20260926_210106/(7178 只有效)。
  • 每只股三档导出(新选型):research/perstock_backtest_v6.1.5_20260926_214714/ (6897 只 × 3 档 = 20691 行)。
  • 复检数字与首轮一致 → 赢家诅咒结论稳健:
    • 全期中位:保守 +43.4% / 稳健 +52.2% / 激进 +55.2%(正收益 93~95%)
    • 训练段中位:+43.7% / +53.1% / +56.6%(正 96~98%)
    • 验证段中位:-0.8% / -0.7% / -0.8%(正收益仅 46%)
  • 结论:逐股”从 ~30 个候选挑最好”在留出段归零;三档横截面对比请只看 「验证段收益%」。此结论在修正 W 口径、修正样本重叠后均成立。

八、仍保留的偏差(不变)

  1. 全局权重/阈值同批数据调参(IND_W、BUY_TH 等);
  2. 策略缓存 5 日(重叠窗口反复选型);
  3. 置信度=样本质量启发式(非命中率校准)——样本窗口重叠修复后, 其”样本数”含义更干净,但评分本身仍未与命中率映射;
  4. 研究回测跨股票窗口重合、不独立。