📋 期货AI基金经理 · 工作日报 (交易日 2026-10-16_TL优化复核) ⏭ 跳到最新(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

# TL(30年国债) 优化复核:**❌ 无法优化到可部署**(2026-10-16)

> 触发:用户要求「根据(现有)模拟数据看看如何优化后继续启用」。
> 前置结论:`2026-10-14_TL国债复刻与WF复核.md` 判定 TL ❌ 停用,根因=成本,
> **唯一未排除项 = 「改成限价挂轨省滑点」**。本次就是去排除它。
> 脚本:`/home/fm/quant/tl_optimize/`(tl_raw_edge / tl_edge2 / tl_causal / tl_final / tl_verdict / tl_trend / tl_trend_verify / tl_minchange / tl_slip / tl_zerodslip_dsr)

---

## 一、先说一个必须纠正的 bug:原复刻脚本有**未来函数**

`verify_tl_wf.py` 第 77-118 行:

```python
ma = pd.Series(c).rolling(win).mean().values # 含 c[i](本根收盘)
...
for i in range(win, n):
if l[i] <= dn[i]: # 却判定本根 bar 内的最低价
```

**band 用了本根 bar 的收盘价,却去判定同一根 bar 内的触碰 —— 用收盘价交易盘中。**
其 docstring 写"信号在 bar i 收盘确认…价格在 bar i 内触轨",本身自相矛盾。

对照(限价挂轨,持有 30 分钟):

| 版本 | 累计净利 | 夏普 |
|---|---:|---:|
| 原版(band 用 c[i]) | **+106,357** | 4.01 |
| **因果版(band 只用截至 i-1)** | **−51,983** | −1.70 |

参数平面:原版所有正格子,因果版**全部转负**(−12,007 ~ −524,657)。

**实盘 `strategy_tl.py` 是正确的** —— `compute_bb()` 用 `closes.iloc[-(BB_PERIOD+1):-1]`,
明确剔除成形 bar。**是复刻脚本与实盘口径不一致,不是策略本身有未来函数。**
(全库审计:只有 `verify_tl_wf.py` 一处,其他 `verify_*` / `*_wf*` 无此问题。)

---

## 二、优化搜索:五个方向,全部因果引擎

### 方向 1:原始信号有没有方向性?

| 参数 | 事件数 | 胜率(先触±0.10) | 毛利/笔 |
|---|---:|---:|---:|
| BB20±2.0σ | 1204 | 51.6% | +32 |
| BB15±2.0σ | 1302 | 54.0% | +80(t=2.90) |
| BB30±2.0σ | 1094 | 44.6% | −108 |

**覆盖 206 元成本需要胜率 > 60.3% —— 没有一组够。**
触轨后 30 分钟确有微弱均值回归(+56 元/手,t=2.33),但**只有成本的 27%**。

### 方向 2:入场方式(限价挂轨 vs 市价)

- 限价:入场=轨值;市价:入场=轨值+1tick
- **盈亏平衡点**:

| | 每边滑点平衡点 |
|---|---:|
| G1(固定+回撤止盈) | **> 0.35 tick 即转负** |
| G2(移动止盈) | **> 0.65 tick 即转负** |

- **实盘实测不利滑点:中位 1.1~1.4 tick、均值 0.7~0.9 tick(每边)**
→ **实测是平衡点的 2~4 倍。**

滑点敏感性(完整实盘规则,因果引擎):

| 每边滑点 | G1 累计 | G2 累计 |
|---:|---:|---:|
| 0.0 tick(理想被动单) | +46,364 | +55,739 |
| 0.7 tick(实盘均值下沿) | −28,664 | −1,313 |
| 1.0 tick | −64,848 | −29,929 |
| 1.2 tick(实盘中位) | −87,538 | −54,273 |

### 方向 3:非对称止盈/止损(20 组)

最优 TP=0.05/SL=0.20 → +23,307。**但风险剖面是典型的负偏**:
胜率 77.8%、盈亏比 **0.32**、偏度 **−1.67**、最差单笔 −2,006。
"小赢大亏"型,且 DSR z=−33。

### 方向 4:趋势过滤(结构性改造,方向一致且显著)

| 方案 | 累计(限价/30m) | t |
|---|---:|---:|
| BB20±2.0σ 无过滤 | −51,983 | −1.46 |
| **+MA200 顺势** | **+42,117** | **2.00** |
| +MA200 **逆**势 | **−70,714** | −2.58 |

**这是本次唯一"有经济含义"的改善** —— 均值回归信号必须与趋势同向
(+MA400 顺势同样更好)。Walk-Forward 也通过:**+35,519,t=2.28,4/5 折正**。

**但**:最优格最大回撤 **−49,954 > 累计利润 +42,117**(卡玛 <1),偏度 −0.88。

### 方向 5:Deflated Sharpe(把全部搜索计入)

| 情形 | 试验数 | 最优夏普 | 期望最大 SR0 | DSR 判定 |
|---|---:|---:|---:|:--:|
| 因果 + 限价 | 120 | 1.443 | **3.880** | ❌ z=−27.9 |
| **滑点=0(理想被动单)** | 120 | **3.879** | **4.872** | ❌ z=−9.79 |

---

## 三、决定性结论

> **即使把滑点假设到 0(实盘做不到的理想被动挂单),
> TL 的 Deflated Sharpe 仍然不通过**:120 组搜索下的最优夏普 3.879 < SR0 4.872。
>
> 也就是说:**最优结果仍然落在"纯噪声搜 120 组也能达到"的范围之内。**

叠加真实约束后更明确:

| 约束 | 现实值 | 要求值 | 差距 |
|---|---:|---:|---|
| 每边不利滑点 | 0.7~1.4 tick(实测) | < 0.35 tick(G1平衡点) | **2~4 倍** |
| Deflated Sharpe | z=−9.79(即便零滑点) | > 1.645 | 差距巨大 |

**原报告的"唯一未排除项(限价挂轨)"至此关闭 —— 答案是:不够。**

---

## 四、还有一个更硬的证据:TL 已经有样本外数据了

TL 不是"从未上线",它**实盘跑了 5 周**:

- 账本 80 笔配对,台能力 **−7,080 元**(2026-09-10 ~ 10-14)
- 复刻因果版同期量级吻合(限价 −16,792 / 市价 −188,034,实盘落在中间)

**这本身就是样本外证据,而且是负的。** 所以"再挂上去观察观察"这个理由对 TL 不成立
—— 观察过了,是亏的。(这一点与 IF 不同:IF 从未上线,挂上去是在**生成**样本外证据。)

---

## 五、建议

| 选项 | 说明 |
|---|---|
| **A. 保持停用(推荐)** | 证据链完整:实盘负 + 复刻负 + 参数平面负 + 零滑点 DSR 不过 + 滑点平衡点差 2~4 倍 |
| B. 仍要挂上观察 | 我不会自行这么做 —— 与上述证据直接冲突。若你明确要求,我会照做并标注为"用户风险偏好决定,非回测支持",同时保留一键停用开关 |
| C. 若真的想走"被动挂单"路线 | 那**不是 TL 的问题,是一个独立的做市/被动成交工程项目**:要先证明 TL 上被动单的成交率与丢单成本,且要**在零滑点假设下先过 DSR** —— 而目前零滑点都不过,所以这条路的前置条件不成立 |

---

## 六、本次可复用的产出

1. **未来函数排查方法**:`rolling(...).mean().values` 配 `l[i] <= dn[i]` 的模式,
一眼可疑。全库已扫,仅 `verify_tl_wf.py` 一处。
2. **趋势过滤是均值回归策略的通用改进方向**:本次把 −51,983 拉成 +42,117,
方向一致(顺势 >> 逆势)。虽然 TL 因 DSR/回撤不达标,但这个结构性发现对其他
带轨均值回归策略有参考价值。
3. **滑点平衡点是比"净利"更有用的指标**:它直接告诉你要把执行做到什么程度才谈得上可行。

---

# 七、追加:用户提议的「30 分钟布林作为方向开关」(2026-10-16)

> 用户原话:「国债目前是用 5 分钟线对吧,如果加上 30 分钟布林作为开关控制方向呢?」
> 确认:**是的,`strategy_tl.py: DURATION = 300`(5 分钟)**。TL 每日 51 根 5m,恰好合成 8 根完整 30m。
> 脚本:`tl_optimize/tl_30m_switch.py`、`tl_30m_dsr.py`

## 7.1 开关定义(写死在测试之前,全部只用**已完成的** 30m bar)

| 编号 | 规则 |
|---|---|
| SW1 | 30m 收盘 > 30m 中轨 → 只做多;< 中轨 → 只做空 |
| SW2 | 30m 中轨**上升** → 只做多;下降 → 只做空 |
| SW3 | 位置与斜率**同向**才做,否则不做 |
| SW4 | 与 SW1 **相反**(证伪性对照,预期更差) |

(SW1~SW4 都只用中轨,所以 σ 倍数不影响结果 —— 实测 20±2.0 与 20±1.5 数字完全相同,符合预期。)

## 7.2 结果一:风险调整收益明显改善(滑点=0)

| 方案 | 笔数 | 累计 | **夏普** | **最大回撤** | t |
|---|---:|---:|---:|---:|---:|
| G1 无开关 | 386 | +48,543 | 2.85 | −8,415 | 2.67 |
| **G1 SW2 中轨斜率** | 196 | +35,908 | **3.59** | **−6,108** | **2.78** |
| G1 SW3 位置+斜率 | 152 | +29,010 | 3.27 | −6,072 | 2.56 |
| G1 SW1 中轨位置 | 165 | +24,600 | 2.62 | −7,197 | 2.07 |
| G1 **SW4 反向** | 266 | +7,567 | 0.58 | −9,753 | **0.50** |
| G2 无开关 | 295 | +55,324 | 3.12 | −11,797 | 2.52 |
| **G2 SW2 中轨斜率** | 179 | +45,169 | **3.63** | −10,869 | **2.68** |
| G2 **SW4 反向** | 246 | +22,208 | 1.40 | −11,269 | **1.14** |

**结论:30m 开关用绝对利润换来了更好的风险调整收益(夏普 2.85→3.59、回撤 −8,415→−6,108),
且 SW4 反向显著更差(t 2.78→0.50)→ 方向信号是真的,不是噪声。**

## 7.3 结果二:滑点平衡点被抬高,但仍不够

| 分组 | 无开关 | **+SW2** | +SW3 | 实盘实测 |
|---|---:|---:|---:|---|
| **G1** | 0.35t | **0.60t** | 0.55t | 0.7~1.4 ❌ |
| **G2** | 0.65t | **0.85t** | 0.75t | 0.7~1.4 ⚠️ |

**G2+SW2 的平衡点 0.85t,正好压在实盘实测的「均值 0.7~0.9 tick」上** —— 即:
**期望收益≈0,结果完全取决于执行质量。** 而实测**中位**是 1.1~1.4 tick(远超 0.85)。

实盘滑点下的表现:

| 每边滑点 | G2 无开关 | **G2 +SW2** |
|---|---:|---:|
| 0.7t(实测均值下沿) | −1,028 | **+7,715** |
| 1.0t | −29,344 | −11,375 |
| 1.1t(实测中位) | — | **162 组中仅 1 组为正(+8,277)** |
| 1.4t | −72,207 | −34,603 |

## 7.4 结果三:Deflated Sharpe(N=312,含 30m 开关族,滑点=0)

SR0 = **4.738**。全部 312 组里:

- **只有 1 组通过**:G2 BB30±2.0/SW3·30mBB30(夏普 5.292,z=+5.26 ✅)
- 其余全部不通过(z = −4.24 ~ −8.89),包括紧随其后的 BB25/BB20 同规则格

**312 组里恰好 1 组擦线通过、且仅滑点=0 时成立** —— 这更接近"312 次尝试中的一次运气",
而不是"找到了稳健边际"。

## 7.5 本次追加的结论

> **用户的 30m 布林方向开关是正确的思路,且是全部优化方案里改善最大的一步**
> (G2 平衡点 0.65→0.85 tick,+31%;夏普 3.12→3.63;回撤同步下降;反向对照明显更差)。
>
> **但它仍然没有把 TL 送过门槛**:
> - G2+SW2 平衡点 0.85t **压在实盘均值 0.7~0.9t 上** → 期望≈0
> - 实盘**中位** 1.1~1.4t 远超平衡点 → 实际应为负
> - 滑点=0 时 312 组仅 1 组过 DSR → 不稳健
>
> **瓶颈已经从"信号"转移到"执行"**:信号侧能做的(多周期共振)已经做到位了,
> 再往下要解决的是**能不能稳定做到 ≤0.85 tick/边**,那是执行工程问题,不是策略参数问题。

## 7.6 若要继续,唯一有意义的动作是**测量执行**,不是继续调参

- 把 `strategy_tl.py` 的下单从 `ask_price1/bid_price1`(主动吃价差)
改成**在轨值挂被动限价单**,加 MA/30m 开关
- 目的**不是赚钱**,而是**测量**:被动单在 TL 上的**成交率、丢单比例、实际不利滑点分布**
- 判据:若实际不利滑点**中位**能稳定 ≤0.85 tick 且丢单率可接受 → G2+SW2 才谈得上复活
- 在这组数据出来之前,**不应把 TL 当作"优化后可启用"的策略**

---

# 八、执行质量测量版:已上线(2026-10-16)

> 用户批准"实现被动挂单 + 30m 开关的测量版"。
> 脚本 `strategy_tl_measure.py` | 服务 `tq-strategy-tlm` | 前缀 `TLM1_`/`TLM2_`
> **定位:测量execution,不是已验证策略。** 原 `tq-strategy-tl` 保持停用不动。

## 8.1 与原版的三处差异

| | 原 `strategy_tl.py` | 测量版 `strategy_tl_measure.py` |
|---|---|---|
| **入场** | 看到价格触轨后,用 `ask_price1/bid_price1` **主动成交**(必吃价差) | **预先在轨值挂被动限价单**,让价格来撞(本版被测对象) |
| **方向** | 无开关,多空都做 | **30m 布林中轨斜率 (SW2)** 只允许顺势侧 |
| **埋点** | 无 | 每个触轨事件记录成交/丢单、成交价 vs 轨值/挂单价 |

出场规则完全不变(硬止损 ±0.10 / G1 固定+回撤止盈 / G2 移动止盈 / 15:13 强平不过夜)。

## 8.2 实测状态(上线后)

```
活动挂单 2 张: TL2612 BUY OPEN 1手 @ 117.76 [ALIVE] ← G1/G2 各一张
盘口: bid 117.85 / ask 117.86 ← 被动单挂在下方 ~10 tick
SW2: +1 (30m中轨上升) → 只挂多头, 不挂空头 ✓ 开关生效
启动清理: 🧹 已撤掉 2 张进程遗留挂单 ✓
```

## 8.3 实现过程中发现并修掉的 5 个问题

1. **`insert_order` 不能传主连符号** —— 传 `KQ.m@CFFEX.TL` 被拒("合约不存在"),
必须用 `quote.underlying_symbol` 取具体合约(原版就是这么做的)。
2. **挂单价必须对齐最小变动价位** —— TL tick=0.01,`round(band,3)` 有 3 位小数被拒
("下单价格不是价格单位的整倍数")。改为就近取整到 tick,
并在记录里**同时存 band_raw 与 order_px**,把"取整噪声(±0.5tick)"与"真实滑点"分开。
3. **不能用 `quote.low/high` 判断"挂单以来是否触轨"** —— 那是**当日**极值,
会把挂单之前的行情算进来,把"未触轨撤单"误判成"触轨未成交"。改为用采样到的最新价跟踪。
4. **进程重启不撤单** —— 旧进程的挂单会残留(新进程 slots 为空),
每次重启多叠一层(2→4→6 张),且旧单可能成交造出非预期持仓。
已加启动清理 `cancel_stale_orders()`。**原 `strategy_tl.py` 有同样隐患,本版显式处理。**
5. **测量表结构变更后的表头错位** —— 旧表头 + 新列。已归档旧文件让其重建。

## 8.4 ⚠️ 必须先知道的测量局限

**TqKq 是模拟撮合,它对被动限价单的成交模拟可能比真实市场乐观**:

- 模拟盘通常在"价格触到挂单价"时即视为成交,**不建模排队位置**。
真实市场里,价格只是**触及**你的价位而没**穿过**,你很可能排在队尾、**不成交**。
- 因此本测量得到的**成交率会偏乐观**;而**成交价 vs 轨值**这一项仍然可信
(它回答的是"被动单能不能拿到轨值价",答案是结构性的)。

**结论口径**:本次测量给出的滑点是**下界(最乐观情形)**。
若连这个下界都压不到 0.85 tick,那就不必再谈;
若压到了,还**必须在真实盘口(或至少 1 分钟级盘口回放)上复核排队与丢单**。

## 8.5 判据与查看方式

```bash
python3 /home/fm/quant/tl_exec_report.py # 随时查看执行质量汇总
```

判据(写在脚本头部):
- 触轨滑点**中位 ≤ 0.85 tick** → 执行侧达标,可谈复活(对照:主动单实测中位 1.1~1.4 tick)
- **丢单率过高** → 被动挂单拿不到想要的成交,方案不成立
- **触轨事件 < 30 个** → 不定论,继续积累

输出文件 `tl_exec_measure.csv` 字段:
`ts, group, dir, band_raw, order_px, bid, ask, event, fill_px, slip_vs_band, slip_vs_order, reason`
(`event ∈ filled / missed / cancelled`;`cancelled` = 轨值移动撤单且期间未触轨,属正常重挂)

## 8.6 复核入口

| 项 | 值 |
|---|---|
| 服务 | `tq-strategy-tlm`(原 `tq-strategy-tl` 仍 suspended) |
| 停用方法 | 把 `tq-strategy-tlm` 加进 `ai_state/suspended_strategies.json` 的 `suspended`(单靠 disable 无效) |
| 面板 | 账户名已改为「账户1(IF+国债测量)」,TL 品种已映射到「30年国债(执行测量版, 账户1)」 |
| 测量数据 | `/home/fm/quant/tl_exec_measure.csv` |
| 归档 | `tl_optimize/archive/tl_exec_measure.bad-header-20261016.csv` |

---

# 九、已接入 JK 面板(2026-10-16)

用户要求「更新到 JK 面板」。账户/策略归属上一轮已改,本轮补的是**执行测量的可视视图**。

## 9.1 新增子视图

| 入口 | 说明 |
|---|---|
| **https://jk.775016.cn/tl** | TL 执行质量测量页面(10 秒轮询刷新)**← 外网入口** |
| `https://jk.775016.cn/api/tl_exec` | 同数据的 JSON 接口 |
| 主面板顶部按钮 | 「🏦 TL执行测量」 |

> 外网路径:nginx `/etc/nginx/sites-enabled/dsh` 的 `server_name jk.775016.cn` (443 ssl) → `proxy_pass 127.0.0.1:8001`。
> 本机地址 `127.0.0.1:8001` 只有本机能访问,**对外一律用 jk.775016.cn**。

新模块 `tl_exec_panel_routes.py`,照 `stk_panel_routes.py` 的既有模式挂载
(`register_tl_exec_routes(app, jsonify, render_template_string)`),**纯文件读取,不碰交易**。

## 9.2 页面内容

- **判据横幅**:三种状态 —— `nodata` 无触轨 / `wait` 样本<30 / `ok` 中位≤0.85t / `bad` 中位>0.85t
- **卡片**:触轨事件数、成交率、滑点中位(vs 轨值)、滑点区间、平衡点 0.85t、对照主动单 1.1~1.4t、重挂次数
- **事件构成**:filled / missed / cancelled 计数
- **最近 12 条事件明细**:时间、组、方向、轨值、挂单价、事件、成交价、滑点
- **顶部警示框**:明确写出 TqKq 模拟撮合不建模排队、本页滑点是**最乐观下界**

## 9.3 判据逻辑已用合成数据验证(未打搅真实文件)

| 用例 | 触轨 | 成交率 | 滑点中位 | 判定 |
|---|---:|---:|---:|---|
| 样本不足 | 15 | 66.7% | 0.0 | `wait` ✅ |
| 达标 | 42 | 95.2% | 0.0 | `ok` ✅ |
| 临界达标 | 42 | 95.2% | 0.8 | `ok` ✅ |
| 不达标 | 42 | 95.2% | 1.2 | `bad` ✅ |
| 不达标(丢单多) | 60 | 66.7% | 2.5 | `bad` ✅ |

## 9.4 面板现状

```
账户: 账户1(IF+国债测量) + AI基金经理(银铜醇菜)
策略: AITR1 / SRIF1 / IFOS1 / TLM1 / TLM2
挂载: ✅ 股票AI基金经理监控 (/stk) ✅ TL执行质量测量 (/tl)
```