Skip to content

feat(research_stats): RS-01 research-only PSR/DSR, bootstrap CI, cost stress, backtest_report.v1 - #658

Merged
Pigbibi merged 1 commit into
mainfrom
rebuild/rs01-research-stats
Oct 10, 2026
Merged

Pigbibi merged 1 commit into
mainfrom
rebuild/rs01-research-stats

Conversation

@Pigbibi

@Pigbibi Pigbibi commented Oct 10, 2026

Copy link
Copy Markdown
Contributor

RS-01:研究统计原语 + backtest_report.v1(research-only)

新增隔离包 quant_platform_kit.research_stats,服务于 QSL 回测标准 v1(研究方案 §2/§6)。研究-only:不读账户、不调用券商、不下单、不写风险政策,不授予 paper/shadow/live 权限。

内容

  • sharpe_inference:PSR(Bailey & López de Prado 2012)、DSR(2014)、期望最大 Sharpe。试验数 < 2、有效试验数 > 已登记数、试验 Sharpe 方差为 0、样本不足/非法 → UNCOMPUTABLE,value=None(缺失永不记为 0)。仅标准库。
  • bootstrap:平稳块自助法(Politis & Romano 1994)给单期对数增长、单期 Sharpe、MDD(含初始净值)的百分位 CI;seed 为必填关键字参数,同输入同 seed 结果可复现;numpy 延迟 import。
  • cost_stress:按声明口径 net = (1 − τ·c)(1 + gross) − 1 重算 1×/2×/3× 成本情景;非法输入 → PARKED。
  • backtest_report:BacktestReportV1 冻结 dataclass + 打包的 schemas/backtest-report.v1.schema.json。live_ready=false/no_order=true 恒定;非 COMPUTED 指标必须 value=null + reason_code;development 数据不得标 OOS_EVALUATED;基准必须 same_dates=true。
  • pyproject.toml:新增可选 extra research = [numpy, pandas];核心 dependencies 仍为 []。uv.lock 仅手工加入该 extra 条目(未重新解析,避免无关 churn)。
  • 文档 docs/research_stats.zh-CN.md。

边界测试(tests/test_research_stats_import_boundary.py)

  • AST 扫描:research_stats 之外的 QPK 模块均不 import 它;research_stats 也不 import QPK 其他模块。
  • 子进程:import 全部 QPK 顶层子包后,research_stats 未被加载。
  • 子进程:屏蔽 numpy/pandas 时仍能 import research_stats 并计算 PSR/成本压力;bootstrap 抛出提示 [research] 的 ImportError。
  • 断言 numpy/pandas 只在 research extra。

未做 / 非目标

  • 不修改 performance_metrics 等现有共享指标函数;不改 QPK_PIN,不升级任何下游 pin,不接入任何消费者。
  • 测试全部为合成数据;本 PR 不含任何真实回测数字。
  • PBO 与 UES trial journal 接线留给 RS-02。

本地验证

  • ruff check . 通过;pytest tests/test_research_stats_*.py:51 passed。
  • 全量本地(Python 3.13)有 3 个 test_strategy_benchmark_catalog 失败,在未改动的 origin/main 上同样失败(本地环境问题,main CI 绿),与本 PR 无关。

…ap, cost stress, backtest_report.v1

- New isolated package quant_platform_kit.research_stats (research-only).
- PSR/DSR fail closed to UNCOMPUTABLE (value=None) on <2 trials, zero
  trial-Sharpe variance, short or invalid samples; never zero.
- Stationary block bootstrap CIs with mandatory seed (numpy lazily imported).
- Cost-stress recompute at 1x/2x/3x; invalid input is PARKED.
- qsl.backtest_report.v1 dataclasses + packaged JSON Schema with
  live_ready=false / no_order=true invariants.
- numpy/pandas only via new optional 'research' extra; core deps stay empty.
- Import-boundary tests: no production module imports research_stats, and
  research_stats imports without numpy.
- Synthetic-data tests only; no real backtest numbers. QPK_PIN untouched.
@Pigbibi

Pigbibi commented Oct 10, 2026

Copy link
Copy Markdown
Contributor Author

Self-review(rebuild):

  • 隔离:research_stats 不 import QPK 其他模块;全仓无模块 import 它;QPK_PIN、下游 pin、消费者均未改动。
  • 依赖:核心 dependencies 仍为 [];numpy/pandas 仅 research extra;屏蔽 numpy 时包可 import,bootstrap 明确报 [research]。
  • 诚实性:PSR/DSR 不可计算时 value=None + reason_code;报告模板 live_ready=false/no_order=true 恒定,development 不能标 OOS_EVALUATED。
  • 公式:PSR/DSR 与独立手算闭式一致(rel 1e-12);DSR 随有效试验数单调不增;成本压力 1×/2×/3× 单调、零换手不变。
  • 数据:测试只用合成序列,无真实回测数字。
  • CI:test 通过(2490 passed)。共享指标口径冲突另记 performance_metrics: benchmark inner-join, win_rate/profit_factor 口径与晋级标准冲突(G3) #659,未在此 PR 改动。
    结论:可合并(squash)。

@Pigbibi
Pigbibi merged commit ee33221 into main Oct 10, 2026
1 check passed
@Pigbibi
Pigbibi deleted the rebuild/rs01-research-stats branch October 10, 2026 13:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant