From 17fe965a7c9264caadaf93eb17e14e373f9d3edb Mon Sep 17 00:00:00 2001 From: jackyu66git Date: Fri, 28 Aug 2026 17:11:41 +0800 Subject: [PATCH] =?UTF-8?q?HANDOFF=20=E8=B7=9F=E4=B8=8A=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E7=AB=AF=EF=BC=9A5.72=20=E6=A0=87=E9=A2=98=E5=9B=9E=E9=80=80?= =?UTF-8?q?=E5=88=B0=E6=97=A7=E7=BB=93=E8=AE=BA=EF=BC=8C=E5=9B=9B=E6=9D=A1?= =?UTF-8?q?=E5=BE=85=E5=8A=9E=E5=B7=B2=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 拉取后对表,文档有几处和代码脱节: 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 --- research/HANDOFF.md | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/research/HANDOFF.md b/research/HANDOFF.md index bdb281c..4ddcba7 100644 --- a/research/HANDOFF.md +++ b/research/HANDOFF.md @@ -1642,7 +1642,7 @@ EMA/MACD/ATR 是递推的、BB/SMA/量比是窗口的,理论上都能 O(1) 更 **→ 已定位,见 §5.72:那 86ms 不存在,是服务端的减法错了。分档两边一致。** -#### 5.72 那 86ms 不存在:`inner_ms` 的 3.3 倍是争抢,不是某个算法档 +#### 5.72 那 86ms 不存在:`inner_ms` 是地板 30ms + 缓存浪费 37ms + 争抢 1.5x 服务端跑了同一个 `probe_inner.py`(2 核,采集器十币在跑)。**分档占比两边 对得上,四倍差距是伪命题:** @@ -2093,9 +2093,20 @@ API 限流风险隔离三个好处。 - [x] **确认交易所与框架** → Bitget + Hummingbot,先只上 1m - [x] **测执行延迟** → 上游连接器 bug 已定位并修好,补丁后 lag 506~642ms、 无条件漂移 0.50~0.87bp,占预算 6%。见 §6 第 2 步 -- [ ] **实盘信号计算改用增量**(§5.5,已验证一致且快 12x:286ms → 24ms)。 - **配套必须做窗口裁剪**:每约 500 根用最近 2000 根重新 `init_stream`, - 否则 `append_bar` 的 O(n) 部分会让耗时持续爬升(1200 根后 +40%) +- [x] **实盘信号计算改用增量** → ✅ 已上线(§5.7):清空十币 560 → 247ms。 + 配套的窗口裁剪也做了,但**重建不要用 `init_stream`**(它逐行 `iloc`, + 比批量 `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]`(中枢结束)的 完整 A/B** —— ✅ **已完成,结论是不换**(step47,见 §5.42)。 当时预判的「反向风险:会去做仍在形成中的中枢的突破,质量可能变差」 @@ -2111,16 +2122,16 @@ API 限流风险隔离三个好处。 - [ ] **写 V2 controller + 盘口缓冲,跑影子测量**(当前第一件事)。 字段与统计口径见 §6 第 3 步,**三条硬要求别漏**:只统计过滤后的信号根、 条件漂移与无条件漂移分开报、出场腿按 maker/taker 分开统计 -- [ ] **改掉 `shadow_report.py` 的 `BUDGET_BP`**(当前 BTC −0.13 / ETH 4.02 / - SOL 2.92)。那三个数由六处差异叠加而来:只有同向没有阶梯过滤、 - 费率按 6bp 双边 taker、`TP=3.0`、余量没除 taker 名义额、无 ATR 门控、 - 且 BTC/ETH/SOL 恰是 ATR 最低的三个币。正确值 8.58 / 20.64 / 16.83, - 直接从 `lib/shadow_budget.py` import。 - **这条优先级最高**:报表里 `drift > b` 与 `drift > b*0.6` 是自动停机开关, - 用错的预算会让它比真实情况早约五倍触发,误杀一个可行的策略 -- [ ] **live 信号路径补上中枢阶梯过滤与 ATR 门控**。现在是 - `fin = full[full["h1_agree"] == 1]`,只有同向。缺这两项测的就不是 - 我们要交易的那批信号,改常数解决不了 +- [x] **改掉 `shadow_report.py` 的 `BUDGET_BP`** → ✅ 已改为从 + `lib/shadow_budget.py` import。原先硬编码的 BTC −0.13 / ETH 4.02 / + SOL 2.92 由六处差异叠加而来(只有同向没有阶梯过滤、费率按 6bp 双边 + taker、`TP=3.0`、余量没除 taker 名义额、无 ATR 门控,且 BTC/ETH/SOL + 恰是 ATR 最低的三个币),正确值 8.58 / 20.64 / 16.83。 + **这条当时优先级最高**:报表里 `drift > b` 与 `drift > b*0.6` 是自动 + 停机开关,用错的预算会让它比真实情况早约五倍触发,误杀一个可行的策略 +- [x] **live 信号路径补上中枢阶梯过滤与 ATR 门控** → ✅ 已补 + (`shadow_signal.py:11-18`:同向 + 阶梯 + `atr_pct ≥ ATR_GATE_BP`)。 + 原先只有 `h1_agree == 1`,测的不是我们要交易的那批信号 - [ ] **子类覆盖加启动断言** + **运行时 lag 探针(>800ms 停开仓)**,见 §6 第 2 步 - [ ] 补测 ADA / DOGE / AVAX 的漂移——真正要交易的是这批(预算 15~22bp)。 BTC/ETH/SOL 流动性最好,测滑点偏乐观是安全方向,但判可行性不能只看它们。 @@ -2146,7 +2157,9 @@ API 限流风险隔离三个好处。 与其他开关不同,**这个不需要等滑点数据**:它在 0bp 到 20bp 的每一档上 都不输给等权,5~12bp 区间还大幅领先,且总R 比不砍更高(657.7 vs 596.6) ——被砍的那 22% 期望为负。**唯一的前置动作是确认阈值附近没有断崖敏感** - (阈值 7 是贴着 Q4 边界取的整数,看过分位表才取的) + (阈值 7 是贴着 Q4 边界取的整数,看过分位表才取的)。 + ⚠️ **live 路径目前没有这一层**:`shadow_signal.py` 的三道过滤是 + 同向 + 阶梯 + ATR 门控,`mom60` 连算都没算。要上得先在信号侧补出这个字段 - [ ] 若真实滑点实测 ≥15bp,再考虑叠加 `vpre10 ≥ 1.5` 与 `vr60 ≥ 4` ("三个都砍",保留 42%)。滑点 <12bp 时这个叠加是亏的,别提前上 - [ ] `有前序` 的余量优势改用**放宽 ATR 门控**兑现(多做几笔而非每笔做大)。