# 池级特征回填 · 对照报告（Mac 侧，沙盒）

- 输入 baseline: `/Users/xpresso/zt_app/backtest_zt_full/strength_baseline.csv`（6013 行）；缓存: `/tmp/pool_cache_sbx`
- 输出基线副本: `/tmp/baseline_backfilled.csv`；170 行逐行留痕: `/tmp/pool_backfill_diffs.csv`（170 行）

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

- pool_signal_count.csv · hs300: **311 行**, 20210112 ~ 20260827
- pool_signal_count.csv · zz500: **571 行**, 20210113 ~ 20260909
- pool_signal_count.csv · zz1000: **1084 行**, 20210112 ~ 20260911
- pool_signal_count.csv · zz2000: **1308 行**, 20210112 ~ 20260911
- pool_daily_stats.csv · hs300: **1382 行**, 20210104 ~ 20260914
- pool_daily_stats.csv · zz500: **1382 行**, 20210104 ~ 20260914
- pool_daily_stats.csv · zz1000: **1382 行**, 20210104 ~ 20260914
- pool_daily_stats.csv · zz2000: **1382 行**, 20210104 ~ 20260914

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

- 全表 6013 行: 两路一致 **5904** 行, 存疑 **109** 行（其中 chain 完全推不出 107 行，推得出但与日历规则不同 2 行）
- 存疑构成: **chain 完全推不出 107 行**（buy_date 分布 {'20260826': 1, '20260901': 12, '20260902': 29, '20260903': 8, '20260904': 9, '20260907': 5, '20260908': 13, '20260909': 17, '20260910': 13}）；chain 推得出但与日历规则不同 2 行（[{'code': '300277.SZ', 'buy_date': '20241111', 'tb': '20241108'}, {'code': '002931.SZ', 'buy_date': '20251225', 'tb': '20251224'}]）
- 定性: "chain 推不出"的行集中在 **20260826~20260910**（0913 数据修准前写入的信号行）。其 `chain_for_buy` 在**修准后数据**上推不出 tb ⇒ 这批"信号"在现行数据口径下不成立（与"方案 B 会掉键"是同一批行的不同侧面）。
  待研究侧定: ①这 107 行按 tb 口径填池级特征（本报告采用，保守不删行），还是 ②按方案 B 视为脏行删除。
- 日历规则(tb = buy_date 前一交易日)对全部 6013 行都可用 ⇒ 池级特征 **NaN 仅可能来自 n_members/f12 历史**，本表两类均为 0。

## ③ 170 行既有池级特征: tb 口径重算 vs 原存值（原值=buy_date 口径的历史实时值）

- 可比行数: 存疑 65 / 可信 105
- **f12_crowd_pool**: 新旧皆非空 170 行; 相对偏差 中位 45.40% / p90 100.00% / 最大 263.55%; 重算后 NaN 0 行
  - 容差判据(§3 双条件, 以现存实时值为基准): 相对 ≤0.5% 的行 0/170; 秩相关 rho=0.5045
- **f13_pool_zt**: 新旧皆非空 170 行; 相对偏差 中位 41.30% / p90 72.22% / 最大 100.00%; 重算后 NaN 0 行
  - 容差判据(§3 双条件, 以现存实时值为基准): 相对 ≤0.5% 的行 3/170; 秩相关 rho=0.5799
- **f14_pool_avgret**: 新旧皆非空 170 行; 相对偏差 中位 76.63% / p90 356.71% / 最大 1064.77%; 重算后 NaN 0 行
  - 容差判据(§3 双条件, 以现存实时值为基准): 相对 ≤0.5% 的行 0/170; 秩相关 rho=0.2311

## ④ NaN 计数（分原因）

| pool | 行数 | 任一 NaN | 原因: 成分股缺失 | 原因: f12 历史<20日 | 存疑行(单列) |
|---|---|---|---|---|---|
| hs300 | 191 | 0 | 0 | 0 | 2 |
| zz500 | 317 | 0 | 0 | 0 | 10 |
| zz1000 | 1217 | 0 | 0 | 0 | 31 |
| zz2000 | 4288 | 0 | 0 | 0 | 66 |

## ⑤ 口径变更清单（须研究侧确认后落库）

- 池级统计口径: **买入日 → 信号日 tb**（裁定 §1）✓ 已按此实现
- f12 分母: baseline 反推 → **独立缓存 `pool_signal_count.csv` 的过去 60 交易日滚动均值**（裁定 §2）✓
- 成分股口径: 原实现取池目录**全部**有行情代码；本实现取 `{pool}_members.pkl` **时点快照**（≤当日最近月末快照）
  —— 裁定原文写"现行名单"，但其语义为"成分股家数"；pkl 里**确有月度时点快照**，用它更忠实（两口径可并列给出）
- f13 涨停阈值取 **9.8**（裁定 §1 原文）；原实现阈值需与之一致
- 置信度: 存疑 65 行 + member_miss 行按上表处理方式待确认
