问题
Discover 的 17 个确定性策略中,多个 K 线规则把缺失价格/成交量误当作有效窗口,向用户输出“20d avg”“20d high”“1m/3m return”等看似有完整依据的理由:
sortedCloses() 会过滤无效 close,随后 pctReturn(..., 21/63) 按压缩后的数组位置计算,缺一根 bar 就把窗口向前移动;若缺的是最新 close,还会把昨日数据当今日。
pctReturn() 已拒绝分母 0,但不检查窗口内部。Massive 生产映射在 provider 缺少 bar.c 时写入 0(packages/shared/src/providers/massive/adapter.ts:467);窗口中间的缺失值仍可被当成完整 3m 样本。
unusual-movement 的“20d average”只要求 20 根中 1 根 有效振幅;缺失的 bar.l 被 Massive 映射为 0,可扭曲平均值。
breakout 对前 20 根 high/volume 过滤缺失值后继续求最大值/平均值,仍标榜“20d high”和“average”。Massive 的缺失 high/volume 同样落成 0。
可复现反例
在干净 main ba5dcdf 添加三条回归用例,bun test packages/shared/src/screening/strategies.test.ts = 27 pass / 3 fail:
- 65 根 K 线,第 3 个月基准 close 为 NaN,最新 close 105;
sortedCloses() 丢掉缺失 bar,strong-momentum 用更早的 80 计算出虚假的 +31.25%。另一个用例将窗口内部 close 置 0(Massive 的缺失值),规则仍接受不完整的 3m 样本。
unusual-movement 前 20 根有一根 low=0(provider 缺失值);规则仍用扭曲的平均值推出 20d 信号。
breakout 前 20 根有一根 high=0 或 volume=0;规则仍输出“20d high / average”信号。
另有最新 close=NaN 的防御用例:过滤后不应把昨天当最新。
期望
- 价格必须是有效的正数;保留每根 K 线的位置,缺失 close 不得缩短 1m/3m 窗口。
- 计算收益、均线前检查整个所需窗口有效,保留现有零分母防护,不产生 Infinity/NaN 评分。
- 20 根基线必须有 20 个有效 high、low、close、正成交量(适用时);不足时不输出带“20d”证据字样的候选。
- 保持无问题数据下的筛选行为和证据引用;用策略级及 ScreeningService 路径测试验证。
范围仅 Discover K 线派生筛选策略,与组合风险回撤 #220、Agent 风险波动率 #218 的路径不同。
问题
Discover 的 17 个确定性策略中,多个 K 线规则把缺失价格/成交量误当作有效窗口,向用户输出“20d avg”“20d high”“1m/3m return”等看似有完整依据的理由:
sortedCloses()会过滤无效 close,随后pctReturn(..., 21/63)按压缩后的数组位置计算,缺一根 bar 就把窗口向前移动;若缺的是最新 close,还会把昨日数据当今日。pctReturn()已拒绝分母 0,但不检查窗口内部。Massive生产映射在 provider 缺少bar.c时写入 0(packages/shared/src/providers/massive/adapter.ts:467);窗口中间的缺失值仍可被当成完整 3m 样本。unusual-movement的“20d average”只要求 20 根中 1 根 有效振幅;缺失的bar.l被 Massive 映射为 0,可扭曲平均值。breakout对前 20 根 high/volume 过滤缺失值后继续求最大值/平均值,仍标榜“20d high”和“average”。Massive 的缺失 high/volume 同样落成 0。可复现反例
在干净 main
ba5dcdf添加三条回归用例,bun test packages/shared/src/screening/strategies.test.ts= 27 pass / 3 fail:sortedCloses()丢掉缺失 bar,strong-momentum用更早的 80 计算出虚假的 +31.25%。另一个用例将窗口内部 close 置 0(Massive 的缺失值),规则仍接受不完整的 3m 样本。unusual-movement前 20 根有一根 low=0(provider 缺失值);规则仍用扭曲的平均值推出 20d 信号。breakout前 20 根有一根 high=0 或 volume=0;规则仍输出“20d high / average”信号。另有最新 close=NaN 的防御用例:过滤后不应把昨天当最新。
期望
范围仅 Discover K 线派生筛选策略,与组合风险回撤 #220、Agent 风险波动率 #218 的路径不同。