卡尔曼滤波嵌入评估报告(2026-10-02)
滚动重估窗口 104 周 bar / 步长 13、特征 kf_level/kf_slope/kf_innovation/kf_uncertainty)。
[level, slope]、观测 = log 价格、三参数 MLE、--quick 全绿):T1 滤波器可复现(合成序列)、T4 两次拟合逐位相同 + 短样本确定性回退 (reason='sample<MIN_FIT_OBS'、返回有限值非 NaN)、T5 缺观ab/base/fold_0..5.json 与既有 wf/fold_0..5.json 的择优参数完全一致,wf/(训练 8 年 → 测试 2 年);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 | 夏普 | 最大回撤 | 总换手 | 总收益 | 交易次数 | 无法评估占比 |
|---|---|---|---|---|---|---|---|---|
| 0 | 2014-01-01~2016-01-01 | 105 | -0.475 | -15.7% | 2.78 | -9.3% | 10 | 0.0% |
| 1 | 2016-01-01~2018-01-01 | 105 | 0.961 | -9.8% | 3.60 | 17.9% | 9 | 0.0% |
| 2 | 2018-01-01~2020-01-01 | 104 | 0.728 | -9.5% | 10.00 | 10.1% | 25 | 19.2% |
| 3 | 2020-01-01~2022-01-01 | 105 | 0.431 | -13.7% | 4.00 | 8.7% | 10 | 0.0% |
| 4 | 2022-01-01~2024-01-01 | 104 | 0.418 | -12.8% | 8.80 | 7.1% | 22 | 19.2% |
| 5 | 2024-01-01~2026-01-01 | 104 | 2.268 | -5.1% | 11.51 | 64.9% | 38 | 0.0% |
V1 · 基线+卡尔曼(level/slope)
| 折 | 夏普 | 最大回撤 | 总换手 | 总收益 | 交易次数 | 无法评估占比 | Δ夏普 vs 基线 | 结论 |
|---|---|---|---|---|---|---|---|---|
| 0 | -0.542 | -17.2% | 4.80 | -10.8% | 12 | 0.0% | -0.067 | 变差 |
| 1 | 0.920 | -9.5% | 5.20 | 17.7% | 13 | 0.0% | -0.041 | 变差 |
| 2 | 0.806 | -9.6% | 8.40 | 11.2% | 21 | 0.0% | +0.078 | 改善 |
| 3 | 0.550 | -13.7% | 5.60 | 12.4% | 14 | 0.0% | +0.119 | 改善 |
| 4 | 0.519 | -11.2% | 4.80 | 8.2% | 12 | 4.8% | +0.101 | 改善 |
| 5 | 2.273 | -5.6% | 13.20 | 69.1% | 33 | 4.8% | +0.005 | 基本持平 |
V2 · 基线+卡尔曼(全 4 特征)
| 折 | 夏普 | 最大回撤 | 总换手 | 总收益 | 交易次数 | 无法评估占比 | Δ夏普 vs 基线 | 结论 |
|---|---|---|---|---|---|---|---|---|
| 0 | -0.497 | -16.0% | 2.78 | -9.6% | 10 | 81.0% | -0.022 | 变差 |
| 1 | 0.804 | -9.5% | 1.62 | 14.3% | 5 | 81.0% | -0.157 | 变差 |
| 2 | 0.781 | -9.6% | 2.80 | 10.0% | 7 | 0.0% | +0.053 | 改善(闸静默失效) |
| 3 | 0.493 | -11.6% | 3.20 | 9.9% | 8 | 81.0% | +0.062 | 改善(仅 19% 可评估) |
| 4 | 0.602 | -11.2% | 2.40 | 9.3% | 6 | 80.8% | +0.184 | 改善(仅 19% 可评估) |
| 5 | 2.606 | -3.8% | 0.00 | 59.9% | 0 | 0.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-26 | 627 | 7.0% | 9.6% | 0.754 | -15.7% | 40.69 | 114 |
| V1(level/slope) | 同上 | 627 | 7.5% | 9.8% | 0.790 | -17.2% | 42.00 | 105 |
| V2(全 4 特征) | 同上 | 627 | 6.7% | 8.8% | 0.778 | -16.0% | 12.80 | 36 |
| 臂 | Δ夏普(门槛 ≥ +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 下界 | 下界上的窗口占比 | p10 | p50 | p90 | max/min 漂移 |
|---|---|---|---|---|---|---|
| σ_obs² (R) | −5 | 100% | 6.738e-03 | 6.738e-03 | 6.738e-03 | 1.000 |
| σ_level² (Q_l) | −5 | 100% | 6.738e-03 | 6.738e-03 | 6.738e-03 | 1.000 |
| σ_slope² (Q_s) | −15 | 100% | 3.059e-07 | 3.059e-07 | 3.059e-07 | 1.000 |
- 同一重估窗内
R ≡ Q_l(恒等)、R的唯一取值数 = 1 ⇒ 所谓"滚动重估"实际退化为固定参数滤波。 - 判读:参数漂移 = 0 不是稳定,而是不可识别(漂移的来源被边界吃掉)。
按任务书"参数漂移剧烈 = 不可部署的直接证据"的同一逻辑,参数被边界锁死同样是不可部署的证据。
六、表 3 · checklist 逐条判定(本模块自查;清单已扩至 16 条,#15/#16 由本轮实测触发)
| # | 陷阱 | 出处 | 本库自查命令 / 字段 | 判定 |
|---|---|---|---|---|
| 1 | 前视偏差 | 16章 §16.2 | python3 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/min | 1.000 | ≫1 | 恒定 = 无数据驱动更新 |
std(kf_innovation) | 0.179(日频 504 bar 段 0.114) | ≈1 | 严重欠离散 → 模型失配 |
mean(kf_innovation) | +0.0042 | ≈0 | — |
kf_uncertainty p10/p50/p90 | 4.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 实测 |
|---|---|---|---|---|
| 0 | 0/105 (0.0%) | 80/105 (76.2%) | 85/105 (81.0%) | 81.0% |
| 1 | 0/105 | 80/105 (76.2%) | 85/105 (81.0%) | 81.0% |
| 2 | 0/104 | 79/104 (76.0%) | 84/104 (80.8%) | 0.0%(confirm=2 静默失效) |
| 3 | 0/105 | 80/105 (76.2%) | 85/105 (81.0%) | 81.0% |
| 4 | 0/104 | 79/104 (76.0%) | 84/104 (80.8%) | 80.8% |
| 5 | 0/104 | 79/104 (76.0%) | 84/104 (80.8%) | 0.0%(confirm=2 静默失效) |
2) 量纲与分位(折 0 测试段,逐折同型)
| 特征 | 定义(代码为准) | 分位(折0) | 量纲 |
|---|---|---|---|
kf_innovation | innovation / 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 未被公平检验"。
⚠ 未决缺陷(本轮未修改任何代码,按监工条款停下报告):
uncertainty闸应改为稳健阈值(如固定相对带宽unc > k × 滚动中位数、或用排名而非扩张分位),
且必须先验证该量在窗内不是单调/非常量;否则该闸无判别力。
innovation闸在残差退化(std≈0.18)前提下无意义 → 须先解决参数退化(固定 R 的 v2 规格)再谈 3σ 闸。- 需与引擎的
l1_confirm_days语义对齐("无法评估不可确认"会让闸门在 confirm≥2 时形同不存在);
若要使闸门生效,应走独立的 no-entry 通道,而非复用 L1 状态机。
八、判定结果与结论
本轮结论只针对 V1 主臂;V2 因两处闸门缺陷(
innovation刻度错、uncertainty统计量用错)未被公平检验,其折级 Δ 既不支持也不否定"全 4 特征"。
事前门槛(跑之前写死,未事后修改):拼接样本外夏普改善 ≥ +0.10 且 ≥ 4/6 折同向 且 换手不劣化 > 20%。
| 臂 | Δ夏普 | 同向折数 | 换手变化 | 三项门槛 | 判定 |
|---|---|---|---|---|---|
| V1(level/slope) | +0.037 | 4/6 ✓ | +3.2% ✓ | 夏普项未过 | 无改善 |
| V2(全 4 特征) | +0.025 | 4/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 前不报告):
| 量 | p10 | p50 | p90 | max/min 漂移 | 最新 |
|---|---|---|---|---|---|
kf_hedge_ratio(周频) | 0.433 | 0.485 | 0.813 | 2.25 | 0.464 |
| 固定窗口 OLS(60 周) | −0.383 | 0.050 | 0.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)
⇒ 作为权重来源同样不可部署;仅作为"金/纳指联动随时间变化"的诊断量留档。
十、未完成 / 存疑(诚实列出)
- 只测了周频(与既有
wf/折同频);日频/月频未做(iSH 成本,且需另建折协议)。 - 未做 DSR / 多重检验修正(checklist #3 判"存疑"):两个事前版本、12 个样本外数字,未按 12_dsr_validation 折减。
- V2 闸门实现有缺陷(本轮新发现,未修码):
uncertainty闸 = 拿近似常量(折内 p0=p90)比扩张 90% 分位
→ 每折稳定闸掉 ~76% 的 bar,与市场状态无关;innovation 闸因残差退化(std≈0.18)永不触发(6 折 0 命中); 再叠加引擎"无法评估 不可被迟滞确认",使 l1_confirm_days=2 的两折静默失效。 ⇒ V2 未被公平检验,其折级 Δ 不构成特征有效性的证据(见 §七·补)。修复方案留待下一轮,本轮不顺手改。
- 似然退化的合法修正(v2 规格:固定 R、只估信噪比)未实现,按监工裁定留给 v2,且必须与 v1 结果并列报告。
- 未跑
tests/全量测试套件(成本高;本模块自带 7 项自检已全绿,engine_v1自身用例未复跑)。 - 对冲比率的
obs_var由 burn-in 固定回归确定 → 换 burn-in 长度会改变比率数值(只影响 §九 对照,不影响 A/B)。 - 本模块未接入任何生产路径,因此不存在"生产行为变更";回测口径数字不得与纸面/生产混用。
附录 A · 文件与指纹、回滚点
| 文件 | 行数 | md5 |
|---|---|---|
回测/kalman/kalman_filter.py | 530 | f49d1f2e9f970db75eec29a90ebbf8c8 |
回测/kalman/kalman_selftest.py | 247 | 623b69bf5f4d9afcf15073fd3ab98d84 |
回测/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。