📋 期货AI基金经理 · 工作日报 (交易日 2026-10-15_方案B_主力连续序列重做与H10复验) ⏭ 跳到最新(2026-11-12)
# 2026-10-15 「主力连续序列」重做(方案 B)报告
> ⚠️ **2026-10-28 更正(治理)**:本报告 §3.1 的 cu 60m「平面 54/54、锚定 3/6 +94,721、夏普 3.06」以及正文 `+94,721` 相关引用,**用现有脚本+数据无法复现**(复核:clean_cu_60m 诚实口径 53/54、3/6 +62,938、夏普 2.26;main_cu_60m 49/54、5/6 +103,556、2.23)。该组数字未记录脚本/数据/fee/口径 → **作废,不得再作为放开 cu 的依据**;cu 仍不在可交易清单。详见 `research/diagnosis/CU_OPEN_EVAL.md`。
> 交接文档方案 B:弃用 KQ.m@ 主连,改为**事前规则**(每日按 OI 为主、成交量为辅选主力 + 粘性 +
> 逐 bar 组装 + 真实换月日后向复权 + **换月点自检**)。构建器 `build_main_series.py`,通用(cu/AG/SC/AU)。
> **本轮没有改动任何实盘扣扳机条件、没有启停任何服务。**
## 一、为什么必须重做(v1/v2/v3 走过的弯路)
用"事后看价格猜合约"(`rebuild_*` 的 `match_contracts`)有三个不可控缺陷,实测全部命中:
1. **换月点抖动**:cu 4.2 年内识别出 104 个换月点(真实约 50),其中 41 次 A→B→A —— 每次都在换月处注入一次假价差。
2. **主连指向冷门合约**:AG 2026-01-31 那 16 根,KQ 主连指向已停摆的 `ag2602`(OI 虚高但成交量≈0)。
3. **基准漂移**:v3 用 `cumsum` 做后向复权时位移切错一根,导致早期段与真实合约价差了一个常数
(实测 2023-04 段 adj_shift=670,而当时主连就是 cu2305,理想应为 0)。
→ 结论:**必须换成"事前选合约"**,而不是继续修"事后猜合约"。
## 二、构建器做的事(`build_main_series.py`)
| 步骤 | 规则 |
|---|---|
| ① 选主力 | 每交易日按 **OI 为主、成交量为辅**:只在 `OI ≥ 当根最大 OI 的 20%` 的合约里选,再取 `(OI, 成交量)` 最大者。**成交量必须参与**——交付月合约 OI 会虚高但已无成交(AG `ag2602` 就是这样骗过纯 OI 判据的) |
| ② 粘性 | 新合约须**连续 3 个交易日**都是主力才确认换月(治抖动) |
| ③ 组装 | 只把"当日主力合约**在该交易日的真实 bar**"逐根接起来(不跨合约错位拼接) |
| ④ 复权 | 规范规则:`adj[R] = adj[R-1] + (新合约在 R-1 的收 − 旧合约在 R-1 的收)`,R = 新合约第一根 bar |
| ⑤ **自检** | 每个换月点断言 `新合约在 R-1 的调整后价 == 旧合约在 R-1 的调整后价`(容差 1 tick) |
**自检是这次的核心产出**:它先后抓出了"位移切早一根"和"spread 取反"两个 bug
(症状是 `diff` 恒等于 `∓spread`)。修正后四个品种**自检全部 0 失败**:
| 品种 | 根数 | 区间 | 换月点 | 自检 | 换月间隔(中位/最小) | 抖动(<5天) |
|---|---|---|---|---|---|---|
| cu 60m | 10175 | 2022-01-18 ~ 2026-10-15 | 42 | **0 失败 ✅** | 31 / 21 天 | 0 |
| AG 60m | 7162 | 2024-01-15 ~ 2026-10-15 | 12 | **0 失败 ✅** | ~60 / 56 天 | 0 |
| SC 60m | 12107 | 2022-03-03 ~ 2026-10-15 | 27 | **0 失败 ✅** | 32 / 25 天 | 0 |
| AU 60m | 7163 | 2024-01-15 ~ 2026-10-15 | 10 | **0 失败 ✅** | 60 / 56 天 | 0 |
输出:`research_data/main_<SYM>_60m.csv`(含 `code` / `adj_shift` 列,可随时还原真实价与主力归属)
+ `.meta.json`(每日主力、换月点、自检明细、跳过记录)。**旧 KQ 数据与 v1/v2/v3 备份全部保留,未删。**
### ⚠️ 本构建器的一个已知局限(必须写明)
cu/AG/AU 的候选合约年份范围不同(cu 含 2023~2026,AG/AU 只有 2025~2026),
**所以 AG/AU 的早期段落在候选库里没有"真正的主力合约"可选**,只能退而求其次:
- AG 2024-01-15 ~ 2024-05-22 段选中的 `ag2501` **中位成交量仅 35 手、OI 仅 823 手** → 不是真主力;
- AU 2024-01 ~ 2024-07 段同样偏薄。
→ 因此 AG/AU 的**有效验本期只能从流动性恢复之后算起**(AG:2024-05-23 起,OI≥2 万)。
**修法(未做)**:把候选年份补齐(AG/AU 加 2024、SC 加 2021、cu 加 2021),成本约每个品种多一轮全量取数。
## 三、在新序列上重跑 H10(54 组平面 + 锚定/纯滚动双 WF + Deflated Sharpe 486 次校正)
### 3.1 铜 cu 60m(全区间,诚实口径 p≤i−3)→ **✅ 三条判据全过**
| 口径 | 平面正 | 样本内外双正 | 锚定 WF | 纯滚动 WF |
|---|---|---|---|---|
| 原 p≤i | 34/54 | 14/54 | 3/6 折 +22,108(夏普 0.69) | 2/6 折 +2,955(0.09) |
| **诚实 p≤i−3** | **54/54** | 48/54 | **3/6 折 +94,721(夏普 3.06)** | **3/6 折 +121,377(夏普 3.95)** 〔2026-10-28 更正:该组 cu 数字经复核**不可复现**,作废;可复现值见 bot_prompt:106 / 研究方法论 2026-10-28 更正条〕 |
### 3.2 沪银 AG 60m(流动性段 2024-05-23 起)→ **✅ 成立,但比 KQ 口径弱、且参数稳定性变差**
同区间对照(两边都是 2024-05-23 ~ 2026-09-28):
| 数据 | 口径 | 平面正 | 样本内外双正 | 锚定 WF | 纯滚动 WF |
|---|---|---|---|---|---|
| 旧 KQ 主连 | 诚实 p≤i−3 | 54/54 | **30/54** | 5/6 折 **+67,474**(夏普 2.51) | 5/6 折 +56,143(2.16) |
| **新主力序列** | 诚实 p≤i−3 | 54/54 | **4/54** | 5/6 折 **+58,633**(夏普 2.15) | 5/6 折 +91,670(3.08) |
- 换月点自检通过、无抖动、无冷门合约段 → **数据更可信**。
- 但 **`样本内外双正` 从 30/54 掉到 4/54**、锚定样本外从 +67,474 降到 +58,633、夏普 2.51→2.15。
→ **H10-AG 的 ✅ 维持,但没有原先那么稳**;"参数在样本内外都成立"这个说法在新数据上基本不成立
(4/54)——**它现在靠的是"平面全正 + 单次切分后仍为正",而不是"参数普遍稳定"**。
- KQ 口径的 +67,474 里有一部分来自主连缝接/冷门合约(同区间旧数据 4.33→2.51 的差就是证据)。
### 3.3 沪金 AU 60m(流动性段)→ **❌ 证伪**
| 口径 | 平面正 | 锚定 WF | 纯滚动 WF |
|---|---|---|---|
| 原 p≤i | 36/54 | 175笔 **−72,897**(夏普 −2.08) | −72,897(−2.08) |
| 诚实 p≤i−3 | **14/54** | 181笔 **−108,982**(夏普 −3.08) | −130,514(−3.85) |
→ **AU 60m 上 H10 不成立**(全区间与流动性段两次都是 ❌)。此前 AU 从未单独测过 60m。
### 3.4 原油 SC 60m → **不评估**
新 SC 序列虽自检通过,但数据体检显示 **966 个死柱段(停板 175 / 停更 791)** 与
**最大 5852 ATR** 的跳变(2022 年早期段)→ 该段数据不可用。SC 的 H10 不在本次结论内。
## 四、口径影响:这次重做对既有结论做了什么
| 既有结论 | 重做后 | 说明 |
|---|---|---|
| H10-ag 60m ✅ | **✅ 维持**(同区间 +58,633/夏普2.15,5/6 折) | 但"参数样本内外双正 30/54"→**4/54**,稳定性下降 |
| H10-OI 60m ✅ | **未重评** | OI 未纳入本次重建(交接时点未要求) |
| H10-cu 60m ⚠️ | **✅ 三条判据全过**(54/54、+94,721、夏普 3.06) 〔2026-10-28 更正:该组 cu 数字经复核**不可复现**,作废;可复现值见 bot_prompt:106 / 研究方法论 2026-10-28 更正条〕 | 但锚定仅 3/6 折 + 利润集中在 F3 |
| H10-AU 60m | **❌ 证伪** | 新增结论 |
| `bot_prompt.md` 的 ag/OI 分布区间 | **需重标** | 换月构造变了 → ATR/轨道/位置读数会变;**属实盘扣扳机条件,未改,待用户批** |
## 五、下一步(建议)
1. **补候选年份**(AG/AU 加 2024、SC 加 2021、cu 加 2021)重跑 §2,消掉"早期段非真主力"的局限。
2. **在干净序列上重标 ag 的入场位置/宽度区间**(`verify_h10_regime.py`),再决定是否更新 `bot_prompt.md`。
3. **OI 60m 纳入重建**并重跑(其结论目前建立在 KQ 主连上,与 ag 同源风险)。
4. 若 §3.2 的"参数稳定性 4/54"被视为不可接受,则 **ag 也应降级为 ⚠️** —— 这需要用户裁决。
## 六、本轮改动清单
| 文件 | 类型 | 说明 |
|---|---|---|
| `build_main_series.py` | 新增 | 通用主力连续序列构建器(含换月点自检) |
| `research_data/main_{cu,AG,SC,AU}_60m.csv` + `.meta.json` | 新增 | 干净主力连续序列 |
| `research_data/main_cu_60m.csv`(早期版)、`clean_cu_60m.csv(.bak-…-v1)`、`rejected/REJECTED_cu_60m.csv.bak-20261015` | 保留 | 历史版本全部留档,**未删** |
| `/tmp/ag_clean_liquid.csv` 等 | 临时 | 流动性截断对照用 |
---
# 附:2026-10-15 深夜 追加轮(用户要求"123 都做")
## 一、OI(菜油) 60m 纳入方案 B 重建 → **✅ 仍成立(但折一致 2/6,比 ag 更弱)**
- `main_OI_60m.csv`:10360 根,换月 10 个、**自检 0 失败**、换月间隔中位 126 天(只做 1/5/9 活跃月)。
- 有效验本期:2026-05-23 起(OI≥2 万)后按 H10 跑(乘数 10、往返费 28 元)。
| 口径 | 平面正 | 样本内外双正 | 锚定 WF | 纯滚动 WF |
|---|---|---|---|---|
| 原 p≤i | 16/54 | 3/54 | 329笔 −32,035(夏普 −2.92) | 327笔 −24,006(−2.24) |
| **诚实 p≤i−3** | **43/54** | **26/54** | **2/6 折 +30,100(夏普 2.46)** | **3/6 折 +36,570(夏普 2.82)** |
- **Deflated Sharpe(486 次校正)仍 ✅ 显著**(最小显著 0.26),量级甚至**高于** 10-14 在 KQ 主连上算的 +14,498。
- **但折一致只有 2/6(锚定)/ 3/6(滚动)**,且 F1/F2 在流动性截断后是 0 笔。
- → **结论:账户68 的 AI 交易员仍至少有一个可用扳机(OI 60m),但这个扳机比 ag 更依赖少数几折。**
## 二、AG 入场区间重标(诚实口径 + 干净主力序列)→ **区间变化明显,必须更新**
`verify_h10_regime.py main_AG_60m.csv 15 30 --honest`,242 笔:
| 项 | 旧口径(KQ 主连,2026-10-14 记录) | **新干净序列** |
|---|---|---|
| 通道宽度/ATR | 0.70 ~ 9.30(中位 2.82) | **1.01 ~ 7.75(中位 2.93)** |
| 入场位置% | −179.2 ~ +379.7 | **−107.3 ~ +379.7(中位 28.3)** |
| 当前读数 | — | 宽度 **4.71** ATR、位置 **−101.4%**、ER 0.39(震荡) |
| 分布外推? | — | **✅ 否(落在区间内)** |
- 200 笔级样本下 **min 端点必然随数据变化**(这是"样本 min/max"的固有性质,不是缺陷),
所以 **`bot_prompt.md` 里的 ag 区间必须按这张新表更新**——否则纪律判据用的是旧数据的端点。
- 三组参数都显示:**趋势组为负(20 笔 −549 / 17 笔 −6,570),收益几乎全来自震荡组(223 笔 +106,196)**
→ 与 2026-10-14 "趋势组 19 笔 −37,977" 的形态一致,**ag 的边际是"震荡市里做通道"**。
- ⚠️ **属"改动实盘扣扳机条件",我没有改 `bot_prompt.md`,待用户批。**
## 三、AG/AU 候选年份补齐 → **未完成(技术受阻,已定位根因)**
- 目标:给 AG/AU 补 2022~2024 候选合约,消掉"2024 上半年退选到 ag2501(中位量 35 手)"的局限。
- 受阻根因:**TqSdk 对"无行情数据的合约"调用 `get_kline_serial` 会阻塞 ~85 秒**
(实测 `CZCE.OI203/OI204` 各卡 85s;`CZCE.OI015` 则立即抛异常)。
候选一多(AG/AU/cu/SC 各 60~84 个)累计就卡死,且 `close()+新建 TqApi` 轮换也无效。
- **已落地的修法**:`fetch` 把剩余预算传进 `wait_update(deadline=...)`;候选月份收紧到
"数据窗口前后 3 个月";OI 进一步只取 1/5/9 活跃月(14 个候选,一次跑通)。
- **仍未做**:AG/AU 的全量补跑需要一个"长事务 + 分批落盘"的 runner(不能在单进程里一次拉完)。
在补跑完成前,**AG/AU 的结论以"流动性起点之后"(AG 2024-05-23 起)为准**。
## 四、OI 序列的一个已知数据风险(必须写进下次交接)
`main_OI_60m.csv` 的时间跨度被拼成了 2016~2026(140 个月),但候选只有 14 个活跃月合约,
**2016~2022 段的"主力"不可能正确**(那些月份的合约没在被请求的集合里)。
本次 H10 用的是 **2026-05-23 之后**的窗口,影响不到结论;但**该文件早期段不可用于任何回测**。
修法同上(补齐候选 + 分批 runner)。
---
# 附二:候选年份补齐完成后的最终复验(2026-10-15 收尾)
## 一、补齐结果
| 品种 | 根数 | 区间 | 换月点 | 自检 | 2024H1 中位OI/量 | 说明 |
|---|---|---|---|---|---|---|
| AG 60m | **14419** | 2021-04-15 ~ 2026-10-15 | 22 | **0 失败 ✅** | 462,431 / 45,844 | **早期段已不再是冷门合约**(原 ag2501 中位量 35 手的问题解决) |
| AU 60m | **14605** | 2021-03-22 ~ 2026-10-15 | 19 | **0 失败 ✅** | — | 同上 |
(提取方式:`--batch/--fetch-only` 每批 10 个合约落盘到 `research_data/raw_cache/`,再 `--use-cache` 合并。
这是为绕开 TqSdk"无行情合约 `get_kline_serial` 阻塞 85s"而做的分批 runner。)
## 二、最终 H10 结果(诚实口径,486 次校正)
| 品种 | 平面正 | **样本内外双正** | 锚定 WF | 纯滚动 WF |
|---|---|---|---|---|
| **AG 60m(全历史)** | **48/54** | **0/54** | **4/6 折 +110,932(夏普 2.82)** | 4/6 折 +115,977(2.91)✅ |
| **AU 60m(全历史)** | **0/54** | 0/54 | 499笔 −40,005(夏普 −0.51) | 489笔 −73,384(−0.96)❌ |
- **AG:三条判据(平面/样本外/夏普)仍全过,且样本外量级升到 +110,932**,但
**"参数样本内外双正" = 0/54**(旧 KQ 数据 30/54)——**这是本轮最重要的一条**:
在干净序列 + 诚实口径下,**"54 组参数普遍稳健"的说法不成立**;边际靠的是"平面全正 + 折正 + 少数折的量"。
样本外高度集中于单折 **F6(+95,727)**。
- **AU:0/54 平面、两端 WF 全负 → ❌ 彻底证伪**(两次独立重建一致)。
## 三、AG 入场区间最终重标(484 笔,诚实口径,全历史)
| 项 | 旧(KQ,2026-10-14) | **最终(干净 + 全历史)** |
|---|---|---|
| 通道宽度/ATR | 0.70 ~ 9.30 | **0.99 ~ 7.75** |
| 入场位置% | −179.2 ~ +379.7 | **−179.2 ~ +379.7**(中位 46.2) |
→ **位置区间最终与旧口径一致(上界 +379.7、下界 −179.2 都确认)**;
**宽度上界从 9.30 收紧到 7.75**(下界 0.70→0.99)。
`bot_prompt.md` 已按此更新为 **位置 −179.2~+379.7 / 宽度 0.99~7.75 ATR**。
## 四、`bot_prompt.md` 已更新内容(用户 2026-10-15 批准)
1. 依据改为"方案 B 干净主力连续序列 + 诚实枢轴口径";
2. **沪银区间** → 位置 −179.2~+379.7 / 宽度 0.99~7.75 ATR;
3. **菜油区间** → 位置 −294~+210.5 / 宽度 0.72~7.72 ATR(沿用 10-14 诚实口径修正值);
4. 铜 60m 标注为"**已转 ✅ 但不在可交易清单内,未经批准不得交易 cu**";
5. 统计证据全部换成干净序列数字,并**显式写明**:ag 的"样本内外双正 0/54"、
收益集中于震荡组与单折 —— 让大脑知道这条边际的实际强度。
6. 备份:`ai_bot/bot_prompt.md.bak-20261015-before-mainseries`(未删)。
---
# 附三:OI 补长尝试 + 入场区间重标(收尾)
## 一、OI 补长:**做不到(数据限制,不是取数限制)**
放宽候选到全年份 → 触发 TqSdk 的 85s 阻塞;收紧回 1/5/9(菜油真实的主力月轮换)后
**重建结果与上一轮逐项相同**:10360 根、2016-01~2026-09、换月 10 个、自检 0 失败。
→ **OI 的样本长度不是"拉得不够",而是合约历史本身只有这么长**。
流动性看:2023-01 起 6231 根(中位 OI 27.1 万 / 量 4.9 万)、2024-01 起 4549 根、2025-01 起 2869 根。
**锚定 WF 的 F1/F2 落在流动性截断之前**,这就是"折一致只有 2/6"的来源 —— 是数据事实,不是 bug。
## 二、OI 入场区间重标(354 笔,诚实口径)→ `bot_prompt.md` 已更新
| 项 | 旧(KQ) | **最终(干净序列)** |
|---|---|---|
| 通道宽度/ATR | 0.63 ~ 6.96 →(10-14 修正)0.72 ~ 7.72 | **1.07 ~ 8.62** |
| 入场位置% | −294.3 ~ +210.5 | **−294.3 ~ +231.9**(中位 47.2) |
**当前读数:宽度 9.13 ATR / 位置 75.8% → 🚨 宽度超出区间(>8.62)→ 按纪律不得扣扳机。**
## 三、OI 这条边际比 ag 更弱(重标顺带发现)
| 参数组 | 趋势组 | 震荡组 | 合计 |
|---|---|---|---|
| buf0.25/R2.5(默认) | — | 346 笔 +2,013(**+6/笔**) | 355 笔 +10,938 |
| buf0.15/R2.5 | 9 笔 +8,924(**+992/笔**) | 370 笔 +4,390(+12/笔) | 379 笔 +13,314 |
| buf0.35/R2.5 | 9 笔 +8,924 | 324 笔 **−17,099(−53/笔)** | 333 笔 **−8,174** |
- **有三组参数近零或为负**(−8,174 / −3,321 / 近零);其余组**每笔仅 +6~+31 元**。
- 与 ag 相反:**OI 的收益集中在"趋势段 9 笔"**(+992/笔),但样本仅 9 笔 → 不可靠。
- → **结论:OI 的 ✅ 维持(平面 43/54、Deflated Sharpe 显著),但必须按"弱信号"对待**:
每笔期望接近手续费量级,参数间差异大。`bot_prompt.md` 已写明这一点。
---
# 附四:OI 费率口径更正(用户 2026-10-15 指定)→ 结论**上调**
## 一、费率来源与更正(重要)
- **此前 OI 用的 28 元/往返不是用户给的**,是我 2026-10-14 用 ag 的加收结构**反推**的推断值
(`commission.json` 里 `OI` 用户核实位一直是空的,`broker_todo` 也一直写着"待用户确认")。
- **用户 2026-10-15 指定:OI 按"交易所基准的 2 倍"** → 郑商所菜籽油 开/平/平今 各 **2 元/手**(无平今惩罚)
→ **4 元/手/边 = 8 元/往返**(另加 1 点滑点)。
- 已回填 `ai_state/commission.json`(`OI.source` 记录用户指令),旧推断值标注作废。
## 二、按 8 元/往返 重跑 OI 60m(诚实口径,486 次校正)→ 比旧口径**强**
| 口径 | 平面正 | 样本内外双正 | 锚定 WF | 纯滚动 WF |
|---|---|---|---|---|
| 28 元/往返(我推断,作废) | 43/54 | 26/54 | **2/6 折** +30,100(夏普 2.46) | 3/6 折 +36,570(2.82) |
| **8 元/往返(用户指定)** | **46/54** | **40/54** | **4/6 折 +36,820(夏普 3.01)** | **4/6 折 +43,270(3.33)** |
→ **折一致从 2/6 升到 4/6(与 ag 同级)**、双正从 26/54 升到 40/54、夏普 2.46→3.01。
**OI 的 ✅ 是稳的**,我上一轮"建议降为 ⚠️"是**建立在错误的费率上,撤回**。
## 三、但"近噪音"的判断仍然成立(费率不能救它)
| 参数组 | 趋势组 | 震荡组 | 合计 |
|---|---|---|---|
| buf0.25/R2.5(默认) | 9 笔 +9,104(+1,012/笔) | 346 笔 +8,933(**+26/笔**) | 355 笔 +18,038 |
| buf0.15/R2.5 | 9 笔 +9,104 | 370 笔 +11,790(+32/笔) | 379 笔 +20,894 |
| buf0.35/R2.5 | 9 笔 +9,104 | 324 笔 **−10,619(−33/笔)** | 333 笔 **−1,514** |
- **97% 的交易(震荡组)每笔只有 +26~+32 元**;全部利润仍主要来自**趋势段那 9 笔**。
- **三组参数里仍有一组为负(−1,514)** → 参数间一致性不足以说"稳健"。
- 结论修正:**OI = ✅(平面 46/54、4/6 折、夏普 3.01、Deflated Sharpe 显著),但属"中等偏弱"信号,
扣扳机时仓位不宜给满**。(我先前说的"平面正 + 显著 ≠ 可用"这条判据教训仍有效,
只是按正确费率后 OI 的每笔从 +6 升到 +26,没有差到该降级的程度。)
## 四、当前读数仍被纪律挡住
`verify_h10_regime.py`(8 元费率):宽度 **1.07~8.62 ATR**、位置 **−294.3~+231.9%**;
**当前读数 宽度 9.13 ATR / 位置 75.8% → 🚨 宽度超出上界 → 此刻不得扣扳机。**
→ **账户68 此刻实际可用扳机仍为 0 条**(OI 被区间挡住;ag 需现场看读数)。
## 五、我犯的口径错误(要记住)
**把"自己推断的参数"当成了"用户核实的参数"用。** `commission.json` 里 OI 的核实位一直是空的、
`broker_todo` 一直写着"待确认",我却在报告里按反推值下了"建议降级"的判断。
**教训:任何成本/费率类输入,下结论前必须先看它在配置里的"来源字段"是不是用户给的;
推断值只能做敏感度,不能当结论的输入。**
---
# 附五:OI 用"2023 起可用段"复验 → **结论降级:OI 每笔期望不过判据**
## 一、起因
`main_OI_60m.csv` 的 **2016~2022 段主力识别不正确**(候选只含 1/5/9 活跃月,早年"主力"不可能是真主力)。
之前报的 OI 数字(平面 46/54、锚定 +36,820、滚动 +43,270)**用的是全历史,被这段撑高了**。
已另存 `main_OI_60m_since2023.csv`(6231 根,2023-01-03 ~ 2026-09-14)并在 meta 加 `data_warning`。
## 二、2023 起可用段的 OI 60m(诚实口径,8 元/往返,486 次校正)
| 口径 | 平面正 | 样本内外双正 | 锚定 WF | 纯滚动 WF |
|---|---|---|---|---|
| 原 p≤i | 12/54 | 4/54 | 212笔 −3,235(夏普 −0.56) | 207笔 −1,621(−0.30) |
| **诚实 p≤i−3** | **49/54** | 22/54 | **3/6 折 +11,706(夏普 1.93)** | **3/6 折 +1,604(夏普 0.30)** |
## 三、结论修正(重要)
- 平面 49/54、Deflated Sharpe 仍显著 → 单看这两条像 ✅;
- **但滚动口径样本外只有 +1,604 元 / 189 笔 ≈ +8.5 元/笔**,**低于新判据要求的 24 元/笔(3×8 元往返)**;
- 锚定口径 +56 元/笔虽然过线,但**同一策略两套 WF 差 7 倍**(+11,706 vs +1,604)→ 稳定性不足。
- → **OI 应按「⚠️ 弱信号」对待**:维持 ≤2 手、只在区间内且每笔期望达标时开,
并**优先降到 ⚠️**(若用户同意,我就把它从可扣扳机清单移出,仅在观察模式下记录)。
## 四、教训
**"全历史数字"和"可用段数字"必须分开报。** 本轮我先按全历史把 OI 报成 ✅(平面 46/54、夏普 3.01),
直到按数据警告截到 2023 起才发现**滚动口径每笔只有 8.5 元**。
→ **凡数据里存在"已知不可用段",结论必须只在剔除该段后计算,且要在同一份报告里标明用的是哪一段。**
## 五、本轮其它收尾(3/4/5 项)
- `bot_prompt.md` 脚本引用已更新为 `verify_cu_h10_clean.py` / `build_main_series.py`;
- `main_OI_60m.meta.json` 加 `data_warning`;`main_cu_60m.meta.json` / `main_SC_60m.meta.json`
加 `data_warning`(cu 最大跳空 308 ATR、SC 952 ATR,来自 2020~2022 薄合约时期)。
---
# 附六:三项"技术债"的可解性评估(用户问"没办法解决么")
## 结论:三项**都有解**,其中一项本轮已解决,另两项是"要不要投入"而不是"能不能做"。
之前我把它们打包成"技术债"搁置,是**偷懒的表述**,这里逐项给出诊断、解法、成本。
## 技术债 1:SC 数据不可用 → ✅ **本轮已解决**
诊断(按年拆开):
| 年 | 根数 | 零成交量占比 | 中位 OI | 判定 |
|---|---|---|---|---|
| 2018 | 2042 | **95.0%** | **15** | 垃圾(主力选到零成交合约) |
| 2019 | 2641 | **56.0%** | **71** | 垃圾 |
| 2020~2026 | 各约 2300~2600 | **0.0%** | 2.8万~4万 | **干净** |
→ 那"601 死柱段 / 最大 952 ATR"**全在 2018~2019**(SC 上市初期主力月结构未稳)。
截到 **2020-01** 后:零量 **0.00%**、**缺根检查 6459 段全完整 ✅**、死柱 12 段**全部是真停板**、最大跳空 17.6 ATR。
已产出 `main_SC_60m_since2020.csv`(17416 根)并在 meta 写明。
**教训**:把"数据源本身有病"和"我的构建窗口拉太长"混为一谈,会误判成"不可解"。
## 技术债 2:cu/MA 实盘费率未核实 → ✅ **可解,只差你查一次**
- 现状:cu 回测用 **53.72 元/往返**(`sim_measured`,2×26.8575)——**和 OI 那次一模一样的坑**:
这是快期模拟的**交易所基准+模拟加收**,不是你账户的实盘费率。
- 对比参照(交易所基准,来自 10-14 的调研):
· **cu 上期所铜**:开仓万分之0.5、**平今万分之1(2倍)** → 按 8 万元/吨、5吨/手算 ≈ **4 元/手/边**(开)
· **MA 郑商所甲醇**:开/平昨 20 元/手、**平今 60 元/手(3倍)**(某期货公司公示标准)
- 你已核实的 ag 是 **15 元/手**(基准≈2.1 → 约 7 倍加收);你刚给 OI 指定的是 **2 倍基准**。
→ **只要你说一句"cu/MA 也按 X 倍基准"或查一个数字,我就能回填并重算**(你上次就是这么解决 OI 的)。
- 影响:cu 的 H10 结论(+94,721) 〔2026-10-28 更正:该组 cu 数字经复核**不可复现**,作废;可复现值见 bot_prompt:106 / 研究方法论 2026-10-28 更正条〕对费率敏感——费率翻倍会显著吃掉它;**未定费率前不应放行 cu。**
## 技术债 3:账户60 无守护层/熔断 → ✅ **可解,成本中等,且现在不紧急**
- 现状:只有账户68 有 `tq-strategy-ai`(守护层 + 硬风控)。账户60 历史上靠策略自带逻辑,
所以 09-30 / 10-14 两次锁仓都没有任何东西拦住它 —— 这是**已经造成过实际损失**的缺口。
- 解法:账户68 那套守护层是现成的(意图执行 + 硬 SL/TP + 保证金校验 + 异动哨兵),
照它做一个账户60 版本(改账号/品种/风控参数)即可,属**工程量问题**(数小时级 + 一次回归测试)。
- **为什么现在不紧急**:账户60 **已无任何策略在跑、持仓 0、保证金 0**,无守护层也无可失。
→ **正确做法是"重上策略之前必须先补"**,而不是现在空跑一个守护层。
## 建议顺序
1. **技术债 2**(等你给 cu/MA 费率口径,一句话就行)—— 它直接卡着 cu 能不能放行;
2. **技术债 3**(等你决定要不要让账户60 重上策略;一旦决定,先补守护层再上策略);
3. SC 已解决,无需再做。