---
name: company-deep-analysis
version: 1.0.12
description: |
  A股/港股公司深度分析。输入公司名称或股票代码，自动完成 6 步分析流程：
  数据采集 → 公司画像 → 产业链五力 → 竞争护城河 → 财务四维 → 相对估值。
  输出双产物：公司深度分析报告 + 投研简报
  支持单步模式：用户指定"财务情况/财务分析/公司画像/公司基本面"时，按路由表只跑对应步骤并输出对应单文件。
  触发词：公司分析 / 深度分析 / 公司调研 / 投资初筛 / 深度调研 / 公司研究 / 行业研究 / 投研简报 / 财务情况 / 财务分析 / 公司画像 / 公司基本面
metadata:
  market: ["A股", "港股"]
  output_format: ["html", "md"]
  display_name: "公司深度分析助手"
  requires:
    pip: ["requests", "pandas", "lxml", "html5lib"]
  optional_pip: ["matplotlib"]
  python_bins: ["python3", "python"]
---

# 公司深度分析助手（A 股 / 港股）

输入 A 股/港股公司名称或股票代码，**默认执行 6 步分析，输出双产物**：
- **MD 深度分析报告**（`{公司名}_深度分析报告_{YYYYMMDD}.md`）
- **HTML 投研简报**（`{公司名}_投研简报_{YYYYMMDD}.html`）

> **单步模式**：用户说"看一下 XX 的财务情况" / "XX 的公司画像" 时，按 [执行模式路由](#执行模式路由) 表只跑对应步骤，输出对应单文件（不要双产物）。

## 适用场景

- 个人投资者做投前初筛（5 分钟看一家公司基本面）
- 卖方/买方研究员做行业研报的子模块
- 投资经理在投委会前快速过一遍潜在标的
- 跨行业比较 5-10 家可比公司的财务与护城河
- 只想看财务 → 单步模式（输出财务分析单文件，不必出简报）
- 只想看公司画像 → 单步模式（输出公司画像单文件）

## 执行模式路由

### 路由表

| 用户关键词（任一命中） | 模式 | 跑的步骤 | 输出文件 |
|-----------|------|---------|---------|
| **（默认）/ 没有任何特殊词** | `full` | Step0 + Step1 + Step2 + Step3 + Step4 + Step5 | **双产物**：`_深度分析报告.md` + `_投研简报.html` |
| **财务** / **财务情况** / **财务分析** / **看看财务** | `financial` | Step0（数据采集） + Step4（财务四维） | `_财务分析.md`（单文件） |
| **画像** / **公司画像** / **公司基本面** / **看看公司** | `profile` | Step0（数据采集） + Step1（公司画像） | `_公司画像.md`（单文件） |

### 关键词优先级（多关键词冲突时）

**最具体的优先**：`financial` > `profile` > `full`

例：
- "分析 XX 公司的财务情况" → `financial`（命中"财务情况"）
- "XX 的公司画像怎么样" → `profile`（命中"公司画像"）
- "帮我分析一下 XX" → `full`（默认）
- "XX 的财务和公司画像" → `financial`（最具体的优先，不双跑）

### 单步模式必跑的前置

- **Step0 数据采集必跑**：所有模式的输入都依赖 `/tmp/{code}_data.json`
- **跳过中间步是安全的**：Step2（五力）/ Step3（护城河）/ Step5（估值）的产物**不喂给** Step1 / Step4，跳过不影响单文件质量
- **代价**：单步模式输出文件**没有**行业竞争 / 护城河 / 估值章节，质量门只检"该模式的章节"

### 用户提示模板

路由判断完成后，在对话中展示一行：

```
🔍 识别到：{公司全称}（{代码}）· {市场} · 即将进入「{模式}」模式（{跑哪几步}），输出 {单/双} 产物：{文件清单}
```

## 执行原则

1. 报告行文按 `ai-internal-rules.md §3.1-3.4` 硬要求（结论先行 + 主谓宾结构）
2. 所有财务数字标注来源，推算指标列出公式
3. 推断内容标注置信度（高/中/低）
4. **full 模式**：6 步串行执行，StepN 完成后才能启动 StepN+1。**单步模式（financial/profile）**：按 [执行模式路由](#执行模式路由) 表只跑对应步骤
5. 无法获取的信息标注为信息盲区，不编造
6. **产物必须基于模板生成**：在 Step6 写任何文件前，必须先 `Read` 对应模板文件并严格按其结构填充。不得凭记忆自行编写报告结构。详见 [§6.0 产物生成的强制执行规则](#60-产物生成的强制执行规则必须严格遵守)

---

## 环境准备与降级策略（必读）

本 skill 的运行依赖 2 类外部能力：**Python 解释器**、**`scripts/` 目录下的采集脚本（含纯 HTTP 数据模块 `westock_data.py`，零外部依赖）**。不同运行环境（本机 / Codex / ClawHub 沙箱）的可用性差异很大，下面给出统一的探测规则与三级降级策略，确保**任何环境都能跑通**。

### 1. Python 命令探测（python3 与 python 均兼容）

不同环境 Python 命令名不同（macOS/Linux 多为 `python3`，部分环境为 `python`，Codex 等容器可能两者皆有或仅有其一）。

**统一探测规则**：执行任何脚本前，先运行以下探测确定命令名，后续统一用变量 `$PY` 指代：

```bash
# 探测：优先 python3，回退 python，都没有则走 L3 降级
if command -v python3 >/dev/null 2>&1; then PY=python3
elif command -v python >/dev/null 2>&1; then PY=python
else echo "⚠ 未找到 Python，走 L3 降级路径"; PY=""
fi
echo "使用 Python 命令: ${PY:-无}"
```

> 脚本 shebang 为 `#!/usr/bin/env python3`，直接用 `$PY` 显式调用可绕过 shebang 限制（如 `python scripts/collect_data.py`）。

### 2. 数据采集依赖说明（零外部 CLI）

本 skill 的数据采集**不依赖任何外部 CLI 或第三方 npm 包**。所有数据通过公开免费 HTTP 接口直接获取：

| 数据项 | 数据源 | API |
|--------|--------|-----|
| 财务三表（利润表/资产负债表）— A 股 | 新浪财经 | `quotes.sina.cn/cn/api/...CompanyFinanceService` |
| 财务三表（利润表/资产负债表）— 港股 | 东财港股 datacenter | `RPT_HKF10_FN_INCOME` / `RPT_HKF10_FN_BALANCE` |
| 现金流量表 | A 股：新浪财经；**港股无此表**（估值自动跳过 EV/EBITDA） | — |
| 主要财务指标（ROE/毛利率/资产负债率等）— A 股 | 东财 datacenter | `datacenter.eastmoney.com/securities/api/data/v1/get` |
| 主要财务指标（ROE/毛利率/资产负债率等）— 港股 | 东财港股 datacenter | `RPT_HKF10_FN_GMAININDICATOR` |
| 公司概况 / F10 | 东财 F10 | A 股 `PC_HSF10/CompanySurvey`；港股 `PC_HSF10/CompanySurvey?code=HK.{code}` |
| 十大股东 / 股东户数 | 东财 F10 ShareholderResearch | 同上 |
| 行情报价（A 股） | 腾讯财经 | `qt.gtimg.cn/q=` |
| 行情报价（港股） | 腾讯财经 | `qt.gtimg.cn/q=hk{code}` |
| 分红送配 | 东财 F10 BonusFinancing | `emweb.securities.eastmoney.com/PC_HSF10/BonusFinancing/...` |

> **执行约定**：脚本 `scripts/collect_data.py` 和 `scripts/westock_data.py` 已内置上述接口调用逻辑，**不需要安装任何额外工具**。直接用 `$PY scripts/collect_data.py {CODE}` 即可运行。

### 3. 三级降级策略

| 级别 | 触发条件 | 行为 |
|------|---------|------|
| **L1 正常** | `scripts/` 存在 + `$PY` 可用 | 执行 `collect_data.py` / `valuation.py` 脚本，脚本内置公开 API 采集全部数据（零外部依赖） |
| **L2 无脚本** | `scripts/` 缺失（打包遗漏/环境隔离）或脚本执行报错 | LLM 直接按同款数据源采集，手写 `/tmp/{code}_data.json`（schema 见下）；用 WebFetch / curl 直连东财/腾讯/新浪等公开接口 |
| **L3 无 Python** | 探测不到 `python3` / `python`（`$PY` 为空） | 完全由 LLM 用 WebFetch / curl 直采，手动拼 JSON 写入 `/tmp/{code}_data.json`，跳过所有 `.py` 脚本 |

**降级判定口诀**：先探 `$PY` → 有脚本就跑 L1 → 无脚本走 L2 → 无 Python 走 L3。

### 4. L2/L3 降级采集 schema（写入 /tmp/{code}_data.json）

降级时 LLM 需产出一个 JSON，结构与脚本输出对齐，至少包含以下字段（其余字段可按信息盲区省略）：

```json
{
  "code": "600519",
  "market": "A股",
  "finance": { "主要财务指标": {} },
  "f10": { "公司概况": {}, "股东研究": {}, "股本结构": {}, "行业分析": {}, "财务分析": {} },
  "lrb": {}, "fzb": {}, "llb": {},
  "quote": { "price": 0, "pe_ttm": 0, "pb": 0, "mcap_yi": 0 },
  "em_info": {}, "blocks": [], "reports": [], "ths_forecast": []
}
```

> 降级采集的字段允许少于脚本（信息盲区标注即可），但**必须**保留 `code` / `market` / `quote` 三项，其余缺失标 `"N/A"`。后续 Step1-5 读取该 JSON 的逻辑不变。

### 5. 降级时三表数据来源

三表（利润表 / 资产负债表 / 现金流量表）在降级路径（L2/L3 ）中通过以下公开接口直采：

| 数据 | 接口 |
|------|----------------|
| 利润表 lrb | 新浪财报 API `quotes.sina.cn/cn/api/...CompanyFinanceService` |
| 资产负债表 fzb | 同上 |
| 现金流量表 llb | 同上 |

> L1 路径中脚本已内置上述接口调用逻辑，无需手动指定。

---

## Step0：公司识别与数据采集

### 0.1 公司识别

**前置检查：市场范围**

支持 A 股 + 港股，**拒绝美股**：
- 用户明示美股，或代码为字母美股代码（如阿里 BABA、特斯拉 TSLA）→ 回复"本工具仅支持 A 股 / 港股分析。如需分析美股，请使用对应工具。"
- 明确为未上市公司（如华为、字节跳动）→ 回复"该公司尚未上市，无法进行股票分析。"
- 通过后继续下面流程

**识别输入类型 + 市场判定**

判断用户输入（顺序敏感，先看代码长度/格式）：

| 输入特征 | 模式 | 市场 |
|---------|-----|-----|
| 5 位纯数字（如 00700、09988）| 港股代码模式 | 港股 |
| 6 位纯数字（如 600519、000858）| A 股代码模式 | A 股 |
| `hk00700` / `sh600519` / `sz000001` / `bj430047` | 带前缀代码模式 | 按前缀判定 |
| `00700.HK` / `600519.SH`（带 `.XX` 后缀） | 港交所/上交所规范后缀模式 | 按后缀判定（需规整成 `hk00700` / `sh600519`）|
| 含 5-6 位数字 + 公司名（如"腾讯 00700"）| 公司名+代码模式 | 按代码长度判定 |
| 其他 | 公司名模式 | search 后由候选判定 |

代码规整：所有变体在传给脚本前**统一**为 `hk{5位}` / `sh{6位}` / `sz{6位}` / `bj{6位}`，collect_data.py 用 `westock_data.market_prefix()` 重新识别。

---

**情况 A：公司名模式**（如"贵州茅台"、"腾讯控股"）

用 WebSearch 搜索 "<公司名> 股票代码"，从搜索结果提取代码。用 `$PY <skill_dir>/scripts/collect_data.py {CODE}` 采集行情验证名称匹配。

- **唯一匹配**：在对话中展示"🔍 识别到：{公司全称}（{代码}）· {市场} · {交易所}"，进入 0.2
- **多候选**：用 ①②③ 列出"{公司全称}（{代码}）· {市场标识}"，**A 股/港股候选全部展示**让用户选；美股候选标注"美股，本工具不支持"排除
- **无结果**：提示"未找到匹配的 A 股/港股公司，请手动输入代码。"

---

**情况 B：股票代码模式**（如"600519" / "00700" / "hk00700" / "00700.HK"）

执行 `$PY <skill_dir>/scripts/collect_data.py {full_code}`，从输出中取 quote.name 字段，反查公司全称和市场。

- **找到匹配**：在对话中展示 → 直接进入 0.2
- **代码无效**：提示"代码 {代码} 未找到，请检查是否正确。"

---

**情况 C：公司名+代码模式**（如"贵州茅台 600519"、"腾讯 00700"）

执行 `$PY <skill_dir>/scripts/collect_data.py {full_code}`（取 quote.name 字段），验证名称与代码是否匹配。

- **匹配 ✓**：直接进入 0.2，不弹确认
- **不匹配 ✗**：展示搜索结果和用户输入，让用户选择正确的一方

---

**确认信息格式**（在对话中展示，不弹窗）：

- 唯一匹配：输出"🔍 识别到：{公司全称}（{6位或5位代码}）· {A股/港股} · {交易所}，即将开始 6 步深度分析。如不对请直接告诉我正确代码。"，然后进入 0.2。
- 多候选：用 ①②③ 列出"{公司全称}（{代码}）· {市场} · {交易所}"，等用户选择后进入 0.2。

### 0.2 结构化数据采集

执行 `scripts/collect_data.py {股票代码}`，脚本自动采集 10+1 项数据：

| 模块 | 数据源 | 备注 |
|---|---|---|
| finance | 东财主要财务指标（A 股）/ 东财港股 GMAININDICATOR（港股） | 已有 |
| f10 | 东财 F10 五大类 | 已有 |
| lrb | 新浪（A 股）/ 东财港股 datacenter INCOME（港股） | 利润表 |
| fzb | 新浪（A 股）/ 东财港股 datacenter BALANCE（港股） | 资产负债表 |
| llb | 新浪（A 股）；**港股无此表** | 现金流量表（港股估值跳过 EV/EBITDA） |
| quote | 腾讯行情（A 股 `qt.gtimg.cn` / 港股 `qt.gtimg.cn/hk{code}`） | 已有 |
| em_info | 东财个股信息 | 已有 |
| blocks | 百度概念板块（A 股）/ 恒生行业（港股） | 已有 |
| reports | 东财研报（A 股）；**港股无** | 已有 |
| ths_forecast | 同花顺一致预期（A 股）；**港股无** | 已有 |

以上 10 项为数据采集项，**外加 1 项衍生**：

| 衍生项 | 拆解方式 | 用途 |
|---|---|---|
| ebitda | 新浪三表（A股）/ 港股无 OCF → `calc_ebitda()` 拆解 | 估值 EV/EBITDA 方法（港股自动跳过） |

全部写入 `/tmp/{股票代码}_data.json`，终端只输出采集摘要。

**批量模式**（不写文件，stdout 输出 JSON，进度走 stderr）：

| 模式 | 命令 | 输出 | 用在哪 |
|---|---|---|---|
| `--quotes` | `collect_data.py --quotes 600519,000858` | 多家公司行情（PE/PB/市值/股价） | Step3.2 估值章节竞对 PE/PB |
| `--finances` | `collect_data.py --finances 600519,000858,002768` | 多家公司财务比率（毛利率/净利率/ROE/营收/同比/8 期报告期） | **Step4 §6 可比公司财务对比（强制走 `collect_data.py --finances` 直采）** |

> **三表数据源说明**：`collect_data.py` 内部自动处理三表采集（优先内置接口，失败时降级到新浪/东财公开接口）。无需手动指定数据源。

**执行方式**：
```bash
# 先按「环境准备与降级策略」探测 $PY（python3/python 自动适配）
# 获取 skill 目录路径，然后执行脚本
$PY <skill_dir>/scripts/collect_data.py {CODE}
# 若 scripts/ 缺失或脚本报错 → 走 L2/L3 降级（LLM 直采写 /tmp/{code}_data.json）
```

### 0.3 定性信息补充（合并搜索）

```
WebSearch "<公司名> 研报 2025 2026 战略"     # 券商研报（战略方向、风险因素）
WebSearch "<公司名> 公告 管理层 重大事项"       # 公司公告（管理层变动、重大事项）
```

2 次拉取覆盖战略方向、风险因素、管理层变动、商誉减值等定性信息。

### 0.4 数据质量评级

- **A级**：10 项数据 + 1 衍生全部成功
- **B级**：1-3 项失败（记录失败项，用 WebSearch 补充）
- **C级**：三表 + F10 均失败（仅做定性分析）

报告采集摘要（数据等级 + 获取项 + 缺失项），自动进入Step1。

---

## Step1：公司画像

**输入**：从 `/tmp/{股票代码}_data.json` 读取 f10.公司概况、f10.股东研究、f10.股本结构、em_info、blocks。

1. **基本信息**:公司全称、股票代码、上市交易所、上市日期、注册资本、实际控制人、所属行业(申万)、**业务模式标签**【互联网/平台/TOC SaaS/TOB SaaS/TOC+TOB 双边/工业品/消费品/金融/医药/地产/强周期/其他】、**概念板块**(合并到此节最后一行,逗号分隔)
2. **主营业务**:主要产品/服务、收入构成、最新业务动态
3. **股权结构**:前十大股东(名称/持股比例/性质)、实际控制人持股链路、总股本/流通股本/限售股
4. **用户规模与活跃度**(**由 §0 业务模式标签决定**):
   - 触发条件:见模板 §0.4 表格(基于申万行业 + 主业占比,**不**用关键词匹配)
   - 触发内容:见模板 §五
     - TOC:MAU/DAU/付费用户/ARPU/留存/LTV/CAC 等核心用户指标
     - TOB:付费客户数/ARR/NDR/续约率/Rule of 40 等 SaaS 指标
     - 两者并存时**两节都生成**

业务模式标签判定按 `templates/company-profile-template.md §0` ��行(申万行业 + 主营占比双判定,主业占比 50% 是分水岭),产物作为 Step2 五力框架选择器、Step3 护城河框架选择器、Step4 财务权重调整表的查询键。

**输出**：使用 `templates/company-profile-template.md` 生成 `{公司名}_公司画像.md`。

**质量门**：
- [ ] 公司全称、股票代码、上市交易所已填写
- [ ] **业务模式标签**已选择（必填）
- [ ] 主营业务描述不少于100字
- [ ] 前十大股东至少列出5个
- [ ] 每个数据项标注来源
- [ ] 概念板块已合并到基本信息表,**不**单独成节
- [ ] **触发条件成立时,用户规模章节已生成**(否则标注"不适用")

---

## Step2：产业链分析

**输入**：Step1 公司画像中的"**业务模式标签**" + 从 `/tmp/{股票代码}_data.json` 读取 f10.行业分析、blocks。

> **Step2 启动前置检查**:Step2 §2.0「行业大盘前置」必须先生成(行业规模/CR3-CR10/生命周期定位),作为五力分析的"行业大盘"基线;若数据等级 C 级,Step2 五力表需标注"行业数据基础薄弱,五力评级置信度降低"。

### 2.0 行业大盘前置

> **模板位置**:本节产出物写入主报告模板的 `§2.1 行业概览`(行业定位 + §2.1.1 行业规模 + §2.1.2 市场份额 + §2.1.3 行业生命周期定位)。
> **数据获取**:从 `/tmp/{股票代码}_data.json` 读取 f10.行业分析 + blocks.行业。用 WebSearch 搜索 "<行业> 市场规模 CR5 集中度 2025" 补充行业数据。

- 行业规模:总规模 + 过去 5 年 CAGR + 未来 5 年 CAGR 预测 + 公司占比
- 市场份额:头部 5-10 名 + CR3/CR5/CR10 集中度
- 行业生命周期定位(导入/成长/成熟/衰退 + 核心驱动 + 政策/技术变革)
- 数据缺失时按模板 §6.4 兜底并降级

### 2.1.0 五力框架选型

按 `ai-internal-rules.md §2.0` 选五力框架（业务模式标签 → 框架 A/B/C），加载 `porter-five-forces-template.md` 对应章节执行。

### 2.1 经典 Porter 五力(框架 A 模板,其他框架按对应章节)

| 力量 | 分析要点 | 数据来源 |
|------|---------|---------|
| 供应商议价力(上游) | 原材料/技术供应方、供应商集中度、切换成本 | `f10.行业分析` + WebSearch "<公司名> 供应链 供应商" |
| 买方议价力(下游) | 客户集中度、产品可替代性、议价能力 | `f10.财务分析` + WebSearch "<公司名> 客户 集中度" |
| 现有竞争者威胁 | 同行数量、市场份额分布、竞争强度 | WebSearch "<行业> 竞争格局 CR5" + `<行业> 市场份额排名` |
| 新进入者威胁 | 资金/技术/牌照壁垒 | `f10.行业分析` + WebSearch "<行业> 行业壁垒 准入" |
| 替代品威胁 | 替代产品/服务、替代趋势 | WebSearch "<行业> 替代品 趋势" |

### 2.2 搜索合并(共用)

五力搜索合并为 **2-3 次**(互相独立,可并行执行),命令清单按 `porter-five-forces-template.md` §3 / §4 各力量「数据来源」字段执行。

每项评级：强/中/弱 + 至少 2 条数据支撑。

**质量门**：
- [ ] **所选框架已明确标注**(A/B/C/A+B)
- [ ] 五力每项都有评级
- [ ] 每项至少 2 条数据支撑
- [ ] 产业链上下游各列出至少 2 个具体环节
- [ ] **(框架 B/C 额外)** 核心指标(CAC/LTV/留存/MAU)有数据点

---

## Step3：竞争格局与护城河分析

**输入**：Step2 五力分析 + 从 `/tmp/{股票代码}_data.json` 读取 reports、quote。

### 3.1 识别竞争对手

从Step2提取同行 + WebSearch "<行业> 上市公司 同行对标"（拿行业成份股列表）+ WebSearch "<公司名> 竞品分析 券商研报"（券商研报里的竞品分析），筛选 5-8 家主要竞对。

**竞对选取方法论**：

> **核心原则**：从"业务模式"和"产业链位置"双维度匹配。**先找同行业（高可比），再找上下游/相似业务（中可比），最后是行业参考（低可比）**。

具体步骤：
1. **业务模式拆分**：把目标公司按"营收占比"拆成主业（占比最高）+ 次业（如自研/小业务）。**可比公司必须对标主业**。
2. **三层选取**：
   - 🟢 **高可比**：业务模式相同 + 主营行业相同
   - 🟡 **中可比**：主营行业不同但**业务模式类似**
   - 🔴 **低可比**：**业务模式差距大**，仅作行业参考
3. **每家公司必须给"可比性"标注**（高/中/低），并说明理由
4. **行业基准对比不能替代可比公司对比**——这是常见错误

**反例警示**（必须避免）：
- ❌ 把行业平均毛利率/PE 当作"可比公司"——这是偷懒
- ❌ 把业务模式差距大的公司（如 FPGA 芯片设计 vs 存储分销）放在同一张估值表里比较 PE/PB

**最终报告规则**：可比公司在双产物中的差异化处理：

- **深度分析报告**（MD）：
  - §2.3 行业与竞争分析、§4.1 估值结论 → **只列高可比 2 家**（焦点对标）
  - §3.6 财务分析（可比公司财务对比）→ **列出所有收集到的可比公司**（高+中+低），用"可比性"列标注等级
- **投研简报**（HTML）：由于是 30s 必读卡片，**不展开可比公司**（KPI 已涵盖核心数据）
- 中/低可比公司在深度报告 §2.3 / §4.1 节**仅在分析时作为参考**，不进入最终报告这两节。

**产物归属**：本步骤识别结果作为模板 §2.3 行业与竞争分析的前置输入，不单独占用模板小节。

### 3.2 竞对业务对比

竞对主营/营收用 WebSearch "<竞对公司名> 主营业务 营收 2025"（研报/官网覆盖）。竞对 PE/PB/市值用脚本的批量行情入口一次获取：
```bash
# $PY 为「环境准备与降级策略」探测到的 Python 命令（python3/python 自动适配）
$PY <skill_dir>/scripts/collect_data.py --quotes {目标代码},{竞对代码1},{竞对代码2},...
```
该命令直接打印各代码的 name/price/pe_ttm/pb/mcap_yi。整理对比表：公司名/主营/营收/市值/PE/PB/市场份额。

> 若 `scripts/` 缺失或 `$PY` 为空 → 走 L2/L3 降级：用 WebFetch 直连腾讯行情 `qt.gtimg.cn/q=` 逐家获取 PE/PB/市值，手动汇总。

### 3.3 护城河分析(行业适配型)

> **方法论升级说明**:Porter 1985 经典六类护城河已扩展为**按行业适配的 6 套框架**,
> 并引入 **Hamilton Helmer 7 Powers**、**Ben Thompson Aggregation Theory** 等现代权威方法论。
> 加载 `references/moat-analysis-framework.md` 后,**第一步**:用 §0 行业适配选择器选定框架,再按该框架的指标体系执行。

按 `ai-internal-rules.md §2.5` 选护城河框架（业务模式标签 → 框架 A-F），加载 `moat-analysis-framework.md` 对应章节执行。

**三轮反问机制**（可复制性 / 周期韧性 / 隐蔽威胁）：按 `references/moat-analysis-framework.md §8` 执行。

#### 3.3.1 护城河维度评级(所选框架的专属维度,逐项宽/窄/无)

按所选框架(§0 选择器)的核心维度逐项评级(宽/窄/无)。
数据来源：`f10.财务分析` + WebSearch "<公司名> 护城河 竞争优势"（研报/分析文章）。

每轮记录:反问问题 → 分析过程 → 评级是否调整 → 理由。

**质量门**：
- [ ] 至少识别 3 家竞对
- [ ] **所选护城河框架已明确标注**(A/B/C/D/E/F/经典)
- [ ] 护城河反问轮次按数据等级：A 级 ≥ 3 轮，B 级 ≥ 2 轮，C 级 ≥ 2 轮
- [ ] 每轮有明确结论

### 3.4 为什么非它不可（竞争优势综合判断，对应模板 §2.5）

> **3 问与 §3.3 护城河三轮反问的区分**:§3.3 问的是"竞对能不能复制你的护城河"（竞对视角）；§3.4 问的是"客户为什么非选你不可"（客户视角）——两个视角互补，§3.4 必须基于 §3.3 的护城河综合评级输出。

按 §3.3 选定的护城河框架(消费/平台/制造/金融/医药/地产)→ `references/moat-analysis-framework.md §11` 取对应 Q1/Q2/Q3 指标定义,填到 `deep-analysis-report-template.md §2.5` 的 3 个 `{Q? 指标}` 占位符。
- [ ] 最终护城河评级有数据支撑
- [ ] **护城河类型**已明确归类

---

## Step4：财务四维 + 穿透分析

**输入**：从 `/tmp/{股票代码}_data.json` 读取 lrb(利润表)、fzb(资产负债表)、llb(现金流量表)、finance(主要财务指标)、f10.财务分析。

加载 `references/financial-analysis-guide.md`,**第一步**:根据 Step1 的"业务模式标签"选定权重表,再按选定的权重做四维分析。

### 4.0.0 基准年判定（必做 · 引用 `ai-internal-rules.md §0.1`）

跑报告**第一步**：按 `references/ai-internal-rules.md §0.1` 判定基准年，所有模板列名引用 `{基准年}` / `{基准年-1}` 变量，不允许硬编码具体年份。

### 4.0 行业类型对应权重表(必读)

按 `ai-internal-rules.md §3.0` 选财务权重（详见 `financial-analysis-guide.md §0.1`）。报告"摘要"必须说明选用了哪套权重。

### 4.1 四维分析(按选定的权重)

- **4.1 盈利能力**:毛利率、净利率、ROE、ROA
- **4.2 偿债能力**:流动比率、速动比率、资产负债率、利息保障倍数
- **4.3 营运能力**:存货/应收周转天数、总资产周转率
- **4.4 成长能力**:营收/净利润同比增长率、经营现金流增长率

### 4.5 杜邦三因子分解(所有行业必做,亏损公司用替代公式)

按 `ai-internal-rules.md §3.6` 执行：ROE = 销售净利率 × 总资产周转率 × 权益乘数。亏损公司不豁免,4 种替代公式任选其一(扣非归母 ROE / ROA / EBIT ROIC / 三年平均)。

**输出表**(必做):

| 报告期 | 销售净利率 | 总资产周转率 | 权益乘数 | **ROE** | 行业 ROE | 驱动因子 |
|--------|----------|------------|---------|---------|---------|---------|
| 4 期 | | | | | | {净利率/周转率/杠杆} |

### 4.6 综合评分

| 维度 | 权重(已调整) | 得分 | 加权得分 |
|------|------------|------|---------|
| 盈利能力 | {选定%} | __/100 | __ |
| 偿债能力 | {选定%} | __/100 | __ |
| 营运能力 | {选定%} | __/100 | __ |
| 成长能力 | {选定%} | __/100 | __ |
| **合计** | 100% | | **__/100** |

**输出**:使用 `templates/financial-analysis-template.md` 生成 `{公司名}_财务分析.md`。

**质量门**:
- [ ] **权重调整已说明**(报告摘要中列出选用的权重表)
- [ ] 四维每项至少 4 个指标
- [ ] 所有比率列出公式和计算过程
- [ ] 每个数字标注来源
- [ ] 趋势分析(至少 4 期对比)
- [ ] 有行业对比
- [ ] **杜邦三因子分解(必做,所有行业,亏损公司用替代公式)**
- [ ] 综合评分已计算

---

## Step5：相对估值

**输入**：竞对公司 + 从 `/tmp/{股票代码}_data.json` 读取 quote、reports、ths_forecast。

加载 `references/valuation-methods.md`。

### 5.1 相对估值（四步法）

**方法选取**：按 `ai-internal-rules.md §7.1` 选 1-3 种估值方法（PE-TTM / PB-MRQ / EV/EBITDA-TTM / PS-TTM / NAV 等），按 §7.2 写估值结论。

**自动判定**：`scripts/valuation.py` 的 `_classify_industry(data)` 已实现上述判定逻辑，输入申万一级行业自动返回首选方法 + 交叉验证方法。

**实操流程**：

1. **调估值脚本**（`scripts/valuation.py`）：
   ```bash
   # $PY 为「环境准备与降级策略」探测到的 Python 命令（python3/python 自动适配）
   $PY scripts/valuation.py 600519 peers.json
   # peers.json 示例：{"peer_pe_median": 25.0, "peer_pb_median": 8.0}
   ```
   脚本输出 JSON：行业分类 / 首选方法 / 合理股价 / 上行空间 / 数据完整度

   > 若 `scripts/` 缺失或 `$PY` 为空 → 走 L2/L3 降级：`valuation.py` 的 `_classify_industry()` 逻辑在 `references/valuation-methods.md` 中有等价的文本版判定规则，LLM 按该规则手动选方法、算合理股价。
2. **交叉验证**（10 个变体中至少 2 个）：
   
   - 偏差 < 15%：取均值
   - 偏差 15-30%：取均值但标注分歧原因
   - 偏差 > 30%：必须分析分歧（周期性/特殊项目/会计差异），取更保守的估值
3. **数据完整度检查**：< 60% 时提示补充行业数据
4. **报告写作**：`templates/deep-analysis-report-template.md` §四估值（只展示数字，公式放 `valuation-methods.md`）

---

## Step6：生成产物与清理

跑完 6 步分析后，**输出两份产物**（默认行为）：

| 产物 | 文件名 | 模板 |
|------|--------|------|
| **深度分析报告** | `{公司名}_深度分析报告_{YYYYMMDD}.md` | `templates/deep-analysis-report-template.md` |
| **投研简报** | `{公司名}_投研简报_{YYYYMMDD}.html` | `templates/briefing-card-template.html` |

### 6.0 产物生成的强制执行规则（⚠️ 必须严格遵守）

> **这是产物质量的最后一道门。无论走 L1/L2/L3 哪条路径，以下规则不可跳过。**

**步骤 1：读取模板文件（强制）**

在写任何产物之前，**必须先使用 `Read` 工具读取对应模板文件的完整内容**：

- 深度分析报告 → `Read <skill_dir>/templates/deep-analysis-report-template.md`
- 投研简报 → `Read <skill_dir>/templates/briefing-card-template.html`
- 单步模式财务分析 → `Read <skill_dir>/templates/financial-analysis-template.md`
- 单步模式公司画像 → `Read <skill_dir>/templates/company-profile-template.md`

**不得凭记忆或猜测来编写产物结构——必须以读取到的模板文件为准。**

**步骤 2：严格按模板结构填充**

读取模板后，产物的生成方式为：

1. **保留模板的全部章节标题、表格结构、格式标记不变**
2. **将 `{占位符}` 替换为实际分析数据**（如 `{公司名}` → "中国巨石"，`{YYYY-MM-DD}` → "2026-07-14"）
3. **将模板中的说明性括号文字替换为具体内容**（如"（100-200 字描述...）" → 实际的描述段落）
4. **不删除模板的任何章节**，数据缺失时标注 `"N/A"` 或"信息盲区"
5. **不自行新增模板中不存在的章节**（除非单步模式路由表明确要求）

**禁止行为**：
- ❌ 不读模板直接按自己的理解写报告
- ❌ 改变模板的章节顺序或层级结构
- ❌ 省略模板中存在的任何标准化区块（如"30 秒极简版"、"摘要"列表等）

### 6.1 清理临时文件

分析完成后清理临时数据：
```bash
rm -f /tmp/{股票代码}_data.json
```
