Skip to content

fix(screening): 缺失 K 线被压缩或当零值,生成虚假的动量与 20 日信号 #229

Description

@Bluuok

问题

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:

  1. 65 根 K 线,第 3 个月基准 close 为 NaN,最新 close 105;sortedCloses() 丢掉缺失 bar,strong-momentum 用更早的 80 计算出虚假的 +31.25%。另一个用例将窗口内部 close 置 0(Massive 的缺失值),规则仍接受不完整的 3m 样本。
  2. unusual-movement 前 20 根有一根 low=0(provider 缺失值);规则仍用扭曲的平均值推出 20d 信号。
  3. 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 的路径不同。

Activity

  1. Bluuok commented on Sep 26, 2026

    @Bluuok
    ContributorAuthor

    /claim

  2. github-actions commented on Sep 26, 2026

    @github-actions

    @Bluuok 已认领该 Issue,并已自动设为 Assignee。提交 PR 时请在描述中写 Closes #229。

  3. github-actions commented on Oct 4, 2026

    @github-actions

    @Bluuok 这个 Issue 已认领超过 7 天,目前没有发现关联的 open PR,也没有看到最近 7 天的进度更新。

    如果仍在推进,请在 3 天内 留一条简短进度说明(包括正在等待的前置依赖也可以);如果已经有 PR,请贴出链接。若 3 天内没有回应,认领会自动释放,方便其他贡献者接手。

  4. Bluuok commented on Oct 4, 2026

    @Bluuok
    ContributorAuthor

    进度更新:本 Issue 的修复代码和可复现测试报告已于 2026-09-26 提交至原 PR #230。原源仓库已脱离 fork 网络,GitHub 无法重新打开旧 PR;现已由新的贡献 fork 恢复为 PR #290:#290 。

    新 PR 当前为 open,描述中包含 Closes #229,原测试报告已保留。后续修订与验证将在该 PR 继续,请保留认领,待维护者审查、合并。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

claimedClaimed by a contributor and currently in progress

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions