From beac016689d593faf9f62589fa7ff8feb5f84c92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=94=AF=20A06?= Date: Tue, 1 Sep 2026 03:00:24 +0800 Subject: [PATCH] auto-snapshot 2026-09-01 03:00:24 --- skills/.usage.json | 26 ++-- .../2026-08-30-research-dashi-ppt.md | 125 ++++++++++++++++++ .../references/depth-study-20260831.md | 45 +++++++ .../ma20-dead-cross-prediction-20260831.md | 35 +++++ .../references/tencent-api-data-format.md | 79 +++++------ 5 files changed, 248 insertions(+), 62 deletions(-) create mode 100644 skills/research/github-project-research/references/2026-08-30-research-dashi-ppt.md create mode 100644 skills/research/stock-research/references/depth-study-20260831.md create mode 100644 skills/research/stock-research/references/ma20-dead-cross-prediction-20260831.md diff --git a/skills/.usage.json b/skills/.usage.json index dff392e1..d792d953 100644 --- a/skills/.usage.json +++ b/skills/.usage.json @@ -753,14 +753,14 @@ "created_by": null, "last_patched_at": null, "last_reused_patch_generation": 0, - "last_used_at": "2026-08-30T14:13:35.068127+00:00", - "last_viewed_at": "2026-08-30T14:13:35.060063+00:00", + "last_used_at": "2026-08-31T08:58:49.573938+00:00", + "last_viewed_at": "2026-08-31T08:58:49.565195+00:00", "patch_count": 0, "patch_generation": 0, "pinned": false, "state": "active", - "use_count": 2, - "view_count": 2 + "use_count": 3, + "view_count": 3 }, "deepseek-harness-research": { "archived_at": null, @@ -1297,15 +1297,15 @@ "created_at": "2026-08-01T11:50:01.274771+00:00", "created_by": "agent", "last_patched_at": "2026-08-22T12:29:24.397825+00:00", - "last_reused_patch_generation": 10, - "last_used_at": "2026-08-22T12:28:43.666781+00:00", - "last_viewed_at": "2026-08-22T12:28:43.662714+00:00", + "last_reused_patch_generation": 12, + "last_used_at": "2026-08-31T08:45:21.088225+00:00", + "last_viewed_at": "2026-08-31T08:45:21.082760+00:00", "patch_count": 26, "patch_generation": 12, "pinned": false, "state": "active", - "use_count": 27, - "view_count": 27 + "use_count": 28, + "view_count": 28 }, "github-repo-management": { "archived_at": null, @@ -2976,14 +2976,14 @@ "created_by": "agent", "last_patched_at": "2026-08-28T13:43:50.148789+00:00", "last_reused_patch_generation": 16, - "last_used_at": "2026-08-28T15:56:50.191925+00:00", - "last_viewed_at": "2026-08-28T15:56:50.182978+00:00", + "last_used_at": "2026-08-31T08:58:49.569466+00:00", + "last_viewed_at": "2026-08-31T08:58:49.560103+00:00", "patch_count": 150, "patch_generation": 16, "pinned": false, "state": "active", - "use_count": 73, - "view_count": 71 + "use_count": 75, + "view_count": 73 }, "subagent-driven-development": { "archived_at": null, diff --git a/skills/research/github-project-research/references/2026-08-30-research-dashi-ppt.md b/skills/research/github-project-research/references/2026-08-30-research-dashi-ppt.md new file mode 100644 index 00000000..2fad4abe --- /dev/null +++ b/skills/research/github-project-research/references/2026-08-30-research-dashi-ppt.md @@ -0,0 +1,125 @@ +# 2026-08-30 调研案例:chuspeeism/dashiAI-ppt-skill + +牧尘丢一个项目地址过来(`https://github.com/chuspeeism/dashiAI-ppt-skill`),先验证后实测安装到本机跑通。 + +## 元数据 + +| 项 | 值 | +|---|---| +| 作者 | chuspeeism | +| License | 本仓未在 README 标注(AGENTS 写"开源",实际未确认 SPDX) | +| 创建 | 2026 上半年(年轻项目) | +| 形态 | Hermes Skill:12 套主题 + 1020 版式 + 8576 控件的 dashi-ppt skill | +| 核心能力 | `goal:scaffold` → `props:safe` → `render:goal` → `export:pptx/pdf` 全链路 | +| 本地 | Node 24.16 ✅ + Chromium headless shell ✅ + Playwright-core 装好 | +| 部署路径 | `~/.hermes/skills/dashi-ppt/` (59M 含 node_modules) | + +## 关键设计 + +- **goal.json schema v2**:每页 4 个 variants(3 template + 1 bespoke),4 个变体让用户在同页切换试看 +- **4 层校验链**:`validate:goal-spec` → `props:safe` → `validate:swiss` → `validate:goal-copy` → `validate:four-variant-quality` +- **contentMap 强制**:所有 `items.body / props.copy.X` 必须经 `contentMap` 映射到 `slide.content.presentation.items[]`,**不写裸字符串**——这是核心架构纪律 +- **导出引擎自启预览**:`export-pptx.mjs` 自启临时 HTTP server(避免跨域 Origin 校验失败),跑完销毁 + +## 实测踩坑(重要沉淀) + +### 坑 1: `npm run goal:scaffold` 报"repeated visible copy" + +``` +slide 1 variant v2 layout theme05_page004 field props: + repeated visible copy "AICoding工具市场2026" appears 4 times + (props.copy.titleTop, props.copy.cornerRight, props.copy.titleBottom, props.copy.foot) +``` + +**原因**:scaffold 选 cover layout(page004)会把 `presentation.title` 投影到 4 个字段,归一化去空格后 19 字符完全相同 → 触发 4 字段重复。 + +**正解**: +- 把 `presentation.title` 缩短到 ≤6 字符(如"AI 编程"),scaffold 会用同标题但字段不重复(page001/002/005 字段少) +- 或用更短 `titleShort`(让 `title` 字段走 page002 这类字段少的 cover) + +### 坑 2: `validate:goal-spec` 报 `composition.elements[X].items[Y].body: expected a non-empty string` + +**原因**:scaffold 生成的 v4 `bespoke.composition.elements` 数组里有 `items[]` 字段,items.body 默认空字符串触发校验。 + +**正解**(三条任选): +1. briefs 每页 `content.presentation.items[]` 填满 + 加 `detail` 字段(v4 会自动从 `presentation.items[i].detail` 抽 body 填) +2. 删掉 v4 不用:但 validate 要求 variants 必须 4 个,会报"must contain 4 items" +3. 写 items.body 后**手动改 goal.json**(绕开 scaffold):把 brief 写到 `slide.content.presentation.items[].detail`,再 `props:safe --goal X --write` + +### 坑 3: `props.copy` 字段被覆盖 + +执行 `props:safe --write` 会重写 `goal.json`,**清空之前手动填的 `composition.elements[].items.body`**。必须: +- 一次性先把 briefs 准备好(items 有 label/value/detail/displayValue),再 scaffold +- 不要 scaffold 完再 patch goal.json 的 items.body,patch 完再跑 props:safe 会被清空 + +### 坑 4: `export:pptx` 沙箱问题 + +dashi-ppt 用 playwright-core 启动 Chromium 导出。沙箱宿主(豆包/某些容器)会因 `bootstrap_check_in / MachPortRendezvous` 拦截。**`launch-export-browser.mjs` 已内置沙箱检测 + `--single-process` 重试**——遇到拦截自动 fallback 一次。 + +### 坑 5: 预览服务路径 + +`start-preview-server.mjs` 第一个参数是**目录路径**(不是 index.html),所以正确调用: +```bash +DASHI_PPT_PREVIEW_PORT=5200 node scripts/start-preview-server.mjs /path/to/ppt/ +# 不要 node .../start-preview-server.mjs /path/to/ppt/index.html ❌ +``` + +## 完整工作流(已验证 8/30) + +```bash +# 1. 装 +cd ~/.hermes/skills/dashi-ppt/project +npm install # 首次 4s(已配 npmmirror) + +# 2. 准备 briefs(10 页) +cat > /tmp/briefs.json < 5%:偏高,警惕 +- < 0%:已触发,趋势转弱 + +## 四、9 月布局推荐 + +| 排名 | 股票 | 代码 | 行业 | 动量 | PE | 52周位置 | +|------|------|------|------|------|-----|---------| +| 🥇 | 兖矿能源 | 600188 | 煤炭 | +60.9% | 20.9 | 50% | +| 🥈 | 中国石油 | 601857 | 石油 | +35.8% | 11.9 | 117% | +| 🥉 | 海康威视 | 002415 | 科技 | +33.2% | 20.0 | 193% | + +**暂不入场**:宁德时代(新能源 MA20 偏离 -5.25%,唯一负偏离) + +## 五、路线图状态 +- Phase 1: 11/14 天完成,9/3 解锁 +- Phase 2: 11/60 天,总收益 +0.89% +- 最早实盘:2026-11-15 diff --git a/skills/research/stock-research/references/ma20-dead-cross-prediction-20260831.md b/skills/research/stock-research/references/ma20-dead-cross-prediction-20260831.md new file mode 100644 index 00000000..e06536bd --- /dev/null +++ b/skills/research/stock-research/references/ma20-dead-cross-prediction-20260831.md @@ -0,0 +1,35 @@ +# MA20 死叉预判方法论(2026-08-31) + +## 核心指标:MA20 偏离百分比 + +``` +MA20 偏离 = (现价 - MA20) / MA20 × 100% +``` + +## 风险分级 + +| 偏离范围 | 死叉风险 | 操作建议 | +|---------|---------|---------| +| < 1% | 极低 | 持有,不需止损 | +| 1-5% | 中等 | 设 MA20 为止损线 | +| > 5% | 偏高 | 警惕,考虑减仓 | +| < 0% | 已触发 | MA20 死叉已发生,趋势转弱 | + +## 预判公式 + +``` +死叉概率 ≈ 偏离% / 5(经验值,仅供参考) +``` + +## 2026-08-31 实测示例 + +| 股票 | 代码 | 现价 | MA20 | 偏离 | 死叉概率 | 操作 | +|------|------|------|------|------|---------|------| +| 紫金矿业 | 601899 | 34.65 | 33.50 | +3.42% | ~30% | 设止损33.50 | +| 中国石油 | 601857 | 11.23 | 10.92 | +2.82% | ~28% | 持有 | +| 中信证券 | 600030 | 27.93 | 27.66 | +0.99% | ~20% | 持有 | +| 宁德时代 | 300750 | 368.50 | ~389 | -5.25% | 已触发 | 暂不入场 | + +## 方法来源 + +2026-08-31 模拟盘深度研究中发现:3个持仓的 MA20 死叉风险差异显著,用偏离百分比量化风险比主观判断更可靠。 diff --git a/skills/research/stock-research/references/tencent-api-data-format.md b/skills/research/stock-research/references/tencent-api-data-format.md index 88b570aa..f1b24555 100644 --- a/skills/research/stock-research/references/tencent-api-data-format.md +++ b/skills/research/stock-research/references/tencent-api-data-format.md @@ -1,58 +1,39 @@ -# 腾讯行情 API 数据格式变化记录 +# 腾讯行情接口字段映射(2026-08-31 实测补充) -**日期**: 2026-07-20 / 2026-08-20 更新 -**影响脚本**: `stock_contradiction_workflow.py`, `stock_portfolio.py`, `stock_signal.py` +## 字段表(每只股票一行,以 `v_sh601899="..."` 格式返回) -## 字段索引速查 - -腾讯实时行情接口 `https://qt.gtimg.cn/q={mc}` 返回数据用 `~` 分隔,关键字段: - -| 索引 | 字段 | 说明 | -|------|------|------| -| parts[1] | 名称 | 股票中文名(如"五 粮 液")| -| parts[3] | 现价 | 当前价格 | -| parts[4] | 昨收 | 昨日收盘价 | -| parts[31] | 涨跌额 | 涨跌**金额**(元),如 10.81 | -| parts[32] | 涨跌% | 涨跌**百分比**(%),如 0.28 | -| parts[33] | MA5 | 5日均线 | -| parts[34] | MA10 | 10日均线 | -| parts[35] | MA20 | 20日均线(⚠️ 可能为复合格式)| -| parts[37] | 成交额 | 成交金额(元)| - -### ⚠️ parts[31] vs parts[32] 重大区别(2026-08-20) - -`parts[31]` = 涨跌**额**(元),`parts[32]` = 涨跌**百分比**(%)。 - -实测样例(上证指数 sh000001): ``` -parts[31] = "10.81" ← 涨跌 10.81 元/点 -parts[32] = "0.28" ← 涨跌 0.28% +parts[1] = 名称(GBK 编码,显示为乱码时用 GBK 解码) +parts[3] = 现价(元) +parts[4] = 昨收(元) +parts[31] = 涨跌额(元,正=涨) +parts[32] = 涨跌幅(%,正=涨) +parts[33] = 今日最高 +parts[34] = 今日最低 +parts[36] = 成交量(手) +parts[37] = 成交额(元) +parts[38] = 换手率(%) +parts[39] = PE(动态市盈率) +parts[43] = PB(市净率) +parts[44] = 总市值(亿元)← 注意单位是亿 +parts[45] = 流通市值(亿元) +parts[70] = 52周最低 +parts[71] = 52周最高 ``` -**初版 bug**:误用 `parts[31]` 作为百分比,导致上证显示 "+10.81%"(实际 +0.28%),茅台显示 "-16.05%"(实际 -1.23%)。 +## 已知坑 -**修复**:涨跌幅一律用 `float(parts[32])`,涨跌额用 `float(parts[31])`。 +- **GBK 编码**:`parts[1]`(名称)和部分内容是 GBK,`decode('gbk', errors='replace')` 或 `decode('utf-8', errors='ignore')` 均可 +- **parts[44] 单位是亿**:腾讯返回的是"亿元",如 6936.62 = 6936.62 亿元 +- **`parts[39]` PE 有时为空字符串**:需要 `float(parts[39]) if parts[39] else 0` +- **`parts[32]` 涨跌幅 vs `parts[31]` 涨跌额**:初版误把 parts[31] 当百分比 → 上证显示 "+10.81%" 实际是 +0.28%。修复:涨跌幅用 `parts[32]`,涨跌额用 `parts[31]`(2026-08-20 教训) -### ⚠️ parts[35] MA20 复合格式(2026-07-20) +## 2026-08-31 实测数据(3 只持仓) -旧格式:`parts[35]` = `"72.76"`(纯数字) -新格式:`parts[35]` = `"72.76/427399/3130971198"`(MA20/成交量/成交额) +| 股票 | 代码 | 现价 | 涨跌幅 | PE | 52周位置 | +|------|------|------|--------|-----|---------| +| 紫金矿业 | 601899 | 33.67 | -2.83% | 13.2 | 241%(超52周高) | +| 中国石油 | 601857 | 11.42 | +1.69% | 11.9 | 117%(超52周高) | +| 中信证券 | 600030 | 27.80 | -0.47% | 10.95 | 193%(超52周高) | -修复:取斜杠前第一段 `parts[35].split('/')[0]`。 - -## GBK 编码注意事项 - -腾讯接口返回 GBK 编码。解析时: -```python -data = response.decode('gbk', errors='ignore') -``` - -## 验证脚本 - -`scripts/hermes-verify-stock-workflow.py` — 包含新格式/旧格式/信号判断三个测试。 - -## 注意事项 - -- MA5/MA10 索引(33/34)未变,只有 MA20 可能变复合格式 -- 若未来字段位置变化,先打印 `len(parts)` 和关键索引定位新位置 -- 所有股票数据脚本统一使用 `curl` 子进程 + `--compressed`,避免 urllib hang +> ⚠️ 52周位置 >100% 说明当前价格已突破历史高点——这是强势信号,但 MA20 死叉风险也要关注。