Change: 新增M03智能选股模块
Why
根据任务大纲,M03智能选股是P0优先级功能模块,当前系统已有基础的选股功能(条件筛选、预设策略),但存在以下不足:
- 筛选维度有限:仅支持PE/PB/换手率/涨跌幅等基础指标,缺少技术指标筛选
- 自然语言选股不完善:当前NL选股仅返回空结果,未真正实现AI解析
- 缺少十维画像:任务大纲要求基于多维度指标(十维画像)自动筛选股票
- 缺少AI推荐:没有基于用户偏好和市场状态的智能推荐功能
- 缺少行业/板块筛选:无法按行业、概念板块进行筛选
What Changes
新增功能
1. 多维度条件筛选增强
- 估值维度:PE/PB/PS/股息率/市值等
- 技术维度:均线位置、MACD信号、RSI超买超卖、KDJ金叉死叉
- 量能维度:换手率、量比、成交额
- 涨跌维度:日涨跌幅、N日涨跌幅、连涨连跌天数
- 行业维度:行业分类、概念板块
- 财务维度:ROE、营收增速、净利润增速(依赖财报数据)
2. 十维画像选股
基于任务大纲要求,构建股票十维画像评分体系:
| 维度 | 权重 | 指标 |
|---|---|---|
| 估值 | 15% | PE百分位、PB百分位 |
| 成长 | 15% | 营收增速、净利润增速 |
| 盈利 | 10% | ROE、毛利率 |
| 动量 | 15% | 近期涨幅、相对强弱 |
| 趋势 | 10% | 均线多头排列、MACD |
| 量能 | 10% | 换手率、量比 |
| 波动 | 5% | 波动率、ATR |
| 资金 | 10% | 主力资金流向 |
| 情绪 | 5% | 涨停板、龙虎榜 |
| 风险 | 5% | ST风险、停牌风险 |
3. 自然语言选股(NL Screener)
- 使用ScreenerAgent解析用户自然语言描述
- 转换为结构化筛选条件
- 支持模糊匹配和智能纠错
- 示例:"找出低估值高成长的科技股"
4. AI智能推荐
- 基于用户历史偏好推荐
- 基于市场热点推荐
- 基于策略回测结果推荐
- 每日精选推荐
5. 预设策略增强
- 低估值策略:PE<15, PB<2, 股息率>2%
- 高成长策略:营收增速>20%, 净利润增速>30%
- 动量策略:5日涨幅>10%, 量比>1.5
- 价值投资策略:ROE>15%, PE<20, 连续盈利
- 技术突破策略:突破20日均线, MACD金叉
- 龙头股策略:行业龙头, 市值>500亿
后端增强
数据访问原则
优先使用 Plugin Services 获取数据:所有数据访问应通过 plugins/ 目录下的 Service 类进行,而非直接写 SQL 查询。
可用的 Plugin Services:
| Service | 功能 |
|---|---|
TuShareDailyBasicService |
PE/PB/换手率等估值指标 |
TuShareStockBasicService |
股票基本信息/行业/上市状态 |
TuShareDailyService |
日线行情数据 |
TuShareFinaceIndicatorService |
财务指标数据 |
TuShareAdjFactorService |
复权因子 |
好处:
- 统一数据访问接口,复用现有逻辑
- Plugin Services 已实现输入验证和 SQL 注入防护
- 数据表结构变更只需修改 Plugin Service
- 便于 Mock 测试
ScreenerAgent 增强
继承LangGraphAgent基类,增强选股能力:
Agent Tools:
| 工具函数 | 功能描述 |
|---|---|
screen_by_conditions(conditions) |
多条件组合筛选 |
screen_by_nl(query) |
自然语言选股 |
get_stock_profile(ts_code) |
获取股票十维画像 |
get_ai_recommendations(user_id) |
AI智能推荐 |
get_sector_stocks(sector) |
行业板块选股 |
get_technical_signals() |
技术信号选股 |
ScreenerService 新增
class ScreenerService:
# 多维度筛选
async def filter_by_conditions(conditions: List[Condition]) -> List[Stock]
# 十维画像计算
async def calculate_profile(ts_code: str) -> StockProfile
# 批量画像计算
async def batch_calculate_profiles(ts_codes: List[str]) -> List[StockProfile]
# 自然语言解析
async def parse_nl_conditions(query: str) -> List[Condition]
# AI推荐
async def get_recommendations(user_id: str) -> List[Recommendation]
新增API接口
POST /api/screener/filter- 多条件筛选(增强)POST /api/screener/nl- 自然语言选股(增强)GET /api/screener/profile/{ts_code}- 获取股票画像POST /api/screener/batch-profile- 批量获取画像GET /api/screener/recommendations- AI推荐GET /api/screener/sectors- 获取行业列表GET /api/screener/sectors/{sector}/stocks- 行业内选股GET /api/screener/signals- 技术信号选股POST /api/screener/presets/{id}/apply- 应用预设策略
前端增强
组件增强
ScreenerView.vue- 选股主界面(增强)ConditionBuilder.vue- 条件构建器(增强,支持更多维度)ProfileCard.vue- 新增 股票画像卡片ProfileRadar.vue- 新增 十维画像雷达图NLScreener.vue- 新增 自然语言选股组件RecommendationPanel.vue- 新增 AI推荐面板SectorFilter.vue- 新增 行业板块筛选器TechnicalSignals.vue- 新增 技术信号面板
Store增强
- 新增画像数据状态
- 新增推荐数据状态
- 新增行业筛选状态
Impact
Affected Specs
- stock-screener(新增)
Affected Code
后端:
src/stock_datasource/modules/screener/router.py- 增强API路由src/stock_datasource/modules/screener/service.py- 新增 选股服务src/stock_datasource/modules/screener/schemas.py- 新增 数据模型src/stock_datasource/modules/screener/profile.py- 新增 十维画像计算src/stock_datasource/agents/screener_agent.py- 增强选股Agentsrc/stock_datasource/agents/tools.py- 增强选股工具
前端:
frontend/src/views/screener/ScreenerView.vue- 增强选股界面frontend/src/views/screener/components/- 新增子组件frontend/src/api/screener.ts- 增强APIfrontend/src/stores/screener.ts- 增强状态管理
Dependencies
- 依赖已有的
ods_daily、ods_daily_basic、ods_stock_basic数据表 - 依赖已有的
LangGraphAgent基类 - 依赖 M02 行情分析模块的技术指标计算能力
- 依赖 Langfuse 配置:LLM 调用(自然语言选股、AI推荐)需要配置 Langfuse 实现可观测性
Langfuse 配置要求
大模型调用需要配置 Langfuse 以实现可观测性:
# .env 配置
LANGFUSE_PUBLIC_KEY=pk-xxx # Langfuse Public Key
LANGFUSE_SECRET_KEY=sk-xxx # Langfuse Secret Key
LANGFUSE_HOST=https://cloud.langfuse.com # 或私有部署地址
LANGFUSE_ENABLED=true # 启用 Langfuse
项目已有 Langfuse 集成(src/stock_datasource/llm/client.py),ScreenerAgent 需使用 get_llm_client() 获取已配置 Langfuse 追踪的 LLM 客户端。
Data Tables
ods_daily- 日线行情ods_daily_basic- 每日估值指标ods_stock_basic- 股票基础信息(行业分类)ods_stk_limit- 涨跌停数据