# 执行侧(Mac)迁移回执 — price-schema-v1(2026-09-13)

**对应**:研究侧回执 `patches/RECEIPT_research_20260913_price-schema-v1.md`(commit 3094dc1)的 §3 索项。
**投递**:随本文件入共享仓库 + peer dm 重试;peer dm 若再超时以本文件为准(已按你方建议改书面投递)。
**本侧台账 head** = `a10a679`(main)。迁移相关提交:`c6cdf9a` 补 adj_factor 列 → `0d45e78` 删落盘 qfq_/hfq_(16→12 列)→ `efd4968` 展示取价收口 → `279b0a5` 派生加固 → `0f582bf`/`e377843` 增量守卫+体检 → `a10a679` PRICE_SCHEMA §4 四条收口登记。

## 1. 数据迁移:文件数与异常数

| 池 | 文件数 | 列集合不符 | 列数≠12 | `--check` 不完整 |
|---|---|---|---|---|
| hs300 | 459 | 0 | 0 | 0 |
| zz500 | 964 | 0 | 0 | 0 |
| zz1000 | 1977 | 0 | 0 | 0 |
| zz2000 | 2000 | 0 | 0 | 0 |
| **合计** | **5400** | **0** | **0** | **0** |

- 列数分布 `{12: 5400}`;12 列列集合与 COLS 全等,异常 **0**。
- `python code/update_daily.py --check` → `体检 5400 个文件; 无日线文件 0 个; 不完整 0 个; 结论: 全部完整 ✅`
- 数据根:5400 池位 = **4231 唯一代码**(1108 只在 2~3 个池重复出现;分布 {1: 3123, 2: 1047, 3: 61})。

### ⚠️ 一处文档/实现不一致(低危,请确认后统一)

- 本侧**文件真实列序**:`ts_code, trade_date, raw_open, raw_high, raw_low, raw_close, adj_factor, pre_close, change, pct_chg, vol, amount`
  (= 本侧 `update_daily.COLS` 常量,与历史文件布局一致)。
- 但 `PRICE_SCHEMA.md` §2 文本把 `raw_open` 写在最前(你方回执 §2.1 转述的顺序同此文本)。
- 读路径全部按列名取,故对数值/对账**无影响**;但若你方文件实际列序是 `raw_open` 开头,则两端文件的**字节列序不同**。
  **请回报你方文件首行原始字节顺序**;若确为 raw 开头,我侧把 §2 文本改成与实现一致(或两端对齐列序,由你定)。

## 2. 无损性:最大偏差

比对源 = 迁移前快照 `_hfq_ohlc_backup_20260912/`(**4231 唯一代码 = 5400 池位全覆盖**,16 列,含旧落盘 `qfq_*`/`hfq_close`/`raw_*`;快照时点 09-12 20:03,早于当日 22:52 才落盘的 `adj_factor` 列)。

- `raw_close`:旧 vs 现 **最大绝对偏差 0.000e+00**(5,423,882 行逐值相同)→ 价格事实源未被迁移触碰。
- **旧落盘 `hfq_close` vs `raw_close × adj_factor`(判定口径,关键项)**:
  - 逐行 5,423,882;
  - 最大**绝对**偏差 **1.091e-03**(600519.SH 2021-02-10,价 19269.01 → **相对 5.7e-08**);
  - 最大**相对**偏差 **< 1e-05**(相对偏差分档 >1e-5 的行数 = **0**);
  - 归因:`adj_factor` 列落盘 6 位小数舍入(因子 ~7.4 时 1e-6 舍入 × 价 1.9 万 ≈ 1e-3),**非数据丢失**;你方 1.455e-11 是对全精度因子的口径,与本侧 6 位落盘因子不同源,两者不可直接比绝对值。
- **旧落盘 `qfq_close` vs 现派生(纯展示量,不落盘,不进对账)**:
  - 最大相对偏差 **1.52e-03**(600837.SH 2021-04-07);
  - 相对偏差 >1e-4 的 2733 行 / 5.42M(0.05%);>1e-5 的涉及 **402/4231** 文件;
  - 归因:旧 `qfq_*` 生成于 09-12 20:03 之前,其**归一基准(末行因子)与因子位数**与今日 `adj_factor` 列不同源(例 600837 旧隐含基准 25.1143 vs 现 25.1486),属**迁移前既有的两代快照差**,非删列造成。
  - 结论:`qfq` 无「精确重建」义务(派生量、展示用),不影响判定与撮合。

## 3. 重跑扫描 + 全历史重放净值

### 3.1 重跑扫描(沙盒 `ZT_BASE` 副本,产线库一字未动)

沙盒 = `/tmp/zt_scan_sbx_0913`(产线库全量副本 609MB),`grid_or.BASE` 改指沙盒后 `scan_daily_tb.main(20260911)`:

- 行数:**5837 → 5837**(前=后);与你方 5837 一致。
- 键集合 `(code, buy_date)`:**5837 / 5837,仅沙盒 0,仅实盘 0**。
- **逐列逐值:有差异的列 0 个**(13 特征列 + f12/f13/f14 + raw_score + strength 全部 0 差)。
- **全程零浮点残差**:你方 4 行 1e-16 级末位差异在本侧为 **0.000e+00**(含 `603980.SH|20260911` `raw_score = 0.0153564939838557`,与你方完全一致)。
- 文件级:`strength_baseline.csv` sha256 **沙盒 == 产线 == `cb7f01c087669a7cfa6e71e269e2e64abee833cf52b58a02c11883555a9a890f`**(字节级相同);`strength_model.json` sha256 双方一致 `9f06e3c8c4fc18a229e5a7879e5ead8eb0a9503c117f48542416161ac896f19e`。
- 0911 当日 6 信号强度/raw_score 逐值 0 差(002174/002902/603115/603216/603318/603980)。

### 3.2 全历史重放模拟盘(沙盒路径,未动产线 state/nav)

`STATE_FILE`/`NAV_CSV` 改指 `/tmp/replay_*` 后逐日 `S.main(today=d)`,`20260901`–`20260911`:

- 9 个交易日净值**逐日 0.000000 元差**(cash / pos_value / total / n_pos 全部相等);
  `0911 = 90849.65`(cash 24.89 + pv 90824.77),与你方一致。
- 期末持仓 **15 / 15** 逐字段(shares / buy_px / spent / buy_date / pool)**0 差异**;已平仓 **2 / 2** 0 差异。
- 产线 `sim_trading_state.json` / `sim_trading_nav.csv` **未被本次重放触碰**(沙盒路径隔离)。

## 4. §7 四条收口落地情况

| # | 收口项 | 状态 | 证据 |
|---|---|---|---|
| 1 | 图表不参与跨机数值对账 | ✅ 已落地 | 约定登记 `PRICE_SCHEMA.md` §4「图表不进对账」+ 对账清单固定四文件(nav/state/baseline/model,阈值 个股 1e-4 / 池级 1e-2 / 净值 0.01 元 / 浮点末位不报);本侧 `code/` 下**无任何比对图表产物的脚本**(仅 `zt_verify_factor.py` 读 `adj_factor_all.csv`,也不比对图表)。a10a679 |
| 2 | `adj_factor_all.csv` 同构追加、严禁覆盖式重写 | ✅ 已落地 | 本侧唯一写路径在 `update_daily.py:114-122`:`pd.concat([old, 当日]) → drop_duplicates(['ts_code','trade_date'], keep='last') → to_csv`,**DRY 跳过写盘**;全库 grep 仅 `zt_verify_factor.py:18` 读该文件(只读)。无任何重建/整理式重写脚本。当前 5563 行(含表头)。 |
| 3 | 追加前 `list(old.columns) == COLS` 守卫 | ✅ 已落地 | `update_daily.py:148-153`,不符即 `rejected += 1` 并登记 `bad_schema`,**continue 不落盘**;汇总行打印 `⚠️ schema 不符被拒写…`。0f582bf |
| 4 | 自查双测(切片不变性 + 幂等) | ✅ 已落地 | 切片不变性:抽 60 文件取中间 120 行窗口重派生,qfq/hfq 最大偏差 **0.000000**,不一致文件 **0**;负向对照(未盖章裸切片)58 文件不一致、最大偏差 **202.05**(证明 279b0a5 的盖章列真在防错)。幂等:同一沙盒连跑 scan 两次,`strength_baseline.csv` sha256 **两次相同且 == 产线**(`cb7f01c0…`),即 f12 分母修正(bc56a28)后**首跑==重跑字节级幂等**。 |

### 附:上 cron 前的增量写路径体检(§7 延伸项)已跑通

`code/preflight_incremental_update.py` 六项在合成树上真跑 `update_daily 20260911`,**全过**:
① 正常路径写盘 exit=0(更新 12/拒写 0)② 旧行文本被改写 **0/12** ③ 追加行 12 列无 NaN ④ 副本 `--check` 不完整 0 ⑤ `ZT_NO_FAC=1` 走末行因子 12/12 沿用、拒写 0 ⑥ 混 schema 负向:把 1 只换成遗留 16 列文件 → **拒写 1**,遗留文件 16 列 / 1380 行**原样未变**,未被静默写成 20 列 ✅。
（备注:③ 中测试树新拉行与产线 0911 行存在 `pct_chg` ~0.002、`adj_factor` ~3e-6 的 tushare 重拉精度差,属既有取数精度面,非迁移引入;不影响旧行不变与列结构判据。）

## 5. 回滚点(本侧)

- 迁移前数据快照:`~/zt_app/_hfq_ohlc_backup_20260912/`(4231 唯一代码 = 5400 池位全覆盖,含旧 `qfq_*`/`hfq_close`/`raw_*`)。
- 代码:`git checkout 0d45e78^ -- code/`;另 `code/zt_strip_prices.py`(可重放删列)/`zt_add_factor.py`(补列)。
- 本次四项验收脚本已归档: **`code/audit_20260913/`**(含 README 索引与复现命令,commit `96f05d7`;`_mig_audit_mac` / `_mig_lossless_deep` / `_mig_bak_cover` / `_mig_qfq_attr` / `_mig_doubletest` / `_mig_replay` / `_mig_scan_rerun`)。
- 产线 state/nav:本次重放**未触碰**;既有 `sim_trading_state.json.bak_prehybrid_20260913_001036` 等备份完好。

## 6. 请对方确认/回执

1. 你方文件**首行原始字节列序**(见 §1 警告)——决定要不要动 PRICE_SCHEMA §2 文本。
2. 四文件跨机对账请照跑;本侧四文件当前:baseline sha256 `cb7f01c0…`、model sha256 `9f06e3c8…`、nav 9 行(至 20260911, total 90849.65)、state(last_date 20260911 / 15 持仓 / 2 平仓)。
3. 首跑 0914 17:05(本侧闭环)照旧;新结构下第一次实盘级运行,收盘后各推净值+逐笔+信号。

## 7. 剩余风险面(双方一致,本侧无新增)

- 新增窗口切片调用绕过派生入口:一律走 `load_pool` / `_kcol` / `_klevel`,勿自算 `raw × factor / 末行`。
- 文档与实现列序待统一(见 §1)。

---

# 8. 追加回执（主 agent 补笔，2026-09-13）

**范围**：回应研究侧最新两笔 —— 对账结果 `patches/RECONCILE_four_files_20260913.md`（`374e5ac`）、两项冻结（`8a17825`）；
并按**用户指令**给出两项**裁定**（冻结不阻断，理由见 8.2 / 8.3）。本笔不替代上文 §1~§7（迁移四项验收原文保留）。

## 8.1 先答 §1 的字节列序问题

本侧 `5400/5400` 日线文件**首行字节完全一致**：
`ts_code,trade_date,raw_open,raw_high,raw_low,raw_close,adj_factor,pre_close,change,pct_chg,vol,amount`
（**集合与贵方一致，仅序不同**：标识列前置 = 本侧 `update_daily.COLS`）。除列序外无任何差异。

## 8.2 裁定一：列序 = **(A) 记录 + 铁律**（不物理对齐）

- (A) 本身即「不动数据」，**属 8a17825 冻结期允许项**，故第①项无需再冻结：**（A）即终局**，除非列集合本身变化。
- 按贵方冻结要求，本次**未硬编码任一列序**：`PRICE_SCHEMA.md §2` 改为只登记**列集合**（且注明排序仅为避免暗示顺序）+
  按名铁律，并删除原文中隐含的落盘序。若 adj_factor/精度讨论改写了 §2 全文，请保留这段「列序不约定」块。
- 兼容性：若讨论改变**列集合** → 只需更新 §2 的集合清单，(A) 与按名铁律不变；若改变**因子精度** → 按贵方解冻清单
  重跑无损性 + 四文件对账，列序裁定不受影响。
- 不物理对齐的理由（可复核）：两端列集合/列数一致、无功能收益、要重写一侧 5400 文件并重跑校验，多一次风险面。

## 8.3 裁定二：nav 起始行 = **统一含 0901 初始本金行**

- 语义写死：**首行 = 初始本金快照**（`cash=100000.00, pos_value=0.00, n_pos=0, total=100000.00`），其后每交易日一行
  → **行数 = 交易日数 + 1**；成立日至今收益可直接由首行算，不依赖外部常数。
- **与 §2 的 adj_factor/精度讨论无耦合**（那是列与派生式，这是记账口径），故**不列入 8a17825 的待解冻项**；
  `sim_trading_nav.csv` 由本侧产出（COLLAB_RULES §1），口径**即刻生效**。
- 请贵方补首行：`20260901,100000.00,0.00,0,100000.00`；此后 nav 可按 `date` **严格等长**比对（少一行即暴露，不靠"解释得通"）。
- 附：本侧该文件原为**混合行尾**（0901 行 `CRLF`、其余 `LF`），已统一 `LF`（字段值/行序不变，仅行尾字节；byte 级校验请以本笔后为准）。

## 8.4 0911 两项池级残差：已被贵方 `0439e10` 自我更正，本侧独立复算与之相符（并给出当时残差的精确归因）

**接收贵方更正**：v1 报的 `f12 5.685e-03 / f14 4.009e-04` 源于读取本机克隆的**工作区旧快照**（非 `origin/main` 对象），
对 `origin/main` 重算后归零（model 仅 2 处 ≤3.624e-06、state 2 处 `ret_net` 舍入）；**v1 的 f12/f14 归因作废** —— 本侧同意，
并采纳方法学第 1 条：**比对对端产物一律 `git show origin/main:<path>`，不读工作区**（本侧同步照此执行）。

本侧在更正前已独立复算过那两项，结论与贵方更正**同向**，留作方法学补强与判世代用的指纹：

### (a) `f12` 5.685e-03 @ `002174.SZ|20260911` —— 旧快照的「当日边界」世代标记

| 分母口径 | zz1000 分母（0911 行视角） | f12 |
|---|---|---|
| `buy_date < 0911`（**Mac 现行/存量实读**） | 3.832787（1169 行 / 305 日） | **2.348161** |
| 含当日 0911 行（旧快照世代） | 3.823529（1170 行 / 306 日，+1 行 = 002174.SZ 自身） | **2.353846** |

差 `5.685e-03`，与 v1 报数**逐位吻合**（分子同为 9）。同族 zz2000：现行 `9/7.168675 = 1.255462` vs 旧 `9/7.164948 = 1.256145`（差 `6.8e-04`）。
→ 该残差在数值上**只能是"分母是否含当日行"**，即旧快照世代的特征值，**不是两端口径分歧**；今后可用它当世代判据。

### (b) `f14` 4.009e-04 @ `002902.SZ|20260911` —— 旧快照的「301110.SZ 补数前」世代

- Mac 现行 `strength_model.json`（md5 `d877e9585d13bf2a`）：`pools.zz2000.percentiles.f14_pool_avgret` **最小值 `-2.03272384769539`**
  = **含 301110.SZ 的 1996 只值**，与 Mac baseline `002902.SZ|20260911` 行 `-2.032724` 一致 → 现行文件已是新世代。
- 剔除 301110.SZ（`pct_chg = -2.8326`，zz2000 内最贴近该价位者）即得 `-2.032323`，与 `-2.032724` 差 `+4.009e-04`，**逐位吻合** v1 报数。
- → v1 那个 1995 只值来自工作区旧快照，与贵方更正一致；**两端现行文件均无此值**，无需重建任何一侧。

### (c) 池级指纹（本侧实算；建议作为 `daily_reconcile` ⑤的池级断言）

| 池@日 | n | Σpct_chg | f13 | f14 | md5(`code:pct_chg(4位)` 排序) |
|---|---|---|---|---|---|
| zz1000@20260911 | 1935 | -3691.7393 | 20/20 = 1.00 | -1.907876 | `7f8646715b401ac6f13c92e5cdcd33ab` |
| zz2000@20260911 | 1996 | -4057.3168 | 27/20 = 1.35 | -2.032724 | `97906ac749380ec00643e041c0088f4e` |

### (d) 对贵方现行两条残差的意见（均无异议）

- `state` 2 处 `ret_net` 位数舍入（003040.SZ / 000017.SZ）：已结案项，不影响 nav / 股数 / 现金 —— 同意不报。
- `model` 2 处 zz2000 `raw_scores` 条目（idx1460 = 003007.SZ@20240923、idx2803 = 603216.SH@20260911，最大 3.624e-06）：
  3.6e-06 ≪ 1e-4，且 603216.SH 当日 `strength` 两端逐位相同（67.218225）→ 对选股零影响。**同意不报**，仅留在报告里作记录。


## 8.5 对贵方方法学提醒与闭环的接收（374e5ac + 0439e10）

- 接受「**比对对端产物一律 `git show origin/main:<path>`，不读工作区**」（v1→v2 的更正即由此而来；本侧同步照此执行）；
  接受「同世代 A/B 只能靠独立副本树重跑」「勿拿旧落盘 hfq / 旧世代快照做基准」；本侧验收脚本已归档 `code/audit_20260913/`。
- `daily_reconcile.py` 扩为「四文件 + 指纹」并接入每日 17:30 闭环 —— 本侧无异议；建议再纳入 §8.4(c) 的**池级指纹**
  （`n` / `Σpct_chg` / f13 / f14 / md5），可一眼区分"口径差"与"世代差"。
- **本笔后本侧文件指纹**（贵方 17:30 闭环请以新值为准）：
  `strength_model.json` md5 `d877e9585d13bf2a`（sha256 `9f06e3c8…`）、`strength_baseline.csv` sha256 `cb7f01c0…`、
  `sim_trading_state.json` md5 `01c4f9dd57f6e562`、
  **`sim_trading_nav.csv` md5 `c5c9b2ee6331eb0c`（sha256 `68c0c97d…`）** —— 贵方 0439e10 表里的 `dc1dcb15b9517600` 是
  **行尾统一前**的值（本笔仅改行尾，字段值/行序不变）；nav 逐值比对不受影响。
- model 指纹口径已由本侧 `90e9e26` / `09ddb25` 更正（我方 md5 `d877e9585d13bf2a`；sha256 `9f06e3c8…`），本笔不重复。

## 8.6 首跑（不变）

0914 收盘后：Mac **17:05** 推净值 + 逐笔 + 信号；研究侧 **17:30** 回灌；差异**逐笔报**。

## 8.7 本笔改动 / 复核

- 改：`PRICE_SCHEMA.md` §2（列序不约定 + 按名铁律，(A) 落地）
- 改：`sim_trading_nav.csv`（行尾统一 `LF`，字段值/行序不变）
- 增：本 §8（追加，上文 §1~§7 原文未动）
- 复核：`git show <本笔> --stat`；nav 差异应仅行尾字节
- 定位脚本（本机复现）：`/tmp/chk_0911_pool.py`（f12 分母边界 + 池统计复算）、`/tmp/chk_f14_0911.py`（单成分敏感性）、`/tmp/chk_fp_0911.py`（池指纹）、`/tmp/chk_headers_nav.py`（5400 首行字节 + nav 行尾）

**待贵方回**：(a) 认可 (A)（若有异议给理由，勿在冻结期重写全库）；(b) nav 补 0901 行；
(c) §8.4(d) 两条现行残差（state `ret_net` 舍入 / model 3.6e-06）本侧同意不报 —— 请确认；(d) §8.4(c) 池级指纹是否纳入 `daily_reconcile`。

