影子路径开 lean 模式,实测完整链路 1410 → 683ms
拉到新引擎后在服务器侧直接实测,没有沿用 3.4 倍那个换算——那是在旧代码上量的。 先做等价性验证。不能直接引用 step46 的对拍结论:它固化的是 bsp_list 那条链的 哈希,而影子路径走 find_fast_bsp3 + build_htf_zones + htf_fx_timeline + attach_htf_context,两条链读的东西不一样。所以新建 verify_lean_parity.py 在 这条路径上逐根对拍 compute() 的每个返回字段。 其中一个坑:随机取窗口测不到信号分支。信号密度约 1/2000 根,头 12 个窗口命中 0 个,「一致」只覆盖了早退路径。改成一半窗口对齐到已知信号根,命中率才上来。 最终 180 窗口 / 两模式各 90 命中 / 零分歧。 生产实测(inner_ms,容器内同口径): compute_ms 646 → 132ms 4.89x inner_ms 612 → 128ms 4.80x lag_signal_ms 1410 → 683ms 完整链路,落回 800ms 线内 比 3.4 倍更好,因为是引擎 ~3.5x 叠 lean ~1.35x。 两点判读上的订正: - lag_data_ms 那 576→490ms 是噪声,不要记在引擎账上。均值 721±36 vs 740±127,重叠;而且引擎本来就影响不到交易所与网络那一段。 - 仍有 44% 的根超 800ms,但尾部现在完全由数据腿主导(lag_data P90 1482ms vs compute P90 237ms)。计算既不是瓶颈也不是尾部主因了,继续压计算换不到 尾部改善。800ms 那道闸取的是最近 30 根的中位数,683ms 已满足。 start.sh 加 SHADOW_LEAN(默认 1),设 0 可退回 full 复量两模式差异。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -39,12 +39,22 @@ for _v in ("OMP_NUM_THREADS", "OPENBLAS_NUM_THREADS", "MKL_NUM_THREADS"):
|
||||
os.environ.setdefault(_v, "1")
|
||||
|
||||
|
||||
def compute(df_l, df_h, entry_px: float | None = None) -> dict:
|
||||
LEAN = os.environ.get("SHADOW_LEAN", "1") not in ("0", "", "false")
|
||||
|
||||
|
||||
def compute(df_l, df_h, entry_px: float | None = None,
|
||||
lean: bool | None = None) -> dict:
|
||||
"""在 df_l 的最后一根上找信号。df_l/df_h 都只含已收盘 K 线。
|
||||
|
||||
entry_px 是次根开盘价(回测 entry_delay=1 的成交价),用作 atr_pct 的
|
||||
分母。取不到时退回用信号根收盘价,并在返回里标 atr_ref="close"。
|
||||
|
||||
lean=True 让 TF_DF 只构建到中枢,跳过线段/走势中枢/MACD 状态机。本路径
|
||||
只读 chan.dataframe 与 chan.klc_list,不碰 bsp_list/seg_list/chanmacd,
|
||||
所以可以跳。但静态检查会漏间接依赖,等价性由 verify_lean_parity.py 在
|
||||
这条路径上逐根实测,不套用 step46 那 5 个对拍用例——那些用例走的是
|
||||
bsp_list,覆盖不到 fast_bsp3 + 嵌套上下文这条链。
|
||||
|
||||
返回 dict:
|
||||
last_idx 最后一根在 chanlun 处理后 dataframe 里的下标
|
||||
n_bars 实际参与计算的根数
|
||||
@@ -55,6 +65,8 @@ def compute(df_l, df_h, entry_px: float | None = None) -> dict:
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
lean = LEAN if lean is None else lean
|
||||
|
||||
try:
|
||||
from chanlun import TF_DF
|
||||
from lib.fast_bsp3 import find_fast_bsp3
|
||||
@@ -63,7 +75,7 @@ def compute(df_l, df_h, entry_px: float | None = None) -> dict:
|
||||
from lib.nested_level import build_htf_zones
|
||||
from lib.shadow_budget import ATR_GATE_BP
|
||||
|
||||
chan_l = TF_DF(df_l, 1, "1m")
|
||||
chan_l = TF_DF(df_l, 1, "1m", lean=lean)
|
||||
cdf = chan_l.dataframe
|
||||
last = len(cdf) - 1
|
||||
base = {"last_idx": last, "n_bars": int(len(df_l)), "hits": [],
|
||||
@@ -99,7 +111,7 @@ def compute(df_l, df_h, entry_px: float | None = None) -> dict:
|
||||
|
||||
# 5m 同向。算不出时 h1_agree 记 0,该信号自然不会通过 pass_all
|
||||
if df_h is not None and len(df_h) > 0:
|
||||
chan_h = TF_DF(df_h, 1, "5m")
|
||||
chan_h = TF_DF(df_h, 1, "5m", lean=lean)
|
||||
hdf = chan_h.dataframe
|
||||
tl = htf_fx_timeline(
|
||||
signals_to_frame(extract_fx_signals(chan_h, hdf)), hdf)
|
||||
|
||||
Reference in New Issue
Block a user