Skip to content

feat: add skill opinion outcome performance statistics - #2

Open
ObVious55 wants to merge 8 commits into
1904-p2-skill-opinion-outcomes-v2from
codex/1904-p2-skill-outcome-stats
Open

feat: add skill opinion outcome performance statistics#2
ObVious55 wants to merge 8 commits into
1904-p2-skill-opinion-outcomes-v2from
codex/1904-p2-skill-outcome-stats

Conversation

@ObVious55

Copy link
Copy Markdown
Owner

PR Type

  • fix
  • feat
  • refactor
  • docs
  • chore
  • test

Background And Problem

#1904 P2 要求 Skill 权重只能基于真实、可归因的 outcome 样本进行校准;样本不足时必须保持 neutral / observational,不能通过其他 skill、horizon、engine version 或非 evaluated 记录拼接样本量。

父 PR #2116 已建立 individual SkillAgent outcome 的计算和持久化核心,但明确未提供表现统计、样本充足度、排名或权重调整。

本 stacked PR 在 ZhuLinsen#2116 的持久化事实之上增加只读表现统计:

  • skill_id + horizon + engine_version 独立聚合;
  • 仅当单个 bucket 的 evaluated >= 30 时输出表现指标;
  • 样本不足时继续返回计数,但表现指标保持 null
  • 不修改运行时权重,不接入 API、Pipeline、Web 或最终投资建议。

Scope Of Change

当前描述基于:

Repository

  • src/repositories/skill_opinion_outcome_repo.py
    • 新增 SkillOpinionPerformanceBucket
    • 使用 SQLAlchemy 按 skill_id + horizon + engine_version 聚合;
    • 返回 total、pending、evaluated、observational、unable、hit、miss 和 evaluated 平均方向收益;
    • repository 仅提供原始事实,不负责样本充足度策略。

Service

  • src/services/skill_opinion_performance_service.py
    • 新增只读 SkillOpinionPerformanceService
    • 固定最低样本门槛为 30 条 evaluated outcome;
    • 每个 bucket 独立判断样本量,禁止跨 skill、horizon 或 engine version 合并;
    • 样本不足时返回 sample_status=observational,所有表现指标为 null
    • 样本充足时:
      • hit/miss rate 使用 hit + miss 作为分母;
      • average directional return 仅使用 evaluated rows;
      • unable rate 使用 evaluated + observational + unable 作为分母,排除 pending;
    • 对空白 skill、空 horizons、非法 horizon 和空白 engine version fail closed;
    • 输出按 total 降序、skill ID、canonical horizon 顺序稳定排序。

Tests

  • tests/test_skill_opinion_outcome_stats.py
    • 使用真实 SQLite 覆盖原始聚合;
    • 覆盖样本不足时指标保持 null
    • 覆盖恰好 30 条 evaluated 时解锁指标;
    • 覆盖大量 observational、unable、pending 不能补足 evaluated 门槛;
    • 覆盖 sibling skill、horizon 和 engine version 不能拼接样本;
    • 覆盖精确筛选、非法筛选、稳定排序和空结果。

Documentation

  • docs/multi-strategy-contract.md

    • 记录 bucket identity、样本门槛、指标分母和 observational 契约;
    • 明确本阶段不修改权重、API、Pipeline 或 Web。
  • docs/CHANGELOG.md

    • [Unreleased] 扁平列表中记录只读 Skill Opinion 表现统计能力。

Issue Link

Refs #1904

Stacked on #2116.

本 PR 只实现 P2 的只读表现统计和样本充足度契约,不声称完成保守权重接入,也不关闭整个 Issue。

Verification Commands And Results

Executed local verification

& 'D:\code\daily_stock_analysis\.venv\Scripts\python.exe' -m pytest `
  tests/test_skill_opinion_outcome_stats.py `
  tests/test_skill_opinion_outcomes.py `
  tests/test_backtest_service.py -q

结果:103 passed, 3 warnings in 68.18s

& 'D:\code\daily_stock_analysis\.venv\Scripts\python.exe' -m py_compile `
  src/repositories/skill_opinion_outcome_repo.py `
  src/services/skill_opinion_performance_service.py `
  tests/test_skill_opinion_outcome_stats.py

结果:通过,无输出。

& 'D:\code\daily_stock_analysis\.venv\Scripts\python.exe' -m flake8 `
  src/repositories/skill_opinion_outcome_repo.py `
  src/services/skill_opinion_performance_service.py `
  tests/test_skill_opinion_outcome_stats.py

结果:通过,无输出。

git diff --check

结果:已跟踪文件通过,无 whitespace error;Git 仅提示部分文件未来可能执行 LF → CRLF 转换。

Full-suite note

曾启动:

& 'D:\code\daily_stock_analysis\.venv\Scripts\python.exe' -m pytest -m 'not network'

该命令选择了 5056 个测试。本地运行至约 10% 时,tests/test_agent_backend_status_service.py 附近出现与本机 Codex app-server / protocol 环境相关的失败,随后停止执行;该命令未完成,不能记为通过。

CI status

当前分支尚未 push,PR 尚未创建,因此当前 Head CI 不可用:

  • ai-governance:TODO
  • backend-gate:TODO
  • docker-build:TODO
  • web-gate:TODO(按改动路径预计不触发,仍以实际 CI 为准)

Visual Evidence (if applicable)

不适用。

本 PR 只修改后端 repository/service、测试和专题文档,不修改报告格式、报告渲染、Web UI、Web 设置或桌面端界面。

Compatibility And Risk

  • 不新增或修改公共 API、Schema、认证或 OpenAPI。
  • 不修改数据库 schema,不迁移、改写或 backfill 既有数据。
  • 不新增运行时配置或第三方依赖。
  • 不变更 provider、model、base URL 或配置迁移语义。
  • 不修改 BacktestService.get_skill_summary()AgentMemorySkillAggregator 或最终投资建议。
  • 新 service 尚未接入主 Pipeline;在后续权重 PR 合入前,运行时继续保持现有中性权重。
  • 统计结果依赖 feat: add skill opinion outcome evaluation core ZhuLinsen/daily_stock_analysis#2116 的 outcome 表、状态和 engine version 契约,因此必须在 feat: add skill opinion outcome evaluation core ZhuLinsen/daily_stock_analysis#2116 之后合入。
  • 固定门槛 30 是当前保守策略;未来调整门槛或指标口径时需要同步测试和契约文档。

Rollback Plan

最小回滚方式:

  1. revert 本 PR;
  2. 重新部署或重启相关服务。

本 PR 不涉及数据库迁移、数据写入入口或运行时配置,因此无需额外的数据和配置回滚。父 PR ZhuLinsen#2116 的 outcome 数据可以继续保留。

EXTRACT_PROMPT Change (if applicable)

不适用:本 PR 未修改 src/services/image_stock_extractor.pyEXTRACT_PROMPT

Checklist

  • 本 PR 有明确动机和业务价值 / This PR has a clear motivation and value
  • 已提供可复现的验证命令与真实结果 / Reproducible verification commands and results are included
  • 已评估兼容性与风险 / Compatibility and risk have been assessed
  • 已提供回滚方案 / A rollback plan is provided
  • 本 PR 未修改报告格式或 Web UI,无需截图
  • 本 PR 未修改 Web 设置字段,无需设置页截图
  • 已同步更新专题文档与 docs/CHANGELOG.md
  • 当前 Head 的阻断型 CI 已确认通过

@github-actions github-actions Bot added documentation Improvements or additions to documentation size/XL testing labels Jul 28, 2026
@github-actions

github-actions Bot commented Jul 28, 2026

Copy link
Copy Markdown

🤖 自动审查报告

项目 结果
📊 变更文件 10 个
➕ 新增行数 870 行
➖ 删除行数 14 行
🔍 静态检查 ✅ 通过
🧠 AI 审查 ✅ 已完成

📁 修改的文件

  • 📝 docs/CHANGELOG.md (+3/-0)
  • 📝 docs/multi-strategy-contract.md (+11/-3)
  • 📝 src/repositories/skill_opinion_outcome_repo.py (+93/-5)
  • 📝 src/services/backtest_service.py (+1/-4)
  • 📝 src/services/skill_opinion_outcome_service.py (+25/-0)
  • 🆕 src/services/skill_opinion_performance_service.py (+153/-0)
  • 📝 src/services/stock_daily_start_resolver.py (+8/-2)
  • 📝 tests/test_backtest_service.py (+85/-0)
  • 🆕 tests/test_skill_opinion_outcome_stats.py (+386/-0)
  • 📝 tests/test_skill_opinion_outcomes.py (+105/-0)

💡 提示: 请确保代码已通过本地测试,并遵循项目代码规范。

@github-actions github-actions Bot added the ai label Jul 28, 2026
* feat: add skill opinion outcome evaluation core

* feat: add skill opinion outcome evaluation core

* fix: unify expected-start resolution

* changelog

* fix: validate persisted daily start sessions

* fix: preserve legacy local backtest windows
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai documentation Improvements or additions to documentation size/XL testing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant