Files
ljwx-stock/AI_ASSISTANT_DATA_STRATEGY.md
2025-11-10 23:27:16 +01:00

45 KiB
Raw Permalink Blame History

AI 助手数据准备完整方案

Stock Recommendation System - AI Assistant Data Pipeline

版本: 1.0 更新时间: 2025-11-10 目标: 为AI助手准备完善、成熟的数据流处理管道


目录

  1. 执行摘要
  2. AI助手的数据需求分析
  3. 需要增加的新数据源
  4. 数据获取方式对比
  5. 完善的数据处理管道设计
  6. 实施路线图
  7. 成本分析

执行摘要

现状

当前系统的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