续接任务提示词 · A1 并行记录与外部资源接入(v5.3)
结论:换权益腿仍显著优于单持黄金 → 效应不只属于纳指;
续接任务提示词 · A1 并行记录与外部资源接入(v5.3)
生成:2026-09-27 | 仓库:
/var/minis/mounts/DUCKERRY_Warehouse用法:新对话直接粘贴本文件末节「八、供新对话粘贴的最小提示词」整段。
本文件是完整离线上下文——上一轮会话很长,已完成/已定案/待办/会踩的坑/资源边界全部固化,新会话不需要历史对话。
零、开工前必读(iSH 环境纪律 · 最容易翻车)
| 纪律 | 说明 |
|---|---|
| 单进程 ≤ 2 分钟 | iSH 上单个 Python 进程约 2 分钟被静默 kill:rc=0、无 traceback、nohup 也挡不住。长任务必须拆成多个 <2 分钟短进程串行跑 |
| 测试逐类前台跑 | PipelineSafetyTests 等整类一次跑必被 kill(本轮第 10 项单独跑 129s OK)。逐类跑,必要时逐项 |
| nohup 写法 | nohup sh -c '…' >/dev/null 2>&1 & ✔ | A && nohup B & ✘(会把 A 一起放后台并随 shell 退出被杀)。本轮又踩两次 |
| 无 CJK 字体 | matplotlib 图例一律 ASCII |
| 算与画分家 | 绘图可能跑过 2 分钟 → 先落盘数据,再由独立脚本出图 |
| 等待机制 | 用 shell_execute 的 delay 轮询,不要在命令里 sleep |
一、已完成、不要重做
1.1 v5.3 卫星降权(c,已落地)
| 项 | 原值 | 新值 |
|---|---|---|
| 方向性仓位上限 | POSITION_LIMIT = 1.0(满仓) | SATELLITE_CAP = 0.20(POSITION_LIMIT 指向它) |
| 空头名义上限 | SHORT_SIZE_CAP = 0.5 | 0.10(同比例 ÷5) |
| 仓位口径 | min(上限, 置信度) | 上限 × 置信度 |
- 口径特意用乘法而非截断:
min(0.2, conf)会让任何 ≥0.2 的置信度都得到 0.2 → 置信度动态调仓彻底退化(会打挂test_rebalance_to_target_on_higher_confidence)。乘法既"等比缩小"又保留动态。 - 信号逻辑/方向判定/止损止盈/min_hold 一字未改(降权不改变符号)。
scripts/paper_engine.pymd53a965b82→1eeba07e;SKILL 升 v1.7.3(两副本 md59c8c7fef)。
1.2 a/b 落地:scripts/portfolio.py(A1 基建,已建好)
- 规则(b 定案):逆波动率(60 周 bar)· 周数据 W-FRI · 季调仓 · 5% 偏离带 · 6bps
- 维护虚拟净值,产出
数据/portfolio_state.json+数据/portfolio_ledger.jsonl+--emit-review(复盘一节) - 硬约束(有单测断言):绝不写
数据/paper/、不生成 order/signal、不 importpaper_engine - 首条记录(2026-09-25 建仓):黄金 45.0% / 纳指 55.0%(近 60 周纳指周波动 2.45% < 黄金 2.99% → 纳指权重反而更高),nav 0.9994
- 单测
PortfolioRecordTests6 项:不写 paper / 逆波动率方向 / 偏离带拦截 / 幂等 / 无前视 / 复盘免责句 - 用法:
python3 scripts/portfolio.py --asof <YYYY-MM-DD>→--emit-review输出贴进复盘
1.3 决策备忘 v1.1(三问已拍板)
- a → A1(并行记录不下单);b → 逆波动率 + 周数据 + 季调仓;c → 立即降权(done)
- 三条补强已写入:① beta 选择警告(赢的三段恰好都是纳指大牛市 → 是"分散 + beta 选择",不是资产类别分散);② 最坏情形表;③ NDX 不含股息(方向保守)
1.4 A1 定义(已按此改写,别退回旧定义)
A1 = ① 并行记录 ② 最坏情形具象化 ③ 换腿稳健性检验
陷阱(写死在备忘 §二):6 个月后拿纸面记录下结论 = 用 ~60 个观测否决 41 年样本
升级 A2 的里程碑 =「经历过一次组合 ≥15% 回撤且没动手」,不是"6 个月"
1.5 最坏情形表(已入备忘 §五,独立复核一致)
| 指标 | 周调仓口径 | 拍板口径(季调仓) |
|---|---|---|
| 最大回撤 | −31.8%(谷底 2008-11-21) | −32.6% |
| 最长水下期 | 221 周 = 4.2 年(自 1987-10) | 210 周 = 4.0 年 |
| 最差滚动 12 月 | −28.1%(2008-10) | −28.5% |
| 纳指腿 2000–2009 | −82.9% | 同 |
如实记录:季调仓在这三个尾部指标上略差于周调仓(少动省成本,但极端行情反应慢)——选它是成本/换手与尾部响应之间的折中。
1.6 换腿稳健性检验(A1 第 3 项,首轮已完成)
| 组合 | 起点 | 夏普 | 回撤 |
|---|---|---|---|
| 金+纳指 | 1986 | 0.859 | −32.6% |
| 金+标普500(换权益腿) | 2016 | 1.096 | −18.4% |
| 黄金 100% | 2016 | 0.795 | −26.1% |
| 金+WTI(坏腿) | 1986 | 0.459 | −51.0% |
| 纳指+标普500 | 2016 | 0.940 | −29.7% |
结论:换权益腿仍显著优于单持黄金 → 效应不只属于纳指;但换坏腿几乎消失 → 依赖"那条腿自己得像样"(= beta 选择观点)。 ⚠ 数据限制(诚实披露):仓库没有长历史非权益分散腿(美股总回报 / 全球股票 / REITs / 长久期美债总回报都缺)→ 换腿只能在 2016 起跑,而 2016–2026 是黄金与股票同时走强的十年 = 弱检验。补长历史数据后重做 [待验证]。
1.7 自检状态(全绿,勿破坏)
arch_check 11/11(md=218 出链=801 死链 0 孤儿 0)|doc_sync_check --strict rc=0|moc_index 无需更新(复盘 96 / 归档 44) 测试:Paper 5 · PaperShortReduce 6 · PortfolioRecord 6 · PipelineSafety 10 · DocSync / MocIndexHeal / ArchState / PathGuard / AuxSource / PatternAbc / StateDigest / PredictLock / BondLeg / RegimeWf 全绿
二、本轮任务(按优先级)
【P0】A1 接线:把 portfolio.py 接进每日发布流程
现状:portfolio.py 需要手工跑。而本仓库的既有哲学是"把习惯变成机械校验"(moc_index / doc_sync_check 都是这么接进 fetch.py 的)。
- 在
scripts/fetch.py发布成功后自动调用portfolio.py --asof <target>(与moc_index.py同级,失败永不阻断发布) - 逃生开关:
--no-portfolio/DK_SKIP_PORTFOLIO=1(对齐--no-bond/DK_SKIP_BOND的既有惯例) - 结果写入
数据/latest.json.portfolio(权重 / nav / 是否再平衡 / 原因) - 在 SKILL 的 SOP 里加一行:复盘 §X 贴
--emit-review输出 - 验收:跑一次
fetch.py→latest.json.portfolio有值;断网/缺数据时发布不受影响;补测PortfolioRecordTests至少 +2 项(接线失败不阻断 / 跳过开关)
【P1】外部资源接入(见 §三)
- quantstats 交叉验证绩效指标(装
py3-seaborn后) - 登记
量化策略/挂载(数据库说明.md§〇·五·一 + 红线分层)
【P2】读源码补强(不改依赖)
- ML4T 回测陷阱 → checklist(落到
回测/下,作为全库回测产出的审核清单) - PyPortfolioOpt
risk_models.py评估:是否值得把portfolio.py的 60 周样本 std 换成收缩估计
三、外部资源(/var/minis/mounts/量化策略/,9 个仓库)
3.0 环境实况(已实测)
| 通道 | 状态 |
|---|---|
pip install | ✘ 不通(proxy 拒绝连接) |
apk add | ✔ 通,且已模拟验证不会动现有 numpy/pandas/scipy |
| 可补 | py3-seaborn · py3-scikit-learn · py3-statsmodels |
| 补不了 | cvxpy / numba / cython(Alpine 仓库无) |
文件完整性已全量体检:2093 个 .py 逐个 AST 解析 0 失败;102 个零字节文件中 96 个是合法空 __init__.py;README/LICENSE 都在(只是扩展名 .rst/.txt/.md)。没有损坏文件,问题只在依赖。
3.1 ✔ 可调用(需先装包)
| 资源 | 前置 | 用途 |
|---|---|---|
| quantstats | apk add py3-seaborn | 交叉验证我们手写的绩效指标 |
为什么这件事最该做:本项目因为手写指标已经踩过两个坑——① 年化因子硬编码 252(周/月夏普被高估
√(252/ppy)倍);② 「1/N 同波动缩放」的夏普变化差点让一条关键结论站不住。做法:写独立脚本(放
回测/,不放scripts/),把engine_v1/engine_multi/portfolio.py的净值曲线分别用 quantstats 与我们的performance()各算一遍,逐项比对(夏普 / 波动 / 最大回撤 / 卡玛 / 索提诺),差异 >1e-6 就报出来并定位。挂载方式:
PYTHONPATH=/var/minis/mounts/量化策略/quantstats-main python3 …
3.2 📖 只读源码(抄算法,不引依赖)
| 资源 | 读什么 |
|---|---|
PyPortfolioOpt-main/pypfopt/risk_models.py(668 行,纯 numpy/scipy) | 协方差估计器:样本协方差 / Ledoit-Wolf 收缩 / 指数加权 / 固定收缩。→ 评估是否把 portfolio.py 的 60 周样本 std 换成收缩或指数加权,并用回测对照;无明确改善就保持现状并说明 |
PyPortfolioOpt-main/pypfopt/hierarchical_portfolio.py(238 行) | HRP 的"相关性→聚类→递归二分"思路(腿数增加时再评估,现在不引) |
Riskfolio-Lib-master/riskfolio/src/RiskFunctions.py | 风险度量定义(与 quantstats 互相印证) |
machine-learning-for-trading-main/ | regime detection 章节(HMM/GMM)+ 回测陷阱章节 |
⚠
Riskfolio-Lib的 2101 个文件里约 2000 个是 vendored 的 Eigen C++ 库——Python 侧只有 21 个文件。别被体量误导。
3.3 ⛔ 只读,绝对禁止安装
| 资源 | 为什么 |
|---|---|
pysystemtrade-develop | 钉死 pandas==2.1.3,现役 2.2.3。任何 install 都会降级 pandas → 直接打断 fetch.py 生产管线。 这是唯一一条会造成实际损害的红线。只允许读源码(syscore/ 的 forecast scaling、分散化思路) |
vectorbt | 缺 numba(且要 numpy≥2.4.6,现 2.1.3) |
cvxportfolio / PyPortfolioOpt / Riskfolio-Lib | 缺 cvxpy |
bt | 缺 Cython,且 __init__.py 第一行 import ffn(ffn 也不在清单里)——别在它上面花时间,读 backtest.py + core.py 即可 |
3.4 ⏸ 待决定后才用
| 资源 | 前置 | 条件 |
|---|---|---|
| hmmlearn | apk add py3-scikit-learn | 仅当决定做"统计 regime"时;且必须对齐仓库已有的 regime_hybrid.py(wess_hmm 移植),不要另起一套 |
3.5 红线分层(必须落进登记)
研究层(
回测/或独立脚本):可以用(PYTHONPATH挂载目录)生产链(
scripts/):一律不 import —— 包括portfolio.py(它只用 numpy,用不着)
pysystemtrade:只读,禁止安装(pandas 版本冲突会毁管线)
在 数据库说明.md §〇·五·一「外部思路源」登记 量化策略/:9 个仓库 + 各自的"可调用/只读/禁装"判定 + 缺失依赖清单 + 上述分层红线。
四、仓库登记规范(加文件后必须做,否则自检失败)
| 规范 | 内容 |
|---|---|
| 地图计数口径 | arch_check.MAP_DIRS:回测/optimization/框架/资产/因子/概念/顶层文档 = all_direct(只数直属文件,不数目录);复盘 = md_direct;audit_evidence = md_recursive。新增子目录不改变声明数 |
新 .md 必须有入链 | 至少一条 [[wiki 链接]],否则判孤儿 → 在驾驶舱 §〇·五 加一行 |
| §九 必须含最新日期 | doc_sync_check 第 8 项:扫 optimization/*.md 取文件名内最大日期,该日期必须出现在 §九区块内 |
frontmatter 更新时间 不能随手改 | 第 1 项要求它 = latest.json 的 generated_at 日期(当前 2026-09-26),不是今天 |
| §九 版本倒序 | check_versions 只解析 ^### v(\d+)\.(\d+) 并要求单调倒序 → 新条目放 §九最前 |
| SKIP_DIRS | scripts/、数据/、tests/、.obsidian、__pycache__ 不计入链接/孤儿扫描 |
| 收尾三件套 | python3 scripts/moc_index.py → python3 scripts/arch_check.py(期望 11/11)→ python3 scripts/doc_sync_check.py --strict(期望 rc=0) |
五、已知坑(别重踩)
- iSH 整类测试必被 kill → 逐类跑,个别项单独跑(
PipelineSafety第 10 项 129s 单独跑 OK)。 A && nohup B &会把cd一起放后台 → 后续命令跑在错误目录。本轮又踩两次。用nohup sh -c '…' &。- 降权后净值口径断裂:
SATELLITE_CAP由 1.0 降到 0.20 后,净值绝对波动约为原来 1/5,与历史paper_equity.csv不可直接对比(已在 REVERT.md 写明)。 - 月频 + 事件否决:若按"月内有非农"整月否决 → 每月都被否 → 卫星永不交易。已用
--veto-scope auto修,别再引入类似映射。 - 年化期数必须随频率切换(252/52/12),否则夏普与波动被放大
√(252/ppy)倍。 - WTI 在 2020-04-20 = −36.98,
pct_change变 −302%,必须加负值守卫。 pd.date_range别进逐行循环(1084 次 = 28.5s)→ 用searchsorted向量化。- 加新维度时同步缓存键:
engine_v1的_frame_key/_layer_key漏加字段会串结果(本轮veto_scope漏过一次)。
六、纪律红线
- 回测/纸面口径 ≠ 实盘 ≠ 生产管线,数字不可互相引用;不构成投资建议。
portfolio.py是只算权重、不下单的并行记录器;绝不写数据/paper/、不生成 order/signal、不 importpaper_engine。- A1 期间纸面数字一律不作决策依据;升级 A2 的里程碑是「经历过一次组合 ≥15% 回撤且没动手」。
- 不要用 A1 的短期结果去裁决一个 41 年样本才能回答的问题。
- 不改
框架/数据口径定义.md、不动归档区与已发布复盘、不动predictions.jsonl。 pysystemtrade只读禁装(会降级 pandas 毁管线)。- 收尾用
memory_write写当日记忆,并回报:变更文件清单 / 自检结果 / 回滚点。
七、附:关键数字速查 & 文件地图
关键数字
- 金+纳指 风险平价(季调仓·6bps,拍板口径):夏普 0.859 / 回撤 −32.6% / 最长水下 210 周 / 最差滚动 12 月 −28.5%
- 分池(周数据+周调仓,1986–2026):金+纳指 0.855 | 金+纳指+WTI 0.766(加 WTI 反而变差)| 金+标普500(2016起) 1.096
- 41 年单资产:黄金 年化 6.38% / 夏普 0.47 / 回撤 −49%;纳指 14.02% / 0.64 / −83%
- 首条组合记录:黄金 45.0% / 纳指 55.0%,nav 0.9994
- v5.3 卫星:
SATELLITE_CAP=0.20、SHORT_SIZE_CAP=0.10、上限 × 置信度
文件地图
| 用途 | 路径 |
|---|---|
| 本交接件 | optimization/继续任务提示词_2026-09-27_A1并行记录与外部资源接入.md |
| 决策备忘 v1.1 | optimization/决策备忘_核心底仓是否改为金加纳指_2026-09-27.md |
| A1 记录器 | scripts/portfolio.py → 数据/portfolio_{state.json,ledger.jsonl} |
| 引擎 v2.0 / v2.0-多资产 | 回测/engine_v1/ | 回测/engine_multi/ |
| 生产管线(勿动逻辑) | scripts/fetch.py → dkpanel.py → dkanalysis.py → paper_engine.py |
| 外部资源(分三层用) | /var/minis/mounts/量化策略/ |
八、供新对话粘贴的最小提示词
读取仓库交接件(**完整离线上下文,不要另外找历史**):
/var/minis/mounts/DUCKERRY_Warehouse/optimization/继续任务提示词_2026-09-27_A1并行记录与外部资源接入.md
并读记忆 /var/minis/memory/2026-09-27.md(v5.3 卫星降权 + A1 两条)。
仓库:/var/minis/mounts/DUCKERRY_Warehouse(挂载,可写)。环境:iSH —— 必读交接件「零、环境纪律」。
任务:执行交接件「二、本轮任务」的 P0 与 P1:
P0 = 把 `scripts/portfolio.py` 接进 `scripts/fetch.py` 发布流程(失败不阻断 + `--no-portfolio`/`DK_SKIP_PORTFOLIO=1` 逃生 + 写 `latest.json.portfolio` + SKILL SOP 加一行 + PortfolioRecordTests 补 ≥2 项);
P1 = ① 装 `py3-seaborn` 后用 quantstats 交叉验证 engine_v1/engine_multi/portfolio.py 的绩效指标(独立脚本放 `回测/`,**不放 scripts/**);
② 在 `数据库说明.md` §〇·五·一 登记 `/var/minis/mounts/量化策略/`(9 仓库 + 可调用/只读/禁装判定 + 交接件 §3.5 的红线分层)。
执行顺序:
1) 先只读交接件 + 抽查 `scripts/portfolio.py` / `scripts/fetch.py` 尾部(看 moc_index/doc_sync_check 是怎么接的);
2) 给出执行计划(文件清单 + 验收标准 + 预计耗时)让我确认,**确认后再开工**;
3) 收尾跑 `moc_index` / `arch_check`(期望 11/11) / `doc_sync_check --strict`(期望 rc=0),用 memory_write 写当日记忆并回报变更清单与回滚点。
硬约束:**不改 paper_engine 的信号/方向/止损逻辑**;`portfolio.py` 绝不写 `数据/paper/`;**`pysystemtrade` 只读禁装**(pandas==2.1.3 会毁管线);长任务拆短进程跑;iSH 整类测试会被静默 kill,逐类跑。修订记录
- 2026-09-27 v1.0:首版。固化 v5.3(卫星降权 +
portfolio.py+ 备忘 v1.1 + A1 新定义 + 最坏情形表 + 换腿首轮)为「已完成」;本轮任务定为 A1 接线(P0)+ 外部资源接入(P1)+ 读源码补强(P2);固化量化策略/9 仓库的可调用/只读/禁装三分层与文件完整性体检结论。