跳转至

A 股实战量化分析指南(2026年5月·数据验证版)

最后更新: 2026年5月3日 | 状态: 生产就绪(基于真实数据验证) 数据源: Sina 财经 API(海外服务器可用) 警告: akshare 在本服务器环境不可用,需使用替代方案


1. 数据源选择指南

1.1 海外服务器数据源对比

数据源 可用性 延迟 数据范围 推荐度
Sina 财经 K线 API ✅ 可用 全市场 ⭐⭐⭐⭐⭐
Sina 实时行情 API ✅ 可用 实时 全市场 ⭐⭐⭐⭐
东方财富 API ❌ 不可用 - - 不推荐
akshare (sina源) ❌ 报错 - - 不推荐
yfinance ❌ 限流 - 有限 不推荐

1.2 Sina 财经 API 使用指南

K线数据接口:

http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=sh000001&scale=240&ma=no&datalen=60

参数说明: - symbol: 股票代码(sh 上海,sz 深圳) - scale: 分钟级别(240=日线,60=60分钟,30=30分钟,15=15分钟,5=5分钟) - ma: 是否返回均线(no=不返回) - datalen: 返回数据条数

实时行情接口:

https://hq.sinajs.cn/list=sh000001
- 需要设置 Referer: https://finance.sina.com.cn 请求头

1.3 标准代码格式

# 上证指数
symbol = "sh000001"
# 深证成指
symbol = "sz399001"
# 创业板指
symbol = "sz399006"
# 个股示例
symbol = "sh600519"   # 贵州茅台
symbol = "sz300750"   # 宁德时代
symbol = "sh601318"   # 中国平安

2. 量化分析完整代码模板

00519" # 贵州茅台 symbol = "sz300750" # 宁德时代 symbol = "sh601318" # 中国平安

---

## 2. 量化分析完整代码模板### 2.1 数据下载与基础指标计算

```python
import json
import urllib.request

def fetch_kline(symbol: str, datalen: int = 60) -> list:
    """从 Sina 财经 API 获取 K线数据"""
    url = (
        f"http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/"
        f"CN_MarketData.getKLineData?symbol={symbol}"
        f"&scale=240&ma=no&datalen={datalen}"
    )
    req = urllib.request.Request(url)
    with urllib.request.urlopen(req, timeout=10) as resp:
        data = json.loads(resp.read().decode('utf-8'))
    return data

def calc_ma(prices: list, period: int) -> list:
    """计算移动平均线"""
    return [sum(prices[i-period+1:i+1])/period 
            for i in range(period-1, len(prices))]

def calc_rsi(prices: list, period: int = 14) -> float:
    """计算 RSI 指标"""
    gains, losses = [], []
    for i in range(1, len(prices)):
        diff = prices[i] - prices[i-1]
        gains.append(max(0, diff))
        losses.append(max(0, -diff))
    avg_gain = sum(gains[-period:])/period
    avg_loss = sum(losses[-period:])/period
    if avg_loss == 0:
        return 100.0
    rs = avg_gain / avg_loss
    return 100 - (100 / (1 + rs))

def calc_macd(prices: list, fast=12, slow=26, signal=9):
    """计算 MACD 指标"""
    ema_fast = calc_ema(prices, fast)
    ema_slow = calc_ema(prices, slow)
    dif = ema_fast - ema_slow
    dea = calc_ema([dif], signal)
    macd = 2 * (dif - dea)
    return dif, dea, macd
st - ema_slow
    dea = calc_ema([dif], signal)
    macd = 2 * (dif - dea)
    return dif, dea, macddef calc_ema(prices: list, period: int) -> float:
    """计算指数移动平均"""
    multiplier = 2 / (period + 1)
    ema = sum(prices[:period]) / period
    for price in prices[period:]:
        ema = (price - ema) * multiplier + ema
    return ema

for price in prices[period:]:
    ema = (price - ema) * multiplier + ema
return ema

```### 2.2 完整分析管线

def analyze_stock(symbol: str, name: str):
    """完整的股票分析管线"""
    data = fetch_kline(symbol, datalen=60)
    closes = [float(d['close']) for d in data]
    volumes = [float(d['volume']) for d in data]
    highs = [float(d['high']) for d in data]
    lows = [float(d['low']) for d in data]

    # 均线系统
    ma5 = calc_ma(closes, 5)
    ma10 = calc_ma(closes, 10)
    ma20 = calc_ma(closes, 20)
    ma60 = calc_ma(closes, 60) if len(closes) >= 60 else None

    # RSI
    rsi = calc_rsi(closes, 14)

    # 趋势判断
    if closes[-1] > ma5[-1] > ma10[-1] > ma20[-1]:
        trend = "多头排列(强势上涨)"
    elif closes[-1] < ma5[-1] < ma10[-1] < ma20[-1]:
        trend = "空头排列(强势下跌)"
    else:
        trend = "震荡整理"

    # 成交量分析
    avg_vol_5 = sum(volumes[-5:]) / 5
    avg_vol_20 = sum(volumes[-20:]) / 20
    vol_ratio = avg_vol_5 / avg_vol_20

    # 支撑/压力
    support_20 = min(lows[-20:])
    resistance_20 = max(highs[-20:])

    # 涨跌幅
    pct_5d = (closes[-1] - closes[-6]) / closes[-6] * 100
    pct_20d = (closes[-1] - closes[-21]) / closes[-21] * 100 if len(closes) > 21 else 0

    return {
        "symbol": symbol,
        "name": name,
        "price": closes[-1],
        "ma5": ma5[-1], "ma10": ma10[-1], "ma20": ma20[-1],
        "trend": trend,
        "rsi": rsi,
        "vol_ratio": vol_ratio,
        "support": support_20,
        "resistance": resistance_20,
        "pct_5d": pct_5d,
        "pct_20d": pct_20d,
    }

"resistance": resistance_20, "pct_5d": pct_5d, "pct_20d": pct_20d, }

---## 3. 实战分析示例(2026-04-30 真实数据)

### 3.1 上证指数 (000001.SH)

| 指标 | 数值 | 状态 |
|------|------|------|
| 最新收盘 | 4112.16 | — |
| MA5 | 4092.91 | 价格 > MA5 ✅ |
| MA10 | 4088.27 | 价格 > MA10 ✅ |
| MA20 | 4030.88 | 价格 > MA20 ✅ |
| 均线排列 | MA5 > MA10 > MA20 | 多头排列 ✅ |
| 趋势判断 | 多头排列(强势上涨) | 看多 |
| 量比(5日/20日) | 1.07 | 量能温和放大 |
| 日涨跌 | +0.11% | 微涨 |
| 5日涨跌 | +0.46% | 温和上涨 |
| 20日涨跌 | +4.14% | 明显上涨 |
| 20日高点 | 4112.16 | 创新高 |
| 20日低点 | 3880.10 | — |

**分析结论**:
- 均线系统呈现完美多头排列,短期、中期均线均向上发散
- 量能温和放大(量比1.07),非异常放量
- 20日涨幅4.14%,处于健康上涨区间
- 当前价位创20日新高,注意短期获利盘压力

### 3.2 宁德时代 (300750.SZ)

| 指标 | 数值 | 状态 |
|------|------|------|
| 最新收盘 | 436.00 | — |
| MA5 | 437.69 | 价格 < MA5 ⚠️ |
| MA10 | 438.80 | 价格 < MA10 ⚠️ |
| MA20 | 425.02 | 价格 > MA20 ✅ |
| 均线排列 | 短期均线压制,中期均线支撑 | 震荡整理 |
| 趋势判断 | 震荡整理 | 中性 |
| RSI(14) | 57.25 | 中性区间 |
| 量比(5日/20日) | 0.91 | 量能萎缩 |
| 20日涨跌 | +7.47% | 明显上涨 |
| 20日高点 | 453.98 | 距高点 -3.96% |
| 20日低点 | 384.59 | 距低点 +13.37% |

**分析结论**:
- 短期均线(MA5/MA10)形成压制,但中期均线(MA20)仍提供支撑
- RSI 处于57.25中性区间,既非超买也非超卖
- 量能萎缩(量比0.91),表明上涨动力减弱
- 20日涨幅7.47%后回调至436,处于20日区间中上部
- **观察区间**: 425.02(MA20支撑)~ 453.98(20日高点压力)

---

## 4. 决策仪表盘模板
涨动力减弱
- 20日涨幅7.47%后回调至436,处于20日区间中上部
- **观察区间**: 425.02(MA20支撑)~ 453.98(20日高点压力)

---

## 4. 决策仪表盘模板### 4.1 标准输出格式
【决策仪表盘】{股票名称} ({代码})

📊 关键数据看板 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 现价: {price} 涨跌幅: 5日 {pct_5d:+.2f}% / 20日 {pct_20d:+.2f}% 均线: MA5={ma5:.2f} MA10={ma10:.2f} MA20={ma20:.2f} RSI(14): {rsi:.2f} 量比: {vol_ratio:.2f}

📈 多空信号 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 均线系统: {trend} MACD: {macd_status} RSI: {rsi_status} 成交量: {volume_status}

🎯 操作建议区间 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 支撑位: {support:.2f} 压力位: {resistance:.2f} 观察区间: [{support_20:.2f}, {resistance_20:.2f}]

⚠️ 风险提示 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1. {risk_1} 2. {risk_2} 3. {risk_3} ```

4.2 信号判定规则

RSI 状态: - RSI > 70: 超买区,注意回调风险 - RSI 50-70: 强势区,多头占优 - RSI 30-50: 弱势区,空头占优 - RSI < 30: 超卖区,注意反弹机会

成交量状态: - 量比 > 1.5: 异常放量,关注突破/反转 - 量比 0.8-1.5: 正常量能 - 量比 < 0.8: 量能萎缩,趋势可能衰竭

MACD 状态: - DIF > DEA 且 MACD > 0: 多头信号 - DIF < DEA 且 MACD < 0: 空头信号 - DIF 上穿 DEA: 金叉(买入信号) - DIF 下穿 DEA: 死叉(卖出信号)


5. 避坑指南

5.1 数据源坑点

  1. akshare 兼容性: akshare 1.18.59 版本中 stock_zh_a_daily 存在字段变更 bug(KeyError: 'date'),不建议直接使用
  2. 东方财富 API: 海外服务器无法访问,返回空数据
  3. yfinance: A股数据经常被限流,不稳定
  4. Sina 财经: 最稳定的海外可用数据源,但需注意 JSONP 解析

5.2 量化分析陷阱

  1. 均线滞后性: MA 是滞后指标,不能单独作为买卖依据
  2. RSI 钝化: 在强趋势中 RSI 可能长期处于超买/超卖区
  3. 量价背离: 价格上涨但成交量萎缩,可能见顶
  4. 幸存者偏差: 回测时必须考虑已退市股票
  5. 过拟合风险: 参数过多容易过拟合历史数据

5.3 严禁事项

  • ❌ 禁止使用缩写(市盈率不能写 PE)
  • ❌ 禁止给出"明天必涨"等无依据结论
  • ❌ 禁止仅凭单一指标做出判断
  • ❌ 禁止忽略成交量分析
  • ❌ 禁止使用模拟数据替代真实数据