HANDOFF 跟上服务端:5.72 标题回退到旧结论,四条待办已完成

拉取后对表,文档有几处和代码脱节:

1. §5.72 标题还写「inner_ms 的 3.3 倍是争抢」,而正文经 af029bc 已更正为
   1.49x。扫标题的人会被带偏,改成 30ms 地板 + 37ms 缓存浪费 + 1.5x 争抢。

2. 「实盘信号计算改用增量」已上线(§5.7,清空十币 560→247ms),标完成,
   并把「重建不要用 init_stream」这个坑记在同一条上。

3. 「shadow_report 的 BUDGET_BP」和「live 补中枢阶梯 + ATR 门控」都已做完
   (前者改为从 lib/shadow_budget import,后者见 shadow_signal.py:11-18),
   标完成并保留当初的理由,那两条的判断过程比结论有用。

4. §5.72 新发现的两个杠杆之前只在正文里,没进待办,补上:按币绑 worker
   (省 inner_ms 三分之一)与 add_indicators 增量化,并写明二者是叠加不是
   二选一,以及后者的拦路石是 Wilder RSI 的 avg_gain/avg_loss 状态。

另外给 mom60≥7 那条待办补一句现状:live 路径的三道过滤是同向 + 阶梯 +
ATR 门控,mom60 连算都没算,要上得先在信号侧补出这个字段。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-28 19:23:39 +08:00
co-authored by Cursor
parent 881cc5e77d
commit 17fe965a7c
+28 -15
View File
@@ -1642,7 +1642,7 @@ EMA/MACD/ATR 是递推的、BB/SMA/量比是窗口的,理论上都能 O(1) 更
**→ 已定位,见 §5.72:那 86ms 不存在,是服务端的减法错了。分档两边一致。** **→ 已定位,见 §5.72:那 86ms 不存在,是服务端的减法错了。分档两边一致。**
#### 5.72 那 86ms 不存在:`inner_ms` 的 3.3 倍是争抢,不是某个算法档 #### 5.72 那 86ms 不存在:`inner_ms` 是地板 30ms + 缓存浪费 37ms + 争抢 1.5x
服务端跑了同一个 `probe_inner.py`(2 核,采集器十币在跑)。**分档占比两边 服务端跑了同一个 `probe_inner.py`(2 核,采集器十币在跑)。**分档占比两边
对得上,四倍差距是伪命题:** 对得上,四倍差距是伪命题:**
@@ -2093,9 +2093,20 @@ API 限流风险隔离三个好处。
- [x] **确认交易所与框架** → Bitget + Hummingbot,先只上 1m - [x] **确认交易所与框架** → Bitget + Hummingbot,先只上 1m
- [x] **测执行延迟** → 上游连接器 bug 已定位并修好,补丁后 lag 506~642ms、 - [x] **测执行延迟** → 上游连接器 bug 已定位并修好,补丁后 lag 506~642ms、
无条件漂移 0.50~0.87bp,占预算 6%。见 §6 第 2 步 无条件漂移 0.50~0.87bp,占预算 6%。见 §6 第 2 步
- [ ] **实盘信号计算改用增量**(§5.5,已验证一致且快 12x:286ms → 24ms - [x] **实盘信号计算改用增量** → ✅ 已上线(§5.7):清空十币 560 → 247ms。
**配套必须做窗口裁剪**:每约 500 根用最近 2000 根重新 `init_stream` 配套的窗口裁剪也做了,但**重建不要用 `init_stream`**(它逐行 `iloc`
否则 `append_bar` 的 O(n) 部分会让耗时持续爬升(1200 根后 +40% 比批量 `TF_DF(lean=True)` 慢 3.2 倍,第一版用它反而涨到 1686ms
- [ ] **按币绑定 worker`symbol hash → worker`** ⭐ 当前最便宜的一刀。
现在 symbol 随机落 worker,每个 worker 的缓存只见过自己处理的根,
于是人人都要追 2.81 根,其中约 22ms 是纯重复。绑定后每次只追 1 根:
离线 67.3 → 45.0ms,在场约省 **33ms/币(inner_ms 的三分之一)**
代价是失去负载均衡,但十币两 worker 本来就是静态五五分。见 §5.72
- [ ] **`add_indicators` 增量化**(§5.71 末尾)。它是上面那个「追加档」的大头
——每追一根都全表重算 2001 行,所以追加成本随根数近线性涨。
与绑定 worker 是叠加关系,不是二选一。
**拦路的是 Wilder RSI**EMA/MACD/ATR 递推、BB/SMA/量比是窗口,都能
O(1) 更新到精确值,但 RSI 要额外维护 `avg_gain`/`avg_loss`(从输出反推
不出来)。**一处不精确就静默换掉一批信号,要做必须先扩对拍**
- [ ] **`available_ts` 改用 `bis[2]`(中枢形成)而非 `bis[-1]`(中枢结束)的 - [ ] **`available_ts` 改用 `bis[2]`(中枢形成)而非 `bis[-1]`(中枢结束)的
完整 A/B** —— ✅ **已完成,结论是不换**step47,见 §5.42)。 完整 A/B** —— ✅ **已完成,结论是不换**step47,见 §5.42)。
当时预判的「反向风险:会去做仍在形成中的中枢的突破,质量可能变差」 当时预判的「反向风险:会去做仍在形成中的中枢的突破,质量可能变差」
@@ -2111,16 +2122,16 @@ API 限流风险隔离三个好处。
- [ ] **写 V2 controller + 盘口缓冲,跑影子测量**(当前第一件事)。 - [ ] **写 V2 controller + 盘口缓冲,跑影子测量**(当前第一件事)。
字段与统计口径见 §6 第 3 步,**三条硬要求别漏**:只统计过滤后的信号根、 字段与统计口径见 §6 第 3 步,**三条硬要求别漏**:只统计过滤后的信号根、
条件漂移与无条件漂移分开报、出场腿按 maker/taker 分开统计 条件漂移与无条件漂移分开报、出场腿按 maker/taker 分开统计
- [ ] **改掉 `shadow_report.py` 的 `BUDGET_BP`**(当前 BTC 0.13 / ETH 4.02 / - [x] **改掉 `shadow_report.py` 的 `BUDGET_BP`** → ✅ 已改为从
SOL 2.92)。那三个数由六处差异叠加而来:只有同向没有阶梯过滤、 `lib/shadow_budget.py` import。原先硬编码的 BTC 0.13 / ETH 4.02 /
费率按 6bp 双边 taker、`TP=3.0`、余量没除 taker 名义额、无 ATR 门控、 SOL 2.92 由六处差异叠加而来(只有同向没有阶梯过滤、费率按 6bp 双边
且 BTC/ETH/SOL 恰是 ATR 最低的三个币。正确值 8.58 / 20.64 / 16.83 taker、`TP=3.0`、余量没除 taker 名义额、无 ATR 门控,且 BTC/ETH/SOL
直接从 `lib/shadow_budget.py` import 恰是 ATR 最低的三个币),正确值 8.58 / 20.64 / 16.83
**这条优先级最高**:报表里 `drift > b``drift > b*0.6` 是自动停机开关, **这条当时优先级最高**:报表里 `drift > b``drift > b*0.6` 是自动
用错的预算会让它比真实情况早约五倍触发,误杀一个可行的策略 停机开关,用错的预算会让它比真实情况早约五倍触发,误杀一个可行的策略
- [ ] **live 信号路径补上中枢阶梯过滤与 ATR 门控**。现在是 - [x] **live 信号路径补上中枢阶梯过滤与 ATR 门控** → ✅ 已补
`fin = full[full["h1_agree"] == 1]`,只有同向。缺这两项测的就不是 `shadow_signal.py:11-18`:同向 + 阶梯 + `atr_pct ≥ ATR_GATE_BP`)。
我们要交易的那批信号,改常数解决不了 原先只有 `h1_agree == 1`,测的不是我们要交易的那批信号
- [ ] **子类覆盖加启动断言** + **运行时 lag 探针(>800ms 停开仓)**,见 §6 第 2 步 - [ ] **子类覆盖加启动断言** + **运行时 lag 探针(>800ms 停开仓)**,见 §6 第 2 步
- [ ] 补测 ADA / DOGE / AVAX 的漂移——真正要交易的是这批(预算 15~22bp)。 - [ ] 补测 ADA / DOGE / AVAX 的漂移——真正要交易的是这批(预算 15~22bp)。
BTC/ETH/SOL 流动性最好,测滑点偏乐观是安全方向,但判可行性不能只看它们。 BTC/ETH/SOL 流动性最好,测滑点偏乐观是安全方向,但判可行性不能只看它们。
@@ -2146,7 +2157,9 @@ API 限流风险隔离三个好处。
与其他开关不同,**这个不需要等滑点数据**:它在 0bp 到 20bp 的每一档上 与其他开关不同,**这个不需要等滑点数据**:它在 0bp 到 20bp 的每一档上
都不输给等权,5~12bp 区间还大幅领先,且总R 比不砍更高(657.7 vs 596.6 都不输给等权,5~12bp 区间还大幅领先,且总R 比不砍更高(657.7 vs 596.6
——被砍的那 22% 期望为负。**唯一的前置动作是确认阈值附近没有断崖敏感** ——被砍的那 22% 期望为负。**唯一的前置动作是确认阈值附近没有断崖敏感**
(阈值 7 是贴着 Q4 边界取的整数,看过分位表才取的) (阈值 7 是贴着 Q4 边界取的整数,看过分位表才取的)
⚠️ **live 路径目前没有这一层**`shadow_signal.py` 的三道过滤是
同向 + 阶梯 + ATR 门控,`mom60` 连算都没算。要上得先在信号侧补出这个字段
- [ ] 若真实滑点实测 ≥15bp,再考虑叠加 `vpre10 ≥ 1.5``vr60 ≥ 4` - [ ] 若真实滑点实测 ≥15bp,再考虑叠加 `vpre10 ≥ 1.5``vr60 ≥ 4`
"三个都砍",保留 42%)。滑点 <12bp 时这个叠加是亏的,别提前上 "三个都砍",保留 42%)。滑点 <12bp 时这个叠加是亏的,别提前上
- [ ] `有前序` 的余量优势改用**放宽 ATR 门控**兑现(多做几笔而非每笔做大)。 - [ ] `有前序` 的余量优势改用**放宽 ATR 门控**兑现(多做几笔而非每笔做大)。