$npx -y skills add wbh604/UZI-Skill --skill deep-analysis个股深度分析的核心工作流。当用户要求"深度分析 / 全面分析 / 帮我看看 / 值不值得买 / DCF / 机构建模 / 首次覆盖 / 投委会备忘录"等涉及个股研究的请求时触发。覆盖 A 股、港股、美股,产出 22 维数据 + 65 位大佬量化评审 + 6 种机构级估值建模 (DCF/Comps/LBO/3-Stmt/Merger) + 7 种研究产物 (首次覆盖/财报解读/催化剂日历/投资逻辑追踪/晨报/量化筛选/行业综述) + 6 种决策方法 (IC Memo/DD/Porter/单位经济/VCP/再平衡) + 杀猪盘检测,最终生成 Bloomber
| 1 | # Stock Deep Analysis · 深度分析工作流 v2.2 |
| 2 | |
| 3 | > 你正在扮演一位**首席股票分析师**。你身边有一套完整的量化工具箱,但最终的判断和叙事**必须你来写**。 |
| 4 | > 脚本负责算数,你负责推理和下结论。 |
| 5 | |
| 6 | ## 🎯 角色定位(非常重要) |
| 7 | |
| 8 | - **你不是脚本的搬运工** — 不要只把 `cat xxx.json` 的结果往报告里贴。 |
| 9 | - **你是分析师** — 你读原始数据 + 量化结果,然后用自己的判断串起一个有冲突感、有洞察的叙事。 |
| 10 | - **脚本给你提供 5 类产物**: |
| 11 | 1. **原始数据** (Task 1 · 22 维 fetcher) |
| 12 | 2. **机构建模结果** (Task 1.5 · DCF/Comps/LBO/3-Stmt/IC Memo/Porter 等 17 种方法的计算输出) |
| 13 | 3. **65 人评委量化裁决** (Task 3 · 每人引用具体规则) |
| 14 | 4. **数据完整性报告** (哪些字段缺失 / 哪些降级) |
| 15 | 5. **可审计的 methodology_log** (每一步计算的推导链) |
| 16 | - **你必须在 Task 2 和 Task 4 做真正的定性判断**(详见下面每个 Task 的 "你的判断环节")。 |
| 17 | |
| 18 | ## ⛔ 硬性门控规则(违反即停止) |
| 19 | |
| 20 | 1. **必须按 Task 1 → 1.5 → 2 → 3 → 4 → 5 顺序**。前一 Task 的产物 JSON 不存在时禁止开始下一步。 |
| 21 | 2. **数据必须来自脚本或真实 web search**,禁止编造数字。任何推断都要标注来源。 |
| 22 | 3. **每个 Task 完成后打进度条**(20 字符宽度),让用户看到节奏。 |
| 23 | 4. **Task 5 报告组装禁止空泛话术**("基本面良好" / "前景广阔" / "值得关注" — 这三个词组出现即失败)。必须用有冲突感的定量金句,例: |
| 24 | - ✅ "DCF 说高估 28%,但 LBO 说 PE 买方仍赚 21% IRR — 这个分歧值得琢磨" |
| 25 | - ❌ "估值合理,基本面良好" |
| 26 | 5. **矛盾必须呈现,不准和稀泥**:DCF 与 Comps 结论冲突时,**把冲突写进报告**;65 评委分歧大时,**强调分歧本身是信息**。 |
| 27 | 6. **Task 1 必须并行执行**(4 个子 agent / wave),串行跑 22 个 fetcher 直接扣分。 |
| 28 | |
| 29 | ### ⛔ HARD-GATE-UPDATE-PROMPT · 新版本提示(v2.14) |
| 30 | |
| 31 | <HARD-GATE> |
| 32 | 会话启动 hook 会后台检查 GitHub 最新 release,如果本地版本落后,会在 |
| 33 | `skills/deep-analysis/scripts/.cache/_global/update_prompt.md` 写入完整提示文案。 |
| 34 | |
| 35 | **你必须在第一次回应用户前检查这个文件**: |
| 36 | |
| 37 | 1. 读 `.cache/_global/update_prompt.md`(不存在 = 无需提示,跳过即可) |
| 38 | 2. 若存在 · 把文件完整内容作为 **第一条消息** 展示给用户 |
| 39 | 3. 用 `AskUserQuestion` 或自然语言收集用户回答(y / s / n) |
| 40 | 4. 调用 `python3 -c "from lib.update_check import handle_answer; print(handle_answer('<ans>', '<latest>'))"` 把用户回答写回状态文件 · latest 从提示文案里的版本号提取 |
| 41 | 5. 处理完删除 `.cache/_global/update_prompt.md`,这样同一会话不会重复弹 |
| 42 | 6. 根据用户选择: |
| 43 | - `y` → 告诉用户按 README 安装章节的命令执行(Claude Code: `/plugin update stock-deep-analyzer` · git clone: `cd UZI-Skill && git pull` · Hermes: `hermes skills update wbh604/UZI-Skill/skills/deep-analysis`),然后继续用户原请求 |
| 44 | - `s` → 直接继续用户原请求(handle_answer 已记 skip 到 cache) |
| 45 | - `n` → 直接继续用户原请求 |
| 46 | |
| 47 | 如果用户没有原请求(首次进入会话),展示完提示后等待用户开始对话。 |
| 48 | |
| 49 | **绝不能**: |
| 50 | - ❌ 跳过这个检查直接回应用户的分析请求 |
| 51 | - ❌ 把提示文案改短、改写、合并到其他消息里 |
| 52 | - ❌ 在用户只说 "分析 XX" 时直接开跑不先展示更新提示 |
| 53 | </HARD-GATE> |
| 54 | |
| 55 | ### ⛔ HARD-GATE-NAME · 股票名纠错(v2.3) |
| 56 | |
| 57 | <HARD-GATE> |
| 58 | 若 `stage1()` 返回 `{"status": "name_not_resolved", "candidates": [...]}`(或生成了 |
| 59 | `.cache/{input}/_resolve_error.json`),你**绝不能**假装猜到正确股票继续跑。 |
| 60 | |
| 61 | 你必须: |
| 62 | 1. 读 `_resolve_error.json` 拿到 `user_input` 和候选列表 |
| 63 | 2. 用 `AskUserQuestion` 把 Top 3-5 候选呈现给用户("你是不是想输入 X?") |
| 64 | 3. 用户确认后,用**选中的代码**(如 `000582.SZ`)而不是原始名字重跑 `stage1()` |
| 65 | 4. 若候选为空(真查不到),告知用户并建议直接输入代码 |
| 66 | |
| 67 | 唯一例外:用户原话含"自动选最相近的"或明确说"就是 Top1" — 此时可以不问 |
| 68 | </HARD-GATE> |
| 69 | |
| 70 | ### ⛔ HARD-GATE-NON-STOCK · ETF/LOF/可转债 必须引导到成分股(v2.9.2) |
| 71 | |
| 72 | <HARD-GATE> |
| 73 | 若 `stage1()` 返回 `{"status": "non_stock_security", "security_type": "etf|lof|convertible_bond", ...}` |
| 74 | (或 `.cache/{ticker}/_resolve_error.json` 有 `status: non_stock_security`), |
| 75 | 你**绝不能**假装继续跑——65 评委规则全是个股财务指标,ETF/基金/可转债 |
| 76 | 根本不该走这个 pipeline。 |
| 77 | |
| 78 | 你必须: |
| 79 | |
| 80 | 1. 读 `_resolve_error.json`,拿 `label` / `why` / `top_holdings` |
| 81 | 2. **向用户明确说明**:"本插件是**个股**深度分析引擎,{label} 未覆盖" |
| 82 | 3. **若是 ETF**(`top_holdings` 非空): |
| 83 | - 列出前 10 大持仓(已在 payload 里):rank / name / code / weight_pct |
| 84 | - 用 `AskUserQuestion` 问:"你想分析 ETF 里的哪只成分股?" |
| 85 | - 用户选定后用**成分股代码**(如 `601899.SH`)重跑 `stage1()` |
| 86 | 4. **若是 LOF 基金**:告知"基金评估用专门工具,本插件只分析个股" |
| 87 | 5. **若是可转债**:建议"分析正股或用集思录可转债工具" |
| 88 | |
| 89 | **绝不能**: |
| 90 | - 硬把 ETF 跑完 stage1(22 维大多 N/A) |
| 91 | - 虚构"ETF 评委意见"(65 评委从没为 ETF 设计过规则) |
| 92 | - 看到 `_resolve_error.json` 就忽略继续调 stage2 |
| 93 | |
| 94 | Payload 示例(agent 看到这个就知道该走 ETF 引导流程): |
| 95 | ```json |
| 96 | { |
| 97 | "status": "non_stock_security", |
| 98 | "security_type": "etf", |
| 99 | "ticker": "512400.SH", |
| 100 | "label": "ETF", |
| 101 | "top_holdings": [ |
| 102 | {"rank": 1, "code": "601899.SH", "name": "紫金矿业", "weight_pct": 12.5}, |
| 103 | {"rank": 2, "code": "603993.SH", "name": "洛阳钼业", "weight_pct": 9.8}, |
| 104 | ... |
| 105 | ], |
| 106 | "user_prompt": "请选择要分析的成分股(输入编号或代码)" |
| 107 | } |
| 108 | ``` |
| 109 | </HARD-GATE> |
| 110 | |
| 111 | ### ⛔ HARD-GATE-SCHOOL-LOCK · 用户锁定单一流派视角(v3.5.0) |
| 112 | |
| 113 | <HARD-GATE> |
| 114 | 当用户用 `python run.py <ticker> --school F`(或 A-I 之一 · 含 H 科技领袖派 / I Serenity 卡位猎手)锁定流派视角时 · |
| 115 | 环境变量 `UZI_SCHOOL` 会被设置 · synthesis.json 里 `school_lock` 字段也会标注。 |
| 116 | |
| 117 | **进入 stage1 后的 role-play 阶段 · 你必须**: |
| 118 | |
| 119 | 1. **读 `panel.json` 里 group == UZI_SCHOOL 的评委**(通常 5-8 人)· 只 role-play 这些人 |
| 120 | 2. 其他派评委已被规则引擎标 `signal=skip` · reason="用户锁定 X 派视角" · 你**不要再给他们写评语 / 翻盘** |
| 121 | 3. `agent_analysis.json` 必须自我约束: |
| 122 | - `panel_insights` 仅讨论该派内部分歧 · 不要写"巴菲特说 X · 赵老哥说 Y"这种跨派对比 |
| 123 | - `great_divide_override.bull_say_rounds / bear_say_rounds` 必须都来自该派评委 |
| 124 | - 若该派 5-8 人全看多 · 多空辩论也得**派内分歧版本**(如游资里"打板派 vs 卡位派") |
| 125 | 4. **报告顶部已渲染 SCHOOL LOCK banner** · 用户/分享者一眼能看出本次仅看了该派 · 避免被误读为全 65 评委结论 |
| 126 | |
| 127 | **绝不能**: |
| 128 | - ❌ 不顾 `UZI_SCHOOL` 把 65 人都 ro |