# 股票分析助手

> 股票综合分析与可视化工具。输入股票代码或名称，自动采集K线数据、技术指标、 新闻资讯、财报信息，生成交易策略建议，并输出可视化HTML报告。 触发场景： - 用户提供股票代码/名称要求分析（如 "分析AAPL" "看看茅台"） - 用户询问某只股票的买卖时机 - 用户需要股票技术面/基本面综合报告 - 用户要求生成股票分析可视化页面 支持市场：美股(NYSE/NASDAQ)、A股(上交所/深交所)

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

---


# Stock Analyzer

股票综合分析与可视化报告生成器。

## 工作流程

```
┌─────────────────────────────────────────────────────────────────┐
│  INPUT: 股票代码/名称                                            │
│         例: "AAPL", "苹果", "600519", "茅台"                     │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  STEP 1: 识别股票                                                │
│  ├─ 解析输入，确定股票代码和市场                                   │
│  ├─ 美股: 直接使用代码 (AAPL, MSFT, GOOGL)                       │
│  └─ A股: 补全代码 (茅台 → 600519.SS)                             │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  STEP 2: K线数据采集 (核心步骤)                                   │
│  ├─ [mcp__laborany_web__read_page] 从金融数据API获取历史OHLCV数据                     │
│  ├─ 数据周期: 日K线，默认获取60-120个交易日                        │
│  └─ 数据字段: 日期/开盘/最高/最低/收盘/成交量                      │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  STEP 3: 技术指标计算 (基于K线原始数据)                           │
│  ├─ 均线系统: MA5 / MA10 / MA20 / MA60                          │
│  ├─ MACD指标: DIF / DEA / MACD柱状图                            │
│  ├─ RSI指标: RSI6 / RSI12 / RSI24                               │
│  ├─ KDJ指标: K值 / D值 / J值                                    │
│  └─ 布林带: 上轨 / 中轨 / 下轨                                   │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  STEP 4: 辅助数据采集 (并行执行)                                  │
│  ├─ [mcp__laborany_web__search] 搜索近期新闻和市场情绪                            │
│  ├─ [mcp__laborany_web__search] 搜索财报数据和分析师评级                          │
│  └─ [mcp__laborany_web__search] 搜索行业动态和政策影响                            │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  STEP 5: 智能分析                                                │
│  ├─ 技术面: 基于计算出的指标进行趋势研判                          │
│  ├─ 基本面: PE/PB/ROE/营收增长 估值分析                           │
│  ├─ 消息面: 新闻情绪/行业动态/政策影响                            │
│  └─ 综合: 多维度交叉验证，生成交易建议                            │
└─────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────┐
│  STEP 6: 生成可视化报告                                          │
│  ├─ 使用 assets/template.html 作为基础模板                       │
│  ├─ 填充数据: K线图/MACD图/RSI图/KDJ图/成交量图                  │
│  └─ 输出: {股票代码}_analysis.html                               │
└─────────────────────────────────────────────────────────────────┘
```

## 执行指南

### Step 1: 识别股票

根据用户输入识别目标股票：

| 输入类型 | 示例 | 处理方式 |
|---------|------|---------|
| 美股代码 | AAPL, MSFT | 直接使用 |
| 美股名称 | 苹果, 微软 | mcp__laborany_web__search 查询对应代码 |
| A股代码 | 600519, 000858 | 补充后缀 (.SS 上交所 / .SZ 深交所) |
| A股名称 | 茅台, 五粮液 | mcp__laborany_web__search 查询对应代码 |

### Step 2: K线数据采集

**这是核心步骤**，需要获取真实的历史K线数据用于后续技术指标计算。

#### 数据源选择

| 市场 | 推荐数据源 | API示例 |
|-----|-----------|---------|
| 美股 | Yahoo Finance | `https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?interval=1d&range=6mo` |
| 美股 | Alpha Vantage | `https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol={symbol}` |
| A股 | 新浪财经 | `https://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol={symbol}&scale=240&ma=no&datalen=120` |
| A股 | 东方财富 | 通过 mcp__laborany_web__search 搜索 "{股票代码} 历史K线数据" |

#### 使用 mcp__laborany_web__read_page 获取数据

```
# 美股示例 (Yahoo Finance)
mcp__laborany_web__read_page URL: https://query1.finance.yahoo.com/v8/finance/chart/AAPL?interval=1d&range=3mo
Prompt: 提取JSON中的K线数据，返回格式化的OHLCV数组

# A股示例 (新浪财经)
mcp__laborany_web__read_page URL: https://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=sh600519&scale=240&ma=no&datalen=120
Prompt: 提取K线数据数组，包含日期、开盘、最高、最低、收盘、成交量
```

#### K线数据结构

采集后的数据应整理为以下结构：

```javascript
const klineData = {
    dates: ["2024-01-02", "2024-01-03", ...],     // 日期数组
    open: [185.50, 186.20, ...],                   // 开盘价数组
    high: [187.30, 188.10, ...],                   // 最高价数组
    low: [184.80, 185.50, ...],                    // 最低价数组
    close: [186.80, 187.50, ...],                  // 收盘价数组
    volume: [52340000, 48920000, ...]              // 成交量数组
};
```

### Step 3: 技术指标计算

基于采集的K线原始数据，计算以下技术指标。参考 [references/technical-indicators.md](references/technical-indicators.md) 获取详细公式。

#### 3.1 移动平均线 (MA)

```javascript
// MA计算公式: MA(N) = SUM(Close, N) / N
function calculateMA(closes, period) {
    const result = [];
    for (let i = 0; i < closes.length; i++) {
        if (i < period - 1) {
            result.push(null);
        } else {
            const sum = closes.slice(i - period + 1, i + 1).reduce((a, b) => a + b, 0);
            result.push(+(sum / period).toFixed(2));
        }
    }
    return result;
}

// 计算各周期均线
const ma5 = calculateMA(closes, 5);
const ma10 = calculateMA(closes, 10);
const ma20 = calculateMA(closes, 20);
const ma60 = calculateMA(closes, 60);
```

#### 3.2 MACD 指标

```javascript
// EMA计算
function calculateEMA(data, period) {
    const k = 2 / (period + 1);
    const result = [data[0]];
    for (let i = 1; i < data.length; i++) {
        result.push(data[i] * k + result[i - 1] * (1 - k));
    }
    return result;
}

// MACD计算
function calculateMACD(closes) {
    const ema12 = calculateEMA(closes, 12);
    const ema26 = calculateEMA(closes, 26);
    const dif = ema12.map((v, i) => +(v - ema26[i]).toFixed(4));
    const dea = calculateEMA(dif, 9);
    const macd = dif.map((v, i) => +((v - dea[i]) * 2).toFixed(4));
    return { dif, dea, macd };
}
```

#### 3.3 RSI 指标

```javascript
function calculateRSI(closes, period = 14) {
    const changes = [];
    for (let i = 1; i < closes.length; i++) {
        changes.push(closes[i] - closes[i - 1]);
    }

    const result = [null];
    for (let i = period; i <= changes.length; i++) {
        const slice = changes.slice(i - period, i);
        const gains = slice.filter(x => x > 0).reduce((a, b) => a + b, 0);
        const losses = Math.abs(slice.filter(x => x < 0).reduce((a, b) => a + b, 0));
        const rs = losses === 0 ? 100 : gains / losses;
        result.push(+(100 - 100 / (1 + rs)).toFixed(2));
    }

    // 填充前面的null
    while (result.length < closes.length) {
        result.unshift(null);
    }
    return result;
}

const rsi6 = calculateRSI(closes, 6);
const rsi12 = calculateRSI(closes, 12);
const rsi24 = calculateRSI(closes, 24);
```

#### 3.4 KDJ 指标

```javascript
function calculateKDJ(highs, lows, closes, period = 9) {
    const k = [], d = [], j = [];

    for (let i = 0; i < closes.length; i++) {
        if (i < period - 1) {
            k.push(50); d.push(50); j.push(50);
            continue;
        }

        const highSlice = highs.slice(i - period + 1, i + 1);
        const lowSlice = lows.slice(i - period + 1, i + 1);
        const hh = Math.max(...highSlice);
        const ll = Math.min(...lowSlice);

        const rsv = hh === ll ? 50 : ((closes[i] - ll) / (hh - ll)) * 100;
        const kVal = i === period - 1 ? rsv : (2/3) * k[i-1] + (1/3) * rsv;
        const dVal = i === period - 1 ? kVal : (2/3) * d[i-1] + (1/3) * kVal;
        const jVal = 3 * kVal - 2 * dVal;

        k.push(+kVal.toFixed(2));
        d.push(+dVal.toFixed(2));
        j.push(+jVal.toFixed(2));
    }
    return { k, d, j };
}
```

#### 3.5 布林带 (BOLL)

```javascript
function calculateBOLL(closes, period = 20, multiplier = 2) {
    const middle = calculateMA(closes, period);
    const upper = [], lower = [];

    for (let i = 0; i < closes.length; i++) {
        if (i < period - 1) {
            upper.push(null); lower.push(null);
            continue;
        }

        const slice = closes.slice(i - period + 1, i + 1);
        const mean = middle[i];
        const variance = slice.reduce((sum, val) => sum + Math.pow(val - mean, 2), 0) / period;
        const std = Math.sqrt(variance);

        upper.push(+(mean + multiplier * std).toFixed(2));
        lower.push(+(mean - multiplier * std).toFixed(2));
    }
    return { upper, middle, lower };
}
```

### Step 4: 辅助数据采集

使用 mcp__laborany_web__search 工具并行采集辅助数据：

```
# 新闻资讯
"{股票代码} latest news {当前年份}"
"{股票名称} 最新消息 {当前年份}"

# 财报分析
"{股票代码} earnings report analysis {当前年份}"
"{股票代码} 财报 业绩 分析"

# 行业动态
"{股票代码} industry analysis {当前年份}"
"{行业名称} 政策 监管 {当前年份}"
```

### Step 5: 智能分析

基于K线数据计算的技术指标和采集的辅助数据，进行多维度分析：

#### 5.1 技术面分析

根据计算出的指标进行趋势研判：

| 指标 | 多头信号 | 空头信号 |
|-----|---------|---------|
| MA排列 | MA5 > MA10 > MA20 > MA60 | MA5 < MA10 < MA20 < MA60 |
| MACD | DIF上穿DEA (金叉) | DIF下穿DEA (死叉) |
| RSI | RSI < 30 (超卖反弹) | RSI > 70 (超买回调) |
| KDJ | K上穿D且J < 20 | K下穿D且J > 80 |
| BOLL | 价格触及下轨反弹 | 价格触及上��回落 |

**信号强度判断**：
- 强信号：3个以上指标同向
- 中等信号：2个指标同向
- 弱信号：仅1个指标

#### 5.2 基本面分析

- 估值指标：PE/PB 与行业对比
- 成长性：营收/利润增长率
- 盈利能力：ROE/毛利率/净利率

#### 5.3 消息面分析

- 新闻情绪：正面/负面/中性
- 行业动态：竞争格局变化
- 政策影响：监管/宏观政策

#### 5.4 综合建议

- 短期策略（1-2周）
- 中期策略（1-3月）
- 风险提示

### Step 6: 生成可视化报告

#### 6.1 CHART_DATA 数据结构

生成报告时，需要构建完整的图表数据对象：

```javascript
const chartData = {
    // ═══════════════════════════════════════════════════════════════
    // 基础K线数据
    // ═══════════════════════════════════════════════════════════════
    dates: ["2024-01-02", "2024-01-03", ...],

    // K线数据: [开盘, 收盘, 最低, 最高] (ECharts candlestick格式)
    kline: [
        [185.50, 186.80, 184.80, 187.30],
        [186.20, 187.50, 185.50, 188.10],
        // ...
    ],

    // 成交量
    volume: [52340000, 48920000, ...],

    // ═══════════════════════════════════════════════════════════════
    // 均线数据
    // ═══════════════════════════════════════════════════════════════
    ma5: [null, null, null, null, 186.20, 186.80, ...],
    ma10: [null, null, null, null, null, null, null, null, null, 185.90, ...],
    ma20: [...],
    ma60: [...],

    // ═══════════════════════════════════════════════════════════════
    // MACD指标
    // ═══════════════════════════════════════════════════════════════
    dif: [0, 0.12, 0.25, 0.38, ...],
    dea: [0, 0.02, 0.07, 0.13, ...],
    macd: [0, 0.20, 0.36, 0.50, ...],

    // ═══════════════════════════════════════════════════════════════
    // RSI指标
    // ═══════════════════════════════════════════════════════════════
    rsi6: [null, null, null, null, null, 55.32, 58.21, ...],
    rsi12: [...],
    rsi24: [...],

    // ═══════════════════════════════════════════════════════════════
    // KDJ指标
    // ═══════════════════════════════════════════════════════════════
    k: [50, 50, 50, 50, 50, 50, 50, 50, 52.30, 55.80, ...],
    d: [50, 50, 50, 50, 50, 50, 50, 50, 51.10, 52.67, ...],
    j: [50, 50, 50, 50, 50, 50, 50, 50, 54.70, 62.06, ...],

    // ═══════════════════════════════════════════════════════════════
    // 布林带
    // ═══════════════════════════════════════════════════════════════
    bollUpper: [null, ..., 192.50, 193.20, ...],
    bollMiddle: [null, ..., 186.80, 187.10, ...],
    bollLower: [null, ..., 181.10, 181.00, ...]
};
```

#### 6.2 模板占位符

| 占位符 | 说明 | 示例值 |
|-------|------|-------|
| `{{STOCK_CODE}}` | 股票代码 | AAPL |
| `{{STOCK_NAME}}` | 股票名称 | 苹果公司 |
| `{{CURRENT_PRICE}}` | 当前价格 | $187.50 |
| `{{PRICE_CHANGE}}` | 涨跌幅 | +2.35% |
| `{{PRICE_DIRECTION}}` | 涨跌方向CSS类 | price-up / price-down |
| `{{ANALYSIS_DATE}}` | 分析日期 | 2024-01-15 |
| `{{TECHNICAL_INDICATORS}}` | 技术指标HTML | 见下方示例 |
| `{{FUNDAMENTAL_INDICATORS}}` | 基本面指标HTML | 见下方示例 |
| `{{NEWS_LIST}}` | 新闻列表HTML | 见下方示例 |
| `{{SHORT_TERM_STRATEGY}}` | 短期策略文本 | 建议持有观望... |
| `{{MID_TERM_STRATEGY}}` | 中期策略文本 | 可逢低布局... |
| `{{RISK_WARNING}}` | 风险提示文本 | 注意市场波动... |
| `{{COMPREHENSIVE_ANALYSIS}}` | 综合分析文本 | 技术面显示... |
| `{{CHART_DATA}}` | 图表JSON数据 | 见上方结构 |

#### 6.3 指标HTML模板

```html
<!-- 技术指标项模板 -->
<div class="indicator-item">
    <div class="indicator-label">MA趋势</div>
    <div class="indicator-value signal-bullish">多头排列</div>
</div>
<div class="indicator-item">
    <div class="indicator-label">MACD</div>
    <div class="indicator-value signal-bullish">金叉 (DIF: 0.85)</div>
</div>
<div class="indicator-item">
    <div class="indicator-label">RSI(14)</div>
    <div class="indicator-value signal-neutral">55.32 (中性)</div>
</div>
<div class="indicator-item">
    <div class="indicator-label">KDJ</div>
    <div class="indicator-value signal-bearish">K:78 D:72 J:90</div>
</div>
```

#### 6.4 输出文件

保存为 `{股票代码}_analysis.html`，例如：`AAPL_analysis.html`

## 输出示例

生成的 HTML 报告包含：

1. **头部概览** - 股票名称、代码、当前价格、涨跌幅
2. **K线图表** - 交互式K线图 + MA均线叠加
3. **MACD图表** - DIF/DEA曲线 + MACD柱状图
4. **技术指标面板** - MA趋势/MACD/RSI/KDJ 信号状态
5. **基本面指标** - PE/PB/ROE等关键财务指标
6. **新闻时间线** - 近期重要新闻列表
7. **策略建议卡片** - 短期/中期操作建议 + 风险提示

## 注意事项

- 所有分析仅供参考，不构成投资建议
- K线数据来源于公开API，可能存在延迟
- 技术指标计算基于历史数据，不代表未来走势
- 建议结合其他专业工具交叉验证


