research: B4 时点干净,但实盘做的不是回测那批单(实盘口径 PF 0.73 vs 回测 4.21)

step63 因果回放:B4 的时点完全干净——100% 召回、100% 准时、零滞后,
一类那个把 PF 从 2.35 打到 0.92 的坑(§3.396)B4 没有。

但回放多产出 592 个全量口径里不存在的信号,PF 0.46 / t −5.03。
step68 按实盘口径复测(2001 根滚动窗口、每 500 根 init_stream、只做当根收盘,
逐行对齐 shadow_signal.py),并把三道滤网全测一遍:

  无过滤    789 笔,额外占比 75%,PF 0.64
  三道全开  195 笔,额外占比 74%,PF 0.73

滤网把成交量砍掉 75% 却几乎不改变额外信号占比——按同比例刷掉好的和坏的。
拆开看:回测里也有的 51 笔 PF 4.21/t+5.90,回测里没有的 144 笔 PF 0.26/t−6.21。

即回测报的 4.21 拿不到:那 51 笔要事后全量重算才能识别,实盘当下分不出来。
机制是重画——实时算出的中枢,数据变多后被修正掉。与 §3.396 同类:
一类错在时点,B4 错在存在性。

顺带闭掉一条待办:2001 根窗口与 2万→4万根增长窗口跑出完全相同的 789/197/592,
窗口左边界效应判为否。

限定:本轮是 5m/30m 而实盘跑 1m,需单独复验;同向过滤器被开了未来函数后门
(HTF 时间线用全量算),真实盘只会更差。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-28 23:46:19 +08:00
co-authored by Cursor
parent 93ed315a4b
commit 84ee59ecfb
3 changed files with 578 additions and 4 deletions
+67 -4
View File
@@ -1531,6 +1531,61 @@ MFE/MAE 给出机制:真底那批**逆向行程中位 2.24 ATR5m/ 2.08
> **这解释了为什么 B4 能做而一类不能**:B4 是突破后的**延续**信号,
> 不需要判断反转;一类的全部难度集中在「这是不是那个底」这一个二分类上。
### 3.3994 🚨 B4 因果回放:时点干净,但实盘做的不是回测那批单(step63/68)
**这条影响正在跑的实盘,优先级高于本文档其余全部内容。**
**好消息:B4 的时点完全干净,一类那个坑它没有**
| | B1(§3.396 | **B4** |
|---|---|---|
| 召回 | 100% | 100% |
| **准时率(首现==entry_idx** | **0%** | **100%** |
| 迟到中位 | +15 根 | **0 根** |
**坏消息:实时回放会多产出一批全量口径里不存在的信号,且它们显著亏钱**
按**实盘口径**(2001 根滚动窗口、每 500 根 `init_stream` 重建、只做当根收盘,
逐行对齐 `shadow_signal.py`)重放 5 币 × 20000 根:
| 过滤 | 留下 | **额外占比** | 全部 PF | 额外 PF | 回测口径 PF |
|---|---|---|---|---|---|
| 无过滤 | 789 | 75% | 0.64 | 0.46 | 1.37 |
| 仅同向 | 402 | 77% | 0.65 | 0.35 | 2.65 |
| 仅阶梯 | 341 | 68% | 0.71 | 0.31 | 2.14 |
| 仅 ATR 门控 | 721 | 76% | 0.64 | 0.46 | 1.35 |
| **三道全开** | **195** | **74%** | **0.73** | **0.26** | **4.21** |
**三道滤网挡不住这批信号。** 它们把成交量砍掉 75%(789 → 195),但额外信号占比
从 75% 只降到 74%——按同样比例刷掉好的和坏的。实盘口径拆开:
| 分组 | 笔数 | 胜率 | PF | 余量bp | t值 |
|---|---|---|---|---|---|
| 回测里也有的 | 51 | 74.5% | **4.21** | +30.15 | +5.90 |
| **回测里没有的** | **144** | 22.9% | **0.26** | 14.25 | **6.21** |
| **实盘实际会做的** | 195 | 36.4% | **0.73** | 4.65 | 0.59 |
**结论:回测报的 4.21 是拿不到的。** 那 51 笔只有事后用全量历史重算才能识别;
实盘在当下拿到 195 个信号,**没有任何办法分辨哪 51 个是真的**。机制是重画——
实时算出的中枢,数据变多后被修正掉,信号随之消失。
这与 §3.396 是同一类错误的两种表现:一类错在**时点**(信号存在但晚 15 根),
B4 错在**存在性**(信号当根就有,但其中 74% 事后会消失)。
**顺带闭掉一条挂了很久的待办:窗口长度不是问题。** 2001 根滚动窗口与
2 万→4 万根增长窗口跑出**完全相同**的 789/197/592,中枢是局部结构,截断无影响。
§5.41 那条「9.0% 中枢消失是不是窗口左边界效应」可以判为**否**。
⚠️ **两点限定**
- 本轮测的是 **5m/30m**,实盘跑的是 **1m**。机制相同但数字必须单独验,
这是下一步第一件事
- 同向过滤器被我**开了未来函数的后门**(大级别分型时间线用全量历史算),
真实盘的 HTF 同样会重画,只会**更差**不会更好
**这不否定 B4 的 alpha**——回测口径那 51 笔 PF 4.21、t 5.90 是真实的,说明
「真中枢上的 B4」确实赚钱。问题是实时分不出真假中枢。可能的方向(均未测):
要求中枢的构成笔 `is_sure`(用滞后换稳定性)、或等 N 根看信号是否仍然存在。
### 3.4 alpha 的来源(step32 消融)
逐条拆掉 `fast_bsp3` 的条件后发现:**alpha 完全来自缠论中枢的上下文定位,
@@ -2738,10 +2793,18 @@ API 限流风险隔离三个好处。
## 10. 待办清单
- [ ] **B4 因果回放(step63,跑着)——当前唯一的关键未决项**
§3.396 证明 `sure_time` 对一类是后视产物(PF 2.35 → 0.92)。B4 用的是
同一个 `sure_time` 字段,**在这个回放出结果前,所有 B4 的历史 PF 都待定**。
若 B4 也栽,整条线要重估;若过了,B4 是目前唯一活着的信号
- [ ] 🚨 **B4 实盘口径 PF 是 0.73,回测报 4.21 —— 最高优先级**(§3.3994
时点干净(100% 准时,一类那个坑没有),但实时会多产出 74% 的信号,
它们 PF 0.26 / t −6.21,**三道滤网按同比例刷除、完全挡不住**。
回测那 51 笔要事后全量重算才能识别,实盘当下分不出来。**要做三件事**:
- [ ] **① 在 1m 上复验**(本轮测的是 5m/30m,实盘跑 1m)。机制相同但数字要单独出,
`step68_live_window.py --ltf 1m --htf 5m`,这是决定是否要动实盘的依据
- [ ] **② 试「中枢构成笔 is_sure」与「等 N 根看信号是否仍在」**(均未测)。
前者用滞后换稳定性,后者直接过滤会消失的信号。目标是把那 74% 压下去
- [ ] **③ 通知服务器侧**:当前实盘在做一批回测里不存在的单。在 ① 出结果前
不建议改参数,但应知晓风险
- [x] **窗口左边界效应判为否**(§3.3994)。2001 根滚动窗口与 2万→4万根增长窗口
跑出完全相同的 789/197/592,中枢是局部结构,截断无影响
- [ ] **一类线:问题已完全定性,等一个决策**(§3.3992 / §3.3993)。
全局只有一个变量——**「是不是真线段端点」**:是则 PF 2.29(5m)/4.11(15m)
否则恒为 0.13,其余特征都只是它的噪声代理。**盈亏平衡精度 5m 72.6%、