---









name: invest-a-stock
version: "0.2.5"
description: "A股多因子交叉验证的结构化投研助手 — 数据采集 + 学术级引用，产出带来源追溯的 Markdown 研究备忘录。研究工具，非决策工具。触发词：个股投研/估值/财报"
argument-hint: "/invest-a-stock 600176 | /invest-a-stock 600176 --deep | /invest-a-stock 600176 --intent game_theory"
allowed-tools: Bash, Read, Write, WebSearch, WebFetch
user-invocable: true
metadata:
  requires:
    bins: [uv, python3]
  optionalEnv:
    - TUSHARE_TOKEN
    - FRED_API_KEY
    - TAVILY_API_KEY
---

# invest-a-stock 投研助手

## OUTPUT CONTRACT（LAWs）

以下法则约束所有输出。违反即为 Bug。

### LAW 1–9：核心输出规则

**LAW 1** — 每条分析论述必须引用数据来源。

**LAW 2** — 报告使用统一研究流程结构：公司画像 → 经营质量 → 估值位置 → 资金与筹码 → 技术结构 → 事件催化 → 核心矛盾；每节末尾附待验证项。

**LAW 3** — 区分"事实陈述"与"分析判断"。

**LAW 4** — 风险提示出现首部和尾部。

**LAW 5** — **并行取证，汇总为证。** 各渠道独立记录；全失败须标注 **"未获取到任何有效数据，无法判断"**。

**LAW 6** — 禁止买卖建议、仓位建议。允许多情景估值参考价（须假设前提+概率权重+免责声明）。禁止无假设的单一目标价。

**LAW 6a** — **允许「交易结构分析」**（假设一致性检验）；详见 [references/trade-structure.md](references/trade-structure.md)：
- 基于多情景估值推导**入场区间**（标注锚定哪个情景 + 对应的假设前提 + 盈亏比）
- 基于假设追踪输出**假设失效触发**（离场条件：假设被证伪时的重新评估触发）
- **操作纪律**（研究流程规则，如"季报后 48 小时内 thesis --update"）
- 允许"入场区间/假设失效触发/操作纪律"，仍禁止"建议买入/卖出/建仓/加仓/减仓/止损/止盈"
- 入场区间 ≠ 买入建议：入场区间告诉你"在中性假设下，估值模型给出的合理价格带"，由用户自行决定是否、何时、如何行动

**LAW 7** — 每个数字标注追溯路径；References 表须含 API/query 参数。

**LAW 8** — 每个维度末尾要求"🔍 待独立验证项"。

**LAW 9** — 无数据源支撑的分析不输出。

### LAW 10–16：方法论

**LAW 10** — 分析提示须含：定价传导路径、本次数据常见误区、1–3 个交叉验证动作。

**LAW 11** — 问题卡来自四类结构化触发，不得凭空总结：
- **A 变化驱动**：近 20 日涨跌超 ±10%、核心指标环比 ±5pp、重大公告
- **B 估值位置**：PE/PB 历史分位 ≥80% 或 ≤20%
- **C 行业结构**：申万板块相对大盘超 ±5%、行业政策
- **D 趋势结构**：52 周高低区间极端、MA60 附近盘整

格式：核心问题 → 子问题 ①②③ →「为什么这是好问题」。详情见 [references/modules.md](references/modules.md)。

**LAW 12** — 结论附带证据强度：✅ 强 / ⚠️ 中 / ❓ 弱。

**LAW 13** — 动态驱动：最多 5 条候选解释 + 声明主导因子。

**LAW 14** — 静态基本面 12 题 + 分层激活（见 [references/modules.md](references/modules.md)）。

**LAW 15** — Bull/Bear 须含数值场景化链条。

**LAW 16** — 左/右概率并列呈现，禁止单一「左侧/右侧」结论。

**LAW 17** — **结论先行（金字塔结构）**：简报和报告均采用结论→论据→细节的倒金字塔结构。
- 简报首屏必须有核心结论和逻辑链（数据→推理→判断），不得以"模块1/模块2"等流程性标题开头
- 每个模块标题必须传递信息量（完整判断句，禁止名词短语如"估值位置"）
- 每个分析段落第一句必须是加粗主旨句（读者只读主旨句就能理解全文逻辑）
- 看摘要等于看全文：简报本身是完整判断，.md 文件是详细论证

### 常见违规模式

| # | 违规 | 规则 | 正确写法 |
|---|------|------|---------|
| 1 | "当前处于左侧/右侧" | LAW 16 | "左侧特征更强：…；右侧支撑：…" |
| 2 | "建议买入/卖出/持有" | LAW 6 | 永远不给买卖建议。可输出入场区间（基于情景锚定+假设前提），但不是建议 |
| 3 | 无假设的"目标价 XX 元" | LAW 6 | 多情景估值参考价+假设 |
| 3a | "止损设在 85 元"/"建议在 95 元买入" | LAW 6a | 改为"悲观情景估值下限 80 元，跌破意味市场定价比悲观更差"+"中性情景锚定区间 95-120 元" |
| 4 | 无来源的"往往/通常" | LAW 3 | 标注待补或案例 |
| 5 | 亏损期 PE 分位当贵贱 | P0-2 | 标注仅作位置参考 |
| 6 | "极度高估/低估" | 措辞 | 用数值比较 |
| 7 | "模块1：当前状态快照"等流程性标题 | LAW 17 | 标题改为结论句，如 "PE 36.5x 处 98% 分位，已定价乐观预期" |
| 8 | 段落无段首主旨句，直接展开数据 | LAW 17 | 每段第一句加粗概括核心判断 |
| 9 | 单用 K 线形态（连续上涨/突破均线）断言主线 | 违反主线资金流确认规则（A 股无动量） | 改为资金流/拥挤度为主证据 + Chui et al. 2022 |

### 措辞规范

> **Canonical 源**：[skills/lib/references/report-conventions.md](../../../skills/lib/references/report-conventions.md) §2 硬约束 + §3 措辞规范 + §1 输出格式。

**§2.3 事实边界（最高优先级）**：禁止猜测/推断/幻觉。引擎/数据源没有的字段写「未知/不可得」，不推断；「检索不到」不得断言「数据不存在」（可能被付费墙/权限遮挡），只允许「公开不可独立验证」；数据冲突并列报告不自行裁决；每个数字必须带来源（引擎字段 / `[来源: Python calc: formula]` / 一手源）。

禁止：买入/卖出/持有/建仓/加仓/减仓/止损/止盈、建议（某价格）买入/卖出。

允许（LAW 6a 交易结构分析）：入场区间、假设失效触发、操作纪律、盈亏比、情景锚定。

报告路径：`reports/{symbol}-{name}/{YYYY-MM-DD-HH-MM-SS}.md`，Claude 内只输出简报。详见共享规范 §1。

### 数据源策略

v0.2.4 R12h **多源降级链**：L3 行情类（kline/quote/basic_info/shareholders/northbound）首选源单发、失败按序降级（cascade）；L2 财务类（financials/valuation）并行双源先到先用。差异保留于 `_meta.all_sources`，由分析阶段标注。

---

## Skill 身份声明

**研究工具，非决策工具。** 多因子交叉验证、归因讨论、概率结构；不做买卖/仓位建议。

### 并行取证哲学

全部可用源并行查询 → 各渠道独立记录 → 汇总为证。全失败 → LAW 5 标注；多源有数据 → 标注以何为主。

## 输出格式（层叠输出）

**第一层（Claude 对话简报）**：结论先行、逻辑链闭环、一屏可扫描。禁止展开完整九模块。模板如下：

### 简报铁律

- **结论在首屏**：读者 30 秒内看到核心判断，禁止以风险提示/问题卡/模块编号开头
- **每条结论带逻辑链**：数据 → 推理 → 判断，一行闭环
- **标题即论点**：禁止 "模块1：当前状态快照" 等名词标签，改为完整判断句
- **看摘要等于看全文**：简报本身是完整判断，详细论证在 .md 文件中

### 简报模板（严格顺序）

> **模板使用说明：** 以下 `##` 标题为结构占位符，实际输出时须替换为传递信息量的完整判断句（LAW 17）。如 `## 核心结论` → `## {一句话概括最重要的判断}`。段首必须加粗主旨句。

```markdown
# {name} ({symbol}) — {date} 研究简报

## 核心结论
[2-3 句最重要的判断，每条携带支撑数据]
[证据强度: ✅/⚠️/❓ 🌐/📡/🔮 🕐/📅/🗄️ ✓✓/✓✗/—]

## 逻辑链
1. 数据 A → 推论 B → 子结论 C
2. ...
∴ 核心判断

## 位置感
周期位置: [...] / 估值位置: [...] / 市场态度: [...]

## 多模块结论速览
| 维度 | 结论 | 关键数据 | 逻辑链 | 置信度 |
|------|------|---------|--------|:------:|
| 估值 | PE 38.5x, 92% 分位, 已定价乐观预期 | PE 38.5x vs 中位 18.2x | ... | ⚠️ |
| 经营 | ... | ... | ... | ... |
| 资金 | ... | ... | ... | ... |
| 催化 | ... | ... | ... | ... |
| 风险 | ... | ... | ... | ... |

## 多情景参考
| 情景 | 核心假设 | 传导路径 | 估值区间 | 概率 |
|------|---------|---------|:------:|:---:|
| 乐观 | ... | A→B→C | XX~YY | 30% |
| 中性 | ... | ... | ... | 40% |
| 悲观 | ... | ... | ... | 30% |

## 关键观察节点
| 时间 | 事件 | 验证什么 | 如何修正判断 |
|------|------|---------|-------------|

## 交易结构分析
> ⚠️ 假设一致性检验，非买卖建议。入场区间基于多情景估值按 3 段参考输出（悲观锚区/中性-悲观区/中性锚区），不设触发条件/比例；盈亏比分析见 `invest.py risk-reward` 子命令。

### 入场区间（基于情景锚定 — 3 段参考，不设触发条件/比例）
| 情景锚定 | 价格区间 | Forward PE | 假设前提 | 进入该区间意味着什么（状态含义） |
|---------|:------:|:-----:|---------|------|
| 悲观锚区 | XX~YY | — | 悲观假设全部兑现 | 市场定价比悲观情景假设更差——悲观假设可能已被证伪或超预期恶化（描述含义，非操作指令） |
| 中性-悲观区 | XX~YY | — | 悲观叙事部分定价 | 悲观叙事开始定价、尚未全部兑现，安全边际在收窄 |
| 中性锚区 | XX~YY | — | 当前中性假设全部成立 | 中性假设全部兑现时的合理价带，无安全边际 |

> 入场区间 ≠ 买入建议；分批动作与比例由用户按自身纪律执行。

### 假设失效触发（离场条件）
| 条件 | 类型 | 触发后动作 |
|------|------|----------|
| ... | 假设证伪/叙事动摇/财务恶化 | 重新评估/下调情景/收紧条件 |

### 操作纪律
1. 定期检查（季报后 / 宏观重大变化 / 价格进入极端区间）
2. 假设追踪（thesis --update 对照假设 vs 实际）
3. 仓位匹配（基于情景概率 × 盈亏比，与个人风险承受能力匹配）

## 主要风险
[3-5 条，标注严重度 🔴/🟡/🟢]

## 致命风险
> 若 [X 可观测条件] 发生，当前核心判断 [Y] 失效。

## 盲点
- [盲点 1] — 当前: [未知/数据不可得]
- [盲点 2] — 当前: [未知/数据不可得]

> ⚠️ 免责声明：本简报由自动化引擎 + Claude 分析生成，不构成投资建议。完整报告见 `reports/{symbol}-{name}/{YYYY-MM-DD-HH-MM-SS}.md`
```

**第二层（.md 文件）**：完整备忘录 + References（见 [references/references-format.md](references/references-format.md)），采用 LAW 17 金字塔结构。

**第三层（concise 对话模式）**：Hermes/OpenClaw 等对话场景使用。结论先行 + 关键数据展开块。3-5 段核心结论直出，详细数据用 `<details>` 折叠。CLI 对应 `--mode concise`。

### Concise 输出契约

对话场景下遵循以下两层结构：

**第 1 层 — 结论速览（3-5 段，最先输出）：**

| 段 | 内容 | 来源 |
|----|------|------|
| 1 | **定位句**：symbol/name/industry + PE 历史位置 + 定性 | 估值+基本信息 |
| 2 | **核心矛盾**：1-2 条，附具体数值 | 交叉验证 |
| 3 | **Bull Case**：关键假设 + 支撑数值 | 生意+财务分析 |
| 4 | **Bear Case**：主要风险 + 触发条件 | 风险+治理分析 |
| 5 | **催化剂与观察节点**（可选） | 事件+公告分析 |

**第 2 层 — 关键数据展开（`<details>` 块）：**

```
<details><summary>展开：财务速览</summary>
| 指标 | 最近报告期 | 趋势 |
ROE / EPS / 毛利率 / OCF/净利润
</details>

<details><summary>展开：估值位置</summary>
| 指标 | 当前值 | 历史分位 | 中位数 |
PE / PB / PS
</details>

<details><summary>展开：资金行为</summary>
- 北向资金 / 股东户数 / 内部人信号
</details>
```

**强制规则：**
1. 结论速览第一条输出，不得在前置过程后
2. 每条结论附来源标签
3. Bull/Bear 含数值假设
4. 禁止输出完整九模块
5. 按"假设→证据→结论"链式排列

### SOP-QC 自检

> **共享清单**：[report-conventions.md §7](../../../skills/lib/references/report-conventions.md) Self-Check（通用 + stock 专项）。

措辞（LAW 6/16/3/17）、结构（简报一屏内、首屏含结论+逻辑链、标题传递信息量、段首主旨句、风险提示首尾、LAW 7）、证据（SOP-EV、分位伴中位数、Bull/Bear 数值化）、**分析合成三步**（对抗性假设检验 ≥3 假设、致命一击条件句、盲点 ≥2 条，详见共享规范 §4）。财报专项的 Bull/Bear 撰写与快速否决 8 条见 [financials.md](references/financials.md) F-2 / F-3。

---

### 分析合成三步（所有模式强制）

> **Canonical 定义**：[report-conventions.md §4](../../../skills/lib/references/report-conventions.md) 分析合成框架。以下为 stock 视角摘要，完整规则见共享规范。

简报和完整报告均须包含以下三步。不可跳过。

#### 1. 对抗性假设检验

对核心判断依赖的关键假设，逐一找**可证伪条件**。

| 关键假设 | 可证伪条件 | 观测窗口 |
|----------|----------|:---:|
| "毛利率改善可持续" | 下季毛利率环比回落 >2pp | 下份季报 |
| "行业景气度上行" | 行业 PMI/订单指数连续 2 月回落 | 月度 |
| ... | ... | ... |

**硬约束**：≥3 个关键假设，每个必须有可观测证伪条件。不可证伪的假设标注「不可验证，置信度降级」。观测窗口须为具体时间或事件节点。

#### 2. 「致命一击」归纳

一句话回答：**如果这个分析错了，最可能是因为什么？**

> 若 [X 可观测条件] 发生，当前核心判断 [Y] 失效。

**硬约束**：必须是条件句（若…则…）。指向具体可观测的失效条件，不是「市场风险」「政策不确定性」等标签。

#### 3. 盲点检查

Final pass 自问：
1. 有什么重要变量完全没有被讨论？
2. 当前共识最可能忽略什么风险？
3. 如果一段时间后回头看，今天最明显的盲点会是什么？

🔍 盲点发现:
- [盲点 1] — 当前: [未知/数据不可得/未覆盖]
- [盲点 2] — 当前: [未知/数据不可得/未覆盖]

**硬约束**：≥2 条。不能输出空集。

### SOP-EV 证据强度

可靠性 ✅/⚠️/❓ | 丰富度 🌐/📡/🔮 | 时效 🕐/📅/🗄️ | 交叉验证 ✓✓/✓✗/—

---

## 专项加载与 intent 路由

执行前用 `Read` 加载对应专项（完整 `report --deep` 加载全部）：

| 用户意图 / CLI | 读取专项 | plan --intent |
|----------------|----------|---------------|
| 默认完整分析 | [modules.md](references/modules.md) | `deep_analysis` |
| 舆情深挖 | [sentiment.md](references/sentiment.md) | `sentiment_deep` |
| 财报深研 | [financials.md](references/financials.md) | `financials_deep` |
| 资金行为扫描 | [game-theory.md](references/game-theory.md) | `game_theory` |
| 完整 report --deep | 全部专项 + modules.md | `deep_analysis` + `--deep` |

**规则**：专项单独运行仍须 `evidence`；完整分析用 `report --mode full`（`--mode` 允许 `brief`/`full`/`concise`，不用 `--mode=sentiment`）。

九模块结构详见 [references/modules.md](references/modules.md)。财报 F 规范详见 [references/financials.md](references/financials.md)。

---

## R12f 分析深化契约（v0.2.4，简报铁律升级）

> 用户画像：**调用本 skill 的用户大概率已在交易软件看过现价/走势/图形**——基础行情数据用户已有。期望的是"为什么、然后呢、怎么办"，不是数据罗列。

**三条铁律**：

1. **默认跳过行情罗列**：现价/涨跌幅/MA/RSI/BOLL 等只作**引用**（一句话带过或进表格），不展开描述"价格 X、涨跌 Y、均线 Z"——除非用户明确要求基础行情。
2. **每个数据必须带 so-what**：引用任何数字后紧跟"这意味着……"——数据 → 归因（为什么）→ 推演（然后呢）→ 预案（怎么办）四层递进。禁止"数据表 + 无解读"。
3. **分析主轴 = 核心矛盾**：简报以"核心矛盾 → 归因 → 多情景推演 → 失效触发"为骨架，而不是"模块 1 → 模块 2 → …"的流程罗列。R1 收益驱动假设 + R12d 模块权重决定矛盾主轴（期权型=事件链，周期型=稳态视角）。

**执行检查**：简报完成后自查——"如果用户删掉所有数字，只剩我的判断句，还能读吗？"若不能（判断句依赖罗列支撑而非逻辑链），重写。

---

## R12a 关联数据挖掘 SOP（v0.2.4，采集后、合成前强制）

> 动机：引擎按固定维度清单采集，无法覆盖"这家公司特有的数据"（分部收入、订单/临床里程碑、可比公司、行业技术路线）。引擎没采到 ≠ 数据不存在——**先找材料，找不到才标「数据不足」**（借鉴 ai-berkshire "材料驱动"）。

采集完成后、合成报告前，**必须**执行以下四步（每步 ≤2 次查询新闻/研报——WebSearch / web-search 技能 / /web，视 harness 而定；遵守 agent-prompts.md 搜索纪律——并行批搜 + search_cache）：

```
STEP 1 公司画像锚定（必做）
  ├─ 主营构成/收入分项（修正引擎行业标签——如"小金属"实为汽车/消费电子/医疗器械）
  ├─ 客户结构与依赖（前五大客户占比）
  └─ 技术路线/商业模式一句话（标注来源）
  → 产出: 「公司画像锚定」小节（来源 + SOP-EV）

STEP 2 数据缺口回填（对 classify / --material-gap / 12 题缺口项）
  ├─ 营收/净利序列 → 财报摘要源/业绩快报
  ├─ 现金流与应收/存货 → 年报附注口径
  ├─ 分红/再融资历史 → 公告（classify 的 dividend/refi 证据）
  └─ 每项回填标注来源；回填不到 → 「数据不足 + 原因 + 建议补查路径」

STEP 3 可比公司挖掘（12 题 D-②/A-③ 触发时）
  ├─ 同行 3-5 家（同主营/同赛道）
  └─ 相对指标：毛利率/ROE/PE 对比（引擎算，AI 引用）

STEP 4 事件链挖掘（公告 + 新闻 + 订单/临床/扩产里程碑）
  ├─ 事件-价格对照（里程碑日期 × 价格反应）
  └─ 事件兑现的可观测节点 → 观察节点表
```

**硬约束**：
- 数据缺口项（`report --material-gap` 输出）回填优先于分析撰写
- 关联数据必须带来源与 SOP-EV；无源断言 → 删除（LAW 3/9）
- 画像锚定发现引擎行业标签与实际业务不符 → 以画像为准，标注差异
- 材料不足的题目允许「数据不足 + 原因」，禁止用推测填充

---

## R12d 模块权重自适应（v0.2.4，依赖 R1 classify）

> 借鉴 ai-berkshire "模板是长出来的，不是套子"：同一套九模块不适合所有标的。`classify` 输出收益驱动假设后，按四分支调整模块权重——**基本面框架对"期权型/周期型"标的解释力有限，事件链与周期位置升权**。

| R1 收益驱动假设 | 基本面 12 题权重 | 事件链/催化剂 | 稳态/周期视角 | 典型标的 |
|------|:---:|:---:|:---:|------|
| 成长兑现 | 标准 | 正常 | 参考 | 高增长制造业 |
| 估值股息回归 | 标准（股息可持续性优先） | 低 | 参考 | 红利/公用事业 |
| 周期均值回归 | 降权为「参考」 | 中 | **升权（R2 稳态估值为主轴）** | 化工/有色/航运 |
| 暂无法判定 | 降权为「参考」 | **升权（事件/期权链为分析主轴）** | 升权 | 亏损+事件定价（如 300328 类） |

**执行**：报告每模块标题后附 `[权重: 标准/参考/升权]` 标注；「暂无法判定」标的的观察节点表必须以事件里程碑为主轴（临床/订单/注册节点），而非财务季报。

**禁止**：模块降权 ≠ "该标的不值得分析"定性（B 裁决：不自动断言无投资价值）；权重调整只影响分析重点与顺序，不影响 LAW 输出纪律。

---

## R4 行业成功关键因素（v0.2.4，行业洞见层）

> 动机：通用 12 题是兜底清单，不是行业洞见——"每个行业都有 3-5 个决定成败的问题，答不出等于研究等于没研究"（白酒=品牌、啤酒=渠道、零售=便宜）。

**执行**：报告头部 `[行业成功关键因素（R4）]` 块先答行业关键问题（引擎按行业路由，数据字段值从财务最新期取值），**每项回答后再进通用 12 题**。

- 已覆盖行业：银行（净息差 / 资产质量 / 资本充足）、电子半导体（产能周期 / 技术路线 / 客户结构）
- 未覆盖行业 → 输出「无行业成功因素定义」，回退通用 12 题，不得编造行业因素
- 引擎外字段（客户结构、技术替代等）→ 输出「需 AI 补查」，由 R12a SOP 回填

**禁止**：不引用数据字段值/来源的"成功因素"空谈；不跳过成功因素段直接进通用 12 题。

---

## R5 行业景气状态卡（v0.2.4，结构性季节）

> 借鉴 A 的结构性四季（"AI 主题已入秋、消费处于寒冬后期"）：行业状态是可解释的，不是模糊感觉。五维独立呈现、≥3 维有效才给结论、政策维度必须官方来源。

**命令**：`market-status --industry 半导体`（独立输出，不进入 snapshot 流程）。

**五维**：① 估值分位（行业 TTM PE 在全体申万一级行业分布内的分位，sw_index_first_info）② 盈利趋势（申万行业指数月线方向，index_hist_sw）③ 相对强度（申万行业指数 vs 沪深300，relative_strength）④ 资金流（同花顺行业资金流净额）⑤ 政策证据（**引擎不自动判定**——由 SOP-M1/新闻检索（WebSearch / web-search 技能 / /web，视 harness 而定）引用官方文件填入；无官方来源固定「未查」）。

**判定纪律（决策 U4）**：
- 有效维度 <3 → 「数据不完整（有效维度 N/5）」+ 缺失维度清单，**不做状态结论、不自动降级猜测**
- 方向投票仅盈利趋势/相对强度/资金流三票（估值分位只定语境，政策证据不参与投票）；有效方向维 <2 → 无法定论
- 真值表：方向↑×估值低位→复苏；↑×中/高位→扩张；↓×高位→降温；↓×低/中位→收缩；平局→无法定论
- 各维度独立呈现，禁止单维下结论；政策证据任何情况下不改变状态判定

**LAW 边界**：状态卡是研究判断（可解释状态），不构成操作信号，也不携带任何仓位/交易含义。

**禁止**：有效维 <3 时编造状态结论；用非官方来源的政策证据；把状态卡当作买卖信号。

---

## R7 成长股四分类分流（v0.2.4，R1=成长兑现 时启用）

> R1 判定「成长兑现」后，分析模板按成长驱动来源进一步分流——四类成长的分析重点不同，套同一模板会答错问题。

| 分类 | 分析重点切换 | 估值适用 |
|------|------|------|
| 新经济 | 以空间/份额为主，利润为辅（不苛求当期盈利） | PS/空间测算为主 |
| 份额提升 | 业绩可算性最高，聚焦渗透率与单位经济模型 | DCF/PEG |
| 利润提升 | 聚焦利润率驱动因子（产品结构/成本/提价） | PE/PEG |
| 周期成长 | 合并 R2 稳态估值视角（成长 + 周期位置双轨） | 稳态 PE 对照 |

**执行**：见 [references/financials.md](references/financials.md) F-5 段（各分类的「分析重点切换」清单）；分类依据来自财务数据 + 业务画像（R12a SOP 回填），AI 不得凭空判定。

---

## R12g 双路径分流 + 连板触发（v0.2.4，趋势路径引擎）

> 沃格（连板）、宜安（期权型）、588000（ETF）案例暴露：同一套九模块流程服务所有用户是错误的——用户风格决定分析主轴（开场四问见 R12g-B），趋势路径由引擎补强均线与连板结构。

**引擎补强（本段，R12g-A）**：
- **均线系统表**：报告头部 `[均线系统表（R12g）]` 行——MA5/10/20/60 值 + 现价位置 + 排列标签 [来源: kline derived]
- **连板触发**：近 5 日 ≥2 涨停（R12e 检测）→ 自动附加 `[连板结构（R12g）]` 段，并采集龙虎榜/涨停池（**仅触发时**，未触发零额外网络调用）

**连板六步数据边界**（AI 不得越界）：
| 步骤 | 数据可交付性 | 来源 |
|------|------|------|
| 情绪周期 / 梯队 | ✅ 引擎渲染 | stock_zt_pool_em |
| 龙虎榜席位 | ✅ 引擎渲染（缺失 → 资金流三日结构替代） | stock_lhb_detail_em → 新浪互备 + stock_lhb_stock_detail_em |
| 证伪条件 | ✅ 固定模板 + AI 合成引用 | 引擎固定清单 |
| 筹码 / 题材纯度 | ❌ **不可得 + attempted sources**（未定义取数前，AI 不得补全） | 待数据源验证 |

**注意**：连板 ≠ 必然上榜（603773 8-04/8-05 双连板但双源龙虎榜均未上榜）——席位缺失时降级用资金流三日结构，不强行归因。

---

## R12g-B 开场四问 + 双路径分流（v0.2.4，会话起点）

> 用户风格决定分析主轴（趋势 = 常见情况：当前时点 + 过去数据，MA5/20/60 是常用指标；价值 = 判断数月-数年后的可能性）。**开场四问在 skill 会话起点执行**（AskUserQuestion 一次性，每题带默认值）。

| # | 问题 | 选项 | 分流 |
|:---:|------|------|------|
| Q_风格 | 投资风格？默认读「当前标的」最近 Q1 记录（无同标的记录则询问，**不得用其他标的记录替代**） | 价值/成长/趋势/事件驱动/混合 | 与 Q_周期互斥校验（趋势+长线 → 提示重确认；混合不拦截按周期分流） |
| Q_周期 | 持有周期视角？ | 短线 1-2 周 / 中线 1-6 月 / 长线 1 年+ | 短/中线 → **趋势路径**；长线 → **价值路径** |
| Q_焦点 | 关注焦点？（多选） | 估值/事件催化/资金行为/全面 | 决定深化方向（与 R1 冲突按 U1 仲裁） |
| Q_已看 | 已看过行情？默认是 | 是/否 | 是 → 跳过基础行情罗列（R12f 契约） |

**风格↔Q1 驱动逻辑显式映射表**（无对应项一律走中性，不自动推断）：

| 风格自评 | Q1 驱动逻辑 | 映射 |
|---|---|---|
| 价值 | 均值回归 | 直接对应 |
| 趋势 | 趋势跟随 | 直接对应 |
| 事件驱动 | 政策催化 | 直接对应 |
| 成长 | （无对应项） | 询问确认 |
| 产业转型 | （无风格对应） | 中性 |
| 混合 | 任意 | 不自动推断，按 Q_周期分流 |

**分流矩阵**（Q_周期 + Q_焦点 决定主轴；取证范围不缩水）：

| 维度 | 趋势路径 | 价值路径 |
|------|------|------|
| 时间尺度 | 当前时点 + 过去 N 日（日-周级） | 数月-数年（远期可能性） |
| 分析主轴 | 技术结构（均线系统）+ 资金行为 + 连板六步 | 稳态盈利（R2）+ EV 桥接（R3）+ 多情景 + 事件兑现窗口 |
| 核心工具 | MA5/10/20/60 系统 + 资金流 + 龙虎榜 + R12e 连板检测 | `value --steady/--ev-ebitda` + `classify` + thesis + DCF |
| 产出 | 趋势状态判断 + 证据 + 可证伪条件 + 待核验节点 | 远期可能性判断 + 观察节点 + 失效触发 |

**用户焦点 × 引擎判定仲裁（决策 U1）**：
- 冲突矩阵（Q_焦点 × R1 假设）仅有「估值 × 暂无法判定」与「估值 × 周期均值回归」两格存在冲突
- 冲突时：**用户焦点为主轴**，同时输出引擎建议行（「引擎建议主轴：XXX，因收益驱动为 YYY」）并注明「方法论一致性」张力——不强行改主轴，不隐藏引擎判定
- **强制例外**：周期均值回归标的用户选「估值」→ 估值输出**必须**并入 R2 稳态对照（当期低 PE 可能源于周期高位，引擎纪律不容偏好绕过）

**概率来源标注**：价值路径多情景概率 = 用户输入，或明确标注为分析假设并给出敏感性——禁止把概率包装成事实。

**LAW 边界**：趋势路径输出为状态描述 + 证据 + 可证伪条件 + 待核验节点（"MA5 上穿 MA20"是状态，不生成交易信号；不输出默认操作预案路径）；价值路径远期判断为多情景参考（LAW 6）。

---

## 数据来源

详见 [references/source-guide.md](references/source-guide.md)。

## CLI 命令

```bash
# 生成采集计划（intent: deep_analysis | quick_check | catalyst_monitor | compare
#   | sentiment_deep | financials_deep | game_theory）
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py plan 600176 --intent game_theory

# 按计划采集 + 证据表 + 报告
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py collect 600176 --plan /tmp/plan.json
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py evidence 600176 --plan /tmp/plan.json
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py report 600176 --plan /tmp/plan.json --mode full

# 常用
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py collect 600176
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py report 600176
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py report 600176 --outdir=./reports/
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py report 600176 --deep
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py compare 600176 000858
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py diagnose
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py diff 600176
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py store list
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py collect 600176 --no-store   # 默认自动入库，--no-store 关闭
```

> 运行目录：`code/`。必须用 `uv run python`（所有引擎命令已统一带 `${INVEST_SKILLS_ROOT:-.}` cd 前缀）。`--mode`：`brief` | `full` | `concise`。

## 代理 / VPN

akshare/baostock 自动绕过 HTTP 代理；`diagnose` 可查 `proxy_detected`。规则与 TUN 说明见 [source-guide.md](references/source-guide.md)。

## 引用格式（精简）

事实：`"数值" [来源: {路径} / {日期}]` | 分析：`[依据: …；逻辑链: …]` | 推测：`[推测，待验证]`

完整规范：[references/references-format.md](references/references-format.md)

## 技术指标

MA/MACD 仅描述市场状态，不生成交易信号。

**固定提示行**（引擎/模板层，AI 不得删改）：

> 技术指标仅用于描述市场状态（价格与均线位置关系、MACD 方向）与交叉验证其他证据，不单独构成结论，也不构成任何操作依据。学术检验（Chen, Zhou & Wang 2018, *Physica A*）：沪深 300 期指 279 个技术策略计入交易成本后利润被完全消除。

**信息深度匹配提示**（C 原则 2）：对 R1「暂无法判定」假设或信息不足标的，自上而下（宏观/行业）视角比单票技术/财务深挖更稳健（Zurek & Heinrich 2021）——研究深度与信息可得性不匹配时，先补宏观/行业语境，不硬挖单票。

**三维共振定位**：技术形态是「产业趋势 + 技术形态 + 流动性」三维共振的交叉验证维度之一（模块 2 + 技术模块 + 模块 3），不单独构成决策依据。

## 采集顺序

### SOP-M1 宏观情景（`--with-macro`）

简报首行：`[宏观情景] PMI + CPI + LPR → 政策方向 | VIX + 波动等级 + SOX + 费城半导体指数`

示例：`[宏观情景] PMI 50.2 + CPI +0.3% + LPR 3.45% →偏宽松 | VIX 18.5 正常 SOX 6,850`

1. `diagnose` → 2. `plan`/`collect` → 3. `evidence`（专项推荐）→ 4. `report` → 5. `store`（可选）

---

## v0.1.9 CLI 扩展

```bash
# 质量门
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py rigor 600176 --verify-all [--strict]
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py audit report.md --extract
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py audit report.md --verdict

# 质地检查 / 组合 / 假设追踪
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py check 600176
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py portfolio holdings.json [--stress]
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py thesis 600176 --init|--update|--status

# 价格冲击插值（非风险中性概率）
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py shock 300274 \
  --pre-price 163.46 --post-price 140 --eps-base 6.55 --eps-hit 1.64 \
  --pe-normal 27 --pe-stressed 20

# 新闻包（公告 + 查询包 + 可选 Tavily）
cd "${INVEST_SKILLS_ROOT:-.}" && uv run python skills/invest-a-stock/scripts/invest.py collect 600176 --with-news-pack
```

`TAVILY_API_KEY` 可选；无 Key 时 Layer3 静默跳过，Layer1+2 仍产出。

### SOP-DEEP（四视角并行）

完整 `--deep` 报告时分两阶段并行：**采集（3 Agent）→ 分析（4 Agent）**。

---

**Phase 1 — 并行采集 + 交叉验证（3 Agent 同时启动）：**

```
┌─ Collector A: 财务主线（Tushare）─────────────────────┐
│  invest.py collect SYMBOL --deep                       │
│    --dims "financials,valuation,basic_info"            │
│  产出: /tmp/{symbol}_collect_A.json                    │
└───────────────────────────────────────────────────────┘

┌─ Collector B: 行情+资金+财务交叉验证（akshare主）─────┐
│  invest.py collect SYMBOL --deep                       │
│    --dims "financials,quote,kline,valuation"           │
│  financials 用 akshare 做主源，与 A 的 Tushare 交叉    │
│  产出: /tmp/{symbol}_collect_B.json                    │
└───────────────────────────────────────────────────────┘

┌─ Collector C: 补充数据（股东/研报/事件/行业）─────────┐
│  invest.py collect SYMBOL --deep                       │
│    --dims "shareholders,research,events"               │
│  产出: /tmp/{symbol}_collect_C.json                    │
└───────────────────────────────────────────────────────┘
```

**验证规则：**
- financials 维度：A（Tushare）vs B（akshare），关键字段（ROE/EPS/毛利率）差异 <5% → 通过
- 差异 ≥5% → 触发 Tie-breaker（第三源三方投票）：另采一份第三方 collection
  `invest.py collect SYMBOL --dims "financials" --deep`（换批次/时点），
  与 A/B 一起跑 `scripts/merge_collections.py`
- 三取二投票决定最终值，无法决定则保留差异并标注"跨源分歧"
- 合并 3-4 份 JSON → 完整 collection（用 `scripts/merge_collections.py`）

**Phase 1 耗时：** 3 Agent 并行 ≈ 30-40s（vs 串行 80s）

---

**Phase 2 — 四视角并行分析（4 Agent 同时启动）：**

```
同时启动 4 个 Agent（用 references/agent-prompts.md 的模板，替换变量）：
  Agent A: 生意质量 → section_1_business.md
  Agent B: 财务与估值 → section_2_financials.md
  Agent C: 行业与竞争 → section_3_industry.md
  Agent D: 风险与治理 → section_4_risk.md

每个 Agent 的参数: {collection_json_path} = 合并后的 JSON 路径,
  {symbol} = 标的代码, {output_dir} = reports/{symbol}-{name}/
```

---

**Phase 3 — 合成（主编 Claude）：**
1. 等待 4 个分析 Agent 全部完成
2. 读取 4 个 section 文件 + 合并后的 collection JSON
3. 运行 `valuation_calc.py SYMBOL` 嵌入估值数据（DCF/多情景/预期差）
4. 合成完整报告 → `reports/{symbol}-{name}/{YYYY-MM-DD-HH-MM-SS}.md`，采用以下 LAW 17 金字塔结构。
> **模板使用说明：** 以下 `##` 标题为结构占位符，实际输出时须替换为传递信息量的完整判断句（LAW 17）。段首必须加粗主旨句。

```markdown
# {name} ({symbol}) — 深度研究备忘录 {date}

## 核心结论
（从 4 Agent section 提炼，≤5 句，每条携带数据+逻辑链）
[证据强度]

## 位置感
周期位置 / 估值位置 / 市场态度 — 三句话定位当前状态

## 模块结论速览
| 维度 | 结论 | 关键数据 | 逻辑链 | 置信度 |
|------|------|---------|--------|:------:|

## 论证展开
（每节标题为完整判断句，段首加粗主旨句，数据→推理→判断一行闭环）

## 多情景参考
（表格：情景 | 假设 | 传导 | 估值区间 | 概率）

## 观察节点
（表格：时间 | 事件 | 验证什么 | 如何修正判断）

## 主要风险
（3-5 条，标注严重度 + 缓解因素）

## 致命风险
> 若 [X 可观测条件] 发生，当前核心判断 [Y] 失效。

## 对抗性假设检验
| 关键假设 | 可证伪条件 | 观测窗口 | 状态 |
|----------|----------|:---:|:---:|
| ... | ... | ... | ✅/⚠️/❓ |

## 盲点扫描
🔍 盲点发现:
- [盲点 1] — 当前: [未知/数据不可得/未覆盖]
- [盲点 2] — 当前: [未知/数据不可得/未覆盖]

## References
（保持现有 LAW 7 格式）
```

3b. 执行分析合成三步（详见 SOP-QC 上方「分析合成三步」章节）：
   - 对抗性假设检验：从 4 Agent section 提炼 ≥5 个关键假设，逐一找可证伪条件
   - 致命一击：一句话条件句归纳最大风险
   - 盲点扫描：检查四视角是否有遗漏维度

5. 输出 Claude 对话简报（按第一层模板，一屏内）
6. QC 自检：LAW 1-17 逐条验证 + 分析合成三步完整性（对抗性假设检验 ≥5 假设、致命一击条件句、盲点 ≥2 条），尤其 LAW 17（标题是否传递信息量、段首是否有主旨句、简报首屏是否有核心结论）

---

四视角覆盖内容：

1. **生意质量**：商业模式 / 护城河 / 管理层 / 价值链
2. **财务与估值**：DCF 三情景 / 财务健康 / 盈利质量 / 估值位置
3. **行业与竞争**：波特五力 / 竞争格局 / 产业链利润池
4. **风险与治理**：快速否决 / 风险信号 / 公司治理 / Known Unknowns

> Agent prompt 模板详见 [references/agent-prompts.md](references/agent-prompts.md)。
> 采集/分析阶段的所有 Agent 只调 Bash（invest.py/merge_collections.py），不调 Tushare/akshare API — 不触发限流。

### SOP earnings-review（季报/年报后）

- [ ] 对比指引 vs 实际（营收/净利/毛利率）
- [ ] OCF/净利润是否背离（阈值 0.6）
- [ ] 资本开支与产能叙事是否一致
- [ ] 更新 thesis `--update` 假设状态

### SOP industry-research / news-pulse

- [ ] `collect --with-news-pack` 获取公告 + 查询包
- [ ] 对 `query_pack` 查询新闻/研报（WebSearch / web-search 技能 / /web，视 harness 而定；Tavily 可选），回填 NewsCard
- [ ] 外生冲击假说⑥段：方向 + 可信度 + 来源
- [ ] 重大波动时用 `shock` CLI 计算价格冲击插值比例（附学术声明）
