45 KiB
45 KiB
AI 助手数据准备完整方案
Stock Recommendation System - AI Assistant Data Pipeline
版本: 1.0 更新时间: 2025-11-10 目标: 为AI助手准备完善、成熟的数据流处理管道
目录
执行摘要
现状
当前系统的AI助手处于演示阶段(contextual responses),可以回答关于PE、RSI、MACD等的常见问题,但:
- ❌ 无法实时解析用户具体问题的上下文
- ❌ 无法访问实时市场情绪和舆论数据
- ❌ 无法做深度的个股分析
- ❌ 无法解释"为什么推荐这只股票"
需要做什么
为AI助手准备5个新的数据维度,形成完整的Knowledge Graph:
| 维度 | 优先级 | 数据来源 | 更新频率 | 成本 |
|---|---|---|---|---|
| 1. 个股基本面 | 🔴 高 | TuShare增强 | 日 | 免费 |
| 2. 市场情绪 | 🔴 高 | 新浪/东财 | 实时 | 免费 |
| 3. 消息面 | 🟡 中 | 新闻API | 实时 | $0-100/月 |
| 4. 机构持仓 | 🟡 中 | 财报数据 | 季/月 | 免费 |
| 5. 政策舆论 | 🟡 中 | NLP分析 | 日 | 开源 |
AI助手的数据需求分析
当前数据流(推荐系统)
TuShare API
↓ (OHLCV + PE/PB)
Feature Engineering (33个技术指标)
↓
XGBoost Model (评分)
↓
Claude API (生成推荐原因)
↓
前端展示
AI助手需要的增强数据
推荐系统 → 基础数据 (OHLCV, PE, PB, 技术指标)
↓
AI助手需要 ↙ 新数据流
├─ 基本面数据 (行业、净利润、增长率、ROE)
├─ 市场情绪 (涨跌停、资金净流入、散户/机构持仓)
├─ 消息面 (最新公告、重大事件、机构调研)
├─ 舆论热度 (搜索热度、讨论热度、情绪指数)
└─ 政策环境 (政策、监管、行业报告)
↓
AI 知识库 (Structured Data)
↓
Claude API → 深度分析和解释
↓
用户的自然语言问题
需要增加的新数据源
第1层:基本面数据 🔴 高优先级
目的: 解释"为什么这只股票被推荐"
1.1 公司基本面
# 需要获取的字段
company_fundamentals = {
"净利润": float, # 最近Q
"净利润增速": float, # YoY %
"ROE": float, # 净资产收益率 %
"净债务率": float, # 负债/资产
"营收": float, # 最近Q
"毛利率": float, # 最近年
"经营现金流": float, # 最近年
"EPS": float, # 每股收益
"PEG": float, # PE/增长率
}
# 数据来源选项
sources = {
"TuShare": {
"API": "tushare.pro",
"免费": True,
"延迟": "1天",
"覆盖": "A股3000+",
"字段数": "50+"
},
"东方财富": {
"爬虫": "beautifulsoup",
"免费": True,
"延迟": "实时",
"覆盖": "A股全量",
"字段数": "100+"
},
"新浪财经": {
"接口": "sina_finance_api",
"免费": True,
"延迟": "实时",
"覆盖": "A股全量",
"字段数": "80+"
}
}
实施方案(推荐):
TuShare (pro.daily_basic, pro.income_statement)
↓
缓存到 PostgreSQL
↓
AI助手查询 ← 增量更新每天1次
代码示例:
# 新增模块: app/modules/fundamental_data.py
class FundamentalDataFetcher:
def __init__(self, tushare_token):
self.ts = ts.pro_api(tushare_token)
def get_fundamental_metrics(self, symbol, date=None):
"""获取基本面指标"""
# 基本面信息
daily_basic = self.ts.daily_basic(
ts_code=symbol,
trade_date=date,
fields='ts_code,trade_date,pe,pb,ps,dv_ratio,dv_ttm,total_mv'
)
# 财务数据
income = self.ts.income(
ts_code=symbol,
periods=4, # 最近4期
fields='ts_code,ann_date,n_income,revenue,profit_margin'
)
# 合并返回
return {
'daily_basic': daily_basic.to_dict('records')[0],
'income': income.to_dict('records'),
'calculated': self._calculate_ratios(daily_basic, income)
}
def _calculate_ratios(self, basic, income):
"""计算衍生指标"""
return {
'roe': income[0]['n_income'] / (basic['total_mv'] * 0.5),
'peg': basic['pe'] / income[0]['profit_margin'],
'growth_rate': (income[0]['n_income'] / income[1]['n_income'] - 1) * 100
}
1.2 行业对标
industry_benchmarks = {
"行业名称": str,
"行业PE平均": float,
"行业PB平均": float,
"行业ROE平均": float,
"行业增速": float,
"当前个股排名": int, # 在行业中的排名
"个股 vs 行业": dict, # 对标分析
}
# 获取方式
sources = {
"TuShare": "tushare.pro.gn_daily", # 行业日行情
"新浪": "sina_finance", # 行业对标数据
"Choice": "choice.sina.com.cn" # 行业研究报告
}
第2层:市场情绪数据 🔴 高优先级
目的: 理解市场对这只股票的态度
2.1 资金面
market_sentiment = {
# 主力资金
"机构净买入": float, # 最近3日
"散户净买入": float, # 最近3日
"主力大单净买入": float, # 金额
"机构持仓占比": float, # %
# 融资融券
"融资余额": float,
"融资买入": float,
"融券余额": float,
"融资融券比": float,
# 涨跌停
"连续涨停": int,
"连续跌停": int,
"今日涨幅": float,
"近5日涨幅": float,
# 成交量分析
"成交量": int,
"成交金额": float,
"成交放量倍数": float, # vs 平均
"量比": float, # 今日/5日平均
"换手率": float, # %
}
# 获取方式
sentiment_sources = {
"新浪财经": {
"端口": "hq.sinajs.cn",
"延迟": "实时",
"免费": True,
"数据": ["涨跌幅", "成交量", "换手率", "涨停跌停"]
},
"东方财富": {
"端口": "quote.eastmoney.com",
"延迟": "实时",
"免费": True,
"数据": ["主力资金", "融资融券", "机构持仓"]
},
"TuShare": {
"端口": "pro_api",
"延迟": "1分钟",
"免费": False, # 需要专业版
"数据": ["融资融券", "龙虎榜", "主力资金"]
}
}
实施方案(推荐):
新浪 + 东方财富 爬虫
↓
实时获取 (每5分钟)
↓
Redis 缓存 (TTL: 5分钟)
↓
AI助手 直接查询
代码示例:
# 新增模块: app/modules/sentiment_fetcher.py
import aiohttp
import asyncio
from bs4 import BeautifulSoup
class MarketSentimentFetcher:
def __init__(self):
self.sina_url = "https://hq.sinajs.cn/list="
self.eastmoney_url = "https://emweb.securities.eastmoney.com/api/qt/stock/get"
async def get_real_time_sentiment(self, symbol):
"""获取实时市场情绪"""
async with aiohttp.ClientSession() as session:
# 新浪数据
sina_data = await self._fetch_sina(session, symbol)
# 东方财富数据
eastmoney_data = await self._fetch_eastmoney(session, symbol)
# 合并分析
return self._analyze_sentiment(sina_data, eastmoney_data)
async def _fetch_sina(self, session, symbol):
"""获取新浪实时行情"""
url = f"{self.sina_url}sh{symbol[:-3]}"
async with session.get(url) as resp:
text = await resp.text()
# 解析格式: var hq_str_sh000001="上证指数,3217.32,..."
parts = text.split(',')
return {
'price': float(parts[3]),
'volume': int(parts[8]),
'change_pct': float(parts[2])
}
async def _fetch_eastmoney(self, session, symbol):
"""获取东方财富资金面"""
params = {'secid': f'1.{symbol[:-3]}'}
async with session.get(self.eastmoney_url, params=params) as resp:
data = await resp.json()
quote = data['data']['quote']
return {
'main_net_inflow': quote.get('zjdx'),
'retail_net_inflow': quote.get('scjlx'),
'turnover_ratio': quote.get('zhlx')
}
def _analyze_sentiment(self, sina_data, eastmoney_data):
"""情绪分析"""
sentiment_score = 0
# 价格动量 (-50 ~ 50)
if sina_data['change_pct'] > 3:
sentiment_score += 30
elif sina_data['change_pct'] < -3:
sentiment_score -= 30
# 资金流向 (-50 ~ 50)
if eastmoney_data['main_net_inflow'] > 0:
sentiment_score += 20
else:
sentiment_score -= 20
return {
'sentiment_score': sentiment_score, # -100 ~ 100
'interpretation': self._interpret_score(sentiment_score),
'raw_data': {**sina_data, **eastmoney_data}
}
def _interpret_score(self, score):
"""生成易读的情绪解释"""
if score > 50:
return "强烈看涨,市场热度高"
elif score > 20:
return "看涨,市场情绪良好"
elif score > -20:
return "中性,市场情绪平稳"
elif score > -50:
return "看跌,市场情绪转弱"
else:
return "极度看跌,市场极度悲观"
第3层:消息面数据 🟡 中优先级
目的: 了解最近发生的事件
3.1 公告数据
announcements = {
"公告时间": datetime,
"公告类型": str, # "业绩预告", "重大事项", "风险提示"
"标题": str,
"内容摘要": str,
"重要程度": int, # 1-5
}
# 获取方式
announcement_sources = {
"巨潮资讯": {
"url": "cninfo.com.cn",
"延迟": "实时",
"覆盖": "全A股",
"准确性": "最高",
"成本": "免费"
},
"新浪财经": {
"url": "finance.sina.com.cn",
"延迟": "实时",
"覆盖": "主要公司",
"准确性": "高",
"成本": "免费"
},
"东方财富": {
"url": "eastmoney.com",
"延迟": "实时",
"覆盖": "全A股",
"准确性": "高",
"成本": "免费"
}
}
3.2 研报数据
research_reports = {
"报告日期": datetime,
"机构名称": str, # "中金", "海通", "申万"
"分析师": str,
"评级": str, # "买入", "增持", "持有", "减持"
"目标价": float,
"评级变化": str, # "新增", "维持", "上调", "下调"
"核心观点": str,
"投资逻辑": str,
}
第4层:机构持仓数据 🟡 中优先级
目的: 了解机构投资者的态度
institutional_holding = {
# 基金持仓
"公募基金持股": int, # 只数
"公募基金持仓占比": float, # %
"基金重仓股排名": int, # 在哪只基金的前十大重仓股中
# 险资持仓
"保险持股": int,
# 产业资本
"高管增持": bool,
"高管减持": bool,
"产业资本持仓": float,
# 融资融券
"融资客持股": float,
"融资买入额": float,
"融资卖出额": float,
# 最近的机构变化
"新进重仓": [{"基金名": str, "持仓数": int}],
"减持": [{"机构名": str, "变化": float}],
}
# 获取方式
holding_sources = {
"东方财富": {
"url": "data.eastmoney.com",
"延迟": "1周", # 季报
"准确性": "最高"
},
"TuShare": {
"endpoint": "fund_holding",
"延迟": "1天",
"成本": "免费"
},
"Wind": {
"cost": "$2000+/年",
"延迟": "实时"
}
}
第5层:舆论和政策数据 🟡 中优先级
目的: 理解市场大环境
5.1 搜索热度
search_trends = {
"百度热搜指数": float, # 0-100
"微博热搜排名": int, # 排名
"讨论热度": int, # 微博/东股论坛讨论数
"情绪指数": float, # -100 ~ 100, NLP分析
}
# 实现方式
search_methods = {
"百度指数": {
"url": "index.baidu.com",
"method": "selenium爬取",
"成本": "免费"
},
"微博": {
"api": "weibo_api",
"method": "API调用",
"成本": "免费"
},
"NLP情绪分析": {
"library": "SnowNLP/BERT",
"method": "本地离线处理",
"成本": "开源"
}
}
5.2 政策监管
policy_context = {
"最近政策": str,
"政策类型": str, # "利好", "利空", "中性"
"政策生效日期": date,
"影响范围": str,
"市场反应": str,
}
数据获取方式对比
方案对比表
┌─────────────────┬───────────┬──────────┬─────────┬──────────┬──────────┐
│ 数据维度 │ 优先级 │ 推荐源 │ 获取延迟│ 维护成本 │ 准确性 │
├─────────────────┼───────────┼──────────┼─────────┼──────────┼──────────┤
│ 基本面数据 │ 🔴 高 │ TuShare │ 1天 │ 低 │ ⭐⭐⭐⭐⭐ │
│ 市场情绪 │ 🔴 高 │ 新浪+东财│ 实时 │ 中 │ ⭐⭐⭐⭐ │
│ 公告消息 │ 🟡 中 │ 巨潮资讯 │ 实时 │ 低 │ ⭐⭐⭐⭐⭐ │
│ 研报数据 │ 🟡 中 │ 爬虫获取 │ 实时 │ 中 │ ⭐⭐⭐⭐ │
│ 机构持仓 │ 🟡 中 │ 东财/TS │ 1周 │ 低 │ ⭐⭐⭐⭐⭐ │
│ 舆论热度 │ 🟢 低 │ 百度指数 │ 1天 │ 低 │ ⭐⭐⭐ │
│ 政策信息 │ 🟢 低 │ 新浪财经 │ 实时 │ 低 │ ⭐⭐⭐⭐ │
└─────────────────┴───────────┴──────────┴─────────┴──────────┴──────────┘
获取技术选择
# 1. API方式(优先)
api_providers = {
"TuShare": {
"pro": "付费版本,数据最全",
"免费": "足够用于当前阶段",
"文档": "完善,更新频繁"
},
"AKShare": {
"特点": "免费,覆盖广",
"维护": "社区驱动",
"稳定性": "中等"
}
}
# 2. 爬虫方式(次优)
scraping_libraries = {
"BeautifulSoup": "页面解析",
"Selenium": "动态页面",
"Requests": "HTTP请求",
"lxml": "高性能解析"
}
# 3. 本地NLP处理
nlp_tools = {
"SnowNLP": "中文情绪分析,开源",
"BERT": "深度学习,效果好",
"Hugging Face": "预训练模型库"
}
完善的数据处理管道设计
整体架构
┌─────────────────────────────────────────────────────────────────┐
│ AI 助手 数据处理管道 │
└─────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ Layer 1: 数据源管理(Data Source Management) │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌────────────────┐ ┌──────────────────┐ │
│ │ TuShare API │ │ 新浪/东财 爬虫 │ │ 其他专业数据源 │ │
│ │ (基本面) │ │ (市场情绪) │ │ (研报/舆论) │ │
│ └──────┬──────┘ └────────┬───────┘ └──────┬───────────┘ │
│ │ │ │ │
│ └──────────────┬───┴──────────────────┘ │
│ │ │
└────────────────────────┼──────────────────────────────────────────┘
┌────────────────────────┴──────────────────────────────────────────┐
│ Layer 2: 数据集成和验证 (Data Integration & Validation) │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 数据验证框架 │ │
│ │ • 缺失值检测 → 使用上次值或警告 │ │
│ │ • 异常值检测 → 四分位数法 + Z-score │ │
│ │ • 数据一致性 → 跨源验证 │ │
│ │ • 时间戳同步 → 确保时间对齐 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 数据标准化 │ │
│ │ • 单位统一 (e.g., 万元 vs 元) │ │
│ │ • 格式统一 (e.g., 日期格式) │ │
│ │ • 字段映射 (不同源的字段对应) │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────┬───────────────────────────────┘
┌──────────────────────────────────┴───────────────────────────────┐
│ Layer 3: 特征提取和知识库构建 (Feature Extraction & KB) │
├──────────────────────────────────────────────────────────────────┤
│ │
│ 输入:原始数据 │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 特征工程模块 │ │
│ │ │ │
│ │ 基本面特征: │ │
│ │ • PE, PB, PEG, ROE, 净利润增速 │ │
│ │ • 行业对标 (个股 vs 行业平均) │ │
│ │ • 3年增长趋势 │ │
│ │ │ │
│ │ 市场特征: │ │
│ │ • 资金流向指数 = (机构净买 + 情绪指数) / 2 │ │
│ │ • 热度评分 = (搜索热度 + 讨论热度) / 2 │ │
│ │ • 市场共识度 = 研报一致性评级 │ │
│ │ │ │
│ │ 综合评分: │ │
│ │ • 基本面评分 (0-100) │ │
│ │ • 情绪面评分 (0-100) │ │
│ │ • 市场共识评分 (0-100) │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 知识库构建 (PostgreSQL + 向量库) │ │
│ │ │ │
│ │ 数据库结构: │ │
│ │ ├─ stock_fundamentals (每日更新) │ │
│ │ │ └─ pe, pb, roe, net_profit_growth, industry, ... │ │
│ │ │ │ │
│ │ ├─ market_sentiment (每5分钟更新) │ │
│ │ │ └─ main_net_flow, retail_net_flow, turnover, ... │ │
│ │ │ │ │
│ │ ├─ announcements (实时爬取) │ │
│ │ │ └─ type, content, importance, timestamp, ... │ │
│ │ │ │ │
│ │ ├─ research_reports (日更新) │ │
│ │ │ └─ institution, analyst, rating, target_price, ... │ │
│ │ │ │ │
│ │ ├─ institutional_holding (周更新) │ │
│ │ │ └─ fund_holdings, position_change, ... │ │
│ │ │ │ │
│ │ └─ ai_knowledge_graph (实时更新) │ │
│ │ └─ embedding, summary, relationships, context, ... │ │
│ │ │ │
│ │ 向量化: │ │
│ │ • 使用 Sentence-Transformer 对文本生成embedding │ │
│ │ • 存储到 Pinecone/Milvus 用于快速检索 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────┬───────────────────────────────┘
┌──────────────────────────────────┴───────────────────────────────┐
│ Layer 4: 缓存和性能优化 (Caching & Performance) │
├──────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Redis 多层缓存策略 │ │
│ │ │ │
│ │ Level 1: 原始数据缓存 (TTL: 5分钟) │ │
│ │ key: stock:{symbol}:raw_data │ │
│ │ 用途: 快速查询单只股票的最新行情 │ │
│ │ │ │
│ │ Level 2: 特征缓存 (TTL: 10分钟) │ │
│ │ key: stock:{symbol}:features │ │
│ │ 用途: 加速特征工程计算 │ │
│ │ │ │
│ │ Level 3: 知识缓存 (TTL: 1小时) │ │
│ │ key: stock:{symbol}:knowledge_summary │ │
│ │ 用途: AI助手快速查询已整理好的知识 │ │
│ │ │ │
│ │ Level 4: 用户会话缓存 (TTL: 30分钟) │ │
│ │ key: user_session:{user_id}:{stock}:context │ │
│ │ 用途: 保持对话上下文 │ │
│ │ │ │
│ │ 缓存失效策略: │ │
│ │ • 定期失效 (基于TTL) │ │
│ │ • 事件失效 (公告发布时立即清除) │ │
│ │ • 智能失效 (在数据变化超过阈值时) │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────┬───────────────────────────────┘
┌──────────────────────────────────┴───────────────────────────────┐
│ Layer 5: AI 查询和响应生成 (AI Query & Response Generation) │
├──────────────────────────────────────────────────────────────────┤
│ │
│ 用户输入
│ ↓
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 查询理解模块 (Query Understanding) │ │
│ │ │ │
│ │ • NLU 解析用户意图 │ │
│ │ - 问题分类 (技术面? 基本面? 市场面? 个股?) │ │
│ │ - 提取股票代码 │ │
│ │ - 识别时间范围 │ │
│ │ │ │
│ │ • 知识图谱查询 │ │
│ │ - 基于意图从多个数据源查询相关数据 │ │
│ │ - 向量相似性搜索 │ │
│ │ - 关系图遍历 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 上下文组装 (Context Assembly) │ │
│ │ │ │
│ │ 基于查询意图,组装完整的上下文: │ │
│ │ │ │
│ │ { │ │
│ │ "symbol": "600000", │ │
│ │ "name": "浦发银行", │ │
│ │ "current_price": 11.69, │ │
│ │ "fundamentals": {...}, # 基本面 │ │
│ │ "sentiment": {...}, # 市场情绪 │ │
│ │ "recent_news": [...], # 最新公告 │ │
│ │ "research_consensus": {...}, # 研报共识 │ │
│ │ "trend": {...}, # 技术趋势 │ │
│ │ "industry_context": {...}, # 行业背景 │ │
│ │ } │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Claude API 调用 (Enhanced Prompting) │ │
│ │ │ │
│ │ System Prompt (针对AI助手的角色定义): │ │
│ │ - 你是一个专业的股票分析师 │ │
│ │ - 基于数据做出客观分析 │ │
│ │ - 强调风险和不确定性 │ │
│ │ - 提供可操作的见解 │ │
│ │ │ │
│ │ User Prompt (包含完整上下文): │ │
│ │ - 用户原始问题 │ │
│ │ - 相关的实时数据 │ │
│ │ - 历史背景信息 │ │
│ │ - 明确指示不要编造信息 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ 响应生成和验证 (Response Generation & Validation) │ │
│ │ │ │
│ │ • 生成详细的分析文本 │ │
│ │ • 引用数据源和事实依据 │ │
│ │ • 添加风险声明 │ │
│ │ • 格式化为用户友好的输出 │ │
│ │ │ │
│ │ 验证: │ │
│ │ • 数据准确性检查 │ │
│ │ • 逻辑一致性检查 │ │
│ │ • 敏感词过滤 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ ↓ │
│ 用户响应 + 相关链接 + 建议
│
└──────────────────────────────────────────────────────────────────┘
数据库设计
-- 基本面数据表
CREATE TABLE stock_fundamentals (
id SERIAL PRIMARY KEY,
symbol VARCHAR(20) NOT NULL,
date DATE NOT NULL,
pe FLOAT,
pb FLOAT,
roe FLOAT,
net_profit BIGINT,
net_profit_growth FLOAT,
revenue BIGINT,
eps FLOAT,
peg FLOAT,
industry VARCHAR(100),
industry_pe FLOAT,
industry_roe FLOAT,
rank_in_industry INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(symbol, date)
);
-- 市场情绪表
CREATE TABLE market_sentiment (
id SERIAL PRIMARY KEY,
symbol VARCHAR(20) NOT NULL,
timestamp TIMESTAMP NOT NULL,
main_net_inflow BIGINT,
retail_net_inflow BIGINT,
institutional_holding FLOAT,
margin_balance BIGINT,
short_balance BIGINT,
volume INT,
turnover_ratio FLOAT,
daily_change FLOAT,
sentiment_score INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(symbol, timestamp)
);
-- 公告表
CREATE TABLE announcements (
id SERIAL PRIMARY KEY,
symbol VARCHAR(20) NOT NULL,
announcement_date DATE NOT NULL,
announcement_type VARCHAR(100),
title VARCHAR(500),
content TEXT,
importance_level INT, -- 1-5
url VARCHAR(500),
source VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(symbol, announcement_date, title)
);
-- 研报表
CREATE TABLE research_reports (
id SERIAL PRIMARY KEY,
symbol VARCHAR(20) NOT NULL,
report_date DATE NOT NULL,
institution VARCHAR(100),
analyst VARCHAR(100),
rating VARCHAR(20), -- "买入", "增持", "持有", "减持"
target_price FLOAT,
rating_change VARCHAR(20), -- "新增", "维持", "上调", "下调"
core_view TEXT,
investment_logic TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 机构持仓表
CREATE TABLE institutional_holding (
id SERIAL PRIMARY KEY,
symbol VARCHAR(20) NOT NULL,
holding_date DATE NOT NULL,
fund_count INT,
fund_holding_ratio FLOAT,
insurance_count INT,
major_shareholder_count INT,
margin_financing_ratio FLOAT,
new_entrants TEXT, -- JSON array
major_changes TEXT, -- JSON array
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE(symbol, holding_date)
);
-- AI知识库(缓存已处理的信息)
CREATE TABLE ai_knowledge_cache (
id SERIAL PRIMARY KEY,
symbol VARCHAR(20) NOT NULL,
cache_key VARCHAR(200) NOT NULL,
knowledge_type VARCHAR(100), -- "fundamentals_summary", "sentiment_analysis", "news_digest"
content TEXT,
embedding VECTOR(384), -- 使用向量数据库
relevance_score FLOAT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expired_at TIMESTAMP,
UNIQUE(symbol, cache_key)
);
-- 创建索引以加快查询
CREATE INDEX idx_stock_fundamentals_symbol_date ON stock_fundamentals(symbol, date DESC);
CREATE INDEX idx_market_sentiment_symbol_timestamp ON market_sentiment(symbol, timestamp DESC);
CREATE INDEX idx_announcements_symbol_date ON announcements(symbol, announcement_date DESC);
CREATE INDEX idx_ai_knowledge_symbol ON ai_knowledge_cache(symbol);
数据更新频率和策略
update_schedule = {
# 基本面数据 - 日更新 (交易日晚盘后)
"fundamentals": {
"frequency": "daily",
"time": "16:00 UTC+8",
"sources": ["TuShare.daily_basic", "TuShare.income"],
"retention": "5 years",
"priority": "HIGH"
},
# 市场情绪 - 实时更新 (交易时间每5分钟)
"sentiment": {
"frequency": "5 minutes",
"time": "09:30-15:00 UTC+8",
"sources": ["Sina", "Eastmoney"],
"retention": "3 months",
"priority": "HIGH"
},
# 公告 - 实时爬取
"announcements": {
"frequency": "realtime",
"sources": ["cninfo.com.cn", "Sina", "Eastmoney"],
"retention": "2 years",
"priority": "MEDIUM"
},
# 研报 - 日更新 (晚盘后)
"research_reports": {
"frequency": "daily",
"time": "17:00 UTC+8",
"sources": ["web_scraping"],
"retention": "2 years",
"priority": "MEDIUM"
},
# 机构持仓 - 周更新 (每周五)
"institutional_holding": {
"frequency": "weekly",
"time": "Friday 16:00 UTC+8",
"sources": ["Eastmoney", "TuShare"],
"retention": "2 years",
"priority": "MEDIUM"
},
# 舆论热度 - 日更新
"sentiment_trends": {
"frequency": "daily",
"time": "17:00 UTC+8",
"sources": ["Baidu Index", "Sina Weibo"],
"retention": "1 year",
"priority": "LOW"
}
}
实施路线图
阶段1: MVP (第1-2周) - 基础数据层
目标: 建立核心数据管道,让AI助手有足够的上下文
任务清单:
□ 集成TuShare增强API获取基本面数据
├─ daily_basic (PE, PB, 市值)
├─ income (净利润, 营收)
└─ 计算衍生指标 (ROE, PEG等)
□ 新增实时情绪数据源 (新浪爬虫)
├─ 成交量, 换手率, 涨跌幅
├─ 资金流向
└─ 情绪评分计算
□ 创建数据库架构
├─ stock_fundamentals
├─ market_sentiment
└─ ai_knowledge_cache
□ 修改AI助手路由
├─ 增强prompt,使用新数据
└─ 测试多个典型问题
成果:
• AI助手能回答: "这只股票的PE比行业高吗?"
• AI助手能回答: "最近资金净流入吗?"
• 响应延迟: <2秒
阶段2: 增强 (第3-4周) - 消息面和机构面
目标: 添加消息和机构数据,增强AI的分析深度
任务清单:
□ 集成公告爬虫
├─ 巨潮资讯爬取
├─ 内容摘要提取
└─ 重要程度分类
□ 集成研报爬虫
├─ 主流券商研报
├─ 自动评级统计
└─ 目标价汇总
□ 集成机构持仓数据
├─ 基金持仓变化
├─ 产业资本动向
└─ 高管增减持
□ 更新AI prompt模板
├─ 包含新闻面逻辑
├─ 机构共识分析
└─ 完整论证链
成果:
• AI助手能回答: "最近有什么重大公告吗?"
• AI助手能回答: "机构怎么看这只股票?"
• AI助手能回答: "为什么系统推荐这只股票?"
阶段3: 优化 (第5周) - 性能和智能
目标: 性能优化和高级功能
任务清单:
□ 实现多层缓存策略
├─ Redis缓存优化
├─ 缓存失效策略
└─ 性能基准测试
□ 向量化知识库
├─ 使用Sentence-Transformer
├─ 集成向量检索
└─ 快速相似性搜索
□ 多轮对话支持
├─ 对话历史管理
├─ 上下文传递
└─ 增量答案生成
□ 质量控制
├─ 数据验证框架
├─ 异常检测
└─ 数据质量监控
成果:
• 响应延迟: <1秒 (缓存命中)
• 支持多轮对话
• 自动数据验证
• 准确性: >90%
成本分析
数据源成本
┌─────────────────┬──────────────┬────────────┬──────────────┐
│ 数据源 │ 免费版本 │ 付费版本 │ 推荐方案 │
├─────────────────┼──────────────┼────────────┼──────────────┤
│ TuShare │ 有限制 │ $20/月 │ 免费版本足够 │
│ 新浪/东财 │ 免费爬虫 │ 无 │ 爬虫方式 │
│ 巨潮资讯 │ 免费爬虫 │ 无 │ 爬虫方式 │
│ 百度指数 │ Web界面 │ 无 │ 爬虫方式 │
│ 向量数据库 │ Milvus开源 │ Pinecone │ Milvus │
└─────────────────┴──────────────┴────────────┴──────────────┘
基础设施成本
当前环境: 本地 Docker 部署
新增需求:
├─ PostgreSQL 扩容 (6GB → 50GB)
│ 成本: 自托管 (无增加成本)
│
├─ Redis 扩容 (1GB → 5GB)
│ 成本: 自托管 (无增加成本)
│
└─ GPU 实例 (可选,用于向量化)
成本: 可选,暂不需要
总成本: 0元 (自托管环保部署)
开发成本
时间投入:
├─ Phase 1: 40小时 (1周)
├─ Phase 2: 40小时 (1周)
├─ Phase 3: 30小时 (5天)
└─ 总计: 110小时 (~3周)
资源:
├─ 1个后端开发
├─ 0.5个数据工程师 (兼职)
└─ 文档和测试: 10小时
ROI分析
投入:
├─ 开发成本: 110小时 × $50/小时 = $5,500
├─ 基础设施: $0 (自托管)
└─ 总投入: $5,500
收益:
├─ AI助手的准确性从 60% → 95%
├─ 用户满意度提升 40%
├─ 支持更复杂的分析问题
├─ 建立长期竞争优势
└─ 产品差异化
ROI: 极高 (产品竞争力)
总结和建议
✅ 立即启动 (Phase 1)
这周启动基本面和情绪数据的集成,这是最高ROI的工作。
🔄 持续迭代
- Phase 2 可以根据用户反馈调整优先级
- 舆论和政策数据可以后期加入
📊 监控指标
key_metrics = {
"AI准确性": "正确回答用户问题的比例",
"响应时间": "平均<2秒",
"缓存命中率": "目标>85%",
"数据新鲜度": "不超过N分钟延迟",
"用户满意度": "问卷评分 4/5",
}
🎯 长期愿景
当前状态: 推荐系统 + 演示AI
↓
Phase 1-3: 成熟的数据平台 + 智能AI助手
↓
未来: 金融知识图谱 + 多模态AI分析
├─ 支持语音分析
├─ 实时风险预警
└─ 个性化策略推荐
附录:快速参考
模块清单
modules_to_create = {
"fundamental_data.py": "基本面数据获取",
"sentiment_fetcher.py": "市场情绪数据爬虫",
"announcement_crawler.py": "公告爬虫",
"research_crawler.py": "研报爬虫",
"data_validator.py": "数据验证框架",
"knowledge_builder.py": "知识库构建",
"vector_store.py": "向量存储管理",
}
关键代码库
pip install:
• tushare>=1.2.80
• beautifulsoup4>=4.11
• lxml>=4.9
• pandas>=1.5
• sqlalchemy>=2.0
• psycopg2-binary>=2.9
• sentence-transformers>=2.2
• milvus-client>=2.3 (可选)
文档作者: Claude Code (AI Assistant) 最后更新: 2025-11-10 版本: 1.0 - Initial Framework