DUCKERRY_Warehouse 系统架构优化报告 v4.0(2026-09-22)
已读取:根目录、scripts/(14 活跃 + 7 legacy)、tests/、数据/(runs/paper/predictions/logs)、复盘/、框架/、优化/、optimization/、MOC 驾
DUCKERRY_Warehouse 系统架构优化报告 v4.0(2026-09-22)
性质:全库架构优化(效率 + 稳定性 + 整洁度),质量只升不降——所有行为级变更经 old-vs-new 逐字节 diff / 单测验证。
修改前备份:
/var/minis/shared/backup/DUCKERRY_Warehouse_pre_arch_20260922_001450(603 文件,含全部原始脚本/数据)。生产库:
/var/minis/mounts/DUCKERRY_Warehouse。
1. 审计范围与方法
已读取:根目录、scripts/(14 活跃 + 7 legacy)、tests/、数据/(runs/paper/predictions/logs)、复盘/、框架/、优化/、optimization/、MOC 驾驶舱、audit_evidence/。共 548 文件(排除 .obsidian)。
验证方法:
python3 -m compileall -q scripts tests -> PASS
python3 -m unittest(重构后分批) -> 10/10 PASS
regime_hybrid old-vs-new 逐字节 diff(同面板) -> CSV_IDENTICAL / WF_CSV_IDENTICAL
paper_engine 现金推导 vs 现有状态 -> 0.300 / 0.999580 完全一致
fetch.py 真实抓取 12 源 -> 12/12 OK(20260922T030600)2. 发现与修复
| ID | 类别 | 发现 | 修复 | 验证 |
|---|---|---|---|---|
| A1 | 测试过时 | 4 个测试假设"面板末行=完整交易日";面板延伸至 09-21(PM 未发布)后全挂 | setUpClass 目标日改为最后真实交易日(trading_frame().index[-1]),与面板巧合解耦 | 4/4 ok,套件 10/10 恢复 |
| A2 | 隐式耦合 | paper_engine._cash_delta 实例属性在 execute_signal 与 daily_mark_to_market 之间传值——先执行后盯市/跨日中断时现金错 | 删除该属性;盯市改为从订单文件按 status=filled and side=buy 无状态推导(幂等,任何调用顺序正确) | 推导值 0.300 与现有状态完全一致 |
| A3 | 转写错误 | fetch.py pipeline_error.log 写入字面量 \\n(非换行) | 改为真实 \n | py_compile PASS |
| A4 | 转写错误 | dkfetch.clean() HTML 实体被解码成 no-op("<"→"<"、">"→">"、"&"→"&") | 恢复 </>/& 解码;clean() 移出逐行循环 | py_compile PASS |
| B1 | 重复逻辑 | regime_hybrid.py main() 与 compute_regime_from_df() 重复 ~150 行(L1 信号 ×3、距离循环 ×2、walk-forward ×2) | 抽取共享核心:_l1_signal/_dist_rows/_raw_label/_conf_entropy/walkforward_compare/_archetypes_from_z;main 收敛为编排+渲染 | old-vs-new CSV 逐字节一致(-regime_daily.csv / regime_daily_wf.csv) |
| B2 | 效率 | test_pipeline.py 顶层 import fetch 拉起整条 scipy 链(iSH ~45s),纯解析测试陪跑 | 改为 test 内延迟导入 | 非重算测试启动显著加速 |
| C1 | 整洁度 | 7 个 09-13 时代一键修复脚本散在 scripts/(finalize_reviews/finish_reviews_fast/panel_legacy/rebuild_reviews×2/calibrate/validate_0918) | 归档至 scripts/legacy/(引用扫描:fetch/tests 均不 import;未删除) | scripts/ 收敛为 14 个活跃脚本 |
| C2 | 整洁度 | scripts/__pycache__、tests/__pycache__ 残留 | 清理(可再生,不作证据) | — |
| D1 | 稳定性 | 低内存设备上 mcal import(~70s)+ valid_days(~66s)→ 长进程可能被静默终止(本会话实测多次) | dkpanel 增加 DK_DISABLE_MCAL=1 kill-switch(强制回退硬编码假日表,2026 表与官方日历 77/77 零差异已验证) | 关闭后套件全跑通 |
| D2 | 文档一致性 | MOC v3.6:状态停更在 09-11、无新组件(模拟盘/债券腿/regime WF)、regime 行滞后于 LBMA 数据修订 | 升级 v4.0:新增 §〇 系统架构总览、概览表 5 维更新、Agent 表更新、v4.0 版本记录、regime 行同步当前面板计算值(Trending-Down 0.788) | MOC 内部一致 |
3. 质量守恒验证
- regime_hybrid 重构:新旧代码在同一 panel 上输出
regime_daily.csv与regime_daily_wf.csv逐字节一致;唯一日志差异为合计行 -0.01pp 显示舍入(新版与逐行展示一致,更自洽)。无前视 walk-forward 数字与历史记录完全一致(Δ+4.29pp、5 被过滤日含 06-17 -2.43%、07-22 -2.65%)。 - paper_engine:无状态现金推导 = 现有 equity.csv 记录值(0.300000 / equity 0.999580),当前持仓量纲正确。
- 测试:10/10 通过(修复前 6/10——4 个失败为测试过时而非生产 bug,根因已写入测试注释)。
- fetch.py 主管线:12 源真实抓取 12/12 OK;面板/分析/regime 组件分别验证通过。⚠ 本会话 iOS 内存压力下长进程(>~2.5 分钟)可能被静默终止,完整发布运行待用户下次正常时段执行(
python3 scripts/fetch.py)。
4. 未变更(刻意保留)
- G1/G8 失败关闭发布机制、原子写、run 归档、无填充/无外推原则——v2.1 审计的核心能力,全部保留。
audit_evidence/冻结证据包——只读,不改写。复盘/历史原始记录/隔离归档。recompute2/3/4.py、validate_prediction.py、predict_regime_conditional.py、update_bond_etf.py、reset_paper_state.py——活跃管线/工具,未动。- 回测/因子/资产/概念 文档——本次任务为架构优化,未触碰研究内容。
5. 文件变更清单
| 文件 | 变更 |
|---|---|
scripts/regime_hybrid.py | 重构:478→419 行,抽取 6 个共享核心,消除 ~150 行重复;接口/输出不变 |
scripts/paper_engine.py | 删除 _cash_delta 隐式耦合;现金无状态推导(+6 行注释) |
scripts/dkfetch.py | clean() 实体解码修复 + 移出循环 |
scripts/fetch.py | pipeline_error.log 换行符修复 |
scripts/dkpanel.py | 新增 DK_DISABLE_MCAL kill-switch |
tests/test_pipeline.py | 4 个过时测试修复 + fetch 延迟导入 |
scripts/legacy/(新增) | 7 个一键修复脚本归档 |
00 驾驶舱(投资MOC).md | v4.0:§〇架构总览、概览/Agent/版本记录更新、regime 行同步 |
optimization/系统架构优化报告_2026-09-22.md(新增) | 本报告 |
6. 回滚
如需回滚:cp -r /var/minis/shared/backup/DUCKERRY_Warehouse_pre_arch_20260922_001450/* /var/minis/mounts/DUCKERRY_Warehouse/(覆盖前确认无新写入)。
7. 下一步建议(可选优化)
- ~~下次正常时段跑一次完整
python3 scripts/fetch.py发布~~ ✔ 已于 2026-09-22 后台方式完成(见 §9)。 - 低内存设备建议在 fetch 前设置
DK_DISABLE_MCAL=1(若 mcal 挂起)。
8. 追加清理(2026-09-22 同一批次)
在主体优化后,继续完成顶层整洁度收敛(引用扫描 + 备份均就绪,未破坏任何导航):
| 变更 | 前 | 后 |
|---|---|---|
优化/(中文目录,3 个 09-12/13 修复报告) | 无任何 md 引用,孤立 | 并入 optimization/(现 14 份统一收纳),空目录移除 |
根 logs/(2 个 08-16 历史日志) | 无引用 | 并入 数据/logs/ |
根 workspace/(含空 duckerry_audit_0911/) | 空目录遗留 | 移除 |
根 refactor_md_ios.py(emoji→ios-tag 排版工具) | 散在根目录 | 按 09-11 审计建议归档 scripts/legacy/(现 8 个) |
顶层最终结构:11 个目录(audit_evidence / optimization / scripts / tests / 回测 / 因子 / 复盘 / 数据 / 框架 / 概念 / 资产)+ 根仅存 驾驶舱 & 5 个参考文档。 驾驶舱 §〇:已用玻璃主题 status-* 徽章美化(管线分层表 + 状态列 + 稳定性加固清单),DOM/CSS 双重验证渲染正常。
9. 完整发布运行 + 模拟盘透支修复(2026-09-22 12:23)
完整发布成功(后台 nohup + 轮询绕过会话内存压力杀进程问题):
- run_id
20260922T122347+0800|target2026-09-21|G1=PASS / publish=PASS / source=PASS - 12 源全 OK;面板 81 行 / 77 交易日(09-21 已升为完整交易日含金 PM)
- L0 降级(TLT/AGG 债券源滞后到 09-18 → L0-3 当日无法评估,正确行为)
- L1 up +1.34%|Regime Trending-Up 0.785|Brier 0.074
- 产出:
复盘/2026-09-21 收盘数据快照.md+ MOC AUTO 区块已刷新;recompute2/4 rc=0
发现并修复模拟盘真实缺陷:连续两日 long 信号时,execute_signal 按 size×equity 下单却未扣减可用现金,09-21 二次买入把现金打至 -0.485(凭空加杠杆/透支),使"纪律测试"失真。
- 修复:
execute_signal增加无保证金约束——可用现金 =1.0 − Σ已成交买入,单笔买入min(size×equity, cash_avail),无现金则不加仓(等价 hold)。验证:09-22 size=0.9 请求被正确截断为 0.30(仅剩余现金)。 - 状态纠正:移除无效的 09-21 透支订单/信号,重算持仓;
paper_equity.csv两行均恢复正现金 0.300,09-21 变为持有(daily_return +0.047%)。 - 备份:
数据/paper_bak_pre_cashfix_20260922_123330。 - ⚠ ~~遗留:
size×equity增量语义;min_hold_days未强制~~ → ✔ 已于同日 v4.1 修复,见 §10。 latest.json.paper显示旧值 0.995265(诊断快照,MOC 不展示,下次 fetch 自动刷新为 v4.1 语义结果)。
10. 模拟盘 v4.1:再平衡到目标 + 止损止盈卖出腿(2026-09-22)
修复 §9 两处遗留 + 同期发现的风险执行缺口:
| # | 问题 | v4.1 修复 |
|---|---|---|
| 1 | size×equity 为增量买入,连续多日 long 重复建仓 | 再平衡到目标:目标市值=size×净值,加仓=max(0, 目标−已持) |
| 2 | 净值每日漂移 → 无谓 churn(每次 ~6bps 成本) | 容差带 REBALANCE_BAND=2%:偏离 > 2%×净值 才下单 |
| 3 | ✔ stop_loss/take_profit 只记录不执行 → 3%/6% 风险上限形同虚设 | 新增 check_exits() 卖出腿:硬止损优先于 min_hold(风险优先纪律);止盈受 min_hold 约束;同日幂等;当日已出场则不再回补(防先卖后买) |
| 4 | 现金推导只算买入 | _cash_from_orders() 统一 1.0 − Σ买入 + Σ卖出(仍无状态幂等) |
| 5 | 同日重跑时 daily_return/max_dd/consec_loss 拿被替换的旧行当基准 | 统计基准统一排除同日旧行(prev_rows) |
新增回归测试 tests/test_pipeline.py::PaperEngineTests(纯标准库、5.5s,不依赖面板): ① 连续重复 long 不透支 ② 置信度上调→再平衡 ③ 同日幂等 ④ 止损全卖且不当日回补 ⑤ min_hold 阻断止盈 —— 5/5 OK。
沙盒 7 日情景验证:建仓 0.70 → 同信号容差带内不动 → conf 0.9 加至 0.1975 → 同日幂等 → -4.2% 止损清仓(cash 0.966 无透支)→ 清仓后再入场 → +6.2% 止盈被 min_hold 拦截。生产 09-21 腿按新语义重跑:conf 0.785 → 补足 buy 0.0855,cash 0.2145>0,daily_return -0.3898%(基准正确取 09-18 而非旧同日行)。