# 12 键差归因报告（Mac 侧，隔离实验裁定）

## 0 结论（一句话）
对端问的 12 键差（11「仅重跑有」+ 1「仅重建版有」）**全部由 0913 的 adj_factor 修准造成**：
用**修准前**的池日线（`_adjfactor_repair_backup/`，0913 15:05 快照）跑**同一套代码路径**，
复现出**重建版 88438d5 的键集合**（0824 恰 6 键、0826 恰 10 键且含 000505.SZ）；
用**修准后**数据跑则复现出**重跑键集合**（5786，两端同数）。⇒ 不是路径差、不是成员名单差。

## 1 「仅重建版有」的那 1 个键
**000505.SZ / buy_date=20260826 / pool=zz2000 / tb=20260825**
- 记录版(88438d5^) 无此键；重建版(88438d5) 与现行 HEAD baseline 均有；修准后重跑无。
- 其记录特征: f1_t0_pct=10.0486, f2_t0_vol_ratio=5.189286161953245, f3_ta_shrink=1.0842152002216845, f4_ta_drawdown=-0.0191420674308893, f5_ta_gap=4.0, f6_tb_strength=0.0279859654041079, f7_tb_gap=5.0, f8_chain_len=6.0, f9_tb_vol=2.032377612990744, f10_tb_ma5_slope=0.0539825874066945, f11_tb_ma_align=1.0
- 修准前树上 **复现存在**（0826 的 10 键里含它）⇒ 属"被修准抹掉的边缘键"。

## 2 那 11 个键的方向（本端逐键核对结果）
不是"仅重跑有 vs 记录版"——**记录版与重建版都没有它们**，修准前树上也**全部缺席**，只在修准后成立：

| code | pool | buy_date | tb | m_t0 | m_tb | m_ta | m_min |
|---|---|---|---|---|---|---|---|
| 002045.SZ | zz1000 | 20260824 | 20260821 | 1.37e-01 | 7.43e-02 | 2.25e-02 | -2.14e-01 |
| 000603.SZ | zz1000 | 20260824 | 20260821 | 1.50e-01 | 6.33e-02 | 2.56e-02 | 2.56e-02 |
| 000506.SZ | zz1000 | 20260824 | 20260821 | 1.33e-01 | 4.16e-02 | 5.13e-03 | 5.13e-03 |
| 301550.SZ | zz1000 | 20260824 | 20260821 | 1.50e-01 | 9.15e-03 | 7.99e-02 | -2.28e-01 |
| 601616.SH | zz2000 | 20260824 | 20260821 | 2.95e-01 | 5.26e-03 | 5.45e-03 | 5.26e-03 |
| 000751.SZ | zz2000 | 20260824 | 20260821 | 2.58e-01 | 3.91e-03 | 6.15e-03 | 3.91e-03 |
| 600397.SH | zz2000 | 20260824 | 20260821 | 1.83e-01 | 7.40e-02 | — | 7.40e-02 |
| 002686.SZ | zz2000 | 20260824 | 20260821 | 2.00e-01 | 2.28e-02 | 1.65e-03 | 1.65e-03 |
| 603052.SH | zz2000 | 20260824 | 20260821 | 1.59e-01 | 5.11e-02 | 5.53e-04 | 5.53e-04 |
| 002469.SZ | zz2000 | 20260824 | 20260821 | 8.03e-02 | 2.85e-02 | 3.32e-03 | 3.32e-03 |
| 002638.SZ | zz2000 | 20260824 | 20260821 | 1.50e-01 | 7.27e-02 | — | 7.27e-02 |

**11 键全部 buy_date=20260824、tb=20260821**；池分布 zz1000 4 / zz2000 7。
m_min（最紧约束的归一化余量）中位 ~3.91e-03，与修准幅度同阶 ⇒ 边缘键。

## 3 机制证据（量级对齐）
修准把 adj_factor 从"每日抖动"平化为 4 位小数常量，**修准前同股相邻日因子相对漂移**实测：
- 000505.SZ: 1358/1381 行有变，最大相对 **3.170e-04**（3.362194→3.3622 类）
- 601616.SH: 最大相对 **1.466e-04**；000506.SZ: **1.497e-05**
- 12 键所在 0818~0828 窗口：12 只全部出现在 0913 adj_factor 修准清单（1505/1514 两轮）
⇒ 因子抖动 1e-4~3e-4 相对量级，足以翻转 m_min∈[5.5e-4, 7.4e-2] 的边缘键（hfq=raw×factor 进链）。
（pre_close/pct_chg 修准清单对这 12 只 **0 命中** ⇒ 与这两列无关；members.pkl 自 0909 未变 ⇒ 与名单无关；
grid_or/ideal_engine/plot_ideal_top10 在 88438d5 与 HEAD 间**逐字节相同** ⇒ 排除"同机两世代"的路径差；跨机不等字节（见 §3 更正）。）

## 4 三套键集合对账
- 修准后重跑(现行): **5786** 键
- 修准前重跑(隔离实验): **5764** 键
- 重建版 88438d5: **5776** 键
- 记录版 88438d5^: **5837** 键
- 修准后 vs 修准前: 共有 5756，仅后 30，仅前 8
- 修准前重跑 vs 重建版: 共有 5757，仅前 7，仅重建版 19
- 修准后 vs 重建版: 共有 5775，仅后 **11**，仅重建版 **1**
- 修准后 vs 记录版: 共有 5573，仅后 213，仅记录版 264

## 5 逐日差（修准后 − 修准前，仅列有差日）

| buy_date | 修准前 | 修准后 | Δ |
|---|---|---|---|
| 20240221 | 13 | 14 | +1 |
| 20240222 | 29 | 30 | +1 |
| 20240507 | 26 | 25 | -1 |
| 20240530 | 1 | 2 | +1 |
| 20240702 | 3 | 4 | +1 |
| 20240712 | 8 | 9 | +1 |
| 20240716 | 1 | 2 | +1 |
| 20240729 | 8 | 9 | +1 |
| 20240925 | 35 | 37 | +2 |
| 20241008 | 51 | 53 | +2 |
| 20241018 | 18 | 19 | +1 |
| 20241021 | 120 | 121 | +1 |
| 20241024 | 48 | 49 | +1 |
| 20241029 | 76 | 75 | -1 |
| 20241108 | 15 | 14 | -1 |
| 20241111 | 13 | 14 | +1 |
| 20241204 | 15 | 16 | +1 |
| 20241225 | 9 | 8 | -1 |
| 20250210 | 14 | 15 | +1 |
| 20250213 | 21 | 20 | -1 |
| 20250218 | 12 | 13 | +1 |
| 20250307 | 30 | 29 | -1 |
| 20250313 | 12 | 13 | +1 |
| 20260818 | 14 | 13 | -1 |
| 20260824 | 7 | 18 | +11 |
| 20260826 | 10 | 9 | -1 |

## 6 交付物
- 修准后全量键: `keys_post.csv`；修准前全量键: `keys_pre.csv`（含 pool/tb，供对端逐键 diff）
- 差集明细: `diff_keys.csv`（归属 + 余量）；逐日差: `diff_by_date.csv`
- 复跑脚本: `code/chk_keyset_diff.py`（差集+余量）、`code/chk_key_fragility.py`（余量定义）

## 7 对同构性验收的含义（供对端处置）
- 两端 baseline 历史区若要同构，只能**同时**基于修准后数据重算；重建版 5776 键属修准前世代 ⇒ 直接弃用。
- 11 键/1 键不是"待归因悬案"，是修准的确定性后果 ⇒ 压到 0 的正确做法是**两端都用修准后数据重跑**，
  而不是靠容差吸收（容差 1e-2 只能吸收数值漂移，吸收不了键集合的增删）。
