叙事页 · S4 · A/B 对照

框架

卡尔曼滤波嵌入评估报告(2026-10-02)

滚动重估窗口 104 周 bar / 步长 13、特征 kf_level/kf_slope/kf_innovation/kf_uncertainty)。

回测 · 资产·机制 · 回测/kalman/报告_卡尔曼嵌入评估_2026-10-02.md · 25100 B

01
一、任务与事前设计(跑 A/B 之前定稿,未事后修改)
模型与产出:见 回测/kalman/README §二(状态 [level, slope]、观测 = log 价格、三参数 MLE、
02
二、无前视证据(原始命令与原始输出)
其余自检(--quick 全绿):T1 滤波器可复现(合成序列)、T4 两次拟合逐位相同 + 短样本确定性回退 (reason='sample<MIN_FIT_OBS'、返回有限值非 NaN)、T5 缺观
03
三、pre-flight 断言(缓存隔离 / 协议复现)——原始输出
六折全检:ab/base/fold_0..5.json 与既有 wf/fold_0..5.json 的择优参数完全一致,
04
四、表 1 · 样本外 A/B 对照(原始数据)
折协议 = 既有 wf/(训练 8 年 → 测试 2 年);
05
五、表 2 · 参数稳定性(滚动重估轨迹,原始数据)
窗口 104 周 bar、步长 13(≈2 年 / 1 季度),覆盖 1990-01 起、共 140 次重估(全部 conv=True、回退 0 次)。

场景:S4 · A/B 对照 · 共 5 幕 · 幕题与副句逐字取自本文小标题与首句

卡尔曼滤波嵌入评估报告(2026-10-02)

摘要(一句话):纯 numpy 局部线性趋势卡尔曼滤波(MLE + 滚动重估)作为点内特征嵌进 engine_v1

的 L1 动量与趋势态判定,在既有 wf/fold_0..5 协议下做样本外 A/B。判定 = 无改善

(拼接样本外夏普 0.754 → 0.790 / 0.778,Δ = +0.037 / +0.025,事前门槛 ≥ +0.10)

⇒ 不引入。同时实测到三参数 MLE 100% 钉在事前边界、似然随放松边界继续下降(−526.66 → −1356.81),

即似然退化 / 方差参数弱识别——这是本轮最重要的负面发现,已登记为 checklist 第 15 条。

口径:年化一律 bar 数 / ppy(此处周频 ppy=52),见 回测/perf_audit/README §四。

回测口径 ≠ 纸面 ≠ 生产管线;不构成投资建议。

一、任务与事前设计(跑 A/B 之前定稿,未事后修改)

  • 模型与产出:见 回测/kalman/README §二(状态 [level, slope]、观测 = log 价格、三参数 MLE、

滚动重估窗口 104 周 bar / 步长 13、特征 kf_level/kf_slope/kf_innovation/kf_uncertainty)。

  • 注入:V1(判据)= kf_level + kf_slope;V2(同表并列)= 全 4 特征;诊断 = innovation/uncertainty 统计量。

两版本都报告,不挑选;L0 阈值/G1 闸门/L2/L3/成本/事件否决未动。

  • 判定门槛(事前写死):拼接样本外夏普改善 ≥ +0.10 且 ≥ 4/6 折同向 且 换手不劣化 > 20%。
  • 折定义:与既有 回测/engine_v1/wf/fold_0..5.json 逐字段一致(实测 train 8 年 + test 2 年,起点 2006-01-01)。

二、无前视证据(原始命令与原始输出)

$ cd 回测/kalman && python3 kalman_selftest.py --only 2          # 真实 gold_pm 尾 900 bar
== kalman_selftest (full) ==
  T2 对比:全样本 900 bar vs 截断 801 bar(cut=800);截断点之前非空行 697
  T2 OK  删除 t 之后全部数据 → t 及之前 kf_level/kf_slope/kf_innovation/kf_uncertainty 逐位不变
     (2 用时 37.5s)
MLE 拟合次数 30、回退 0 次
$ python3 kalman_selftest.py --only 3
  T3 OK  重估 12 次,全部 fit_end=生效位置、n_obs≤104;不同参数组 107 组;首次生效位置 104
        pos= 104 样本[   0, 104) R=6.7379e-03 Ql=6.7379e-03 Qs=4.0286e-06 conv=True nll=-89.7546
$ python3 kalman_selftest.py --only 6
  T6 OK  截断逐位不变;kf 比率中位数 1.238(真值 1.2)、OLS60 中位数 1.171

其余自检(--quick 全绿):T1 滤波器可复现(合成序列)、T4 两次拟合逐位相同 + 短样本确定性回退 (reason='sample<MIN_FIT_OBS'、返回有限值非 NaN)、T5 缺观测只做预测步、T7 真实数据端到端。 MLE 收敛日志摘要:滚动重估 140 次全部 conv=True,回退 0 次(回退仅出现在自检的短样本用例)。

三、pre-flight 断言(缓存隔离 / 协议复现)——原始输出

监工点名:_frame_key/_layer_key 漏字段会静默串结果。故:① 两臂分目录;② 注入前后清空引擎层缓存

并断言注入前缓存为空;③ 断言"基线臂 vs 卡尔曼臂"结果不得逐位相同;④ 基线臂复现既有 wf 数字。

$ python3 kalman_embed.py --preflight
[preflight] 注入生效检查:l1_status 不同 bar = 56/105;trend_ok 不同 bar = 5/105
[preflight] 样本外片段(2014-01-01~2016-01-01) 夏普:base=-0.475 v1=-0.528 v2=-0.497;交易次数 10/12/10
[preflight] 净值逐位相同? base==v1 → False;base==v2 → False
[preflight] PASS:注入生效、两臂结果不同、缓存无串扰
$ python3 kalman_embed.py --verify-baseline        # 复现既有 wf/fold_0.json
[verify] 折0 择优参数:harness={'vol_target': 0.1, 'l1_confirm_days': 2, 'hard_stop_pct': 8.0} 既有={...} 相同
[verify] 总收益_策略  harness=-0.0926  既有=-0.0926  OK
[verify] 夏普_策略    harness=-0.475   既有=-0.475   OK
[verify] 最大回撤_策略 harness=-0.1571 既有=-0.1571  OK
[verify] bar数       harness=105      既有=105      OK
[verify] 交易次数      harness=10       既有=10       OK
  • 六折全检:ab/base/fold_0..5.json 与既有 wf/fold_0..5.json 的择优参数完全一致,

夏普 −0.475 / 0.961 / 0.728 / 0.431 / 0.418 / 2.268 逐折一致;其余字段逐字段一致, 唯一差异是 总换手 的小数位(harness 未 round(2))。

  • 拼接样本外复现既有 wf/oos_summary.json:基线 夏普 0.754、收益 126.2%、回撤 −15.7%、

总换手 40.69、bar 627 —— 逐项一致。

  • 18 次(6 折 × 3 臂)测试段复跑(--emit-curves)全部 复跑一致=True(逐位),

即无状态泄漏、无缓存串扰;且六折 Δ夏普 = 臂 − 基线 无一为 0(§四)→ 两臂确实不同。

$ CURVES_ARM=v1 python3 kalman_embed.py --emit-curves
[curves] v1 折0 复跑一致=True (夏普 -0.542 vs -0.542)   ... 折1..5 同
[curves] v1 拼接样本外:2014-01-03→2025-12-26 bar=627 年化期数=52 夏普=0.79 收益=140.2% 回撤=-17.2% 总换手=42.00

四、表 1 · 样本外 A/B 对照(原始数据)

折协议 = 既有 wf/(训练 8 年 → 测试 2 年);每折先在训练段用与引擎相同的 12 组风险旋钮网格择优, 再在测试段做样本外评估(两臂协议完全相同,唯一差别 = 是否注入卡尔曼特征)。

基线

折测试窗口bar夏普最大回撤总换手总收益交易次数无法评估占比
02014-01-01~2016-01-01105-0.475-15.7%2.78-9.3%100.0%
12016-01-01~2018-01-011050.961-9.8%3.6017.9%90.0%
22018-01-01~2020-01-011040.728-9.5%10.0010.1%2519.2%
32020-01-01~2022-01-011050.431-13.7%4.008.7%100.0%
42022-01-01~2024-01-011040.418-12.8%8.807.1%2219.2%
52024-01-01~2026-01-011042.268-5.1%11.5164.9%380.0%

V1 · 基线+卡尔曼(level/slope)

折夏普最大回撤总换手总收益交易次数无法评估占比Δ夏普 vs 基线结论
0-0.542-17.2%4.80-10.8%120.0%-0.067变差
10.920-9.5%5.2017.7%130.0%-0.041变差
20.806-9.6%8.4011.2%210.0%+0.078改善
30.550-13.7%5.6012.4%140.0%+0.119改善
40.519-11.2%4.808.2%124.8%+0.101改善
52.273-5.6%13.2069.1%334.8%+0.005基本持平

V2 · 基线+卡尔曼(全 4 特征)

折夏普最大回撤总换手总收益交易次数无法评估占比Δ夏普 vs 基线结论
0-0.497-16.0%2.78-9.6%1081.0%-0.022变差
10.804-9.5%1.6214.3%581.0%-0.157变差
20.781-9.6%2.8010.0%70.0%+0.053改善(闸静默失效)
30.493-11.6%3.209.9%881.0%+0.062改善(仅 19% 可评估)
40.602-11.2%2.409.3%680.8%+0.184改善(仅 19% 可评估)
52.606-3.8%0.0059.9%00.0%+0.338⚠ 退化(卫星完全停摆)

口径提醒(防止误读 V2 的折级 Δ):V2 4/6 折的 Δ夏普建立在仅约 19% 的可评估样本上

(l1_status="无法评估" 占 81.0%/81.0%/81.0%/80.8%),其 Δ 不构成特征有效性的证据;

报告 §八 引用的池化 54.1% 为样本数加权平均数(各折 bar 数略有差异)。

另两折的 0.0% 不代表"闸门没开",而是 l1_confirm_days=2 时引擎的"无法评估不可确认"规则使闸门静默失效(见 §七·补)。

表 1b · 拼接样本外(各折测试段等权拼接;年化 = bar/ppy,ppy=52)

臂窗口bar年化年化波动夏普最大回撤总换手交易次数
基线2014-01-03~2025-12-266277.0%9.6%0.754-15.7%40.69114
V1(level/slope)同上6277.5%9.8%0.790-17.2%42.00105
V2(全 4 特征)同上6276.7%8.8%0.778-16.0%12.8036
臂Δ夏普(门槛 ≥ +0.10)同向改善折数(门槛 ≥ 4/6)换手变化(门槛 ≤ +20%)判定
V1+0.037 ✗4/6 ✓+3.2% ✓未达门槛
V2+0.025 ✗4/6 ✓−68.5% ✓未达门槛

五、表 2 · 参数稳定性(滚动重估轨迹,原始数据)

窗口 104 周 bar、步长 13(≈2 年 / 1 季度),覆盖 1990-01 起、共 140 次重估(全部 conv=True、回退 0 次)。

参数事前 log 下界下界上的窗口占比p10p50p90max/min 漂移
σ_obs² (R)−5100%6.738e-036.738e-036.738e-031.000
σ_level² (Q_l)−5100%6.738e-036.738e-036.738e-031.000
σ_slope² (Q_s)−15100%3.059e-073.059e-073.059e-071.000
  • 同一重估窗内 R ≡ Q_l(恒等)、R 的唯一取值数 = 1 ⇒ 所谓"滚动重估"实际退化为固定参数滤波。
  • 判读:参数漂移 = 0 不是稳定,而是不可识别(漂移的来源被边界吃掉)。

按任务书"参数漂移剧烈 = 不可部署的直接证据"的同一逻辑,参数被边界锁死同样是不可部署的证据。

六、表 3 · checklist 逐条判定(本模块自查;清单已扩至 16 条,#15/#16 由本轮实测触发)

#陷阱出处本库自查命令 / 字段判定
1前视偏差16章 §16.2python3 kalman_selftest.py --only 2(截断逐位不变);--only 3(重估 fit_end==生效位置);--preflight(注入后复跑)符合
2幸存者偏差02章 §2.5标的是 LBMA 定盘价与 NDX 指数;本模块不建资产池符合(低风险)
3数据窥探 / 多重检验16章 §16.7 / 12_dsr_validation本报告 §四:只报 2 个事前版本(V1 判据 + V2 并列),未搜索 Q/R/窗口/频率;6 折 × 2 版本 = 12 个样本外数字,未做 DSR 折减存疑(已自我披露)
4交易成本与滑点16章 §16.6沿用引擎 6bps 单边;换手/成本列逐折列出(表 1)符合
5样本外与参数稳定性16章 §16.7 / 06章表 2:参数 100% 钉在事前边界、漂移 1.000、R 唯一取值数 1;表 4:似然随放松边界继续下降违背(协议合规,但参数不可识别 ⇒ 不可部署)
6复权 / 分红02章 §2.3黄金定盘价、NDX 价格指数(无股息腿)不适用
7频率与年化口径16章 §16.5年化 = bar/ppy(周频 52);与 wf/oos_summary.json 逐项复现符合
8单一资产 beta / 分散幻觉17章 §17.3本模块不做组合构建;对冲比率只作对照(§九),未改 portfolio.py不适用
9执行时序与成交价16章 §16.2继承引擎(t 收盘定信号、t+1 生效);特征为点内(#1)符合
10现金约束与隐性杠杆16章 §16.2未触碰仓位/敞口逻辑;core_pct=0.60 口径不变符合
11指标定义分歧16章 §16.5绩效一律调用 engine_v1.performance;索提诺/卡玛定义随该函数符合
12制度切片 / 事后窗口16章 §16.6折窗口 = 既有 wf/ 折(事前固定),断言逐字段一致符合
13尾部风险与回撤路径19章 §19.4有 最大回撤,无 VaR/CVaR/水下时长存疑(继承引擎既有存疑)
14风控自适应泄漏19章 §19.7未触碰 vol_target/止损;V2 分位闸用 expanding(只用历史)符合
15似然退化 / 方差参数弱识别 → 边界解本轮实测 + ML4T §9.2 原话表 2 + 表 4:logθ 100% 在下界、nll −526.66 →(放松边界)−1356.81违背(本模块自身;已登记进清单)
16阈值闸 / 状态闸的工程校验本轮实测(§七·补,方法论判据 B)v2_gate_diag.py:innovation 闸 0%(≈0 极端)、uncertainty 闸恒定 76%(≈80% 极端)、confirm=2 时被迟滞规则吞掉违背(本模块 V2;已登记进清单)

七、表 4 · 退化诊断(量化)

诊断量实测理想/参照判读
logθ 钉在下界的比例(R / Q_l / Q_s)100% / 100% / 100%0%参数不可识别,边界承担全部工作
R 漂移幅度 max/min1.000≫1恒定 = 无数据驱动更新
std(kf_innovation)0.179(日频 504 bar 段 0.114)≈1严重欠离散 → 模型失配
mean(kf_innovation)+0.0042≈0—
kf_uncertainty p10/p50/p904.218e-03 / 4.227e-03 / 4.227e-03随数据变化变化极小(固定增益附近)
特征覆盖(OOS 627 bar)100%(1993 起 100%)—首个重估生效前一律 NaN、不外推

无界性证据(原始命令与输出)

$ python3 /tmp/kf_bounds_diag.py                # 诊断脚本:官方边界 vs 独立网格 vs 放松边界
== D 频率,近 504 bar ==
  L-BFGS-B(事前边界 (-5,-5,-15)): log_params= [-5. -5. -15.]  nll= -526.662  conv= True  it= 1
  网格搜索 (100 点,76.1s) 最优: log_params=(-6, -6, -14) nll= -760.805
  放松边界 (-12,-12,-20): log_params= [-11.6072  -8.5403 -19.1587]  nll= -1356.813
== W 频率,近 104 bar ==
  网格搜索 (100 点,6.3s) 最优: log_params=(-6, -6, -14) nll= -131.435
  放松边界 (-12,-12,-20): log_params= [-12.  -8.3494 -20.]  nll= -228.579

⇒ 局部线性趋势对价格序列的似然无上界(R→0 时模型可逐点跟踪观测);事前边界是建模选择而非估计结果。 v2 合法修正(事前声明,本轮未做):固定 R 为归一化常数、只估信噪比 → 一步预测方差 ≥ R > 0, 似然有下界、无界性消除(退化为角点最优)。

七·补 · V2 闸门机制诊断(2026-10-02 复核后补,只读诊断,未改码)

触发原因:逐折 uneval_frac 实测为 0.810 / 0.810 / 0.000 / 0.810 / 0.808 / 0.000,

与"|kf_innovation| ≥ 3"(该特征 std ≈ 0.18)自相矛盾 → 必须查清是哪条闸在起作用。

原始命令与输出(python3 回测/kalman/v2_gate_diag.py(输出留档 cache/v2_gate_diag.log),逐折用该折已落盘的择优参数重算注入层):

列定义:kf_innovation = innovation/sqrt(S)(标准化残差,无量纲);kf_uncertainty = tr(P)(log 价格²)
--- 折0 2014-01-01~2016-01-01  n=105 ---
  innovation 闸:  0/105 = 0.0%   |kf_innovation| p50/p90/p99/max = 0.109/0.257/0.425/0.459(阈值 3.0)
  uncertainty 闸: 80/105 = 76.2%   unc p0/p10/p50/p90/max = 0.00423/0.00423/0.00423/0.00423/0.00423  thr(末值)=0.004227
     unc 首值=0.004227 末值=0.004227 单调增占比=100%  严格>阈值 的次数=80
  合并后 l1_status==无法评估:85/105 = 81.0%;kf 特征 NaN bar = 0
--- 折1 … 闸: innovation 0/105 = 0.0% ;uncertainty 80/105 = 76.2% ;合并 85/105 = 81.0%
--- 折2 … 闸: innovation 0/104 = 0.0% ;uncertainty 79/104 = 76.0% ;合并 84/104 = 80.8%
--- 折3 … 闸: innovation 0/105 = 0.0% ;uncertainty 80/105 = 76.2% ;合并 85/105 = 81.0%
--- 折4 … 闸: innovation 0/104 = 0.0% ;uncertainty 79/104 = 76.0% ;合并 84/104 = 80.8%
--- 折5 … 闸: innovation 0/104 = 0.0% ;uncertainty 79/104 = 76.0% ;合并 84/104 = 80.8%
(6 折 innovation 闸均为 0;|kf_innovation| 每折 max = 0.459/0.682/0.314/0.519/0.425/0.521 ≪ 3.0)

1) 两条闸各自闸掉的 bar 数(生效条数)

折innovation 闸(阈值 3.0)uncertainty 闸(扩张 90% 分位)合并 → 无法评估折内 l1_status 实测
00/105 (0.0%)80/105 (76.2%)85/105 (81.0%)81.0%
10/10580/105 (76.2%)85/105 (81.0%)81.0%
20/10479/104 (76.0%)84/104 (80.8%)0.0%(confirm=2 静默失效)
30/10580/105 (76.2%)85/105 (81.0%)81.0%
40/10479/104 (76.0%)84/104 (80.8%)80.8%
50/10479/104 (76.0%)84/104 (80.8%)0.0%(confirm=2 静默失效)

2) 量纲与分位(折 0 测试段,逐折同型)

特征定义(代码为准)分位(折0)量纲
kf_innovationinnovation / sqrt(S)(标准化残差)|·| p50/p90/p99/max = 0.109/0.257/0.425/0.459无量纲(O(0.1),非 O(1))
kf_uncertainty后验协方差迹 tr(P)p0/p10/p50/p90/max = 0.00423 / 0.00423 / 0.00423 / 0.00423 / 0.00423(p0=p90,5 位小数全同)log 价格²(数值上近似常量)

3) 结论一句话

两条闸是两类不同的失败:innovation 闸属"特征退化导致闸门完全失效"(6 折 0 命中,

|z| 最大 0.68 ≪ 3.0,因残差 std 仅 0.18 而永远够不到 3σ);uncertainty 闸属"闸门设计本身有误"

——拿一个近似常量、在窗内单调微漂移的量去比扩张 90% 分位,阈值必然长期低于当前值,

于是闸门退化为"预热 26 bar 之后几乎全部关闭"(每折稳定 76%,与市场状态无关)。

两者叠加后再与引擎既有的"无法评估 不可被迟滞确认"规则(l1_cand != "无法评估")交互,

使 l1_confirm_days=2 的两折出现静默失效(闸门开了但状态不被采纳)。

⇒ 本次 V2 的结果不能读作"全 4 特征无用",只能读作"该闸门实现有缺陷、V2 未被公平检验"。

⚠ 未决缺陷(本轮未修改任何代码,按监工条款停下报告):

  1. uncertainty 闸应改为稳健阈值(如固定相对带宽 unc > k × 滚动中位数、或用排名而非扩张分位),

且必须先验证该量在窗内不是单调/非常量;否则该闸无判别力。

  1. innovation 闸在残差退化(std≈0.18)前提下无意义 → 须先解决参数退化(固定 R 的 v2 规格)再谈 3σ 闸。
  2. 需与引擎的 l1_confirm_days 语义对齐("无法评估 不可确认"会让闸门在 confirm≥2 时形同不存在);

若要使闸门生效,应走独立的 no-entry 通道,而非复用 L1 状态机。

八、判定结果与结论

本轮结论只针对 V1 主臂;V2 因两处闸门缺陷(innovation 刻度错、uncertainty 统计量用错)未被公平检验,

其折级 Δ 既不支持也不否定"全 4 特征"。

事前门槛(跑之前写死,未事后修改):拼接样本外夏普改善 ≥ +0.10 且 ≥ 4/6 折同向 且 换手不劣化 > 20%。

臂Δ夏普同向折数换手变化三项门槛判定
V1(level/slope)+0.0374/6 ✓+3.2% ✓夏普项未过无改善
V2(全 4 特征)+0.0254/6 ✓−68.5% ✓夏普项未过无改善

⇒ 结论:【无改善】→ 不引入

  • 不接入 scripts/、不改 portfolio.py、不产生任何 order/signal;本目录整体归档为研究层证据。
  • 关于 V2 的表面数字:其改善来自少交易 / 不交易而非更好的择时——OOS 627 bar 中 l1_status="无法评估"

占比 54.1%(样本数加权;逐折 81.0%/81.0%/0.0%/81.0%/80.8%/0.0%,见 §七·补), fold_5 的交易次数 = 0(卫星完全停摆,只剩 60% 核心底仓),该折的 +0.338 是"什么都不做"的结果, 不构成引入理由。并且经 §七·补 诊断确认:该 54% 并非来自"闸门严格",而是 uncertainty 闸设计有误 (近似常量去比扩张分位)+ innovation 闸因特征退化永不触发 ⇒ V2 事实上未被公平检验; 因此 V2 一栏的结论只能记为"无改善(且实现有缺陷、不构成对全 4 特征的否定)"。

  • 门槛只差夏普一项(+0.037 vs +0.10),但因参数钉在边界(表 2/表 4)这一独立缺陷,

即使硬凑过线也不具备部署条件;不做"再调 Q/R/窗口/频率试一次"的动作(正是 checklist 第 3 条禁止的行为)。

九、组合层对照:kf_hedge_ratio vs portfolio.py 逆波动率(只对照,未改 portfolio.py)

逆波动率(60 周 bar、季调仓、5% 偏离带)最新记录:黄金 44.5% / 纳指 55.5%(数据/portfolio_state.json,nav 0.9812)。 动态对冲比率(周频 W-FRI、log 价格、δ=1e-3、观测方差由 52 周 burn-in 残差确定、burn-in 前不报告):

量p10p50p90max/min 漂移最新
kf_hedge_ratio(周频)0.4330.4850.8132.250.464
固定窗口 OLS(60 周)−0.3830.0500.735−1.27(可穿越 0)0.195
逆波动率权重比(ndx/gold)—1.25——1.25
  • 两者回答的不是同一个问题:对冲比率 = 金对纳指的动态 beta(≈0.49),逆波动率 = 等风险权重(比 1.25);

数值相差约 2.6 倍,不可互换引用。

  • 对冲比率本身在 1990–2026 上漂移 2.25 倍(p10–p90:0.43→0.81),固定窗 OLS 更不稳定(中位 0.05、可穿越 0)

⇒ 作为权重来源同样不可部署;仅作为"金/纳指联动随时间变化"的诊断量留档。

十、未完成 / 存疑(诚实列出)

  1. 只测了周频(与既有 wf/ 折同频);日频/月频未做(iSH 成本,且需另建折协议)。
  2. 未做 DSR / 多重检验修正(checklist #3 判"存疑"):两个事前版本、12 个样本外数字,未按 12_dsr_validation 折减。
  3. V2 闸门实现有缺陷(本轮新发现,未修码):uncertainty 闸 = 拿近似常量(折内 p0=p90)比扩张 90% 分位

→ 每折稳定闸掉 ~76% 的 bar,与市场状态无关;innovation 闸因残差退化(std≈0.18)永不触发(6 折 0 命中); 再叠加引擎"无法评估 不可被迟滞确认",使 l1_confirm_days=2 的两折静默失效。 ⇒ V2 未被公平检验,其折级 Δ 不构成特征有效性的证据(见 §七·补)。修复方案留待下一轮,本轮不顺手改。

  1. 似然退化的合法修正(v2 规格:固定 R、只估信噪比)未实现,按监工裁定留给 v2,且必须与 v1 结果并列报告。
  2. 未跑 tests/ 全量测试套件(成本高;本模块自带 7 项自检已全绿,engine_v1 自身用例未复跑)。
  3. 对冲比率的 obs_var 由 burn-in 固定回归确定 → 换 burn-in 长度会改变比率数值(只影响 §九 对照,不影响 A/B)。
  4. 本模块未接入任何生产路径,因此不存在"生产行为变更";回测口径数字不得与纸面/生产混用。

附录 A · 文件与指纹、回滚点

文件行数md5
回测/kalman/kalman_filter.py530f49d1f2e9f970db75eec29a90ebbf8c8
回测/kalman/kalman_selftest.py247623b69bf5f4d9afcf15073fd3ab98d84
回测/kalman/kalman_embed.py—见 md5_after.txt
回测/kalman/kalman_report.py—见 md5_after.txt
回测/kalman/README.md—见 md5_after.txt
本报告—见 md5_after.txt
  • 被修改文件:00 驾驶舱(投资MOC).md(+1 行入链)、回测/回测审核清单_backtest_pitfalls.md(+ 第 15 条)。

scripts/、回测/engine_v1/、回测/engine_multi/、框架/、归档区、已发布复盘、predictions.jsonl 一字未动。

  • 回滚点:/var/minis/shared/backup/DUCKERRY_pre_kalman_20261001/

(pre/ 快照 + md5_before.txt + post/ + md5_after.txt + REVERT.md)。

  • 复现路径:kalman_selftest.py --quick → kalman_embed.py --preflight → --build-kf(可多次续跑)

→ --fold K --arm base|v1|v2(逐折 <2 分钟短进程串行)→ --emit-curves → kalman_report.py。