AI 量化研究:A 股实战分析框架
创建日期: 2026年5月1日 | 状态: 生产就绪 数据源: akshare (新浪财经源), 实时验证 验证股票: 贵州茅台 (600519) - 2025-01-01 至 2025-04-30
1. 数据基础设施
1.1 akshare 数据获取(已验证)
import akshare as ak
import pandas as pd
import numpy as np
# 日线数据(前复权)- 新浪财经源
df = ak.stock_zh_a_daily(
symbol="sh600519", # sh/sz + 6位代码
start_date="20240101",
end_date="20250430",
adjust="qfq" # qfq=前复权, hfq=后复权, ""=不复权
)
# 返回字段: date, open, high, low, close, volume, amount,
# outstanding_share, turnover
# 实时行情(东方财富源)
spot = ak.stock_zh_a_spot_em()
# 包含: 代码, 名称, 最新价, 涨跌幅, 换手率, 成交量, 成交额等
# 北向资金
north = ak.stock_hsgt_north_net_flow_in_em(symbol="北上")
# 返回每日北向资金净流入
北向资金
north = ak.stock_hsgt_north_net_flow_in_em(symbol="北上")
返回每日北向资金净流入
```### 1.2 技术指标计算(无需 TA-Lib)
def ema(data, period):
"""指数移动平均"""
k = 2 / (period + 1)
ema_val = np.zeros_like(data, dtype=float)
ema_val[0] = data[0]
for i in range(1, len(data)):
ema_val[i] = data[i] * k + ema_val[i-1] * (1 - k)
return ema_val
def compute_macd(close, fast=12, slow=26, signal=9):
"""MACD 指标"""
ema_fast = ema(close, fast)
ema_slow = ema(close, slow)
dif = ema_fast - ema_slow
dea = ema(dif, signal)
macd_hist = 2 * (dif - dea)
return dif, dea, macd_hist
def compute_rsi(close, period=14):
"""RSI 相对强弱指标"""
delta = np.diff(close)
gain = np.where(delta > 0, delta, 0)
loss = np.where(delta < 0, -delta, 0)
avg_gain = np.zeros(len(close))
avg_loss = np.zeros(len(close))
avg_gain[period] = np.mean(gain[:period])
avg_loss[period] = np.mean(loss[:period])
for i in range(period+1, len(close)):
avg_gain[i] = (avg_gain[i-1]*(period-1) + gain[i-1]) / period
avg_loss[i] = (avg_loss[i-1]*(period-1) + loss[i-1]) / period
rs = avg_gain / np.where(avg_loss == 0, 1, avg_loss)
return 100 - (100 / (1 + rs))
/ period
rs = avg_gain / np.where(avg_loss == 0, 1, avg_loss)
return 100 - (100 / (1 + rs))def compute_kdj(high, low, close, n=9):
"""KDJ 随机指标"""
low_n = np.array([np.min(low[max(0,i-n+1):i+1]) for i in range(len(low))])
high_n = np.array([np.max(high[max(0,i-n+1):i+1]) for i in range(len(high))])
rsv = (close - low_n) / np.where(high_n - low_n == 0, 1, high_n - low_n) * 100
k = ema(rsv, 3)
d = ema(k, 3)
j = 3*k - 2*d
return k, d, j
n - low_n) * 100 k = ema(rsv, 3) d = ema(k, 3) j = 3k - 2d return k, d, j
---## 2. 实战分析框架:贵州茅台 (600519) 案例分析
### 2.1 关键数据看板
| 指标 | 数值 | 说明 |
|------|------|------|
| 最新收盘价 | 1491.86 | 2025-04-30 |
| MA5 | 1493.46 | 短期均线压制 |
| MA10 | 1497.75 | 中期均线压制 |
| MA20 | 1495.82 | 价格略低于20日均线 |
| MA60 | 1472.54 | 中长期均线支撑 |
| 成交量比率(5日/20日) | 0.57 | 量能萎缩 |
### 2.2 技术面多空信号
| 指标 | 数值 | 状态 | 解读 |
|------|------|------|------|
| MACD DIF | -0.1116 | 死叉 | DIF 低于 DEA,短期空头占优 |
| MACD DEA | 2.2537 | 下行 | 中期动能减弱 |
| RSI(14) | 48.35 | 中性 | 未进入超买(>70)或超卖(<30)区间 |
| KDJ-K | 32.92 | 偏弱 | K 值偏低,接近超卖区 |
| KDJ-D | 33.91 | 偏弱 | D 值同步走低 |
| KDJ-J | 30.95 | 偏弱 | J 值最低,有反弹需求但信号不强烈 |
**技术面综合判断**: 短期均线空头排列(MA5 < MA10 < MA20),MACD 死叉,但价格仍高于 MA60 中长期支撑线,属于**短期回调、中期盘整**格局。
### 2.3 量价关系分析
- **成交量比率 0.57**: 5日均量仅为20日均量的57%,属于**明显缩量**
- **量缩价跌**: 符合正常回调特征,非恐慌性抛售
- **天量/地量参考**: 期间最大成交量出现在 2025-04-30(257万手),为阶段性放量
- **筹码分布**: 缩量回调至 MA60 附近,筹码集中度提高
### 2.4 操作建议区间
| 区间类型 | 价格区间 | 依据 |
|----------|----------|------|
| 支撑位 | 1472-1480 | MA60 (1472.54) + 近期低点 |
| 压力位 | 1495-1510 | MA20 (1495.82) + MA10 (1497.75) + 近期高点 |
| 观察区间 | 1472-1510 | 等待方向选择 |
### 2.5 风险提示
1. **板块退潮风险**: 白酒板块整体估值处于历史中位,若消费数据不及预期可能进一步承压
2. **技术指标共振偏空**: MACD 死叉 + KDJ 偏弱 + 均线空头排列,三重共振增加短期下行概率
3. **量能不足**: 缩量状态下突破压力位的可信度较低,需等待放量确认
---
## 3. 资金面分析框架
### 3.1 北向资金追踪
```python
# 北向资金净流入(日频)
north_flow = ak.stock_hsgt_north_net_flow_in_em(symbol="北上")
# 分析: 连续净流入天数、累计净流入额、与股价相关性
# 个股北向持股
north_hold = ak.stock_hsgt_individual_em(symbol="600519")
# 分析: 北向持股比例变化趋势
3.2 主力资金流向
3.2 主力资金流向
```python# 个股资金流向(东方财富) fund_flow = ak.stock_individual_fund_flow(stock="600519", market="sh")
分析: 主力净流入/流出、超大单/大单/中单/小单分布
### 3.3 龙虎榜分析
```python
# 龙虎榜个股详情
lhb = ak.stock_lhb_detail_em(
start_date="20250401",
end_date="20250430"
)
# 分析: 游资席位追踪、机构买卖差额、知名游资动向
4. 舆情面分析框架
4.1 行业板块轮动
# 行业板块涨跌幅
sector = ak.stock_board_industry_name_em()
# 分析: 当日/周/月涨跌幅排名,判断资金偏好
# 概念板块热度
concept = ak.stock_board_concept_name_em()
# 分析: 概念板块资金流入排名
4.2 散户情绪指标
| 指标 | 计算方法 | 解读 |
|---|---|---|
| 换手率 | 成交量 / 流通股本 | >5% 活跃,>10% 过热,<1% 冷清 |
| 量比 | 当日量 / 5日平均量 | >2 放量,<0.5 缩量 |
| 涨停板数量 | 每日涨停股票数 | >100 市场情绪高涨,<20 情绪低迷 |
10% 过热,<1% 冷清 | | 量比 | 当日量 / 5日平均量 | >2 放量,<0.5 缩量 | | 涨停板数量 | 每日涨停股票数 | >100 市场情绪高涨,<20 情绪低迷 |
---## 5. 完整分析管线
def analyze_stock(symbol, name, start_date="20240101", end_date="20250430"):
"""完整 A 股分析管线"""
import akshare as ak
# 1. 获取数据
df = ak.stock_zh_a_daily(symbol=symbol, start_date=start_date, end_date=end_date, adjust="qfq")
close = df['close'].values.astype(float)
high = df['high'].values.astype(float)
low = df['low'].values.astype(float)
volume = df['volume'].values.astype(float)
# 2. 计算技术指标
dif, dea, macd_hist = compute_macd(close)
rsi = compute_rsi(close)
k, d, j = compute_kdj(high, low, close)
# 3. 计算均线
ma5 = np.convolve(close, np.ones(5)/5, 'valid')
ma20 = np.convolve(close, np.ones(20)/20, 'valid')
ma60 = np.convolve(close, np.ones(60)/60, 'valid')
# 4. 生成报告
report = {
"stock": symbol,
"name": name,
"last_close": close[-1],
"macd_status": "金叉" if dif[-1] > dea[-1] else "死叉",
"rsi": rsi[-1],
"rsi_status": "超买" if rsi[-1]>70 else "超卖" if rsi[-1]<30 else "中性",
"kdj_k": k[-1],
"kdj_d": d[-1],
"kdj_j": j[-1],
"ma5": ma5[-1],
"ma20": ma20[-1],
"ma60": ma60[-1],
"vol_ratio": np.mean(volume[-5:]) / np.mean(volume[-20:])
}
return report
# 使用示例
report = analyze_stock("sh600519", "贵州茅台")
print(json.dumps(report, indent=2, ensure_ascii=False))
6. 避坑指南
ock("sh600519", "贵州茅台") print(json.dumps(report, indent=2, ensure_ascii=False)) ```
6. 避坑指南### 6.1 数据源注意事项
| 问题 | 解决方案 |
|---|---|
stock_zh_a_spot_em 连接超时 |
东方财富限频,建议加 time.sleep(1) 或使用备用源 |
| 前复权 vs 后复权 | 技术分析用前复权(qfq),收益计算用后复权(hfq) |
| 停牌日数据缺失 | akshare 自动跳过停牌日,计算均线时需注意数据连续性 |
| 新股数据不足 | MA60 需要60个交易日,新股指标不可靠 |
6.2 指标计算注意事项
| 问题 | 解决方案 |
|---|---|
| EMA 初始值偏差 | 使用前 period 个数据作为预热期 |
| RSI 极端值 | avg_loss=0 时需特殊处理(代码已处理) |
| KDJ 钝化 | 强势股 KDJ 可能在超买区持续运行,需结合其他指标 |
| 均线滞后性 | MA 是滞后指标,不能作为唯一决策依据 |
6.3 量化分析红线
- 严禁使用模拟数据替代真实数据
- 严禁给出"明天必涨/必跌"等无依据结论
- 必须基于数据逻辑推导,标注假设条件
- 必须明确风险提示,列出潜在风险点
- 严禁使用英文缩写代替中文术语(如 PE 写为市盈率)