# ETF拆分检测净值兜底 — 收盘价除权滞后盲区（588710案例，2026-08-15）

## Bug
5个fetch脚本（fetch_tech/gold/national_team/old_economy/sector_etf_data.py）的 `detect_and_fix_splits` 仅靠"份额跳变后5日内收盘价是否除权"区分拆分vs大额申赎。
**588710.SH（科创半导体设备ETF华泰柏瑞）2026-08-14发生3:1拆分**：份额+196.7%，单位净值3.1344→1.0532（-66.4%已除权），但tushare `fund_daily` 收盘价仍3.16未除权（数据滞后）→ 被误判"大额申购"跳过 → 虚假+223亿单日净流入污染 etf_tech_combined.csv 的合计净资产。

## 修复：fund_nav兜底（净值是拆分除权的权威信号）
收盘价未除权时，查 `pro.fund_nav(ts_code, start_date=跳变日前5天, end_date=跳变日)`：
- 正向拆分：`nav_ratio = 拆分前unit_nav / 拆分后unit_nav`；若 `0.75 < nav_ratio/share_ratio < 1.33` → 确认拆分
- 反向合并：检查净值是否升约 `1/ratio` 倍（同容差）
- 确认后修正（收盘价滞后场景）：历史份额×ratio（净资产连续），**全部**收盘价÷ratio（统一到拆分后口径）
- 实现：`nav_confirms_split(code, split_date, ratio)` 加在 fetch_tech_etf_data.py，用正则块替换同步到其余4个脚本（5个脚本语法全过，`pro = ts.pro_api` 均已定义）

## 验证方法（跳变排查recipe）
1. 扫描combined CSV：`change_*` 列单日净流入绝对值 > 前日 `asset_*` 的40%（且前日资产>1亿排除新上市）→ 候选跳变
2. 对每个候选拉 fund_share + fund_daily + fund_nav：
   - 净值单日最大变动 >25-30% → 拆分/合并（除权）
   - 净值连续（<10%波动）→ 真实大额申赎，不处理
3. 单元验证：`nav_confirms_split('588710.SH','20260814',2.966)` → True；`('159682.SZ','20241009',1.80)` → False（真实申购）
4. 重跑fetch后复扫：588710跳变日净流入+223亿→0.0亿，收盘价3.16→1.06除权，合计净资产连续

## 确认为真实申赎的历史大跳变（勿再排查）
- 159682/159681 20241009（924行情，+67%/53%）、512100 20240205（国家队救市，+125%）、588200 20241009（+122%）、560780 20250924（+107%）、159845 20260714（+69%）、516650 20251230（+79%）——全部净值连续验证过
