# 池级特征回填 · 对照报告 v1（Mac 侧，沙盒；口径 = RULING c33b091）

- 输入 baseline: `/Users/xpresso/zt_app/backtest_zt_full/strength_baseline.csv`（6013 行）；缓存: `/tmp/pool_cache_v1`（目录口径，非 members.pkl 名单）
- 输出基线副本: `/tmp/baseline_backfilled_v1.csv`；170 行逐行留痕: `/tmp/pool_backfill_diffs_v1.csv`（170 行）

## ① 两张缓存表行数与首末日期

- pool_signal_count.csv（含 n_sig=C(d), c_mean250） · hs300: **1382 行**, 20210104 ~ 20260914
- pool_signal_count.csv（含 n_sig=C(d), c_mean250） · zz500: **1382 行**, 20210104 ~ 20260914
- pool_signal_count.csv（含 n_sig=C(d), c_mean250） · zz1000: **1382 行**, 20210104 ~ 20260914
- pool_signal_count.csv（含 n_sig=C(d), c_mean250） · zz2000: **1382 行**, 20210104 ~ 20260914
- pool_daily_stats.csv（n_zt/avg_ret/n_codes） · hs300: **1382 行**, 20210104 ~ 20260914
- pool_daily_stats.csv（n_zt/avg_ret/n_codes） · zz500: **1382 行**, 20210104 ~ 20260914
- pool_daily_stats.csv（n_zt/avg_ret/n_codes） · zz1000: **1382 行**, 20210104 ~ 20260914
- pool_daily_stats.csv（n_zt/avg_ret/n_codes） · zz2000: **1382 行**, 20210104 ~ 20260914

## ② tb 推导交叉验证（日历规则 vs chain_for_buy）

- 全表 6013 行: 两路一致 **5904** 行, 存疑 **109** 行（chain 推不出 107 行; chain ≠ 日历 tb 2 行）
- chain 推不出的 buy_date 分布: {'20260826': 1, '20260901': 12, '20260902': 29, '20260903': 8, '20260904': 9, '20260907': 5, '20260908': 13, '20260909': 17, '20260910': 13}
- 定性: 集中在 20260826~20260910（0913 修准前写入的信号行）⇒ 现行数据口径下信号不成立；与"方案 B 掉键"同一批。处置待 Owner 签批（本报告保守填值不删行）。

## ③ 170 行: tb 口径重算 vs 原存值（原值 = 全目录+买入日 口径的历史实时值）

- 容差基准（裁定 §5）: 池级 **绝对 1e-2**；判据以 strength 1e-4 为准（strength 需全表重派生后另比）
- **f12_crowd_pool**: 新旧皆非空 170 行; |Δ| 中位 0.513622 / p90 1.909022 / 最大 4.052256; 达标(≤1e-2) 5/170 行; 重算后 NaN 0 行
- **f13_pool_zt**: 新旧皆非空 170 行; |Δ| 中位 0.800000 / p90 1.300000 / 最大 2.100000; 达标(≤1e-2) 6/170 行; 重算后 NaN 0 行
- **f14_pool_avgret**: 新旧皆非空 170 行; |Δ| 中位 0.722466 / p90 1.788413 / 最大 2.824552; 达标(≤1e-2) 0/170 行; 重算后 NaN 0 行

注: 存值是「买入日 + 全目录」口径 ⇒ 换成 tb 口径后**按定义**必然变动（前视消除的代价），1e-2 容差**不适用于"新 vs 旧存值"**，只适用于"同一新口径的两个实现之间"（对端独立复核用）。
验证(决定性): 用**同一新口径**但把取值日换成 buy_date，与存值重合到 1e-7 量级（`chk_pool_stat_variants.py` 的 all_buy 变体; 对端独立复核 zz1000 20260903 实测 Δ=3.8e-07）⇒ 上表 |Δ| 全部来自 **tb↔buy_date 日错位**，不含实现误差。

## ④ NaN 计数

| pool | 行数 | 任一 NaN | 原因: 当日无行情文件 | 存疑行(单列) |
|---|---|---|---|---|
| hs300 | 191 | 0 | 0 | 2 |
| zz500 | 317 | 0 | 0 | 10 |
| zz1000 | 1217 | 0 | 0 | 31 |
| zz2000 | 4288 | 0 | 0 | 66 |

## ⑤ 不可近似还原的日期段（披露）

- hs300: 目录首个交易日 20210104, 当日文件数中位 450, 最少 423；文件数 <50% 中位的日期段: 无
- zz500: 目录首个交易日 20210104, 当日文件数中位 937, 最少 858；文件数 <50% 中位的日期段: 无
- zz1000: 目录首个交易日 20210104, 当日文件数中位 1907, 最少 1648；文件数 <50% 中位的日期段: 无
- zz2000: 目录首个交易日 20210104, 当日文件数中位 1917, 最少 1405；文件数 <50% 中位的日期段: 无
- 说明: 目录口径下"名单为空"不再是问题（不读 members.pkl）；上表列出的是**行情覆盖稀疏**的日期段 ——
  这些日子的 n_zt/avg_ret 由当日实际有行情的文件得出，与当时"成分"可能有偏差，回填值已按当日实际计算并留痕。

## ⑥ 口径清单（v1 = pool-feat-v1，待 Owner 签批生效）

- 成员集 = 该池日线目录当日全部有行情文件（对端实测复核；本端 all_buy 变体独立重合）
- 池级统计日期 = 信号日 tb（裁定 ②），废止买入日口径（消除前视）
- f12 = C(tb)/max(1, mean(C(tb-250..tb-1)))，C 与 scan all_sig 同语义（同 code 多链计多次），不读 baseline ⇒ 幂等
- f13 = n_zt(tb)/20（阈值 9.8）；f14 = avg_ret(tb) 百分数单位
- NaN: 当日无行情文件 → 三特征 NaN（不插值）；f12 分母下限 max(1, ·)
