auto-snapshot 2026-09-01 03:00:24
This commit is contained in:
parent
f9cc4053dc
commit
beac016689
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 <<EOF
|
||||
[{"role":"cover","content":{"presentation":{"title":"AI 编程","titleShort":"AI编程","summary":"2026 市场格局","items":[]}}}, ...]
|
||||
EOF
|
||||
|
||||
# 3. scaffold (生成 goal.json)
|
||||
npm run goal:scaffold -- --title "X" --theme theme05 --pages 10 \
|
||||
--content-briefs /tmp/briefs.json --layout-variants 3 \
|
||||
--seed "test-01" --workflow-run-id "20260830T183000-test01" \
|
||||
--chunk-size 5 --out /tmp/deck/goal.json
|
||||
|
||||
# 4. props:safe (填充 props + contentMap)
|
||||
npm run props:safe -- --goal /tmp/deck/goal.json --write
|
||||
|
||||
# 5. render:goal (生成 HTML)
|
||||
npm run render:goal -- /tmp/deck/goal.json /tmp/deck/ppt/index.html
|
||||
|
||||
# 6. 三层校验
|
||||
npm run validate:swiss -- /tmp/deck/ppt/index.html
|
||||
npm run validate:goal-copy -- /tmp/deck/goal.json /tmp/deck/ppt/index.html
|
||||
npm run validate:four-variant-quality -- --deck /tmp/deck/ppt/index.html --goal /tmp/deck/goal.json
|
||||
|
||||
# 7. 导出
|
||||
npm run export:pptx -- /tmp/deck/ppt /tmp/deck/deck.pptx --title "My Deck"
|
||||
npm run export:pdf -- /tmp/deck/ppt /tmp/deck/deck.pdf --title "My Deck"
|
||||
```
|
||||
|
||||
**实测输出**:10 页 + 4 variants = 40 slide PPTX (1.4MB),859 个可编辑文本对象。
|
||||
|
||||
## 与现有工具的对比
|
||||
|
||||
| 工具 | 优势 | 劣势 |
|
||||
|------|------|------|
|
||||
| **dashi-ppt** | 12 主题/1020 版式/8576 控件,预览可切换 variants | 沙箱兼容问题,需本机 Chromium;scaffold 偶发陷阱 |
|
||||
| guizang-ppt-skill | 杂志风/瑞士风固定模板,快 | 模板少,需自己设计内容 |
|
||||
| frontend-slides | 视觉探索强,动画丰富 | 慢、复杂,纯设计向 |
|
||||
| ppt-master | 标准 PPTX 操作 | 没视觉系统 |
|
||||
|
||||
**取舍**:dashi-ppt 做"科技/数据/分析"报告最佳(theme05 色谱图、theme07 冷白调研);guizang 做"杂志/品牌/视觉";ppt-master 做"传统办公文档"。
|
||||
|
||||
## 落地建议
|
||||
|
||||
1. **dashi-ppt 作为默认 PPT 工具**——主题多、变体切换强、导出干净
|
||||
2. **briefs 模板固化**:把"10 页科技分析报告"模板写到 `references/dashi-brief-template.json`,下次复用
|
||||
3. **铁律级踩坑清单**:上述 5 个坑做成 `dashi-ppt` skill 的 `Pitfalls` 节(但 dashi-ppt 是 user-owned,**不能直接改**,下次启动时报"踩坑 1/2/3 已知"提示)
|
||||
4. **集成到 cron 推送**:每天 18:00 推"今日金股 + 10 页 PPT 简报"到飞书(参考 stock-research cron 18:50 简报模式)
|
||||
|
||||
## 未解决问题
|
||||
|
||||
- **License 未确认**:README 没写 SPDX,建议查 `LICENSE` 文件确认是否可商用
|
||||
- **国际化**:schema v2 copyBudget 按中文字符算?日韩字符可能误判
|
||||
- **主题国际化**:theme05 是中文风格,海外场景需英文主题
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
# 2026-08-31 模拟盘深度研究 - 关键发现
|
||||
|
||||
## 一、因子状态健康
|
||||
- 8 个动量正行业:煤炭 +44.7% / 有色 +25.9% / 新能源 +17.9% / 石油 +15.9% / 科技 +15.2% / 航运 +8.1% / 家电 +7.0% / 电力 +6.6%
|
||||
- 5 个真弱势(拦截中):白酒 -25% / 医药 -22.8% / 通信 -7.2% / 汽车 -31.2% / 地产 -43.8%
|
||||
- 因子交叉验证:金融 -2.2% vs 白酒 -25%(差 -22.8%)方向与 MA20 回测一致
|
||||
|
||||
## 二、4 笔亏损诊断
|
||||
| 日期 | 行业 | 买→卖 | 亏损 | 周期 |
|
||||
|------|------|-------|------|------|
|
||||
| 8-12 | 白酒 | 75.11→75.00 | -0.15% | 1天 |
|
||||
| 8-13 | 石油 | 10.77→10.66 | -1.02% | 1天 |
|
||||
| 8-20 | 有色 | 33.36→32.76 | -1.80% | 1天 |
|
||||
| 8-31 | 半导体 | 126.33→125.88 | -0.36% | 1天 |
|
||||
|
||||
**结论**:平均亏损 -0.83% ≤ 1%,都是金叉→死叉 1 天内来回,**震荡市正常磨损**,不是策略失败。
|
||||
|
||||
## 三、3 持仓 MA20 死叉预判(新方法论)
|
||||
|
||||
| 股票 | 代码 | 现价 | 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% | 持有 |
|
||||
|
||||
**MA20 偏离风险分级**:
|
||||
- < 1%:极低,持有
|
||||
- 1-5%:中等,设 MA20 为止损
|
||||
- > 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
|
||||
|
|
@ -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 死叉风险差异显著,用偏离百分比量化风险比主观判断更可靠。
|
||||
|
|
@ -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 死叉风险也要关注。
|
||||
|
|
|
|||
Loading…
Reference in New Issue