# Stock Analysis Enhanced

> 一句话搞定个股分析 — 说"分析XXX"，自动采集30+数据源 → AI完成基本面(Step 0-8)+技术面+资金面的完整研报 → 生成交互式HTML报告。支持增量更新（K线/行情/技术指标自动刷新）。触发词："分析XXX股票"（首次）或"更新XXX股票"（增量）。

- Skill: `mingli30119/stock-analysis-enhanced` (Agent Skill, multi-file: 14 files)
- Install (CLI): `npx skillmds@latest add mingli30119/stock-analysis-enhanced`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mingli30119/stock-analysis-enhanced/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: mingli30119 (https://skillmd.com/u/mingli30119)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mingli30119/stock-analysis-enhanced

---


# 一句话搞定个股分析

> 版本：v3.1 | 更新：2026-05-30 | 用户说一句话 → 30+数据源采集 → Step 0-8 基本面 + 第9章技术面 + 资金面 → 双主题交互式HTML

---

## 📋 快速导航

- [⚡ 使用方式](#使用方式) — 一句话触发，全自动执行
  - [场景判断](#场景判断)
  - [场景A：首次分析](#场景a首次分析) — 完整三阶段
  - [场景B：增量更新](#场景b增量更新) — 快速刷新数据
- [🏗️ 三层架构](#三层架构) — Phase 1 数据采集 → Phase 2 AI分析 → Phase 3 HTML
- [📊 输出内容](#输出内容) — MD 报告 + HTML 报告的完整结构
- [🎨 HTML手写规范](#html手写规范) — 分批手写 + grep 机械校验
- [🔧 执行流程](#执行流程) — Phase 1/2/3 详细步骤
- [🔄 增量更新详细说明](#增量更新详细说明) — 脚本自动 + AI 手动

---

## ⚡ 使用方式

### 场景判断

**AI必须根据用户输入的关键词判断场景：**

#### 场景A：首次分析（完整流程）

**触发关键词：**
- "分析 XXX股票"
- "个股分析 XXX"
- "研究 XXX"
- "生成 XXX报告"
- 用户明确说"首次分析"

**判断逻辑：**
- 用户输入包含上述关键词 → 执行首次分析（Phase 1→2→3）

#### 场景B：增量更新（只更新数据）

**触发关键词：**
- "更新 XXX股票"
- "刷新 XXX报告"
- "增量更新 XXX"
- "更新报告"
- 用户明确说"更新"

**判断逻辑：**
1. 用户输入包含上述关键词
2. 检查 `output/个股研究-{股票名称}.html` 是否存在
3. 如果存在 → 执行增量更新
4. 如果不存在 → 提示用户："未找到 XXX 的报告，是否需要首次分析？"

---

### 场景A：首次分析

**当用户说"分析 XXX股票"时，一句话触发全流程：**

### Phase 1: 数据采集（3-5分钟）

```bash
cd G:/vibe/my-skills/stock-analysis-enhanced
python stock_full_report.py <股票代码>
```

**示例：**
```bash
python stock_full_report.py 600519  # 贵州茅台
python stock_full_report.py 600673  # 东阳光
```

**唯一输出：** `output/data_<股票代码>.json`（包含K线、财务、股东、业务构成等完整数据，供Phase 2/3使用）

**⚠️ Phase 1完成后立即进入Phase 2**，不要停下来询问用户。JSON只是数据中间产物。

**⚠️ Phase 1 新增功能：** 自动计算技术指标（MACD/KDJ/RSI/BOLL/MA），保存到 `data_{代码}.json` 的 `technical_indicators` 和 `technical_signals` 字段，供 Phase 3 生成第9章使用。

---

### 场景B：增量更新

**执行命令：**

```bash
cd G:/vibe/my-skills/stock-analysis-enhanced副本
python update_stock_report.py <股票代码>
```

**常用参数：**
```bash
# 基本用法（自动查找HTML文件）
python update_stock_report.py 000066

# 指定HTML文件
python update_stock_report.py 000066 --html output/个股研究-中国长城.html

# 强制更新（跳过检查，直接更新）
python update_stock_report.py 000066 --force
```

**更新内容：**
- ✅ K线数据（rawData数组）
- ✅ Hero区域（最新价、涨跌幅）
- ✅ 第9章技术指标（MACD/KDJ/RSI/BOLL图表）
- ❌ 基本面分析（Step 0-8，不更新）

**详细说明：** 见本文件末尾"[🔄 增量更新详细说明](#增量更新详细说明)"章节

---

### Phase 2: AI深度分析（30-60分钟）

**AI必须手动执行以下步骤：**

1. **读取数据：** `output/data_<股票代码>.json`
2. **执行MCP搜索：** 根据实际需要搜索（通常3-6次）
   - 行业趋势、市场规模
   - 竞争对手、市场份额
   - 券商研报、目标价
   - 最新新闻、政策动态
3. **逐步完成Step 0-8分析：** 严格按照分析框架，每个Step达到要求
4. **输出MD报告：** `output/个股研究-<股票名称>.md`

**⚠️ 三阶段连续执行，中间不中断：** Phase 2完成后**立即进入Phase 3**，不要停下来询问用户是否继续。MD报告只是中间产物，HTML才是最终交付物。

---

### Phase 3: HTML生成层（AI手动分批拼装 + 逐批机械校验）

> ⚠️ 写 HTML 只用 Write 工具。整个 Phase 3 只需 6 次 Write 调用，约 30 分钟，完全在单会话内完成。不要用 Python 替代。

**原理：** AI手写完整HTML——从范例提取结构参照，从 `shared/` 搬运CSS/JS，从MD报告提取内容。**分批 Write，每批写完后立即用 grep 对范例做机械校验，通过才继续。**

**核心规则：不靠记范例，靠每批 grep diff。**

**执行步骤：**

1. **读取模板：** `shared/template_base.css` + `shared/template_base.js`
2. **读取范例并提取参照：** `examples/个股研究-中国长城.html` → 用 grep 提取 nav 锚点列表、section id 列表，保存为临时参照文件
3. **读取校验规范：** `HTML手写参考.md` → 严格按「分批机械校验」表格逐批执行
4. **读取数据：** `output/个股研究-{股票名称}.md` + `output/data_{代码}.json`
5. **分批手写HTML（每批 = Write + grep校验）：**
   - 每批 ≤300行，用 **Write工具** 直接写HTML markup
   - **写完后立即跑该批对应的 grep 校验命令**（命令清单见 `HTML手写参考.md` § 分批机械校验）
   - 校验通过 → 下一批。校验失败 → grep 范例对应行 → 比对 → Edit 修正 → 重新校验
6. **合并：** 仅用 `cat` 做机械字节拼接
7. **终验：** 运行合并后终验命令（nav-id 配对 + 结构完整性），全部通过才输出最终文件
8. **输出：** `output/个股研究-{股票名称}.html`

### ⚠️ 分批手写规则（强制）

**禁止行为：**

| 禁止 | 原因 |
|------|------|
| ❌ **Python f-string/template 生成HTML** | 需要大量 `{{}}` 转义，易出错不可维护 |
| ❌ **Bash heredoc 生成HTML** | 多行HTML下经常EOF匹配失败 |
| ❌ **一次性写出整个HTML** | >300行文件必须分批，每批独立一个Write调用 |
| ❌ **用 `python -c` 拼接HTML字符串** | 属于Python生成，不是手写 |

**正确做法：**

| 操作 | 工具 | 说明 |
|------|------|------|
| 写入HTML内容 | **Write** | 直接写HTML markup，无转义问题 |
| 精确局部修改 | **Edit** | 替换特定行，不改动其他部分 |
| 机械合并部分文件 | **Bash `cat`** 或 **Python `file.read()`** | 仅读取+拼接字节，不生成任何markup |

**标准分批方案（~900行HTML）—— 每批三步：Read范例 → Write → grep：**

**参考范例：** `examples/个股研究-中国长城.html`（864行，金标准成品）

> ⚠️ **参考范例路径不可变。** 该文件位于 `examples/` 目录（稳定范例），禁止替换为 `output/` 下的生成结果。行号基于当前版本，如范例更新需同步修正行号。

| 批次 | Step 1: Read范例（先看再写） | Step 2: Write | Step 3: grep兜底 |
|------|---------------------------|---------------|------------------|
| Batch 0 | `Read 中国长城 line=1-129`（head+style段） | Write DOCTYPE + `<head>` + `<style>` | `grep -c '<style>'`=1, `grep 'echarts\|MathJax'` 确认CDN |
| Batch 1 | `Read 中国长城 line=130-195`（nav+hero+conclusion+profile网格） | Write `<body>` + nav + hero + conclusion(含交易参数行) + grid-2(公司画像+近期动态) | `grep -oc 'href="#'`=14, `grep -c 'hero-meta-item'`=5, `grep 'nav-analysis-date'`存在, `grep -c '利好\|利空\|中性'`≥5, `grep 'overflow-y\|max-height:300'`=0, `grep -c 'style="[^"]*color:#fff[^"]*"\|style="[^"]*color:white[^"]*"\|style="[^"]*color:rgba(255'`=0, `grep -c '买入区间\|止损位\|目标价\|建议仓位'`≥4 |
| Batch 2 | `Read 中国长城 line=196-260`（饼图+财务+K线） | Write 饼图+财务grid-2 + K线card(kline-section) | `grep 'id="kline-section"'` 存在, `grep 'height:480px'` 存在, `grep -c 'markLine'`≥1, `grep -c 'markPoint'`≥1 |
| Batch 3 | `Read 中国长城 line=260-397`（Step 0-3） | Write Step 0-3 卡片（mission/macro/chain/quality） | `grep -o 'id="[^"]*"'` → mission/macro/chain/quality 四者存在 |
| Batch 4 | `Read 中国长城 line=398-550`（Step 4-6） | Write Step 4-6 卡片（elasticity/risk/valuation） | `grep -o 'id="[^"]*"'` → elasticity/risk/valuation 三者存在, `grep -c 'score-fill.*width'`≥10, `grep 'border-top:2px solid var(--gold)'` 弹性树横线存在 |
| Batch 5 | `Read 中国长城 line=551-863`（Step 7-8+第9章+footer） | Write Step 7-8 卡片 + 第9章技术面卡片（信号总览6卡片→技术图表2x2→多周期趋势→位置形态→动量量价→资金面→市场风格→综合研判）+ footer + `</div>` | `grep -o 'id="[^"]*"'` → compare/tracking/technical 存在, `grep '📌'` 存在, `grep -c '<p>' footer段`=5, `grep 'strong' footer段`=0, `grep '催化剂兑现追踪\|已兑现\|待兑现'`存在, `grep '📋 事件记录'`存在, `grep -c 'chart-macd\|chart-kdj\|chart-rsi\|chart-boll'`=4 |
| Batch 6 | `Read 中国长城 line=864-1155`（script段）；从 `data_{代码}.json` 提取K线（最近120条）和业务构成 | Write `<script>...</script>`（搬运 `template_base.js` 完整内容，替换4处占位符：`__RAW_DATA_ARRAY__` → K线JSON数组、`__PIE_DATA_ARRAY__` → 业务构成JSON数组、`__MARKLINE_DATA__` → markLine数组、`__MARKPOINT_DATA__` → markPoint数组。模板已含技术指标计算+6个渲染函数，直接搬运无需修改） | `grep -c '__'`=0, `grep -cF 'const rawData'`=1, `grep -c 'renderMACD'`=1, `grep -c 'renderKDJ'`=1, `grep -c 'renderRSI'`=1, `grep -c 'renderBOLL'`=1, `grep -c '</script>'`=1 |
| 合并+终验 | — | Bash `cat _h_part*.html > 最终文件`，然后运行 **`HTML手写参考.md` § 终验自检清单** 全部 **16** 条 | 全部通过才输出最终文件 |

**执行规则（不可跳过）：**
1. 每批第 1 步：**必须用 Read 工具打开范例对应行号区间**。读完范例段落后立即 Write，中间不做其他操作。
2. 写完后跑第 3 步 grep。对不上 → `grep` 范例对应行 → `grep` 自己写的 → 看差异 → Edit 修正 → 重跑 grep。
3. 三步全部通过才进入下一批。

> **若各批写为独立文件，用 `cat _h_part*.html > 最终文件` 合并，然后删临时文件。**

**Step 0-8 关键可视化组件清单：**
- **Step 0:** 4个信息卡片（标的/周期/风格/命题）
- **Step 1:** 核心矛盾高亮框
- **Step 2:** 产业链SVG图谱、grid-2布局、关键判断提示框
- **Step 3:** grid-2布局、6个评分条、评级徽章
- **Step 4:** 弹性树、公式卡片2x2、情景分析grid-3
- **Step 5:** grid-2布局、止损信号列表
- **Step 6:** grid-2布局、三档目标价、盈亏比量化卡片
- **Step 7:** 对比表格、增长引擎切换3卡片
- **Step 8:** grid-2布局、执行清单、verdict-highlight、五维评分、📌总结框（强制，红色左边框）

**关键约束：**
- **OHLC 转换**：`ohlc.push([d[1], d[4], d[3], d[2]])` — rawData 格式 `[日期, 开盘, 最高, 最低, 收盘, 成交量]`（akshare 原生列序），itemStyle 用 `color: c.upColor, color0: c.downColor`。与 stock-analysis-github 验证通过版本一致
- 成交量柱必须每根单独着色（红涨绿跌）
- 产业链 SVG 文字使用 `.svg-hdr` / `.svg-sub` class
- MathJax 使用 `\\(...\\)` 行内分隔符 → **HTML源码中写 `\(...\)`（单反斜杠），禁止 `\\(...\\)`（双反斜杠）**。HTML text 中反斜杠不是转义符，双反斜杠会导致 MathJax 分隔符匹配失败
- 所有CSS class必须来自 `shared/template_base.css`
- **内容区子标题禁止编号前缀**（不用 "1a/1b/2a"），直接写中文描述文字
- **禁止 h2/h3 标题带"Step X"编号前缀**：卡片标题只写中文描述（如"任务锁定与核心矛盾"，不写"Step 0 · 任务锁定"），`.sub` 同样禁止编号
- **Hero meta-item 5项固定顺序**：①分析基准日（`data-cutoff`日期，标签"分析基准日"，值格式`YYYY-MM-DD`）②公司质地等级（Step 3评分，标签"公司质地"）③中期目标价 ④盈亏比 ⑤风险等级
- **两套评分标签区分**：Step 3 评分 → 标签"公司质地评分"；Step 8 评分 → 标签"综合交易评分"。两套分维度不同、数值不同是正常的，标签区分清楚即可
- **产业链 SVG 内容质量**：不满足于基础的3节点模板。根据 MD 分析内容扩充节点——多业务线（如 IVD vs SPD）、分支节点（如子公司网络）、关键数据标注（如各业务毛利率）。**每个`<text>`元素≤14个中文字**，超出换新`<text>`行(y+22)。写完自检：最长text字符数×13px < 所在rect的width
- **📌总结框为强制组件**：Step 8 底部必须有一个独立的红色左边框总结框（`border-left:4px solid var(--red-up)`），包含 `📌 总结` 标题和一段话总结，不可省略或用 verdict-highlight 替代
- **弹性树强制HTML模板**：使用flex+CSS边框构建树形图——顶层节点(金色边框)→竖线(2px×6px gold)→横线(border-top:2px solid gold)→三列子节点flex(2:1:1)。🔴红色/🟡金色/⚪灰色分别标记核心/次要/其他业务。每个子节点含业务名+营收占比+毛利率+业务线+弹性因子。**禁止纯文本无树形图**
- **评分条score-fill宽度强制**：每个 `.score-fill` 必须为 `<div>`（**禁止 `<span>`**，inline 元素 width 无效），必须有内联 `style="width:X%"`，X为该维度得分百分比。格式：`<div class="score-fill" style="width:65%;"></div>`——不可省略style属性，不可用CSS class替代width。高分段(≥70%)金色，中分段(40-69%)橙色，低分段(<40%)红色
- **核心结论区强制附加交易参数行**：`.conclusion-top` 内 verdict-tags 下方必须有一行 `border-top:1px dashed var(--border)` 分隔，展示5个关键交易参数（flex行，居中排列）：①买入区间（绿色）②止损位（绿色）③目标价（红色）④建议仓位（金色）⑤盈亏比（金色）。格式：`<div style="font-size:11px;color:var(--text-muted);">标签</div><div style="font-weight:700;color:语义色;font-size:15px;">值</div>`。参数来源于 MD 报告 Step 6/8 分析结论
- **Hero标签限制**：`.hero-tags` 内标签≤5个，每个标签≤4个中文字
- **Footer格式**：作者行和联系方式行**禁止使用strong标签和金色高亮**，保持纯文本
- **禁止HTML body内联硬编码颜色**：所有 `style="color:#fff"` / `style="color:white"` / `style="color:rgba(255,255,255,...)"` 必须改用CSS变量（`var(--text-primary)` / `var(--text-secondary)` 等），确保双主题切换时文字始终可见。浅色模式下 `card-bg-alt` 为 `#fef5e7`（暖奶油色），白色文字完全不可见
- **近期动态强制规范**：**禁止使用滚动容器**（`max-height`/`overflow-y`），固定高度展示。每条新闻用纯文本 `<span>`（暂不设链接）。每条右侧必须有**利好/利空/中性标签**（`<span>` + 内联style），利好=红色背景+红字（`background:rgba(245,86,86,0.15);color:var(--red-up)`），重大利好另加红色左边框（`border-left:3px solid var(--red-up)`），中性=金色背景+金字（`background:rgba(212,168,83,0.15);color:var(--gold)`），利空=绿色背景+绿字。标签文字≤4字。**增量更新时，近期动态必须替换为当日最新新闻，重新判断利好利空属性**
- **K线图强制技术标注**：必须包含4条markLine（虚线金色`#d4a853`）：前高压力位/关键均线(MA20或MA60)/加仓位/止损位，价格取自MD报告分析内容。2个markPoint（pin图标）：当前价位(金色`#d4a853`)+关键历史价位(红色`#f55656`)。label用`#fff` 字号11px fontWeight bold。markLine label用`#d4a853` 字号10px

---

### 输出文件

```
output/
├── data_<股票代码>.json           # Phase 1: 原始数据（akshare采集）
├── 个股研究-<股票名称>.md          # Phase 2: 完整分析报告
└── 个股研究-<股票名称>.html        # Phase 3: 可视化HTML报告
```

---

## 🔧 配置要求

### 所有版本通用

**必需配置：**
- Python 3.8+
- akshare库（数据采集）
- Claude Code环境（AI分析和HTML生成）
- **智谱AI MCP配置**（`.mcp.json`）：用于Phase 2的中文信息搜索

**配置示例：**

`.mcp.json`（智谱AI搜索）：
```json
{
  "mcpServers": {
    "zhipu": {
      "command": "npx",
      "args": ["-y", "@zhipu-ai/mcp-server"],
      "env": {
        "ZHIPU_API_KEY": "your_zhipu_api_key"
      }
    }
  }
}
```

**说明：**
- Enhanced版本：本地使用，MCP已配置
- Competition版本：比赛提交，需确保MCP配置文件存在
- GitHub版本：开源发布，需在README中说明MCP配置步骤

---

## 🏗️ 三层架构

### 架构图

```
┌─────────────────────────────────────────────┐
│               用户输入                       │
│     "分析 XXX股票" 或 "分析 600519"         │
└────────────────────┬────────────────────────┘
                     │
  ┌──────────────────▼──────────────────┐
  │  Phase 1: 数据采集（脚本）           │
  │  python stock_full_report.py <code> │
  │  → output/data_{代码}.json          │
  └──────────────────┬──────────────────┘
                     │
  ┌──────────────────▼──────────────────┐
  │  Phase 2: AI分析（手写）             │
  │  读取 data JSON → MCP搜索           │
  │  → 逐步完成 Step 0-8                │
  │  → output/个股研究-{名称}.md         │
  └──────────────────┬──────────────────┘
                     │
  ┌──────────────────▼──────────────────┐
  │  Phase 3: HTML生成（手写）           │
  │  CSS/JS 从 shared/ 搬运             │
  │  内容从 MD + data JSON 提取         │
  │  结构参考 examples/ 范例            │
  │  → output/个股研究-{名称}.html       │
  └──────────────────┬──────────────────┘
                     │
              ┌──────▼──────┐
              │  完成 ✓     │
              └─────────────┘
```

---

## 📊 输出内容

### MD报告结构（540-740行）

```markdown
# {股票名称}（{股票代码}）深度研究

## 基本信息
- 股票名称、代码、行业、市值、PE、PB等

## 财务摘要（最近一年）
- 营业收入、净利润、毛利率、ROE

## 股东结构
- 十大股东表格

## 主营业务构成
- 业务构成表格

---

## Step 0: 任务锁定（10行）
- 标的、周期、数据截止日、研究状态、风格预判

## Step 1: 宏观与周期定位（50行）
- 1a. 经济周期映射
- 1b. 政策与环境扫描
- 1c. 核心矛盾提炼

## Step 2: 产业链深度拆解（100行）
- 2a. 题材来源判断
- 2b. 产业链图谱（ASCII/Mermaid）
- 2c. 趋势三要素
- 2d. 价值链利润分布

## Step 3: 公司筛选与质量评分（50行）
- 3a. 正面筛选清单
- 3b. 不碰清单
- 3c. 质量评分（100分制）

## Step 4: 业绩弹性测算（80行）
- 4a. 分业务弹性树
- 4b. 价格敏感度公式
- 4c. 情景分析

## Step 5: 风险分析（40行）
- 5a. 风险清单
- 5b. 逻辑破坏条件（5个止损信号）

## Step 6: 估值与买卖时机（100行）
- 6a. 估值方法
- 6a+. 资金面分析
- 6a++. 技术面分析
- 6b. 三档目标价
- 6c. 盈亏比量化

## Step 7: 对标分析（60行）
- 7a. 案例类比法
- 7b. 增长引擎切换

## Step 8: 跟踪计划与综合结论（50行）
- 8a. 分层跟踪锚点
- 8b. 执行清单
- 8c. 综合结论（一句话判断、风险等级、操作建议）
- 8d. 五维综合评分
```

### HTML页面结构（实际输出格式）

```
<!DOCTYPE html>
<html>
<head>
  <meta> + <title>
  <script src="echarts CDN">
  <script src="MathJax CDN">
  <style> /* = template_base.css 完整搬运 */ </style>
</head>
<body>
  <nav class="top-nav">        <!-- 顶部导航（sticky） -->
    股票名+代码 · logo · **14个固定nav-links（含技术面）**（行情/结论/画像/K线/任务/宏观/产业链/质量/弹性/风险/估值/对标/跟踪）· **分析基准日**（格式：`📅 YYYY-MM-DD`，12px字号，颜色跟随主题）· 主题切换按钮
  </nav>
  <div class="container">
    <div class="hero">         <!-- Hero行情卡片 -->
      价格 + 涨跌幅 + **hero-meta 5项固定**（分析基准日/质量评级/中期目标价/盈亏比/风险等级）+ 标签组
    </div>
    <div class="conclusion-top"> <!-- 结论置顶卡片 -->
      核心结论标签 + 综合判断 + 详细说明 + 标签组
    </div>
    <!-- 公司画像 + 新闻（grid-2） -->
    <!-- 主营业务饼图 + 关键财务指标（grid-2） -->
    <!-- K线图卡片（ECharts candlestick + 成交量） -->
    <!-- K线底部4指标行（向上空间/盈亏比/目标价/周期） -->
    <!-- 分析章节卡片：任务/宏观/产业链/质量/弹性/风险/估值/对标/跟踪 -->
    <!-- 页脚（固定模板，见 HTML手写参考.md） -->
    <!-- 页脚含：免责声明 + 数据截止/研究状态/分析基准日 + 数据来源行 + 作者信息 + 联系方式 -->
    <!-- 分析基准日格式：📅 分析基准日：YYYY-MM-DD（数据截止日当天或最近交易日） -->
  </div>
  <script> /* = template_base.js 骨架搬运 + 数据注入 */ </script>
</body>
</html>
```

> **关键约束：** HTML不使用左侧目录导航（旧设计规范中的 `nav.toc` 已废弃），改用顶部 sticky 导航 + 滚动高亮。

---

## 🎨 HTML手写规范

> **Phase 3开始时，必须读取 `HTML手写参考.md`。该文件包含：组件速查表、颜色语义、以及分批机械校验的 grep 命令清单。校验命令不可跳过。**

### 核心要点

- `<style>` = `shared/template_base.css` 完整搬运，不做修改
- `<script>` = `shared/template_base.js` 骨架 + 注入 rawData（K线）+ pieData（业务构成）
- `<body>` 结构参考 `examples/个股研究-中国长城.html`
- OHLC 格式 `[open, close, low, high]`，成交量每根单独着色
- 红涨绿跌全篇一致，所有CSS class来自template_base.css
- 产业链SVG文字用 `.svg-hdr` / `.svg-sub` class，MathJax用 `\\(...\\)`

### 页面结构（强制顺序）

```
top-nav → .hero → .conclusion-top → grid-2(公司画像+动态) → grid-2(饼图+财务)
→ .card(K线图) → 分析章节9卡片 → footer
```

### 详细参考

完整组件速查表、颜色语义表、CHECKS自检清单 → **[HTML手写参考.md](HTML手写参考.md)**

---

## 🌓 双主题颜色规范

> **浅色/深色模式切换通过 `<button class="theme-toggle" id="themeToggle">` 实现，CSS 变量切换由 `:root` 和 `body.light-mode` 两组变量控制。**

### 浅色模式强制检查清单

**Phase 3 分批校验时，每批完成后必须逐项确认浅色模式覆盖完整：**

| 检查项 | 深色模式 | 浅色模式要求 | grep 校验命令 |
|--------|---------|-------------|--------------|
| Nav logo文字 | `color:#fff` | `color:var(--text-primary)` | `grep -c 'light-mode.*logo'` ≥1 |
| Nav logo-icon | `color:#fff` | `color:var(--card-bg)` | `grep 'light-mode.*logo-icon'` 存在 |
| Nav stock-name/stock-code | 继承logo白色 | 继承修复后可见 | 同上条覆盖即可 |
| 卡片标题 h2 | `color:#fff` | `color:var(--text-primary)` | `grep -c 'light-mode.*card-header h2'` ≥1 |
| Hero区域 | `color:#fff` | `color:var(--text-primary)` | `grep -c 'light-mode.*\.hero'` ≥1 |
| 结论大字 `.big-verdict` | `color:#fff` | `color:var(--text-primary)` | `grep 'light-mode.*big-verdict'` 存在 |
| Hero meta label | `color:rgba(255,255,255,0.7)` | `color:var(--text-muted)` | `grep 'light-mode.*hero-meta-item.*label'` 存在 |
| Hero meta val | `color:var(--gold-light)` | `color:var(--gold)` | `grep 'light-mode.*hero-meta-item.*val'` 存在 |
| 评级标题 `.body .title` | `color:#fff` | `color:var(--text-primary)` | `grep 'light-mode.*rating-callout.*title'` 存在 |
| 产业链SVG `.svg-hdr` | `fill:#e8e9ec` | `fill:#2a1f12` | `grep 'light-mode.*svg-hdr'` 存在 |
| 产业链SVG `.svg-sub` | `fill:#b0b3be` | `fill:#6b5634` | `grep 'light-mode.*svg-sub'` 存在 |
| KPI value `.value` | `color:var(--gold-light)` | `color:var(--gold)` | `grep 'light-mode.*kpi-info-item.*value'` 存在 |
| Theme toggle按钮 | 默认样式 | 浅底深字可辨识 | `grep 'light-mode.*theme-toggle'` 存在 |
| 新闻链接 `.news-item a` | 继承text-secondary | 保持可点击辨识 | 无需额外覆盖 |

### 浅色模式覆盖CSS模板

**以下代码必须完整出现在 `<style>` 标签中（template_base.css 已包含）：**

```css
body.light-mode .top-nav{background:rgba(255,251,245,0.92);border-bottom-color:var(--gold)}
body.light-mode .top-nav .logo{color:var(--text-primary)}
body.light-mode .top-nav .logo-icon{color:var(--card-bg)}
body.light-mode .top-nav .stock-name{color:var(--text-primary)}
body.light-mode .top-nav .stock-code{color:var(--text-muted)}
body.light-mode .theme-toggle{background:rgba(0,0,0,0.05);border-color:var(--gold);color:var(--gold)}
body.light-mode .theme-toggle:hover{background:rgba(0,0,0,0.1)}
body.light-mode .nav-links a{color:var(--gold)}
body.light-mode .nav-links a:hover,body.light-mode .nav-links a.active{background:rgba(0,0,0,0.05);color:#7f1d1d}
body.light-mode .hero{background:linear-gradient(105deg,#fef5e7,#fffbf5);color:var(--text-primary);border-color:var(--gold)}
body.light-mode .hero-price{color:var(--text-primary)}
body.light-mode .hero-change{background:rgba(220,38,38,0.1);color:var(--red-up)}
body.light-mode .hero-meta-item .val{color:var(--gold)}
body.light-mode .hero-meta-item .label{color:var(--text-muted)}
body.light-mode .hero-tag{background:rgba(212,168,83,0.15);border-color:var(--gold);color:var(--gold)}
body.light-mode .conclusion-top{background:linear-gradient(135deg,#fff9f0,#fef5e7)}
body.light-mode .conclusion-top .big-verdict{color:var(--text-primary)}
body.light-mode .card-header h2{color:var(--text-primary)}
body.light-mode .tag{background:rgba(212,168,83,0.15);color:var(--gold);border-color:var(--gold)}
body.light-mode table.cons thead th{background:linear-gradient(180deg,#f55656,#c0392b)}
body.light-mode .score-bar .score-track{background:#f0e4ce}
body.light-mode .rating-callout{background:linear-gradient(135deg,#fff9f0,#fef5e7)}
body.light-mode .rating-callout .body .title{color:var(--text-primary)}
body.light-mode .verdict-highlight{background:#fef5e7}
body.light-mode .verdict-highlight .judgment{color:var(--gold)}
body.light-mode .verdict-highlight .v-val{color:var(--text-primary)}
body.light-mode .chain-svg .svg-hdr{fill:#2a1f12}
body.light-mode .chain-svg .svg-sub{fill:#6b5634}
body.light-mode .kpi-info-item .value{color:var(--gold)}
```

### 禁止的硬编码颜色

| 禁止写法 | 原因 | 正确写法 |
|---------|------|---------|
| `color:#fff`（无浅色覆盖） | 浅色模式白色背景上看不见 | 用CSS变量 + body.light-mode覆盖 |
| `color:white`（无浅色覆盖） | 同上 | 同上 |
| `fill:#fff`（SVG文字，无浅色覆盖） | SVG白字在浅色背景不可见 | 用`.svg-hdr`/`.svg-sub` class，已含双主题覆盖 |
| `color:rgba(255,255,255,0.7)`（无浅色覆盖） | 半透明白色同理 | 用`var(--text-muted)` + light-mode覆盖 |

---

## 🔧 执行流程

### Phase 1: 数据采集层（3-5分钟）

**脚本：** `stock_full_report.py`

**功能：**
1. 使用akshare采集数据源
2. Fallback机制：akshare失败→跳过
3. **唯一输出：** `output/data_{代码}.json`（供Phase 2/3使用）

**数据源：** 基础信息、行情（3年日K线）、主营业务、资金流向、财务数据、股东结构、公告新闻、研究报告

### Phase 2: AI分析层（45-75分钟）

**AI手动执行，无自动化脚本。**

**2.1 基础信息写入（5分钟）**
- 读取 `output/data_{代码}.json`
- 写入MD头部：股票名称、代码、行业、市值、PE/PB、财务摘要、股东结构、主营业务构成

**2.2 MCP搜索（10分钟）**
- 用智谱AI搜索行业趋势、竞争对手、券商研报、最新新闻（通常3-6次）
- 智谱失败则fallback到Tavily

**2.3 AI逐步分析Step 0-8（30-60分钟）**

**⚠️ MD写作禁止事项（防止内容泄露到HTML）：**
- ❌ MD正文任何位置禁止出现：`@明立玩AI` / `作者：明立` / `ll-mingli1221` / 社交媒体ID
- ❌ MD末尾禁止添加署名行（如 `> 分析框架：... | @明立玩AI`）
- ✅ 这些信息仅出现在HTML的footer中，由Phase 3统一添加

**强制执行清单：**

```
□ Step 0: 任务锁定（10行）
  ├─ 标的（公司名、代码、交易所）
  ├─ 周期（短线/中线/长线）
  ├─ 数据截止日（YYYY-MM-DD）
  ├─ 研究状态（首次覆盖/持续跟踪）
  └─ 风格预判（配置型/交易型/左侧博弈型）

□ Step 1: 宏观与周期定位（50行）
  ├─ 使用MCP搜索结果：行业趋势
  ├─ 1a. 经济周期映射
  ├─ 1b. 政策与环境扫描
  └─ 1c. 核心矛盾提炼（XX vs YY）

□ Step 2: 产业链深度拆解（100行）
  ├─ 使用MCP搜索结果：竞争对手、产业链
  ├─ 2a. 题材来源判断
  ├─ 2b. 产业链图谱（ASCII或Mermaid代码块）
  ├─ 2c. 趋势三要素（表格+打分）
  └─ 2d. 价值链利润分布（表格）

□ Step 3: 公司筛选与质量评分（50行）
  ├─ 使用akshare数据：财务、股东
  ├─ 3a. 正面筛选清单（6项标准）
  ├─ 3b. 不碰清单（负面排查）
  └─ 3c. 公司质地评分（100分制，6个维度——注意：与Step 8综合交易评分维度不同，两个分不一定相等）

□ Step 4: 业绩弹性测算（80行）
  ├─ 使用akshare数据：主营业务、财务
  ├─ 4a. 分业务弹性树（ASCII代码块）
  ├─ 4b. 价格敏感度公式（3个公式）
  └─ 4c. 情景分析（悲观/基准/乐观表格）

□ Step 5: 风险分析（40行）
  ├─ 5a. 风险清单（表格：风险类型、影响程度、发生概率）
  └─ 5b. 逻辑破坏条件（5个止损信号）

□ Step 6: 估值与买卖时机（100行）
  ├─ 使用MCP搜索结果：券商研报
  ├─ 使用akshare数据：K线、资金流向
  ├─ 6a. 估值方法选择
  ├─ 6a+. 资金面分析（筹码分布、主力资金）
  ├─ 6a++. 技术面分析（均线、支撑阻力）
  ├─ 6b. 三档目标价（短期/中期/长期表格）
  └─ 6c. 盈亏比量化（向上空间 vs 向下空间）

□ Step 7: 对标分析（60行）
  ├─ 使用MCP搜索结果：竞争对手
  ├─ 7a. 案例类比法（对比表格）
  └─ 7b. 增长引擎切换（如果适用）

□ Step 8: 跟踪计划与综合结论（50行）
  ├─ 8a. 分层跟踪锚点（高频/季度/事件）
  ├─ 8b. 执行清单（短线/中线）
  ├─ 8c. 综合结论（一句话判断、风险等级、操作建议）
  └─ 8d. 五维综合交易评分（基本面/资金面/技术面/情绪面/事件——与Step 3公司质地评分维度不同）

✅ 总计：540行（最低要求）
```

**执行规则：**
1. AI必须严格按照Step 0→Step 8顺序执行
2. 每完成一个Step，输出：`✅ Step X完成（XX行）`
3. 不能跳过或简化任何Step
4. 每个Step必须达到最低行数要求

### Phase 3: HTML生成层（AI手动分批拼装）

**原理：** AI手写完整HTML——从 `shared/` 搬运CSS/JS，从MD报告提取内容，从范例参考结构。**分批用Write工具写，禁止用Python/Bash heredoc生成HTML内容。**

**执行步骤：**

1. **读取模板：** `shared/template_base.css` + `shared/template_base.js`
2. **读取范例：** `examples/个股研究-中国长城.html`
3. **读取数据：** `output/个股研究-{股票名称}.md` + `output/data_{代码}.json`
4. **分批手写HTML：**
   - 每批 ≤300行，用 **Write工具** 直接写HTML markup
   - `<style>` = 完整搬运 template_base.css（Write工具写入）
   - `<script>` = template_base.js 骨架 + 注入 rawData + pieData（独立一批，Write工具写入）
   - `<body>` = 参考范例结构，分2-4批写入各section
5. **合并部分文件（如有）：** 仅用 `cat` 或 Python `file.read()` 做机械字节拼接，绝不生成HTML内容
6. **输出：** `output/个股研究-{股票名称}.html`

### ⚠️ 分批手写规则（强制）

**禁止行为：**

| 禁止 | 原因 |
|------|------|
| ❌ **Python f-string/template 生成HTML** | 需要大量 `{{}}` 转义，易出错不可维护 |
| ❌ **Bash heredoc 生成HTML** | 多行HTML下经常EOF匹配失败 |
| ❌ **一次性写出整个HTML** | >300行文件必须分批，每批独立一个Write调用 |
| ❌ **用 `python -c` 拼接HTML字符串** | 属于Python生成，不是手写 |

**正确做法：**

| 操作 | 工具 | 说明 |
|------|------|------|
| 写入HTML内容 | **Write** | 直接写HTML markup，无转义问题 |
| 精确局部修改 | **Edit** | 替换特定行，不改动其他部分 |
| 机械合并部分文件 | **Bash `cat`** 或 **Python `file.read()`** | 仅读取+拼接字节，不生成任何markup |

**标准分批方案（~900行HTML）：**

```
Batch 0: Write — DOCTYPE + <head> + <style>（CSS完整复制）           ~180行
Batch 1: Write — <body> + nav + hero + conclusion-top + profile      ~150行
Batch 2: Write — K线图卡片 + Step 0-3 卡片                            ~200行
Batch 3: Write — Step 4-6 卡片（弹性/风险/估值）                      ~200行
Batch 4: Write — Step 7-8 卡片 + footer + </div>                      ~150行
Batch 5: Write — <script>（JS完整复制 + 注入rawData + pieData）       ~150行
```

> **若各批写为独立文件，用 `cat part*.txt >> main.html` 合并，然后删临时文件。Python仅用于 `file.read()` 字节拼接，绝不用f-string生成HTML markup。**

**Step 0-8 关键可视化组件清单：**
- **Step 0:** 4个信息卡片（标的/周期/风格/命题）
- **Step 1:** 核心矛盾高亮框
- **Step 2:** 产业链SVG图谱、grid-2布局、关键判断提示框
- **Step 3:** grid-2布局、6个评分条、评级徽章
- **Step 4:** 弹性树、公式卡片2x2、情景分析grid-3
- **Step 5:** grid-2布局、止损信号列表
- **Step 6:** grid-2布局、三档目标价、盈亏比量化卡片
- **Step 7:** 对比表格、增长引擎切换3卡片
- **Step 8:** grid-2布局、执行清单、verdict-highlight、五维评分、📌总结框

**关键约束：**
- **OHLC 转换**：`ohlc.push([d[1], d[4], d[3], d[2]])` — rawData 格式 `[日期, 开盘, 最高, 最低, 收盘, 成交量]`（akshare 原生列序），itemStyle 用 `color: c.upColor, color0: c.downColor`。与 stock-analysis-github 验证通过版本一致
- 成交量柱必须每根单独着色（红涨绿跌）
- 产业链 SVG 文字使用 `.svg-hdr` / `.svg-sub` class，字号 `.svg-hdr` ≥14px, `.svg-sub` ≥12px
- MathJax 使用 `\\(...\\)` 行内分隔符 → **HTML源码中写 `\(...\)`（单反斜杠），禁止 `\\(...\\)`（双反斜杠）**。HTML text 中反斜杠不是转义符，双反斜杠会导致 MathJax 分隔符匹配失败
- 所有CSS class必须来自 `shared/template_base.css`
- **禁止占位符：HTML 全文不得残留任何 `<!-- AI填充` 或 `<!-- XXX_PLACEHOLDER` 注释**
- **弹性树必须用 `grid-2`（2×2），禁止 flex 单行4列**
- **📌总结框必须为独立 `.card`（红色左边框），位于 Step 8 之后、footer 之前**

> **归档说明：** `gen_html.py`、`gen_ganfeng_html.py`（硬编码模板）、`phase3_html_builder.py`（骨架生成）、`phase3_md_parser.py`（MD解析）、`stock_analysis_main.py`（早期主控）均已归档至 `archive/`。Phase 2/3 全部由AI手写，不使用自动化脚本。

---

## 📝 使用示例

### 示例：分析赣锋锂业（002460）

```bash
cd G:/vibe/my-skills/stock-analysis-competition
python stock_full_report.py 002460
```

**输出：**
```
[Phase 1/3] 数据采集中...
  ✅ Phase 1完成，数据已保存：output/data_002460.json

[Phase 2/3] AI分析中...
  ✅ Step 0-8 完成，MD已保存：output/个股研究-赣锋锂业.md（619行）

[Phase 3/3] AI手写HTML中...
  ✅ 模板已读取（shared/template_base.css + shared/template_base.js）
  ✅ HTML已保存：output/个股研究-赣锋锂业.html（991行/63KB）
```

---

## 🔍 常见问题

### Q1: 为什么Phase 2这么慢？
A: Phase 2需要AI逐步分析Step 0-8，每个Step都需要深度思考和MCP搜索，总计需要30-60分钟。这是为了保证分析质量。

### Q2: 可以跳过某些Step吗？
A: 不可以。Step 0-8是完整的分析框架，跳过任何一步都会导致分析不完整。

### Q3: MCP搜索失败怎么办？
A: 系统会自动fallback：智谱搜索失败→Tavily搜索→继续执行。

### Q4: HTML太长写不下怎么办？
A: HTML最终约900行/60KB，远非"太大"。关键是分批写：用Write工具每批≤300行，分5-6批写完。若写为独立文件，最后用 `cat` 做机械合并。**禁止用Python f-string生成HTML。**

---

## 📚 相关文档

- [shared/template_base.css](shared/template_base.css) — 规范CSS模板，AI复制到`<style>`
- [shared/template_base.js](shared/template_base.js) — 规范JS模板，AI复制到`<script>`并注入数据
- [examples/个股研究-中国长城.html](examples/个股研究-中国长城.html) — 成品参考范例
- [HTML报告设计规范v1.0.md](HTML报告设计规范v1.0.md) — CSS设计系统详细文档
- [分析框架.md](分析框架.md) — Step 0-8 完整分析方法论
- [第9章技术分析设计.md](第9章技术分析设计.md) — 第9章技术面分析HTML结构设计
- [archive/](archive/) — 已归档的旧脚本和文件

## 🗄️ 已归档

以下脚本/文件已移至 `archive/`：
- `gen_html.py`、`gen_ganfeng_html.py` — 硬编码模板（每股票需单独写脚本）
- `phase3_html_builder.py` — 中间骨架生成（产出`_skeleton.html`，与终版混淆）
- `phase3_md_parser.py` — MD解析工具（Phase 2/3 由AI手写，不需要）
- `stock_analysis_main.py` — 早期主控脚本（已被三层架构替代）
- `stock_report_*.html` — stock_full_report.py 自动生成的简化HTML（只有JSON是Phase 1产出）

---

## 📈 第9章：技术面与资金面分析（强制章节）

### 章节定位

**第9章是基本面分析（Step 0-8）的补充**，用于短期择时和交易信号验证。**每次首次分析和增量更新都必须包含此章节。**

- **位置**：在 Step 8（跟踪计划）之后，footer 之前
- **导航**：顶部 nav 第14个链接 `<a href="#technical">技术面</a>`
- **风格**：与 Step 0-8 保持一致的 `.card` 布局，标题用 `.card-header`
- **标题**：`技术面与资金面分析`，sub 写 `多周期联动 · 形态识别 · 量价配合 · 操作计划`

### 数据来源

- **JS 端计算（首选）：** 从 `rawData` 实时计算 MACD/KDJ/RSI/BOLL（`template_base.js` 已含计算函数，AI 搬运即可）
- **Python 预计算（备选）：** 从 `data_{代码}.json` 读取 `technical_indicators` 和 `technical_signals`（由 `stock_full_report.py` 生成）
- **MD 报告内容：** 从 Phase 2 的 MD 报告中提取关键技术位、形态判断、资金面描述（AI 分析产出）

### HTML结构（9.1-9.7，强制完整）

```html
<div class="card" id="technical">
  <div class="card-header"><span class="icon">📈</span><h2>技术面与资金面分析</h2><span class="sub">多周期联动 · 形态识别 · 量价配合 · 操作计划</span></div>

  <!-- 当前技术信号速览（6个指标卡片，grid-3） -->
  <h3 style="...">当前技术信号</h3>
  <div class="grid-3">
    <div>MACD 信号卡片</div>  <div>KDJ 信号卡片</div>  <div>RSI 信号卡片</div>
    <div>BOLL 信号卡片</div>  <div>均线 信号卡片</div>  <div>成交量 信号卡片</div>
  </div>

  <!-- 技术指标图表（紧接信号速览，与MACD/KDJ等指标关联最近） -->
  <h3>技术指标图表</h3>
  <div class="grid-2"><div id="chart-macd"></div><div id="chart-kdj"></div></div>
  <div class="grid-2"><div id="chart-rsi"></div><div id="chart-boll"></div></div>

  <!-- 多周期趋势分析（grid-3 → 月线/周线/日线，含状态标记+技术信号标签） -->
  <h3>多周期趋势分析</h3>
  <div class="grid-3">月线 · 周线 · 日线 三列卡片</div>
  <p>多周期判断总结（带💡前缀的提示框）</p>

  <!-- 位置与形态分析（grid-2：关键技术位表 + 形态识别表） -->
  <h3>位置与形态分析</h3>
  <div class="grid-2">关键技术位表格 · 形态识别表格</div>

  <!-- 9.4 动量与量价分析（grid-2：动量指标表 + 量价配合表） -->
  <h3>动量与量价分析</h3>
  <div class="grid-2">动量指标表格 · 量价配合表格</div>
  <p>⚠️ 动量预警提示框</p>

  <!-- 9.5 资金面分析（ul列表：主力资金/北向资金/龙虎榜） -->
  <h3>资金面分析</h3>
  <ul>主力资金 · 北向资金 · 龙虎榜</ul>

  <!-- 9.6 市场风格与板块轮动（grid-2：板块TOP5表 + 风格判断卡片） -->
  <h3>市场风格与板块轮动</h3>
  <div class="grid-2">板块TOP5表格 · 风格判断卡片</div>

  <!-- 9.7 综合研判与操作计划（grid-2：技术面评分5维+评级 + 操作计划表） -->
  <h3>综合研判与操作计划</h3>
  <div class="grid-2">技术面评分 · 操作计划表</div>
</div>
```

### 各节详细规范

#### 第9章内部顺序（强制）

**信号速览 → 技术指标图表 → 多周期趋势 → 位置与形态 → 动量与量价 → 资金面 → 市场风格 → 综合研判（操作计划已移至核心结论区）**

#### 当前技术信号速览（6卡片）
- 布局：`grid-3`（3列×2行 = 6卡片）
- 每个卡片：`card-bg-alt` 背景 + `border-left:3px solid` 语义色 + 指标名 + 状态 + 数值
- 颜色语义：多头=红色、空头=绿色、中性=金色、弱势=灰色
- 指标：MACD、KDJ、RSI、BOLL、均线、成交量

#### 技术指标图表（紧接信号速览，与上方MACD/KDJ等指标关联最近）
- 布局：`grid-2` × 2行 = 4个图表
- **MACD图**：DIF(金色折线) + DEA(蓝色折线) + MACD柱(红涨绿跌)
- **KDJ图**：K(金色) + D(蓝色) + J(红色)，Y轴0-100
- **RSI图**：RSI6(蓝) + RSI12(金) + RSI24(红)，Y轴0-100
- **BOLL图**：上轨(红) + 中轨(金) + 下轨(绿) + 收盘价折线(蓝) + 填充区域
- **JS 来源：** `template_base.js` 已含全部计算函数和渲染函数，AI Phase 3 Batch 6 直接搬运
- 图表容器：`chart-macd`/`chart-kdj`/`chart-rsi`/`chart-boll`，高度280px/260px

#### 多周期趋势分析
- 布局：`grid-3`（月线/周线/日线）
- 每列：`card-bg-alt` 背景 + `border-left:4px solid` + 状态描述 + 均线数据 + 信号标签(`<span>`)
- 下方：`💡 多周期判断` 提示框（`border-left:4px solid var(--gold)`）
- 信号标签颜色：多头=红底红字、中性偏多=金底金字、短期透支=橙底橙字

#### 9.3 位置与形态分析
- 布局：`grid-2`
- 左：关键技术位表格（`table.cons`，列：类型/价格/说明，支撑位绿色/压力位红色）
- 右：形态识别表格（`table.cons`，列：形态/完整度/说明）+ 形态评估提示框
- 价格来源于 MD 报告 Step 6 分析内容

#### 9.4 动量与量价分析
- 布局：`grid-2`
- 左：动量指标表格（`table.cons`，列：周期/涨幅/评估，红色涨绿色跌）
- 右：量价配合表格（`table.cons`，列：日期/价格/成交量/关系）
- 下方：⚠️ 动量预警提示框（`border-left:4px solid var(--orange-warn)`）

#### 9.5 资金面分析
- 布局：`<ul>` 列表
- 内容：主力资金流向（近20日累计+超大单/大单拆分）、北向资金持仓变化、龙虎榜数据
- 数据来源：MD 报告 Step 6a+ 资金面分析内容

#### 9.6 市场风格与板块轮动
- 布局：`grid-2`
- 左：近20日涨停板块TOP5表格（`table.cons`，列：板块/涨停次数/趋势）
- 右：市场风格判断卡片（当前风格/轮动特征/对本股影响/操作建议）
- 数据来源：MD 报告 Step 1 宏观分析 + MCP搜索

#### 9.7 综合研判与操作计划
- 布局：`grid-2`
- 左：技术面评分（5个维度的 `score-bar` + 加权总评 + ⭐技术面评级）
- 右：操作计划表格（`table.cons`，列：项目/价格仓位/说明，买入=绿色/卖出/目标=红色）
- 下方：📌 操作建议提示框（`border-left:4px solid var(--red-up)`）
- 评分维度（5维，与 Step 8 综合交易评分区分）：多周期趋势(25%)/技术指标(20%)/形态完整度(20%)/量价配合(15%)/资金面(20%)

### 第9章 Batch 分配

**第9章在 Batch 5 中与 Step 7-8 一同写入**（从范例 Read 对应区域后 Write）。JS 图表渲染函数在 Batch 6 中通过搬运 `template_base.js` 完成。

### 第9章 grep 校验（Batch 5 追加）

| 检查项 | 命令 | 通过条件 |
|--------|------|---------|
| 9.1-9.7 完整 | `grep -c '多周期趋势\|技术指标图表\|位置与形态\|动量与量价\|资金面分析\|市场风格\|综合研判'` | ≥ 7 |
| 4图表容器 | `grep -c 'chart-macd\|chart-kdj\|chart-rsi\|chart-boll'` | = 4 |
| 技术面评分 | `grep -c '技术面评分\|技术面总评\|技术面评级'` | ≥ 3 |
| 操作计划 | `grep -c '买入区间\|加仓位置\|止损位置'` | ≥ 3 |
| 信号标签 | `grep -c '多头信号\|中性偏多\|短期透支\|空头信号'` | ≥ 2 |

---

## 🔄 增量更新详细说明

### 使用场景

报告已生成，需要更新最新数据（K线、Hero行情、技术指标），但不需要重新分析。

### 触发方式

用户说"更新 XXX股票"或"刷新 XXX报告"时，AI执行增量更新。

### 执行命令

```bash
cd G:/vibe/my-skills/stock-analysis-enhanced副本
python update_stock_report.py <股票代码>
```

**常用参数：**
```bash
# 基本用法（自动查找HTML文件）
python update_stock_report.py 000066

# 指定HTML文件
python update_stock_report.py 000066 --html output/个股研究-中国长城.html

# 强制更新（跳过检查，直接更新）
python update_stock_report.py 000066 --force
```

### 更新内容

| 内容 | 是否更新 | 说明 |
|------|---------|------|
| K线数据（rawData数组） | ✅ | 从akshare获取最新120条日K线 |
| Hero区域（最新价、涨跌幅） | ✅ | 从akshare获取实时行情 |
| 第9章技术指标 | ✅ | 重新计算MACD/KDJ/RSI/BOLL，更新图表数据 |
| 基本面分析（Step 0-8） | ❌ | 不更新，需要重新分析请用首次分析 |

### 工作流程

```
1. 提取旧K线数据（从HTML中的rawData数组）
   ↓
2. 获取最新K线数据（akshare实时获取）
   ↓
3. 对比数据变化（最新交易日、新增天数）
   ↓
4. 输出检查报告（需要更新 / 无需更新）
   ↓
5. 如果需要更新：
   - 更新K线数据（替换HTML中的rawData数组）
   - 更新Hero区域数据（价格、涨跌幅等实时数据）
   - 更新第9章技术指标（重新计算并替换technicalData数组）
   - 生成带日期版本（如：个股研究-中国长城_20260528.html）
   - 覆盖最新版本（无日期文件名）
```

### 判断标准

- 如果 `新K线最后交易日 > 旧K线最后交易日` → 需要更新
- 否则 → 无需更新

### 示例输出

```
📊 检查 000066 的更新情况...
   旧HTML: output/个股研究-中国长城.html

[1/2] 提取旧K线数据...
   ✅ 旧K线数据：120条，最新日期 2026-05-20

[2/2] 获取最新K线数据...
   尝试获取数据... (第1/3次)
   ✅ 新K线数据：120条，最新日期 2026-05-27

[3/3] 对比数据变化...

============================================================
📋 更新检查报告
============================================================
✅ 需要更新

变化点：
  1. K线数据更新：2026-05-20 → 2026-05-27，新增5个交易日
============================================================

============================================================
🔄 开始增量更新
============================================================

[1/4] 更新K线数据...
   ✅ K线数据已更新：120条

[2/4] 更新Hero区域数据...
   ✅ Hero数据已更新：价格 18.99，涨跌幅 -3.16%

[3/4] 更新第9章技术指标...
   ✅ 技术指标已更新：120 条记录

[4/4] 覆盖最新版本...
   ✅ 已覆盖：output/个股研究-中国长城.html

============================================================
✅ 更新完成
============================================================

📄 输出文件：
   • 带日期版本：output/个股研究-中国长城_20260527.html
   • 最新版本：output/个股研究-中国长城.html

📊 文件大小：85.3 KB
```

### 版本管理

**生成两个文件：**
1. **带日期版本**：`个股研究-{股票名称}_{YYYYMMDD}.html`
   - 保留历史版本，便于对比分析
   - 建议保留最近30天的版本

2. **最新版本**：`个股研究-{股票名称}.html`（覆盖原文件）
   - 始终保持最新
   - 便于快速访问

### 常见问题

**Q1: 如何判断是否需要更新？**
A: 工具会自动对比旧数据和新数据的最新交易日，如果新数据的最新交易日 > 旧数据，则需要更新。

**Q2: 更新后原文件会被覆盖吗？**
A: 会生成两个文件：带日期版本（新文件，不覆盖）+ 最新版本（覆盖原文件）。历史版本会保留。

**Q3: 网络请求失败怎么办？**
A: 工具会自动重试3次，如果仍然失败，更新失败。建议检查网络连接或稍后重试。

**Q4: 如何回退到旧版本？**
A: 直接使用带日期的历史版本文件即可，例如：
```bash
cp output/个股研究-中国长城_20260520.html output/个股研究-中国长城.html
```

**Q5: 更新频率建议？**
A: 
- **日线数据**：每个交易日收盘后更新一次（15:30后）
- **同一交易日多次触发**：检查发现无新数据，自动跳过更新
- **跨多个交易日触发**：一次性更新到最新

---

## 📋 跟踪日志与版本记录

### 设计理念

每次首次分析产生"初始化跟踪结果"，每次增量更新在跟踪表中**新增一列**，标记更新日期和变化内容。这样所有历史跟踪数据在同一张表中可见，无需翻找旧版本文件。

### 跟踪表格结构：催化剂兑现追踪

**核心理念：** 不是记录数据快照（股价多少/成交量多少），而是追踪**分析中识别的关键催化剂是否兑现**。每行 = 一个催化剂/事件，状态 = 已兑现/待兑现/落空/持续观察。

#### 首次分析（初始化）

```html
<table class="cons" style="font-size:12px;">
<thead><tr><th>跟踪指标 / 催化剂</th><th>预期影响</th><th>兑现状态</th><th>备注</th></tr></thead>
<tbody>
<tr><td>催化剂1（如异环1.1版本）</td><td>流水验证→估值修复</td><td>⏳ 待兑现</td><td>预计6月</td></tr>
<tr><td>催化剂2（如H1业绩预告）</td><td>确认盈利趋势</td><td>⏳ 待兑现</td><td>预计7月</td></tr>
<tr><td>已兑现事件（如首日流水）</td><td>验证吸量能力</td><td style="color:var(--red-up);">✅ 已兑现</td><td>05-28确认</td></tr>
<tr><td>止损观察</td><td>风险控制底线</td><td style="color:var(--text-muted);">⚪ 安全区间</td><td>当前价>止损线</td></tr>
</tbody>
</table>
```

**状态标记：**
- ✅ 已兑现（红色）— 催化剂如期发生，验证分析逻辑
- ⏳ 待兑现（金色）— 尚未发生，仍在等待窗口期
- ❌ 落空（绿色）— 预期落空，需重新评估投资逻辑
- ⚪ 持续观察（灰色）— 中性状态，持续监控

**催化剂来源：** 从 MD 报告的 Step 4（弹性测算）、Step 5（风险/止损信号）、Step 6（估值催化剂）、Step 7（对标）中提取，选取 6-10 个最关键的可验证事件。

#### 增量更新

**每次"更新 XXX股票"时，AI 检查每个催化剂的状态变化：**

1. 已到期的催化剂 → 判断 ✅已兑现 或 ❌落空
2. 仍在等待的 → 保持 ⏳待兑现
3. 新出现的催化剂 → 追加新行
4. 在表格下方"📋 事件记录"中追加更新说明

**不需要插入新列**（与旧设计不同）。催化剂的行是固定的，更新的是每一行的"兑现状态"列。

### 事件记录

**跟踪表格下方必须添加事件记录：**

```html
<div class="update-log" style="margin-top:12px;padding:10px 14px;background:var(--card-bg-alt);border-radius:8px;border-left:4px solid var(--gold);">
<p style="font-weight:700;color:var(--gold);margin-bottom:6px;">📋 事件记录</p>
<ul style="list-style:none;padding:0;font-size:12px;color:var(--text-secondary);">
<li style="padding:3px 0;">• 2026-05-28 首次分析：异环首日流水1亿+已兑现（验证吸量），1.1版本/H1业绩/TI赛事待兑现，当前价14.28>止损12元安全</li>
</ul>
</div>
```

### 更新流程中的跟踪日志维护

**AI执行增量更新时的职责（每次"更新 XXX股票"时执行）：**

1. **刷新近期动态**：将新闻列表替换为当日最新8条新闻，重新判断利好/利空/中性
2. **检查催化剂兑现**：逐行检查到期催化剂是否兑现，更新状态标记
3. **追加新催化剂**：如有新的关键事件，追加新行
4. **在事件记录顶部插入新条目**：日期 + 本次更新发现的变化
5. **同步分析基准日**：nav + hero + footer 三处

**增量更新 HTML 修改清单：**

| 步骤 | 操作 | 位置 |
|------|------|------|
| 1 | 替换新闻列表（8条→新8条+利好利空标签） | grid-2 近期动态卡片 |
| 2 | 逐行检查催化剂兑现状态、必要时更新 | 跟踪日志表 `<tbody>` |
| 3 | 有新催化剂则追加 `<tr>` | 跟踪日志表末尾 |
| 4 | 事件记录顶部插入新 `<li>` | 📋 事件记录 `<ul>` |
| 5 | 更新 `📅 YYYY-MM-DD` | nav + hero + footer 三处 |

**自动更新工具 `update_stock_report.py` 的职责：**
- 更新 K线数据（rawData数组）✅ 已实现
- 更新 Hero行情（价格/涨跌幅）✅ 已实现
- 更新 第9章技术指标 ✅ 已实现
- 更新 跟踪表格（AI手动执行）
- 刷新 新闻列表（AI手动执行）
- 更新 分析基准日（AI手动执行）

### 分析基准日声明

**分析基准日在三处显示：**

| 位置 | 格式 | 说明 |
|------|------|------|
| 顶部Nav | `📅 YYYY-MM-DD` | nav-links右侧、theme-toggle按钮左侧，12px字号，颜色跟随主题 |
| Hero卡片 | hero-meta第1项，标签"分析基准日"，值`YYYY-MM-DD` | 数据截止日/最近交易日 |
| 页脚Footer | `📅 分析基准日：YYYY-MM-DD · 数据来源：akshare/同花顺/新浪` | 与免责声明同一行 |

**Nav中的分析日期CSS：**
```css
.nav-analysis-date{font-size:12px;color:var(--text-muted);margin:0 8px;white-space:nowrap}
body.light-mode .nav-analysis-date{color:var(--text-muted)}
```

---

> **免责声明：** 本系统所有分析仅供研究参考，不构成投资建议。投资有风险，决策需谨慎。

---

> **免责声明：** 本系统所有分析仅供研究参考，不构成投资建议。投资有风险，决策需谨慎。

