Tushare + AI 量化分析实战:从数据采集到智能选股
本文介绍如何基于 Tushare Pro 搭建一套完整的 A股量化分析系统,支持批量分析 4000+ 只股票,LLM 驱动的情绪评分和智能选股。
一、项目背景
我在研究 A股量化投资时,需要一个能够:
- 批量采集全市场股票数据
- 自动分析每只股票的技术面和消息面
- 智能筛选符合特定条件的标的
传统方式需要人工筛选,效率低下。于是我搭建了 DSA(Deep Stock Analysis)系统。
二、系统架构
数据源层(Tushare/Akshare/Eastmoney/Sina)
↓
DataFetcherManager(多源自动切换)
↓
Pipeline(数据处理 + 特征提取)
↓
LLM Agent(DeepSeek/MiniMax)
↓
SQLite(本地存储)+ 飞书(推送)
核心设计理念:
- 多数据源冗余:一个失败自动切换下一个
- LLM 驱动:用大模型做情绪分析和选股决策
- 批量处理:支持同时分析上千只股票
三、数据采集层
3.1 Tushare Pro 数据获取
import tushare as ts
pro = ts.pro_api('your_token')
# 获取日线数据
df = pro.daily(
ts_code='002460.SZ', # 赣锋锂业
start_date='20260301',
end_date='20260331'
)
print(df.head())
Tushare 积分说明:
| 积分 | 可用接口 |
|------|---------|
| 120 | daily(日线)、realtime(实时) |
| 2000 | 财报、龙虎榜、指数 |
3.2 多数据源自动切换
class DataFetcherManager:
"""多数据源统一抽象"""
def __init__(self):
self.fetchers = [
TushareFetcher(), # 优先 Tushare
AkshareFetcher(), # 备选 Akshare
EastmoneyFetcher(), # 备选 东财
SinaFetcher(), # 备选 新浪
]
def get_realtime_quote(self, code):
"""遍历数据源,失败自动切换"""
for fetcher in self.fetchers:
try:
quote = fetcher.get_realtime_quote(code)
if quote:
return quote
except:
continue
return None # 全部失败
四、LLM 驱动的分析引擎
4.1 分析流程
{
"code": "002460",
"name": "赣锋锂业",
"sentiment_score": 82, # 情绪评分 0-100
"trend_prediction": "强烈看多",
"operation_advice": "持有", # 买入/持有/观望/卖出
"confidence_level": "高",
"decision_type": "hold"
}
4.2 Prompt 设计
ANALYSIS_PROMPT = """
你是一个专业的A股分析师。请根据以下数据,分析{stock_name}({stock_code}):
实时行情:{realtime_data}
K线形态:{kline_pattern}
板块信息:{sector_info}
近期新闻:{news_summary}
请输出JSON格式的分析结果:
{{
"sentiment_score": 0-100的评分,
"trend_prediction": "强烈看多/看多/震荡/看空/强烈看空",
"operation_advice": "买入/持有/观望/卖出",
"confidence_level": "高/中/低",
"decision_type": "buy/hold/wait/sell"
}}
"""
五、批量分析实战
5.1 新能源板块筛选
# 新能源板块相关股票
new_energy_stocks = [
('002460', '赣锋锂业'), # 锂矿龙头
('300750', '宁德时代'), # 电池巨头
('600110', '诺德股份'), # 锂电铜箔
('002594', '比亚迪'), # 新能源车
]
# 批量分析
for code, name in new_energy_stocks:
result = analyzer.analyze(code)
print(f"{name}: 情绪={result['sentiment_score']}, 建议={result['operation_advice']}")
2026-04-01 新能源板块分析结果:
| 代码 | 名称 | 收盘价 | 涨跌 | 情绪分 | 建议 |
|---|---|---|---|---|---|
| 603158 | 腾龙股份 | 12.28 | +10.04% | 78 | 观望 |
| 600875 | 东方电气 | 38.28 | +9.22% | 68 | 持有 |
| 300750 | 宁德时代 | 405.71 | +1.00% | 72 | 持有 |
| 002460 | 赣锋锂业 | 77.31 | -1.37% | 82 | 持有 |
5.2 全市场扫描
# 获取全部 A股代码
all_codes = pro.stock_basic(list_status='L')
# 批量分析(带进度)
for i, row in tqdm(all_codes.iterrows(), total=len(all_codes)):
try:
result = analyzer.analyze(row['ts_code'][:6])
save_to_db(result)
except Exception as e:
log_error(row['ts_code'], str(e))
六、飞书定时推送
6.1 持仓日报
from lark_oapi import Client
def send_daily_report(positions):
"""发送持仓日报到飞书"""
client = Client.builder()\
.app_id(APP_ID)\
.app_secret(APP_SECRET)\
.build()
content = "📊 持仓股早报\n\n"
for pos in positions:
content += f"🔋 {pos['name']} ({pos['code']})\n"
content += f" 现价: {pos['price']} | 涨跌: {pos['pct']}%\n"
content += f" 情绪: {pos['sentiment']}/100 | 建议: {pos['advice']}\n\n"
# 发送消息
client.im.v1.message.create(
receive_id=USER_ID,
msg_type="text",
content=json.dumps({"text": content})
)
七、Tushare 积分获取经验
7.1 积分等级对照
| 积分 | 可用数据 | 获取难度 |
|---|---|---|
| 0 | 仅基础行情 | 注册即得 |
| 120 | 日线、实时行情 | 完善信息即可 |
| 500 | 资金流、板块 | 邀请5个用户 |
| 2000 | 财报、龙虎榜 | 写2-3篇文章 |
7.2 我的积分获取经历
- 注册 + 完善信息:获得 120 积分 ✅
- 开源项目贡献:向 Tushare 提交 GitHub 仓库 ✅
- 技术文章发表:在 dev.to/知乎/CSDN 发布教程 ✅
- 社区活跃:在 QQ 群帮助解答问题 → 50-200 积分
7.3 快速获取积分建议
1. 发文章(最推荐)
- 写 Tushare 使用教程
- 发到知乎/CSDN/掘金
- 把链接发给群主 → 100-1000积分
2. 邀请用户
- 每邀请1个有效用户 → +50积分
- 邀请5个用户 → +250积分
3. 学生认证
- 联系 Tushare 高校群
- 提交学生证 → 直接送2000积分
八、总结
基于 Tushare + LLM 的量化分析系统,让选股过程从人工筛选变为智能分析:
优势:
- 数据获取自动化(多源切换)
- 分析过程智能化(LLM 驱动)
- 结果存储本地化(SQLite)
- 报告推送定时化(飞书)
局限:
- Tushare 免费接口有限(需要积分解锁更多数据)
- LLM 分析需要 API 成本
- 量化策略需要回测验证
下一步计划:
- 接入 Level2 行情(资金流更精准)
- 增加回测模块(验证策略有效性)
- 支持港股和美股
项目地址:https://github.com/shuwey/dsa
Tushare 注册:https://tushare.pro/register
Top comments (0)