DUCKERRY_Warehouse v4.2 变更报告 · 债券腿日更自动化 + 武器库接入
推论:武器库当前只能"读源码当算法参考、移植为纯 Python",不能作为运行时依赖。
DUCKERRY_Warehouse v4.2 变更报告 · 债券腿日更自动化 + 武器库接入
日期:2026-09-23 | 版本:v4.2(承接 v4.1 模拟盘风险执行补全版)
一句话:把外接武器库从"挂着没用"变成"每天第一步就能用",并因此把 L0-3 从收益率代理升级为真实债券价格可评估;同时把发布流程做成新对话可直接粘贴的交接包。
一、本次要解决的问题
| 问题 | 症状 | 本次处置 |
|---|---|---|
| 武器库形同虚设 | /var/minis/mounts/武器库/ 挂载 7 仓库,但每天发布从不调用 | 打通唯一可用通道并封装为一键脚本 |
| L0-3 债券腿退化 | AGG/TLT 数据停在 09-18 → L0-3 只能写"部分可评估(收益率代理)" | 债券腿推进至 09-22,L0-3 → 可评估(含真实债券价格) |
| 发布易被静默 kill | 前台必被 kill;本次后台运行亦被抓完后静默终止 | 默认加 DK_DISABLE_MCAL=1,一次跑通 |
| 交接靠记忆 | 新对话需口头补充路径/参数/判据 | 出品 v4.2 交接提示词(整段粘贴即用,含排版同步清单) |
二、武器库环境实测结论(重要,避免后续白费功夫)
python3 3.12 + pandas 2.2.3 + requests ✅ 可用
akshare / efinance / yieldcurve / pybondlab ❌ 未安装,且无 pip 网络 → 不可 import
shell curl / python requests 直连外网 ❌ HTTPS_PROXY 拒绝(ProxyError)
minis-browser-use fetch ✅ 唯一可用通道(http 200,落盘 /var/minis/browser/)推论:武器库当前只能"读源码当算法参考、移植为纯 Python",不能作为运行时依赖。 已在交接提示词中写入禁止项:不得在脚本里 import akshare/efinance/pybondlab。
已打通的数据通道(eastmoney,免 key)
https://push2his.eastmoney.com/api/qt/stock/kline/get
?secid=105.TLT # TLT;AGG=107.AGG(105.AGG 返回 data:null)
&fields1=f1&fields2=f51,f53&klt=101&fqt=1&beg=YYYYMMDD&end=YYYYMMDD
→ {"data":{"code":"TLT","klines":["2026-09-22,81.555", ...]}}⚠ 坑位(已封装):minis-browser-use fetch 落盘名为秒级时间戳,连续抓两个 URL 会互相覆盖——第二次抓取会顶掉第一次的结果(本次实测踩到)。必须「抓一个 → 立即 cp 另存 → 再抓下一个」。
三、新增/变更文件
| 文件 | 变更 |
|---|---|
scripts/refresh_bond_etf.sh | 新增:一键刷新 TLT/AGG 日线(浏览器 fetch → 立即另存 → 增量合并),含坑位封装与 pending 提示 |
scripts/update_bond_etf.py | 沿用(增量合并逻辑正确:旧日期不覆盖,只追加新日期) |
数据/bond_tlt.json / bond_agg.json | 09-18 → 09-22(各 +2 天:09-21、09-22);备份 .bak_20260923 |
00 驾驶舱(投资MOC).md | 升 v4.2(5 处:frontmatter / 头部状态行 / §〇 架构图与表格 / §九版本记录 / §十工具箱 / 页脚) |
复盘/2026-09-21 收盘数据快照.md | --force 重生成(旧版 L0-3 仍写"收益率代理",已过时) |
optimization/每日发布运行提示词_2026-09-23.md | 新增:v4.2 交接包(8 节,整段可粘贴) |
optimization/系统架构优化报告_2026-09-23.md | 新增:本报告 |
四、验证证据(本次真实运行)
4.1 债券腿合并
TLT: 旧 77 天 + 新增 2 天 = 79 天 最新 2026-09-22,81.555
AGG: 旧 77 天 + 新增 2 天 = 79 天 最新 2026-09-22,96.105
(二次执行:新增 0 天 → 幂等,打印 pending,不补数)4.2 发布结果
| 项 | 值 |
|---|---|
| run_id | 20260923T003658+0800(--force 重生成快照:20260923T004212) |
| target | 2026-09-21(09-22 LBMA 黄金 PM 未发布 → lbma_priced=False → 不计交易日,脚本正确拒绝填充) |
| G1 / publish / source | PASS / PASS / PASS,missing_core=[] stale_core=[] |
| 面板 | 82 行 / 77 交易日 / span 2026-06-01 → 2026-09-22 |
| L0-3 | 可评估(含真实债券价格):金 -0.55% / SPX +1.49% / NDX +2.83% / AGG +0.26% → 未触发三杀 |
| L0 汇总 | 正常 |
| L1 | up(+1.34%,同向 3/5);chg20 -3.54% → tf_align=diverged |
| Regime | Trending-Up 0.785(分布 Range 29 / TD 20 / Trans 17 / TU 14) |
| Brier | 0.074(基准 0.12379,n=5);Range n=3 0.0633 / Transitional n=2 0.09 |
| Paper | equity 0.995683 / cash 0.214500 / 持仓 0.781183 / 当日 -0.3898% / 无 exit;新信号 long size 0.785(fd=09-21)→ order=null(同日幂等 hold,该 fd 已有 filled 订单 ord_20260922_125913) |
| recompute | recompute2 rc=0 / recompute4 rc=0 |
4.3 面板债券列(尾部)
2026-09-18 tlt 81.25 agg 95.96 trading_day=True
2026-09-21 tlt 81.80 agg 96.21 trading_day=True
2026-09-22 tlt 81.555 agg 96.105 trading_day=False(gold PM 未发布)4.4 静默 kill 复现记录
| 运行 | 命令 | 结果 |
|---|---|---|
| #1 | 后台 python3 -u scripts/fetch.py | ✔ 完成(00:02,target 09-21,L0-3 走代理) |
| #2 | 同上(刷债券腿后) | ✘ 抓完 12 源后静默终止,无 完成: 行,latest.json 未更新 |
| #3 | DK_DISABLE_MCAL=1 + 后台 | ✔ 完成(00:36,L0-3 真实债券价格) |
| #4 | 同上 + --force | ✔ 完成(00:42,快照重生成) |
五、口径与纪律(未变)
- 缺值保持缺值;禁止前值填充、线性外推、把旧值冒充目标日。
--force只重渲染自动快照,不覆盖人工收盘复盘。- MOC
AUTO:DATA区块由脚本维护,禁止手改。 - 武器库数据仅作补充/校验,写入独立文件并标
[待验证] 单源,不覆盖主管线 12 源原始响应。
六、遗留与风险
| 项 | 说明 |
|---|---|
| 债券腿单源 | AGG/TLT 仅 eastmoney 单源 [待验证],设想引入第二源交叉校验 |
| 09-22 价格微动 | 二次抓取 TLT 09-22 报 81.565(首次 81.555)—— 增量合并不覆盖已有日期,已存值保持不变,属预期 |
| 静默 kill | 根因是 iOS 内存压力,DK_DISABLE_MCAL=1 只是降低概率;仍需以"日志末行"为唯一完成判据 |
| 周报 | 需 ≥5 交易日 equity,自然积累 |
【追加】v4.3 债券腿入管线 + 排版自检(同日完成)
七、v4.3 要解决的问题
| 问题 | 处置 |
|---|---|
| 债券腿是"每日手动第 0 步" | 改为 fetch.py 管线内自动步骤(面板构建前),每日发布恢复"一条命令" |
| "排版同步"靠人记 | 新增 doc_sync_check.py,9 项可机器校验,发布后自动跑 |
| 真实数据被重格式化 | update_bond_etf.py 原样保留源串(81.80 不再变 81.8) |
| L0-3 缺失分支输出原始浮点 | 统一 %+.2f%% / "缺" |
八、代码变更
| 文件 | 变更 |
|---|---|
scripts/fetch.py | 新增 refresh_bond_leg(timeout=240):子进程调用 refresh_bond_etf.sh,异常全部捕获、永不致命,错误写 数据/logs/bond_leg_error.log;新增 --no-bond;结果入 latest.json.bond_leg;发布后调用 doc_sync_check 并回写 latest.json.doc_sync |
scripts/doc_sync_check.py | 新增:纯函数 evaluate(...) + run(...),9 项检查,--strict 时 exit 1 |
scripts/update_bond_etf.py | parse_klines 改为保留源串(不再 float()→str() 往返) |
scripts/dkanalysis.py | 新增 _pct() 辅助;L0-3 缺失分支改用 %+.2f%% |
scripts/publish_status.sh | 新增 bond_leg / doc_sync / panel 三行输出,doc_sync 有 issue 时逐条打印 |
tests/test_pipeline.py | 新增 BondLegTests(3) + DocSyncTests(4),套件 15 → 22 |
技能 duckerry-daily-review | 1.1.0 → 1.2.0:§1.5 改为"已内置管线",新增 §1.6 一致性自检 |
| 交接提示词 | 第 0 步由"必做"改为"v4.3 起内置,排障时才手动";完成判据加入 债券腿: 与 排版同步检查 行 |
九、验证证据
| 项 | 结果 |
|---|---|
| 单元测试 | PipelineSafetyTests rc=0|PaperEngineTests 5 OK|BondLegTests 3 OK|DocSyncTests 4 OK(合计 22 项,逐类 rc=0) |
| 非阻断实测 | DK_SKIP_BOND=1 → 「债券腿: 已跳过」,管线继续 |
| 端到端 run | run_id 20260923T081449+0800(--force,DK_DISABLE_MCAL=1 后台),target 2026-09-22,G1/publish/source 全 PASS,面板 82 行 / 78 交易日 / span 06-01→09-22 |
| 管线日志特征 | 债券腿: === 抓取 TLT/AGG === + 旧 79 天 + 新增 0 天(幂等)+ ✔ 驾驶舱/快照/run_log 与 latest.json 一致 + 排版同步检查: 全部一致 ✔ |
latest.json | bond_leg.ok=true;doc_sync={"ok":true,"issues":[]} |
| 自检实效 | 发布过程中真的抓出「MOC 头部写 77 交易日 / 实际 78」→ 修正后归零(证明检查项有效) |
| recompute | recompute2 rc=0 / recompute4 rc=0 |
十、附带观察
- 目标日推进:本会话期间 LBMA 发布 2026-09-22 PM fix(
gold_pm.json由止于 09-21 → 出现 09-22, 4329.55),面板lbma_priced=True→ target 自动由 09-21 推进至 09-22,新快照复盘/2026-09-22 收盘数据快照.md生成。 - L0 正确降级:09-22 的 SPX/NDX/VIX 目标日尚未发布(FRED 滞后)→ L0-2/L0-3 = 无法评估 → L0 汇总"降级(存在无法评估项)"。无任何填充(符合口径)。债券腿本身有真实值:AGG -0.11%。
- 09-21 的 L0-3 仍为「可评估(含真实债券价格)」(AGG +0.26%)。
十一、回滚点(v4.3)
- 代码改动前:见一次性优化提示词 §0 的
tar czf /var/minis/shared/backup/DUCKERRY_Warehouse_pre_v43_*.tgz - 债券腿数据:
数据/bond_tlt.json.bak_20260923、数据/bond_agg.json.bak_20260923 - 全库:
/var/minis/shared/backup/DUCKERRY_Warehouse_pre_arch_20260922_001450
关联:交接提示词 v4.2 | v4.0 架构报告 | 驾驶舱