From b012d97ffe4165e7606163042fc66f9f1bbaa06d Mon Sep 17 00:00:00 2001 From: shaofl <2899218482@qq.com> Date: Sun, 21 Jun 2026 00:22:10 +0800 Subject: [PATCH] docs: record I5f intraday liquidity diagnostics Docs-only progress sync after merging PR #55 (P-I5f report-only intraday execution liquidity diagnostics). I5f is an execution-realism DIAGNOSTIC, not a factor-research result and not a strategy improvement. - merged-PR list += #55 - new I5f progress bullet: default-off intraday.liquidity_diagnostics; report-only (no fills/NAV/turnover/cost/holdings/alpha/MMP/scores/construction change); capacity uses only the selected execution-minute 1min amount (no future bar, daily amount/volume/close, or EOD proxy); smoke covered=58/58, stk_mins_live_calls=0, final_nav=0.976448 (== accepted I5b); 43 desired / 1 feasibility-blocked / 0 missing / 42 inspected / 20 below 1.0x; ratio 0.122/0.222/1.104/2.730; honest interpretation (not alpha/performance/tradability; no extrapolation beyond 10M RMB / 5%). - quality gate 678 -> 696 passed; 18 -> 19 configs; phase0 0.9600/0.8408 unchanged. - roadmap: I5f landed; enforced partial-fill/volume-cap = possible I5g only after a separate explicit goal; D6 / endpoint schema registry still deferred; MMP remains paused after I5e negative CSI300 generalization. No code/config/test changes; AGENTS.md kept byte-identical to CLAUDE.md. --- AGENTS.md | 10 +++++++--- CLAUDE.md | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index d36b2f3..3359348 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -57,7 +57,7 @@ data → universe → factors(特征) → alpha(合成/预测) → portfolio(+ri ## 开发约定 - **交流中文**;代码/注释/commit message 用**英文**。 -- **Git**:feature 分支 + PR。**PR #1(P0+P1)、#2(P2-1)、#3(P2-2)、#4(进度文档)、#5(P2-3)、#6(进度文档)、#7(P2-4)、#8(进度文档)、#9(P3-1)、#10(进度文档)、#11(P3-2)、#12(P3-3)、#13(进度文档)、#14(P3-4)、#15(进度文档)、#16(P3-5)、#17(进度文档)、#18(P3-6)、#19(P3-7)、#20(进度文档)、#21(P3-8)、#22(进度文档)、#23(P4-1)、#24(进度文档)、#25(P4-2)、#28(tushare 权限/限频探测 + capability registry)、#29(I1–I4 分钟级 intraday pipeline,4 commit 一 PR)、#30(进度文档)、#31(P4-3 因子支撑端点缓存 + 21:00 data updater,2 commit 一 PR)、#33(P-I5a 事件驱动回测架构重构 + opt-in 分钟尾盘 event model,4 commit 一 PR)、#35(P-I5b 分钟尾盘执行期 raw stk_limit 涨跌停可行性,4 commit 一 PR)、#37(P-I5c MMP 分钟因子端到端 opt-in alpha)、#39(P-I5d MMP 五分位分组回测 standalone,含 I5c plumbing)、#41(数据层 D1 契约文档 + token 解析去重)、#43(数据层 D2 TushareCache specs/parsers 拆分)、#45(数据层 D3 report-only 数据质量层)、#47(数据层 D3b default-off `data-update` 质量报告钩子)、#49(数据层 D4 coverage ledger 批量写 + 进程内查找缓存)、#51(数据层 D5 opt-in 有界并发 + 全局限频器)、#53(P-I5e MMP 五分位 CSI300 独立泛化检验,负结果)均已 merge 到 `main`**。commit 用 conventional 格式,**无 attribution**(不加 Co-Authored-By)。 +- **Git**:feature 分支 + PR。**PR #1(P0+P1)、#2(P2-1)、#3(P2-2)、#4(进度文档)、#5(P2-3)、#6(进度文档)、#7(P2-4)、#8(进度文档)、#9(P3-1)、#10(进度文档)、#11(P3-2)、#12(P3-3)、#13(进度文档)、#14(P3-4)、#15(进度文档)、#16(P3-5)、#17(进度文档)、#18(P3-6)、#19(P3-7)、#20(进度文档)、#21(P3-8)、#22(进度文档)、#23(P4-1)、#24(进度文档)、#25(P4-2)、#28(tushare 权限/限频探测 + capability registry)、#29(I1–I4 分钟级 intraday pipeline,4 commit 一 PR)、#30(进度文档)、#31(P4-3 因子支撑端点缓存 + 21:00 data updater,2 commit 一 PR)、#33(P-I5a 事件驱动回测架构重构 + opt-in 分钟尾盘 event model,4 commit 一 PR)、#35(P-I5b 分钟尾盘执行期 raw stk_limit 涨跌停可行性,4 commit 一 PR)、#37(P-I5c MMP 分钟因子端到端 opt-in alpha)、#39(P-I5d MMP 五分位分组回测 standalone,含 I5c plumbing)、#41(数据层 D1 契约文档 + token 解析去重)、#43(数据层 D2 TushareCache specs/parsers 拆分)、#45(数据层 D3 report-only 数据质量层)、#47(数据层 D3b default-off `data-update` 质量报告钩子)、#49(数据层 D4 coverage ledger 批量写 + 进程内查找缓存)、#51(数据层 D5 opt-in 有界并发 + 全局限频器)、#53(P-I5e MMP 五分位 CSI300 独立泛化检验,负结果)、#55(P-I5f 分钟尾盘执行流动性/容量诊断,report-only)均已 merge 到 `main`**。commit 用 conventional 格式,**无 attribution**(不加 Co-Authored-By)。 - **不过度设计**:按路线图 MVP 先打通一条端到端链路,再加层(architecture.html §11,Phase 0→3)。 - **secrets** 一律走外部 `.config.json`;repo `.gitignore` 已排除数据产物(`*.parquet`等)、缓存、`tmp/`(仅留架构文档)。 - 文件小而专(<800 行),immutable 优先。 @@ -219,6 +219,10 @@ data → universe → factors(特征) → alpha(合成/预测) → portfolio(+ri - **结论:FAILS / 不泛化**。final NAV Q1→Q5 **0.8809 / 0.7377 / 0.9418 / 0.7573 / 0.6665**;年化 **−2.55% / −6.00% / −1.21% / −5.50% / −7.92%**;**单调 Spearman −0.5000**(vs CSI500 +1.0000);合成 Q5−Q1 累计 **−26.77%**(vs CSI500 +17.15%)。**Q5(高 MMP)在 CSI300 上最差**——高 MMP 组不跑赢低 MMP 组,I5d 的 CSI500 单调性在独立 universe 上**反转**,强烈提示其为 universe/regime 特异、非稳健因子属性。这正是独立检验要拿到的证据。 - ⚠️ **caveat(保留)**:单因子/单重叠 5 年窗口/单 universe;Q5−Q1 是合成 long-only 腿差非 dollar-neutral 执行;丢弃未覆盖分钟名的 coverage bias;执行模型仍缺 partial-fill/liquidity/volume-cap;无调参/无 learned alpha;**非业绩声明**。CSI500 对照仅作 context,不作任何组业绩声明。 - **回归不破 + 范围克制**:phase0 `0.9600/0.8408` 不变;`pytest` 678 passed(677 基线 + `test_cache_config.py` 的 `config/*.yaml` glob 参数化自动覆盖新 config 的 +1,无新测试文件);**不动 progress docs 以外的代码/config/test**,不碰 schema registry / D6;**PR #38 未动**。 +- ✅ **P-I5f 分钟尾盘执行流动性诊断**(**PR #55 已 merge 到 `main`**,**执行真实性诊断、非因子研究结果;report-only**):给分钟尾盘链路加 opt-in、**report-only** 执行流动性诊断——对每笔 desired trade `|target_w − current_w|`,用**选定执行分钟 1min bar 的成交额 `amount`(RMB)**在参与率上限下估容量,报 capacity ratio(`>=1` 覆盖、`<1` 潜在受限)。新增 default-off `intraday.liquidity_diagnostics`(`enabled` 默认 false → 现存配置字节级不变;启用时 `portfolio_notional`>0、`max_participation_rate`∈(0,1]、仅 `mode=report_only`,各可读报错)。本地 handoff:`tmp/context/session_handoff_20260620/cc_goal_i5f_intraday_liquidity_diagnostics_retry_20260620/`。 + - **report-only 不变量(测试锁定 + 真实 smoke 双证)**:不改 fills / can_buy·can_sell / blocked reason / target 权重 / achieved holdings / turnover / cost / NAV / 因子分数 / MMP 分组 / alpha / 组合构建。容量**只用选定执行分钟 1min `amount`**,绝不用未来 bar、日频 amount/volume、日收盘、或 EOD 代理。`BacktestEngine` 加 additive、default-off `record_rebalance_plan`(默认 False → 循环字节级不变)捕获引擎真实用的 (target,current);诊断在 settle 后从已产出 log 构建,只读不写。既有 missing-bar/missing-price/raw stk_limit 阻挡**保留原 reason,绝不重分类为流动性阻挡**;missing/NaN/≤0 amount 报 missing capacity;零 desired trade 跳过防除零。 + - **真实 smoke(SSE50,2026-03-03→06-12,3 期,机器冻结)**:`covered=58/58 / stk_mins_live_calls=0 / blocked_fills=0`;**`final_nav=0.976448` 与已验收 I5b 逐字节一致** → 启用诊断未动账面(report-only 端到端证明)。诊断:**43** desired trades;**1** 被既有 I5b feasibility 挡(2026-04-30 涨停那笔,原 reason 保留);**0** missing-capacity;**42** 有可用 capacity ratio;**20** below 1.0x;ratio min/p10/median/p90 = **0.122 / 0.222 / 1.104 / 2.730**;最紧 trade `2026-04-30 601658.SH sell` ratio 0.122。 + - ⚠️ **解读(诚实)**:10M RMB 诊断名义 + 5% 参与率下,约一半被检 SSE50 单分钟 desired trade 容量不足——**支持后续做 size-aware 执行建模,但不证明 alpha/业绩/可交易性,也不外推到其他名义**。**非业绩声明、非策略改进**;partial-fill / volume-cap 强制不在本阶段(那是将来 I5g,须单独显式 goal)。I5f 与 MMP 正交,MMP 仍暂缓(I5e 负结果)。 - ✅ **数据层 D1 — cache/store 契约文档化 + token 解析去重**(**PR #41 已 merge 到 `main`**,行为保持型重构,非研究/非数据语义变更):数据层第一步低风险清理,只做两件事——把 `cache` vs `store` 边界写成可提交契约,并把重复的 token 解析收敛到既有 `data/feed/secret.py::read_token`。 - **契约文档** `docs/data/data_layer_contracts.md`:`data/cache` = 可复用 raw endpoint 缓存 / SoT;`data/store/PanelStore` = per-run canonical 面板 artifact(非 raw lake,`artifacts/data/*.parquet` 不当缓存权威);缓存只存 raw;`front_adjust` / PIT 成分 / PIT SW 行业 / `ann_date` 财务对齐 / raw 涨跌停检查 / factor·alpha·portfolio·runtime 数学全在下游;`data-update` 只暖缓存不跑研究;data-quality + 并发是后续阶段(不声称已实现)。 - **token 去重**:`tushare_feed.py` 删掉重复的 module-level `_lookup_dotted` + 内联 json/Path 解析(`_read_token` 变 `read_token(...)` 一行 wrapper);`index_feed.py` 不再从 `tushare_feed` 导入私有 `_lookup_dotted`,`_client` 直接走 `read_token`。`_lookup_dotted` 全仓清零;6 个 tushare feed(feed/index/flags/fina/intraday/covariates)统一走 `secret.read_token`。构造签名 / `__repr__` token 安全 / fetch+cache 路径全不变;+2 窄测试锁定 index feed 真实 token 路径(fake config、不碰网络、不泄漏)。 @@ -247,6 +251,6 @@ data → universe → factors(特征) → alpha(合成/预测) → portfolio(+ri - **缓存并发**(`TushareCache(max_workers=)`):`==1` 串行字节级不变;`>1` 且多 symbol → **只有日频密集 per-symbol 取数**走有界 `ThreadPoolExecutor`,**store upsert + ledger 写仍在主线程按计划序**(成功 gap 先 durable 再抛首个失败,失败 gap 不记覆盖、可重试;store/ledger 内容与取数完成序无关)。snapshot / `index_weight` 90 天分页 / intraday 在 D5 仍串行(并发开启时仍共享同一限频器)。 - **updater 接线**:`run_data_update` 仅 `max_workers>1` 才建**一个** `GlobalRateLimiter`(用 `rate_limit_per_min`),经 `_build_feeds` 共享给全部 feed(6 个 feed 加 `scheduler=None` 默认不变参);`UpdateResult`+`format_summary` 暴露 `max_workers`/全局 `rate_limit_per_min`(非密)。 - **测试**(`tests/test_scheduler.py` + `tests/test_data_update_concurrency.py`,network-free,21):全局时隙在争用下逐次升 sleep(fake clock)/ **8 线程实测全局非按线程**(`next_allowed==N*interval`)/ 重试逐次 acquire / scheduler 模式不做 per-call sleep / 失败 secret-safe(仅异常类型)/ feed 转发其 scheduler / config 校验(`<1` 拒;默认 1)/ **serial==concurrent** 帧·ledger·请求计数 / 失败留 gap 未覆盖可重试而成功 durable / empty·not_ready 不变 / 单 symbol 仍串行。真实 token 扫描 **0 hits**;**未跑 live `data-update`**(network-free 验收)。 -- ✅ 质量门:`pytest` **678 passed**(P0=97 / P1=78 / P2-1=22 / P2-2=22 / P2-3=14 / P2-4=8 / P3-1=10 / P3-2=18 / P3-3=16 / P3-4=15 / P3-5=22 / P3-6=27 / P3-7=25+1 throttle / P3-8=8 / P4-1=28 / P4-2=17 / **intraday I1 schema=14 + feed=9 / I2 cache=10 / I3 aggregate=13 / I4 execution=10 / P4-3 cache=10 + updater=7 / P-I5a event-backtest=19 / P-I5b exec-feasibility=16 / P-I5c mmp-minute=18 / P-I5d mmp-quintile=19 / P-I5e 仅 config(无新测试,`test_cache_config` 的 config glob 自动 +1)/ D1 token-dedup index-feed +2 / D2 cache-modularization +5 / D3 data-quality market=15 + intraday=12 + report=14 / D3b data-update-quality=18 / D4 coverage-ledger-scaling=13 / D5 scheduler=9 + concurrency=12**);`ruff` clean;`validate-config`(全部 18 配置含 data_update + phase_i5a + phase_i5b + phase_i5c + phase_i5d + phase_i5e)+ `run-phase0`(demo)均 OK(**ic 0.9600 / annual 0.8408 不变**)。 +- ✅ 质量门:`pytest` **696 passed**(P0=97 / P1=78 / P2-1=22 / P2-2=22 / P2-3=14 / P2-4=8 / P3-1=10 / P3-2=18 / P3-3=16 / P3-4=15 / P3-5=22 / P3-6=27 / P3-7=25+1 throttle / P3-8=8 / P4-1=28 / P4-2=17 / **intraday I1 schema=14 + feed=9 / I2 cache=10 / I3 aggregate=13 / I4 execution=10 / P4-3 cache=10 + updater=7 / P-I5a event-backtest=19 / P-I5b exec-feasibility=16 / P-I5c mmp-minute=18 / P-I5d mmp-quintile=19 / P-I5e 仅 config(无新测试,`test_cache_config` 的 config glob 自动 +1)/ P-I5f intraday-liquidity=17(+ `test_cache_config` config glob 自动 +1)/ D1 token-dedup index-feed +2 / D2 cache-modularization +5 / D3 data-quality market=15 + intraday=12 + report=14 / D3b data-update-quality=18 / D4 coverage-ledger-scaling=13 / D5 scheduler=9 + concurrency=12**);`ruff` clean;`validate-config`(全部 19 配置含 data_update + phase_i5a + phase_i5b + phase_i5c + phase_i5d + phase_i5e + phase_i5f)+ `run-phase0`(demo)均 OK(**ic 0.9600 / annual 0.8408 不变**)。 - ⚠️ 剩余(已显式披露):日线 only、demo 路径非真数据、旧三因子无信号(P3-3/P3-4 实证;但其组合在 2024-2026 holdout 上 SSE50/CSI300/CSI500 全正、CSI500 高达 +17.8%——小样本/regime 翻转的持续例证);value/低波信号获得**独立样本符号级确认**(P3-7 SSE50/CSI300 量级衰减;P3-8 CSI500 泛化成立且更强),组合级盈利能力仍未确立(排名跨 cell 翻转);subset 报告文件名已可配置(P3-8 起不再互覆盖)。 -- 路线图下一步:**MMP 暂缓推进(I5e 负结果)**(I5e 已在独立 universe CSI300 同窗口机器冻结复跑 → 单调性 **FAILS/反转**(Spearman −0.5,Q5 高 MMP 最差,合成 Q5−Q1 累计 −26.77%);I5d 的 CSI500 单调性疑 universe/regime 特异、**非稳健** → **在出现 disjoint 窗口 / 第三 universe 的正向证据前,不把 MMP 当稳健或可交易信号推进**;新 intraday 因子候选只作显式 EXPLORATORY 工作);**I5b/执行 follow-up**(执行期 feasibility 可再扩 partial-fill / liquidity / volume cap,size-aware 读数前补);**P4-3 follow-up**(fina 按 ann_date 建披露日历 ledger 以去掉启发式 tail / updater 加 stk_mins 历史回填 / data-update summary 落 cache-stats artifact);**数据层 D6**(D1+D2+D3+D3b+D4+D5 已 merge:契约文档化 + token 解析收敛 + `TushareCache` specs/parsers 拆分 + report-only `data/quality/` 质量层 + default-off `data-update` 质量报告钩子 + coverage ledger `record_many` 批量写 + 进程内查找缓存 + opt-in 有界并发 + 全局限频器;剩余数据层 follow-up:**endpoint schema registry** 仍延后;**D6**=`PanelStore` append/partition / 可选物化派生面板存储,**仅当因子研究需要可复用派生面板时才启动**——均尚未实现);研究侧:更长 holdout 滚动复检 / 成本模型细化。 +- 路线图下一步:**MMP 暂缓推进(I5e 负结果)**(I5e 已在独立 universe CSI300 同窗口机器冻结复跑 → 单调性 **FAILS/反转**(Spearman −0.5,Q5 高 MMP 最差,合成 Q5−Q1 累计 −26.77%);I5d 的 CSI500 单调性疑 universe/regime 特异、**非稳健** → **在出现 disjoint 窗口 / 第三 universe 的正向证据前,不把 MMP 当稳健或可交易信号推进**;新 intraday 因子候选只作显式 EXPLORATORY 工作);**I5f 已落地 → I5g(可选,须单独显式 goal)**(I5f 已加 report-only 执行流动性/容量诊断,实测 10M RMB/5% 参与率下约半数 SSE50 单分钟 desired trade 容量不足;**强制 partial-fill / volume-cap(真正约束成交)= 可能的 I5g,仅在单独显式 goal 后启动**,本阶段未做,不声称已实现);**P4-3 follow-up**(fina 按 ann_date 建披露日历 ledger 以去掉启发式 tail / updater 加 stk_mins 历史回填 / data-update summary 落 cache-stats artifact);**数据层 D6**(D1+D2+D3+D3b+D4+D5 已 merge:契约文档化 + token 解析收敛 + `TushareCache` specs/parsers 拆分 + report-only `data/quality/` 质量层 + default-off `data-update` 质量报告钩子 + coverage ledger `record_many` 批量写 + 进程内查找缓存 + opt-in 有界并发 + 全局限频器;剩余数据层 follow-up:**endpoint schema registry** 仍延后;**D6**=`PanelStore` append/partition / 可选物化派生面板存储,**仅当因子研究需要可复用派生面板时才启动**——均尚未实现);研究侧:更长 holdout 滚动复检 / 成本模型细化。 diff --git a/CLAUDE.md b/CLAUDE.md index d36b2f3..3359348 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -57,7 +57,7 @@ data → universe → factors(特征) → alpha(合成/预测) → portfolio(+ri ## 开发约定 - **交流中文**;代码/注释/commit message 用**英文**。 -- **Git**:feature 分支 + PR。**PR #1(P0+P1)、#2(P2-1)、#3(P2-2)、#4(进度文档)、#5(P2-3)、#6(进度文档)、#7(P2-4)、#8(进度文档)、#9(P3-1)、#10(进度文档)、#11(P3-2)、#12(P3-3)、#13(进度文档)、#14(P3-4)、#15(进度文档)、#16(P3-5)、#17(进度文档)、#18(P3-6)、#19(P3-7)、#20(进度文档)、#21(P3-8)、#22(进度文档)、#23(P4-1)、#24(进度文档)、#25(P4-2)、#28(tushare 权限/限频探测 + capability registry)、#29(I1–I4 分钟级 intraday pipeline,4 commit 一 PR)、#30(进度文档)、#31(P4-3 因子支撑端点缓存 + 21:00 data updater,2 commit 一 PR)、#33(P-I5a 事件驱动回测架构重构 + opt-in 分钟尾盘 event model,4 commit 一 PR)、#35(P-I5b 分钟尾盘执行期 raw stk_limit 涨跌停可行性,4 commit 一 PR)、#37(P-I5c MMP 分钟因子端到端 opt-in alpha)、#39(P-I5d MMP 五分位分组回测 standalone,含 I5c plumbing)、#41(数据层 D1 契约文档 + token 解析去重)、#43(数据层 D2 TushareCache specs/parsers 拆分)、#45(数据层 D3 report-only 数据质量层)、#47(数据层 D3b default-off `data-update` 质量报告钩子)、#49(数据层 D4 coverage ledger 批量写 + 进程内查找缓存)、#51(数据层 D5 opt-in 有界并发 + 全局限频器)、#53(P-I5e MMP 五分位 CSI300 独立泛化检验,负结果)均已 merge 到 `main`**。commit 用 conventional 格式,**无 attribution**(不加 Co-Authored-By)。 +- **Git**:feature 分支 + PR。**PR #1(P0+P1)、#2(P2-1)、#3(P2-2)、#4(进度文档)、#5(P2-3)、#6(进度文档)、#7(P2-4)、#8(进度文档)、#9(P3-1)、#10(进度文档)、#11(P3-2)、#12(P3-3)、#13(进度文档)、#14(P3-4)、#15(进度文档)、#16(P3-5)、#17(进度文档)、#18(P3-6)、#19(P3-7)、#20(进度文档)、#21(P3-8)、#22(进度文档)、#23(P4-1)、#24(进度文档)、#25(P4-2)、#28(tushare 权限/限频探测 + capability registry)、#29(I1–I4 分钟级 intraday pipeline,4 commit 一 PR)、#30(进度文档)、#31(P4-3 因子支撑端点缓存 + 21:00 data updater,2 commit 一 PR)、#33(P-I5a 事件驱动回测架构重构 + opt-in 分钟尾盘 event model,4 commit 一 PR)、#35(P-I5b 分钟尾盘执行期 raw stk_limit 涨跌停可行性,4 commit 一 PR)、#37(P-I5c MMP 分钟因子端到端 opt-in alpha)、#39(P-I5d MMP 五分位分组回测 standalone,含 I5c plumbing)、#41(数据层 D1 契约文档 + token 解析去重)、#43(数据层 D2 TushareCache specs/parsers 拆分)、#45(数据层 D3 report-only 数据质量层)、#47(数据层 D3b default-off `data-update` 质量报告钩子)、#49(数据层 D4 coverage ledger 批量写 + 进程内查找缓存)、#51(数据层 D5 opt-in 有界并发 + 全局限频器)、#53(P-I5e MMP 五分位 CSI300 独立泛化检验,负结果)、#55(P-I5f 分钟尾盘执行流动性/容量诊断,report-only)均已 merge 到 `main`**。commit 用 conventional 格式,**无 attribution**(不加 Co-Authored-By)。 - **不过度设计**:按路线图 MVP 先打通一条端到端链路,再加层(architecture.html §11,Phase 0→3)。 - **secrets** 一律走外部 `.config.json`;repo `.gitignore` 已排除数据产物(`*.parquet`等)、缓存、`tmp/`(仅留架构文档)。 - 文件小而专(<800 行),immutable 优先。 @@ -219,6 +219,10 @@ data → universe → factors(特征) → alpha(合成/预测) → portfolio(+ri - **结论:FAILS / 不泛化**。final NAV Q1→Q5 **0.8809 / 0.7377 / 0.9418 / 0.7573 / 0.6665**;年化 **−2.55% / −6.00% / −1.21% / −5.50% / −7.92%**;**单调 Spearman −0.5000**(vs CSI500 +1.0000);合成 Q5−Q1 累计 **−26.77%**(vs CSI500 +17.15%)。**Q5(高 MMP)在 CSI300 上最差**——高 MMP 组不跑赢低 MMP 组,I5d 的 CSI500 单调性在独立 universe 上**反转**,强烈提示其为 universe/regime 特异、非稳健因子属性。这正是独立检验要拿到的证据。 - ⚠️ **caveat(保留)**:单因子/单重叠 5 年窗口/单 universe;Q5−Q1 是合成 long-only 腿差非 dollar-neutral 执行;丢弃未覆盖分钟名的 coverage bias;执行模型仍缺 partial-fill/liquidity/volume-cap;无调参/无 learned alpha;**非业绩声明**。CSI500 对照仅作 context,不作任何组业绩声明。 - **回归不破 + 范围克制**:phase0 `0.9600/0.8408` 不变;`pytest` 678 passed(677 基线 + `test_cache_config.py` 的 `config/*.yaml` glob 参数化自动覆盖新 config 的 +1,无新测试文件);**不动 progress docs 以外的代码/config/test**,不碰 schema registry / D6;**PR #38 未动**。 +- ✅ **P-I5f 分钟尾盘执行流动性诊断**(**PR #55 已 merge 到 `main`**,**执行真实性诊断、非因子研究结果;report-only**):给分钟尾盘链路加 opt-in、**report-only** 执行流动性诊断——对每笔 desired trade `|target_w − current_w|`,用**选定执行分钟 1min bar 的成交额 `amount`(RMB)**在参与率上限下估容量,报 capacity ratio(`>=1` 覆盖、`<1` 潜在受限)。新增 default-off `intraday.liquidity_diagnostics`(`enabled` 默认 false → 现存配置字节级不变;启用时 `portfolio_notional`>0、`max_participation_rate`∈(0,1]、仅 `mode=report_only`,各可读报错)。本地 handoff:`tmp/context/session_handoff_20260620/cc_goal_i5f_intraday_liquidity_diagnostics_retry_20260620/`。 + - **report-only 不变量(测试锁定 + 真实 smoke 双证)**:不改 fills / can_buy·can_sell / blocked reason / target 权重 / achieved holdings / turnover / cost / NAV / 因子分数 / MMP 分组 / alpha / 组合构建。容量**只用选定执行分钟 1min `amount`**,绝不用未来 bar、日频 amount/volume、日收盘、或 EOD 代理。`BacktestEngine` 加 additive、default-off `record_rebalance_plan`(默认 False → 循环字节级不变)捕获引擎真实用的 (target,current);诊断在 settle 后从已产出 log 构建,只读不写。既有 missing-bar/missing-price/raw stk_limit 阻挡**保留原 reason,绝不重分类为流动性阻挡**;missing/NaN/≤0 amount 报 missing capacity;零 desired trade 跳过防除零。 + - **真实 smoke(SSE50,2026-03-03→06-12,3 期,机器冻结)**:`covered=58/58 / stk_mins_live_calls=0 / blocked_fills=0`;**`final_nav=0.976448` 与已验收 I5b 逐字节一致** → 启用诊断未动账面(report-only 端到端证明)。诊断:**43** desired trades;**1** 被既有 I5b feasibility 挡(2026-04-30 涨停那笔,原 reason 保留);**0** missing-capacity;**42** 有可用 capacity ratio;**20** below 1.0x;ratio min/p10/median/p90 = **0.122 / 0.222 / 1.104 / 2.730**;最紧 trade `2026-04-30 601658.SH sell` ratio 0.122。 + - ⚠️ **解读(诚实)**:10M RMB 诊断名义 + 5% 参与率下,约一半被检 SSE50 单分钟 desired trade 容量不足——**支持后续做 size-aware 执行建模,但不证明 alpha/业绩/可交易性,也不外推到其他名义**。**非业绩声明、非策略改进**;partial-fill / volume-cap 强制不在本阶段(那是将来 I5g,须单独显式 goal)。I5f 与 MMP 正交,MMP 仍暂缓(I5e 负结果)。 - ✅ **数据层 D1 — cache/store 契约文档化 + token 解析去重**(**PR #41 已 merge 到 `main`**,行为保持型重构,非研究/非数据语义变更):数据层第一步低风险清理,只做两件事——把 `cache` vs `store` 边界写成可提交契约,并把重复的 token 解析收敛到既有 `data/feed/secret.py::read_token`。 - **契约文档** `docs/data/data_layer_contracts.md`:`data/cache` = 可复用 raw endpoint 缓存 / SoT;`data/store/PanelStore` = per-run canonical 面板 artifact(非 raw lake,`artifacts/data/*.parquet` 不当缓存权威);缓存只存 raw;`front_adjust` / PIT 成分 / PIT SW 行业 / `ann_date` 财务对齐 / raw 涨跌停检查 / factor·alpha·portfolio·runtime 数学全在下游;`data-update` 只暖缓存不跑研究;data-quality + 并发是后续阶段(不声称已实现)。 - **token 去重**:`tushare_feed.py` 删掉重复的 module-level `_lookup_dotted` + 内联 json/Path 解析(`_read_token` 变 `read_token(...)` 一行 wrapper);`index_feed.py` 不再从 `tushare_feed` 导入私有 `_lookup_dotted`,`_client` 直接走 `read_token`。`_lookup_dotted` 全仓清零;6 个 tushare feed(feed/index/flags/fina/intraday/covariates)统一走 `secret.read_token`。构造签名 / `__repr__` token 安全 / fetch+cache 路径全不变;+2 窄测试锁定 index feed 真实 token 路径(fake config、不碰网络、不泄漏)。 @@ -247,6 +251,6 @@ data → universe → factors(特征) → alpha(合成/预测) → portfolio(+ri - **缓存并发**(`TushareCache(max_workers=)`):`==1` 串行字节级不变;`>1` 且多 symbol → **只有日频密集 per-symbol 取数**走有界 `ThreadPoolExecutor`,**store upsert + ledger 写仍在主线程按计划序**(成功 gap 先 durable 再抛首个失败,失败 gap 不记覆盖、可重试;store/ledger 内容与取数完成序无关)。snapshot / `index_weight` 90 天分页 / intraday 在 D5 仍串行(并发开启时仍共享同一限频器)。 - **updater 接线**:`run_data_update` 仅 `max_workers>1` 才建**一个** `GlobalRateLimiter`(用 `rate_limit_per_min`),经 `_build_feeds` 共享给全部 feed(6 个 feed 加 `scheduler=None` 默认不变参);`UpdateResult`+`format_summary` 暴露 `max_workers`/全局 `rate_limit_per_min`(非密)。 - **测试**(`tests/test_scheduler.py` + `tests/test_data_update_concurrency.py`,network-free,21):全局时隙在争用下逐次升 sleep(fake clock)/ **8 线程实测全局非按线程**(`next_allowed==N*interval`)/ 重试逐次 acquire / scheduler 模式不做 per-call sleep / 失败 secret-safe(仅异常类型)/ feed 转发其 scheduler / config 校验(`<1` 拒;默认 1)/ **serial==concurrent** 帧·ledger·请求计数 / 失败留 gap 未覆盖可重试而成功 durable / empty·not_ready 不变 / 单 symbol 仍串行。真实 token 扫描 **0 hits**;**未跑 live `data-update`**(network-free 验收)。 -- ✅ 质量门:`pytest` **678 passed**(P0=97 / P1=78 / P2-1=22 / P2-2=22 / P2-3=14 / P2-4=8 / P3-1=10 / P3-2=18 / P3-3=16 / P3-4=15 / P3-5=22 / P3-6=27 / P3-7=25+1 throttle / P3-8=8 / P4-1=28 / P4-2=17 / **intraday I1 schema=14 + feed=9 / I2 cache=10 / I3 aggregate=13 / I4 execution=10 / P4-3 cache=10 + updater=7 / P-I5a event-backtest=19 / P-I5b exec-feasibility=16 / P-I5c mmp-minute=18 / P-I5d mmp-quintile=19 / P-I5e 仅 config(无新测试,`test_cache_config` 的 config glob 自动 +1)/ D1 token-dedup index-feed +2 / D2 cache-modularization +5 / D3 data-quality market=15 + intraday=12 + report=14 / D3b data-update-quality=18 / D4 coverage-ledger-scaling=13 / D5 scheduler=9 + concurrency=12**);`ruff` clean;`validate-config`(全部 18 配置含 data_update + phase_i5a + phase_i5b + phase_i5c + phase_i5d + phase_i5e)+ `run-phase0`(demo)均 OK(**ic 0.9600 / annual 0.8408 不变**)。 +- ✅ 质量门:`pytest` **696 passed**(P0=97 / P1=78 / P2-1=22 / P2-2=22 / P2-3=14 / P2-4=8 / P3-1=10 / P3-2=18 / P3-3=16 / P3-4=15 / P3-5=22 / P3-6=27 / P3-7=25+1 throttle / P3-8=8 / P4-1=28 / P4-2=17 / **intraday I1 schema=14 + feed=9 / I2 cache=10 / I3 aggregate=13 / I4 execution=10 / P4-3 cache=10 + updater=7 / P-I5a event-backtest=19 / P-I5b exec-feasibility=16 / P-I5c mmp-minute=18 / P-I5d mmp-quintile=19 / P-I5e 仅 config(无新测试,`test_cache_config` 的 config glob 自动 +1)/ P-I5f intraday-liquidity=17(+ `test_cache_config` config glob 自动 +1)/ D1 token-dedup index-feed +2 / D2 cache-modularization +5 / D3 data-quality market=15 + intraday=12 + report=14 / D3b data-update-quality=18 / D4 coverage-ledger-scaling=13 / D5 scheduler=9 + concurrency=12**);`ruff` clean;`validate-config`(全部 19 配置含 data_update + phase_i5a + phase_i5b + phase_i5c + phase_i5d + phase_i5e + phase_i5f)+ `run-phase0`(demo)均 OK(**ic 0.9600 / annual 0.8408 不变**)。 - ⚠️ 剩余(已显式披露):日线 only、demo 路径非真数据、旧三因子无信号(P3-3/P3-4 实证;但其组合在 2024-2026 holdout 上 SSE50/CSI300/CSI500 全正、CSI500 高达 +17.8%——小样本/regime 翻转的持续例证);value/低波信号获得**独立样本符号级确认**(P3-7 SSE50/CSI300 量级衰减;P3-8 CSI500 泛化成立且更强),组合级盈利能力仍未确立(排名跨 cell 翻转);subset 报告文件名已可配置(P3-8 起不再互覆盖)。 -- 路线图下一步:**MMP 暂缓推进(I5e 负结果)**(I5e 已在独立 universe CSI300 同窗口机器冻结复跑 → 单调性 **FAILS/反转**(Spearman −0.5,Q5 高 MMP 最差,合成 Q5−Q1 累计 −26.77%);I5d 的 CSI500 单调性疑 universe/regime 特异、**非稳健** → **在出现 disjoint 窗口 / 第三 universe 的正向证据前,不把 MMP 当稳健或可交易信号推进**;新 intraday 因子候选只作显式 EXPLORATORY 工作);**I5b/执行 follow-up**(执行期 feasibility 可再扩 partial-fill / liquidity / volume cap,size-aware 读数前补);**P4-3 follow-up**(fina 按 ann_date 建披露日历 ledger 以去掉启发式 tail / updater 加 stk_mins 历史回填 / data-update summary 落 cache-stats artifact);**数据层 D6**(D1+D2+D3+D3b+D4+D5 已 merge:契约文档化 + token 解析收敛 + `TushareCache` specs/parsers 拆分 + report-only `data/quality/` 质量层 + default-off `data-update` 质量报告钩子 + coverage ledger `record_many` 批量写 + 进程内查找缓存 + opt-in 有界并发 + 全局限频器;剩余数据层 follow-up:**endpoint schema registry** 仍延后;**D6**=`PanelStore` append/partition / 可选物化派生面板存储,**仅当因子研究需要可复用派生面板时才启动**——均尚未实现);研究侧:更长 holdout 滚动复检 / 成本模型细化。 +- 路线图下一步:**MMP 暂缓推进(I5e 负结果)**(I5e 已在独立 universe CSI300 同窗口机器冻结复跑 → 单调性 **FAILS/反转**(Spearman −0.5,Q5 高 MMP 最差,合成 Q5−Q1 累计 −26.77%);I5d 的 CSI500 单调性疑 universe/regime 特异、**非稳健** → **在出现 disjoint 窗口 / 第三 universe 的正向证据前,不把 MMP 当稳健或可交易信号推进**;新 intraday 因子候选只作显式 EXPLORATORY 工作);**I5f 已落地 → I5g(可选,须单独显式 goal)**(I5f 已加 report-only 执行流动性/容量诊断,实测 10M RMB/5% 参与率下约半数 SSE50 单分钟 desired trade 容量不足;**强制 partial-fill / volume-cap(真正约束成交)= 可能的 I5g,仅在单独显式 goal 后启动**,本阶段未做,不声称已实现);**P4-3 follow-up**(fina 按 ann_date 建披露日历 ledger 以去掉启发式 tail / updater 加 stk_mins 历史回填 / data-update summary 落 cache-stats artifact);**数据层 D6**(D1+D2+D3+D3b+D4+D5 已 merge:契约文档化 + token 解析收敛 + `TushareCache` specs/parsers 拆分 + report-only `data/quality/` 质量层 + default-off `data-update` 质量报告钩子 + coverage ledger `record_many` 批量写 + 进程内查找缓存 + opt-in 有界并发 + 全局限频器;剩余数据层 follow-up:**endpoint schema registry** 仍延后;**D6**=`PanelStore` append/partition / 可选物化派生面板存储,**仅当因子研究需要可复用派生面板时才启动**——均尚未实现);研究侧:更长 holdout 滚动复检 / 成本模型细化。