📋 期货AI基金经理 · 工作日报 (交易日 2026-10-15_未完成项推进_铜重建_配对口径_通道前视闭环_AG冻结溯源) ⏭ 跳到最新(2026-11-12)

📅 全部日报已保留 · 交易时段每小时更新 · 休息日无日报 · 夜盘21:00后归下一交易日 · → 切到股票AI基金经理日报
历史日报: 2026-11-122026-11-112026-11-102026-11-092026-11-062026-11-052026-11-042026-11-032026-11-022026-10-302026-10-292026-10-282026-10-272026-10-262026-10-232026-10-222026-10-212026-10-20_TLM失控开仓事故与修复2026-10-20_IFOS同类隐患排查2026-10-202026-10-192026-10-16_TL优化复核2026-10-162026-10-15_未完成项推进_铜重建_配对口径_通道前视闭环_AG冻结溯源2026-10-15_方案B_主力连续序列重做与H10复验2026-10-152026-10-14_策略迭代评估_zadj近期亏损诊断2026-10-14_未完成项2_菜油费率敏感度2026-10-14_数据重建与zadj基线重算2026-10-14_zadj_walkforward复核2026-10-14_TL国债复刻与WF复核2026-10-142026-10-132026-10-122026-10-092026-10-082026-09-302026-09-292026-09-282026-09-242026-09-232026-09-222026-09-212026-09-182026-09-172026-09-162026-09-152026-09-142026-09-112026-09-102026-09-092026-09-082026-09-072026-09-042026-09-03

# 2026-10-15 交接未完成项推进报告

> 接手 `交接_20261014.md`(含 10-15 更新)后本轮做的事。结论只用三态:✅成立 / ❌证伪 / ⚠️样本不足。
> **本轮没有改动任何实盘扣扳机条件、没有启停任何服务。**

## 摘要(按交接文档的优先级)

| # | 事项 | 结论 | 动作 |
|---|---|---|---|
| 1 | 铜 60m 的 H10 再验 | **⚠️ 不放行**(三条判据全过,但折正 3/6 + 单折集中;见 §1) | 重建数据(两轮收紧) + 重跑 WF + 影响量化 |
| 2 | 统一配对口径 FIFO vs 均价法 | **✅ 完成** | `update_symbol_equity.py` 改为 FIFO(与 `pnl_attrib` 同源同法) |
| 3 | 统一通道口径 `channel_state` | **✅ 闭环(无需改码)** | 证明"边界伪枢轴"在数学上不可能发生 + 回归测试,见 §3 |
| 4 | AG 1 段 60.5h 异常冻结溯源 | **✅ 查明 = 主连指向冷门合约(数据缺陷)** | 见 §4;**依红线未自行修复**,等用户裁决 |
| 5 | (可选)TL/zadj 复活 | 未动 | — |

---

## §1 铜 60m 的 H10 再验(交接未完成项 #5)

### 1.1 重建
- 脚本:`rebuild_cu_60m.py`(思路逐字照 `rebuild_zadj_15m.py`:主连 `KQ.m@SHFE.cu` 为基座 + 用具体合约按收盘价识别换月底层合约 + 换月处后向复权)。
- 输出:`research_data/clean_cu_60m.csv`(8964 根,2022-08-11 ~ 2026-10-14)+ `cu_60m.meta.json`。
旧文件已备份为 `research_data/rejected/REJECTED_cu_60m.csv.bak-20261015`(**未删**)。
- 闸门:
```
⚠️ cu_60m_rebuild: 8964根, 死柱 0.08% (最长 5 根) — 1 段为已声明的停板 → 按真实行情放行
✅ [缺根检查] 4006 个时段段全部根数完整
```
对照:旧 `REJECTED_cu_60m.csv` 死柱同一段 5 根、**max_run=4 → 🚨不合格**。
(两者冻结段其实是同一段;旧文件缺 volume 列,闸门无法判别 → 判可疑。)

### 1.2 那一段"停板"经独立核对 **不是停板,是主连停更**(关键)
交叉核对具体合约后发现 KQ 主连有一处 stale:
- 2023-04-07 **21:00~00:00 四根 60m,KQ 主连是 `开=高=低=收=69130、volume=0`**;
- 但真正的主力 `SHFE.cu2305` 同期**正常在成交**:21:00 收 68930(量 6984)、22:00 收 68850(3594)、23:00 收 68870(994)、00:00 收 68810(1340);
- 2023-04-10 09:00 跳回 68690(真实价),说明主连跳过了真实的夜盘价格。

**判据**:真停板必须"有成交量 + 锁死在涨跌停价";这里主连**量为 0**,而底层合约有量有波动 →
`gate(..., allow_limit_lock=True)` 的启发式(有量 且 ≤24h)恰好**不适用**(量=0,本来就会被判可疑)。
→ **该放行是我误判**,这段应记为"主连停更"。

另核对了 2025-04-07 那处 21.9ATR 大跳变:主连 09:00 开 73640(较 4-03 收 78860 跳空 −6.7%),
与 `SHFE.cu2505` 完全一致(73640,量 7873)→ **是真实的暴跌 + 跌停锁死(13:00~14:00 两根 73640、量 24445/2925)**,
不是数据错误。全样本 8964 根里,真正的主连停更**只有 2023-04-07 那 4 根**。

### 1.3 H10 结果(54 组平面 + 锚定/纯滚动双 WF + Deflated Sharpe 486 次校正)

| 数据 | 区间 | 口径 | 平面正 | 样本内外双正 | 锚定 WF | 纯滚动 WF |
|---|---|---|---|---|---|---|
| 旧 rejected | 08-03~09-28(8963根) | 原 p≤i | **26/54** | 14/54 | **3/6 折** +51,295(1.61) | 4/6 折 +74,081(2.39) |
| 旧 rejected | 同上 | 诚实 p≤i-3 | 52/54 | 40/54 | **3/6 折** +91,680(3.23) | 3/6 折 +92,270(3.18) |
| **同区间对照** → 新重建截断到 09-28(8905根) | 08-11~09-28 | 原 p≤i | 29/54 | 17/54 | 4/6 折 +83,208(2.73) | 5/6 折 +82,711(2.86) |
| **同区间对照** → 新重建截断到 09-28 | 同上 | 诚实 p≤i-3 | **52/54** | **50/54** | **4/6 折** +89,351(3.06) | **4/6 折** +96,543(3.56) |
| 新重建(全量) | 08-11~10-14(8964根) | 诚实 p≤i-3 | 52/54 | 51/54 | 4/6 折 +75,868(2.55) | 4/6 折 +82,188(3.11) |

- 旧文件 + 原口径 = 交接文档记录的「平面 26/54、折正 3/6、样本外 +51,295」✅ **精确复现** → 基线可信。
- **同区间对照**(截断到旧文件终点,排除样本长度差异)显示:
**换月复权把平面饱和度从 26/54 抬到 52/54、锚定折正从 3/6 抬到 4/6、样本外从 +51,295 抬到 +89,351(+74%)**。
- **这个提升与"去前视"是两件独立的事**:
· 前视修正影响的是 −10,643 → +22,501(默认参数,从亏到盈),平面 29/54 → 52/54;
· 换月复权影响的是锚定折正 3/6 → 4/6、样本外量级 +74%。
→ 旧 `verify_h10_products.py` 给的 "cu 60m 平面 26/54、折正 3/6" **确实是被"未做换月复权"压低的**,
这与交接文档把它归因于"一致性不足"不同。

### 1.4 第二轮修补(v2/v3,用户选方案 A):加流动性约束 + 粘性
第一轮 v1 的数据缺陷修完后做了两轮收紧(`match_contracts`):

| 版本 | 约束 | 换月点 | 未匹配 | 备注 |
|---|---|---|---|---|
| v1 | 只看收盘价 | **104** | 319 | 41 次 A→B→A 抖动、14 次换入 OI<5万 |
| v2 | + 流动性(OI ≥ 当根最大 OI 的 20%) + OI 消歧 | 85 | 330 | 抖动减少但未清 |
| **v3** | v2 + **粘性(换约须连续 min_hold=3 根成立)** | **50** | **0** | **4.2 年 ≈ 每月 1 次,符合真实换月节奏** |

v3 的换月日期肉眼可查地落在真实换月窗口(例:`2022-09-26 cu2210→cu2211`、`2022-10-21 cu2211→cu2212`、
`2023-02-22 cu2303→cu2304`、`2023-03-20 cu2304→cu2305`),且每次换入合约的 OI/量都是主力级别。
**v3 已被采为当前 `research_data/clean_cu_60m.csv`**(v1 另存为 `clean_cu_60m.csv.bak-20261015-v1`,未删)。

### 1.5 v3 上的 H10 结果
| 口径 | 平面正 | 样本内外双正 | 锚定 WF | 纯滚动 WF |
|---|---|---|---|---|
| A 原 p≤i | 26/54 | 16/54 | 5/6 折 +88,892(夏普 2.91) | 5/6 折 +91,052(3.19) |
| **B 诚实 p≤i-3** | **53/54** | **49/54** | **3/6 折** +62,938(夏普 2.26) | **3/6 折** +58,705(2.23) |

- 486 次校正后**仍显著**(最小显著 0.26)。
- 与 ag/OI 的参照对比:平面 53/54(ag 54/54、OI 40/54)✅、样本外 +62.9k(ag +67.8k、OI +14.5k)✅、
夏普 2.26(ag 2.08、OI 2.23)✅、锚定折正 **3/6**(ag/OI 均 4/6)⚠️。
- **v1 → v3 的样本外由 +89,351 降到 +62,938(−30%)** → v1 因为换月抖动是**偏乐观**的,
收紧后回到与 ag 同量级。这正是"先修数据再看信号"的价值。

### 1.6 仍不放行的理由(诚实清单)
1. **锚定折正 3/6 < ag/OI 的 4/6**;且样本外利润高度集中在 **F5(+59,148)**,F1/F2/F4 为负。
2. **2023-04-07 那 4 根 stale bar 仍在**(v3 的自动回填没触发,见下)。
3. **冷门段仍在**:v3 体检出 49 段 / 1,018 根标的不是当根最大 OI 合约(11.4%)。
(注:这 49 段多数是"换月前后两个月都很流动"的正常重叠,不全是缺陷;但需要逐段判定。)
4. **v3 的换月基准仍有漂移**:历史段的复权价与真实合约价差了一个不小的常数
(例:2023-04 段 adj_shift=670,而主连当时就是 cu2305 本身,理想应为 0)→
自动回填因此失配(属**设计上的保守失败**,没有瞎猜,但也没修好)。

### 1.7 剩余缺陷的影响量化(已做)
为了回答"这 4 根 stale bar 到底影响多大",**不重建**、只把 v3 文件里那 4 根用底层 `SHFE.cu2305`
的真实价(按该段基准换到复权价面)+ 真实成交量回填,另存 `/tmp/cu_60m_patched.csv` 重跑 H10。
结论见下:**✅ 诚实口径的数字与 v3 *逐项完全相同***
(平面 53/54、双正 49/54、锚定 3/6 折 +62,938 夏普 2.26、滚动 3/6 折 +58,705 夏普 2.23)。
只有"原口径 (p≤i)"变了(锚定折正 5/6→4/6、样本外 +88,892→+20,964、夏普 2.91→0.74)——
因为前视口径本来就依赖那几根"冻结但被读成真实价格"的 bar。
→ **可以正式排除"4 根 stale bar"对诚实结论的影响(缺陷 2 结案)**。
→ 剩下唯一致命的脆弱点是:**诚实口径的样本外利润几乎全部来自单折 F5(+59,148)**,
F1/F2/F4 为负、F6 仅 +8,265 → 折间稳定性差。这一点比数据缺陷更值得警惕。

### 1.8 下一步(若要把它做成 ✅ 或 ❌)
- **必做**:把"主连连续序列"的生成改成**显式按日选主力合约 + 在真实换月日复权**,
并在每个换月点**断言** `复权后旧合约价 == 新合约价`(自检基准漂移)。
- 该工作对 AG/SC/AU 通用(§4 同族缺陷),建议一次做对、四个品种一起换。

## §2 统一配对口径:FIFO vs 均价法(交接未完成项 #6)—— ✅ 完成

### 2.1 判据(先立后改)
恒等式:**全部平完时**,已实现盈亏(不含费)= 乘数 × (Σ平仓价×手 − Σ开仓价×手)。
逐笔用**真实开仓价**配对时,每条开仓腿恰好被消耗一次、每条平仓腿恰好被记一次 →
**恒等式自动成立,且与配对顺序(FIFO/LIFO)无关**。
"单一均价池"在**部分平仓后再开新仓**时池均价被改写 → 不满足该恒等式。

实测(账户60 全账本 745 笔,≥2026-08-16):

| 方法 | 已实现合计 | 相对恒等式 |
|---|---|---|
| FIFO | **−209,477.62** | 基准 |
| LIFO | **−209,477.62** | 与 FIFO 相同 ✅(印证恒等式) |
| 均价法 | −210,510.12 | **差 +1,032(错)** |

品种级差得更明显:原油 **+5,375**、30年国债 **+2,700**、zadj **−3,732**、银 +215。
→ **均价法是错的**,`update_symbol_equity.py` 已改为 FIFO,与 `pnl_attrib.py`(一直用 FIFO)**同源同法**。
(账户68 同样:FIFO −28,788 / LIFO −28,428 / 均价 −28,608。)

### 2.2 改动
- `update_symbol_equity.py`:抽出 `pair_trades(rows, on_pnl)` 作为**唯一配对实现**(真 FIFO,deque);
`per_symbol_daily_pnl` 改为调用它。删掉了"单一均价池 + 累积开仓费"的旧逻辑。
- `pnl_attrib.py` 的 FIFO 逻辑**未动**(它本来就是对的)。

### 2.3 对面板数字的影响(已生效,报告类消费方,不动实盘行为)
| 品种 | 改前 | 改后 | 差 |
|---|---|---|---|
| 原油 | 972,645(−27,355) | **978,020(−21,980)** | +5,375 |
| 银 | 997,248(−2,752) | **997,033(−2,967)** | −215 |
| 30年国债 | 992,920(−7,080) | 992,920(−7,080) | 0 |
| AI驱动 | 1,002,517 | **1,002,402** | −115 |

### 2.4 交叉核对(证明两套消费方现在真的同源)
- `update_symbol_equity` 口径(去重 + 故障剔除后):全账本 FIFO **−170,995.64**。
- 不剔除故障时:**−245,755.64** → 被剔除的 16 笔故障成交贡献 **−74,760**,
与 `system_faults.json` 登记的 48,400 + 25,940 = **74,340 吻合**(差 420 = 分割/取整)→ 缺陷剔除逻辑自洽。
- `pnl_attrib` 账户60:纯交易 −209,477.62 → zadj 台 能力 **−25,366.76**、TL 台 **−7,080**(与交接文档一致)。

---

## §3 统一通道口径 `channel_state`(交接未完成项 #3)—— ✅ 结论:不存在该前视,无需改码

**数学事实**:`zheng_triangle.pivots(d)` 是居中分形,循环 `for i in range(k, n-k)`(k=3)→
返回的**最大索引恒为 n-4**。`channel_state` 里 `k = i = len(d)-1`,故可用枢轴必然满足
`p ≤ n-4 = i-3` —— **与诚实口径 `lines_at(p ≤ i-3)` 完全一致**,"边界伪枢轴"不可能出现。
(直觉解释:要确认 bar p 是枢轴必须看到 p 之后 3 根;数据既然在 i 处截断,p=i 就永远确认不了。)

**验证**:新增 `test_channel_no_lookahead.py`,两项全过:
1. 对 n=40/120/300 × 有/无末根尖峰的构造序列:最大枢轴索引 ≤ n−4;
2. 对真实数据(`REJECTED_ag_60m` / `clean_OI_60m` / `AG_clean15m`)逐 bar 抽样:
`channel_state` 用的枢轴**越界 0 次**。

→ **处置:不改 `channel_state`**(改它反而会动到实盘大脑的读数,且无必要)。
真正要写清的是:`channel_state`(最近 4 个枢轴 + 有效性校验,实盘大脑口径)与
`lines_at`(窗口内全部枢轴,回测口径)的差别**是两种通道定义,不是前视差异**。
闸门用"两套定义取并集"的规避**可以保留**(宁可多跑一轮),但理由要从"防前视"改成"口径不同"。

---

## §4 AG 一段 60.5h 异常冻结的溯源(交接未完成项 #8)—— ✅ 查明

### 4.1 现象
`zadj_v4/data_tq/AG_clean15m.csv` 中,2026-01-31 02:15 起 16 根(15m)**全部 = 24728.00**、
量 941→226→227→247→290→…→55(掉到 50~300 手/根),
到 **2026-02-02 09:00** 才恢复(仍 =24728),当晚 21:00 才跳到 21120 —— 即时间跨度 60.5h 的冻结。

### 4.2 溯源(逐一核对具体合约)
| 合约 | 2026-01-30 21:00 ~ 02-04 表现 | 判定 |
|---|---|---|
| `SHFE.ag2602` | 21:00 **26510**,00:45 触 25690 后**锁死**(01:00 起 volume=0),02-02 09:00 起仍 25690 无量,02-02 21:00 才开在 **21337**(量 1320) | 冷门/交割月合约,实际已停摆 |
| `SHFE.ag2612` | 21:00 **25390**(量 3911),一路真实成交(1764/890/335…),02-02 09:30 **23696**(量 343) | 真正在交易的合约 |
| KQ 主连 | 与 ag2602 同步但整体差一个常数(24728 vs 25690 ≈ −962) | **主连指向了 ag2602** |

**结论**:那 16 根 = **主连指向冷门合约 ag2602** 的结果,**不是**"主连指向一个真实的停板"。
- ag2602 的 OI 仅 11,876 手,而主连的 OI 是 253,490 手 → 主连**不可能**是真在 ag2602 上;
- ag2602 在那几根**成交量为 0**(真涨跌停锁死必须有量,见 `data_quality_gate.py` 的定义);
- 真市场(ag2612)同期一路在跌,02-02 09:30 已到 23696。

### 4.3 影响与处置
- 该 60.5h 冻结 + 之后 **2026-02-02 21:00 的 `36.1 ATR` 单根跳变**(24728→21120)是 **AE 重建数据里最大的一处跳变**,
它就是"主连从冷门合约切回真合约"留下的假跳空。
- 该缺陷的**根因与 §1.4 的铜是同族**:`rebuild_zadj_15m.py` 的 `match_contracts` **只看收盘价相等**,
不看 OI/成交量,于是会把冷门合约认成主连的底层合约。
- 受影响数据:`zadj_v4/data_tq/AG_clean15m.csv`(H10 的 ag 60m 用的是另一份 `REJECTED_ag_60m.csv`,
同样主连口径,**很可能同样受影响**)。
- **依红线"发现异常先停下来问",本轮不自行修复**。修复方案候选 = §1.5 的 A/B 两案(A 加流动性约束 + 按 OI 消歧最省)。

### 4.4 顺手做的"受影响区间"体检(用户要求:只体检,不重跑结论)
用与 `rebuild_zadj_15m.py` **同法**(只看收盘价相等)扫 ag **60m** 主连(2023-05-16 ~ 2026-10-15,8964 根):
- 未匹配 **282/8964(3.1%)**;
- 标的合约 **OI < 当根最大 OI 的 20%** 的段 = **9 段 / 20 根(0.22%)**,最长一段 11 根
(`2025-03-18 21:00 ~ 03-19 14:00`,标的 `ag2505` OI 32,402 vs 主力 `ag2506` OI 418,201);
- **99 处 >3ATR 跳变中,落在这些冷门段 ±1 根内的 = 0 处**。

→ **ag 60m(`REJECTED_ag_60m.csv`)受该缺陷的影响面很小(0.22% bar)**,不像 AG 15m 那份那么集中。
**但本体检有一个重要盲区,必须写明**:我用的是"OI 占比"判据,而 §4.2 那个真凶 `ag2602`
**在被主连指针指着的那几根里 OI 仍有 25 万手**(交付月合约,OI 高但**成交量≈0**)→
**OI 判据抓不到它,必须同时看成交量**。所以"9 段/20 根"是**下界**,不是全貌。
→ 结论:**ag 60m 的既有 H10 结论"大概率"不受影响,但不能凭本次体检宣布安全**;
等 §1.8 的"显式主力合约"重做时,四个品种一起换、用"OI + 成交量"双判据重扫。

---

## §5 本轮新增/改动的文件
| 文件 | 类型 | 说明 |
|---|---|---|
| `rebuild_cu_60m.py` | 新增 | cu 60m 重建(主连为基座 + 换月复权),输出 `research_data/clean_cu_60m.csv` |
| `research_data/clean_cu_60m.csv`, `cu_60m.meta.json` | 新增 | 重建数据 + 来源/换月点/体检 |
| `research_data/rejected/REJECTED_cu_60m.csv.bak-20261015` | 新增(备份) | raw 主连旧文件,**未删** |
| `research_data/clean_cu_60m.csv.bak-20261015-v1` | 新增(备份) | v1(带换月抖动)的重建,**未删** |
| `verify_cu_h10_clean.py` | 新增 | cu 60m H10 再验(原口径 vs 诚实口径双跑) |
| `test_channel_no_lookahead.py` | 新增 | §3 的证明/回归测试 |
| `update_symbol_equity.py` | 修改 | 配对改 FIFO(`pair_trades` 唯一实现) |
| `equity_symbols/{原油,银,AI驱动}.csv` | 重算 | 见 §2.3 |

## §6 仍未完成
1. **铜 60m 最终裁决**:按交接文档的三条判据(平面饱和 / 样本外为正 / 夏普显著)**全过**,
但**锚定折正 3/6** 低于 ag/OI 的 4/6,且样本外集中在单折 F5 +
§1.6 的剩余数据问题 → 我判 **⚠️(不放行)**。**要不要在"折间一致性"上放它一马,请用户裁决**。
2. **主连连续序列重做(§1.8)**:显式按日选主力(OI + 成交量双判据)+ 真实换月日复权 + 换月点自检;
cu/AG/SC/AU 一起换。**这是 §1 与 §4 两个缺陷的共同根治方案。**
3. `commission.json` 里菜油实际手续费仍待用户在账户里查一个数字回填(10-14 遗留)。
4. `bot_prompt.md` 里菜油区间仍是含前视的旧口径(宽度 6.96→应 7.72、位置 +228→应 +210.5)
—— **改动实盘扣扳机条件,待用户批**。