---
slug: "racing-quant-ai-赛马量化ai选股系统-x"
source_type: "clawhub"
source_url: "https://clawhub.ai/skills/racing-quant-ai"
repo: ""
source_file: "description"
---
---
name: racing-quant-ai
description: 赛马量化AI选股系统，集成量化策略选股+个股智能推荐分析。从量化策略数据库筛选符合需求的策略，获取持仓个股，再进行深度分析，最终给出投资参考。触发词：量化选股，racing quant，策略选股，数据库选股，量化分析，AI选股。
---

# Racing Quant AI 赛马量化AI选股系统

## Overview

Racing Quant AI是一套集成化的A股量化选股分析系统，其本质是一个 **「信号→资产」的智能匹配引擎**。系统在三个层面产生信号（策略信号→持仓信号→交易信号），并通过四层匹配机制（用户需求→策略→标的→交易指令）完成从策略研究到交易执行的全链路闭环。

核心功能包含两大部分：
1. **策略选股**：从远程MySQL量化策略数据库中，根据用户需求智能匹配推荐量化策略，并获取策略对应的最新持仓股票
2. **深度分析**：对筛选出的持仓个股，使用结构化分析框架进行个股深度分析，给出客观的投资参考

整个工作流闭环：用户需求 → 匹配策略 → 获取持仓 → 个股分析 → 综合推荐

> ⚠️ **路演/系统说明时的叙事规范**：不要从数据库表结构或技术架构讲起。必须围绕「信号」和「匹配」展开——每个功能点都要回答：它产生什么信号？信号怎么找到对应的资产？详见 `references/signal-asset-matching-framework.md`。

## 触发条件

当用户满足以下任意一种场景时，自动启用本skill：
1. 用户要求"量化选股"、"AI选股"、"策略选股"
2. 用户提到"racing quant"、"赛马量化"、"赛马量化AI"
3. 用户需要从数据库选股并进行深度分析
4. 用户要求根据量化策略推荐股票并分析
5. 用户要求优化策略仓位管理（如调整单仓上限、分仓规则）或回测对比优化方案
6. 用户要求修改或排查 racingai.top 网站功能（前端展示、后端API、数据库问题），包括 bug 修复、性能排查、页面异常
## 数据源（优先级：Tushare > akshare > baostock > 东方财富API）

> 🔴 **数据校验铁律**：所有行情、财务、资金数据必须来自实际数据源调用结果。数据获取失败时必须如实标注"数据获取失败"，**严禁编造任何具体数值**。违反此规则视为重大事故（参见陷阱#14）。

### 1. Tushare MCP（主数据源 - 优先使用）
- **接入方式**：MCP Server `tushareMcp`，工具前缀 `mcp_tushareMcp_*`
- **覆盖范围**：
  - 日线行情（OHLCV）：`daily` / `pro_bar`（含前复权）
  - 每日指标（PE/PB/换手率/市值）：`daily_basic`
  - 财务指标（ROE/净利率/毛利率等）：`fina_indicator`
  - 利润表/资产负债表：`income` / `balancesheet`
  - 个股资金流向：`moneyflow`
  - 龙虎榜：`top_list` / `top_inst`
  - 涨跌停价：`stk_limit`
  - 复权因子：`adj_factor`
  - 交易日历：`trade_cal`
  - 股票基本信息：`stock_basic`
- **优势**：专业金融数据接口，数据准确性和稳定性优于 akshare/baostock
- **前提条件**：Gateway 已配置 tushareMcp MCP Server 并成功发现工具

### 2. new-akshare-stock（第一备用）
- 当 Tushare MCP 不可用（token失效、MCP连接失败、工具未注册）时自动切换
- 覆盖行情、财务、资金流向、龙虎榜等A股量化数据

### 3. baostock（第二备用）
- 当 akshare 也不可用时自动切换
- 覆盖行情K线、财务、基础证券数据

### 4. 东方财富 Push API（兜底）
- 当以上所有Python/MCP接口均不可用时，通过curl调用东方财富实时行情API

### 5. cn-web-search / wechat-article-search（辅助信息源）
- 个股深度研究、行业动态、政策解读，优先返回微信公众号来源内容，自动备注文章标题

### 6. 赛马量化策略数据库
- 实时获取策略持仓、历史绩效、因子暴露数据（MySQL远程连接，独立于行情数据源）

## 核心功能

### 功能1：策略数据库查询与选股

支持多种查询方式，包括直接查询、关键词搜索和**互动偏好匹配**，满足不同用户场景：

#### 数据库配置
连接信息（远程公开量化策略库）：
- 地址：47.121.180.199
- 端口：3306
- 账号：display
- 密码：display999!
- 数据库：db_strategy
- 主表：strategy_information

#### 主策略表字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| strategy_table | text | 策略对应持仓数据表名称 |
| strategy_name | text | 策略英文名称 |
| strategy_id | text | 策略ID（唯一标识） |
| benchmark | text | 对标指数 |
| owner_name | text | 策略创建人姓名 |
| owner_id | text | 创建人ID |
| start_date | datetime | 策略开始回测时间 |
| online_date | datetime | 策略上线时间 |
| strategy_name_cn | text | 策略中文名称 |
| strategy_summ | text | 策略简介 |
| strategy_desc | text | 策略详细描述 |
| strategy_cat | text | 策略分类（量价/基本面/事件驱动/量化选股等） |
| how_to_trade | text | 交易调仓规则 |
| if_recommended | bigint | 是否推荐（1=推荐，0=不推荐） |

#### 策略持仓表字段说明
| 字段 | 类型 | 说明 |
|------|------|------|
| trade_date | text | 交易日期 |
| strategy_name | text | 策略名称 |
| strategy_id | text | 策略ID |
| trading_info | text | 交易信息（持仓信息json，主键为证券代码、值为权重，举例 {'300001.SZ':'0.1'}） |
| trade_price | text | 交易价格（open/close） |
| update_time | datetime | 更新时间 |

#### 支持的查询操作
1. **获取全部策略列表**：查询数据库中所有注册策略，展示策略基本信息
2. **关键词搜索策略**：根据关键词搜索策略名称/简介/描述，返回匹配结果
3. **分类筛选**：按策略分类（量价/基本面等）筛选策略
4. **推荐策略筛选**：只筛选标记为if_recommended=1的优质推荐策略
5. **需求智能匹配**：根据用户描述的投资需求，语义匹配最符合的策略
6. **互动偏好匹配**：通过多轮互动提问，了解用户的投资偏好和风险承受能力，从strategy_desc字段中匹配最契合的策略
7. **获取最新持仓**：根据选中的策略，查询对应持仓表获取最新一期持仓股票列表
备注：多策略命中时，仅列表展示，不自动择优，需用户确认后再获取持仓。

---

### 功能2：个股深度分析（5维度分析框架）

对策略输出的持仓股票，逐个进行结构化深度分析，遵循以下分析框架：

> 💡 **深度分析模式选择**：当用户要求使用"stock-research-sop"分析时，应加载 `quant-finance` 技能的 `templates/stock-research-sop.md` 模板，按三阶段（基本面->技术面->综合判断）执行，该SOP比本5维度框架更严格（含评分、盈亏比、投资者匹配）。本5维度框架适用于快速分析和批量持仓扫描。

#### 维度1：核心交易数据
- 最新股价、当日涨跌幅
- 日内波动区间（最高价/最低价）
- 成交量、成交额、换手率
- 总市值
- 估值指标（PE(TTM)、PB）

**数据源**：优先通过 Tushare MCP 获取；若 Tushare 不可用（token失效/MCP连接失败），切换至`new-akshare-stock`；再不可用切换至`baostock`。最终报告标注实际使用的数据源。
**数据校验要求**：所有量价、市值、估值基础字段，必须与调用数据源实时校验准确性，异常数据高亮备注。

#### 维度2：股价走势回顾
分类展示不同周期涨跌幅：
- 短期：近5日、近1个月
- 中期：近3个月
- 长期：近1年、近5年

**数据源**：优先通过 Tushare MCP 获取；若 Tushare 不可用（token失效/MCP连接失败），切换至`new-akshare-stock`；再不可用切换至`baostock`。最终报告标注实际使用的数据源。
**数据校验要求**：多周期涨跌幅历史量价数据，需匹配数据源原始口径核验计算逻辑，杜绝偏差。

#### 维度3：资金面分析
- 近期主力资金流向（净流入/净流出）
- 主力持仓成本对比当前股价
- 机构控盘度
- 关键支撑位/压力位

**数据源**：优先通过 Tushare MCP 获取；若 Tushare 不可用（token失效/MCP连接失败），切换至`new-akshare-stock`；再不可用切换至`baostock`。最终报告标注实际使用的数据源。
**数据校验要求**：主力资金流向明细，严格校验数据源原始流水数据，异常波动单独标注。

#### 维度4：基本面核心分析
- 估值对比：当前PE/PB对比行业平均，判断高估/低估
- 业绩表现：近期营收、净利润增速，增长稳定性
- 业务亮点：核心优势、新增长点
- 风险提示：客观列出潜在风险（高负债、政策风险、行业周期等）

**数据源**：优先通过 Tushare MCP（`fina_indicator` / `income` / `balancesheet`）获取财务数据；若 Tushare 不可用，切换至`new-akshare-stock`获取公开财务数据；再不可用切换至`baostock`获取。结合`cn-web-search`搜索最新公开信息和机构研报，优先返回微信公众号来源内容，自动备注文章标题
**数据校验要求**：营收、净利润、PE/PB 等财务核心指标，必须对照数据源原始财报字段精准校验，保证基本面数据真实可溯源。

#### 维度5：综合评价
- 短期趋势判断，基于资金面和技术面数据
- 长期投资价值评价，基于基本面分析和估值水平
- 不同类型投资者参考建议（保守/稳健/激进）
- **必须添加免责声明**：明确说明"分析结果仅供学习交流，不构成任何投资建议，投资有风险，入市需谨慎"
- **必须标注**：本次行情/财务/资金数据实际来源（new-akshare-stock 或 baostock）

## 完整工作流程
工作流优先级：用户有明确选股需求 / 指定策略→直接自动执行；无任何需求→触发互动提问；
补充匹配兜底规则：若关键词 / 偏好 / 分类筛选匹配出 2 条及以上策略，仅展示【策略名称 + 中文简介】列表给到用户，等待用户手动选定具体策略后，再执行拉取持仓、个股分析流程，不自动默认选中任意策略。

### 标准工作流（用户给出投资需求）
```
1. 连接数据库 → 查询所有策略
2. 根据用户需求，智能匹配最符合的1-3个策略
3. 对匹配的每个策略，获取其最新一期持仓股票（通常前10-20只）
4. 对持仓股票逐个进行个股深度分析（如用户没有指定数量，则默认前5只）
5. 整理汇总：策略信息 → 持仓列表 → 个股分析报告 → 综合总结
6. 输出完整报告，报告格式严格按照如下输出：
   - 策略信息（名称/ID/简介/描述）
   - 持仓列表（股票代码/名称/占比）
   - 个股分析（每只股票按照5维度分析框架输出）
   - 综合总结（策略优势、风险提示、投资建议）
   - 信息来源注释（公开研报、微信公众号深度报告标题）
   - 免责声明（分析结果仅供学习交流，不构成投资建议，投资有风险，入市需谨慎）
```

### 用户指定策略名称/ID工作流
```
1. 根据用户提供的策略名称/ID，从数据库查询策略详细信息，返回匹配到的策略信息包括名称/ID
2. 获取该策略最新持仓列表
3. 对持仓股票进行个股深度分析（如用户没有指定数量，则默认前5只）
4. 输出完整报告，报告格式严格按照如下输出：
   - 策略信息（名称/ID/简介/描述）
   - 持仓列表（股票代码/名称/占比）
   - 个股分析（每只股票按照5维度分析框架输出）
   - 综合总结（策略优势、风险提示、投资建议）
   - 信息来源注释（公开研报、微信公众号深度报告标题）
   - 免责声明（分析结果仅供学习交流，不构成投资建议，投资有风险，入市需谨慎）
```

### 用户只想查询策略工作流
```
1. 根据用户条件（关键词/分类）筛选策略
2. 输出策略列表和基本信息，供用户选择
3. 用户选择后再进行下一步获取持仓和分析（如用户没有指定数量，则默认前5只）
4. 输出完整报告，报告格式严格按照如下输出：
   - 策略信息（名称/ID/简介/描述）
   - 持仓列表（股票代码/名称/占比）
   - 个股分析（每只股票按照5维度分析框架输出）
   - 综合总结（策略优势、风险提示、投资建议）
   - 信息来源注释（公开研报、微信公众号深度报告标题）
   - 免责声明（分析结果仅供学习交流，不构成投资建议，投资有风险，入市需谨慎）
```

### 互动偏好匹配工作流（在不明确用户偏好时，优先使用）
```
1. 主动提问了解用户的投资偏好，包括：
   - 投资周期偏好（短期/中期/长期）
   - 风险承受能力（保守/稳健/激进）
   - 选股风格偏好（价值成长/红利低波/动量趋势/事件驱动）
   - 行业偏好（是否有特定看好或回避的行业）
   - 其他特殊需求
2. 将用户回答的偏好转化为搜索关键词，在strategy_desc字段中进行语义匹配
3. 按匹配度排序，推荐最符合的3-5个策略
4. 请用户确认选择哪个策略
5. 用户确认后，获取策略最新持仓并进行个股分析（如用户没有指定数量，则默认前5只）
6. 输出完整报告，报告格式严格按照如下输出：
   - 策略信息（名称/ID/简介/描述）
   - 持仓列表（股票代码/名称/占比）
   - 个股分析（每只股票按照5维度分析框架输出）
   - 综合总结（策略优势、风险提示、投资建议）
   - 信息来源注释（公开研报、微信公众号深度报告标题）
   - 免责声明（分析结果仅供学习交流，不构成投资建议，投资有风险，入市需谨慎）
```

### 策略持仓→交易执行（QMT下单）

当用户要求将策略持仓直接推送到交易系统（QMT）时，启用此工作流。

#### 工作流程
```text
1. 连接MySQL策略数据库 → 获取指定策略的最新持仓（代码+权重）
2. 调用东方财富批量API获取实时行情（前20只的现价/涨跌幅/昨收）
3. 加载当前持仓快照（如有）
4. 计算买卖指令：
   - 买入：按权重分配资金，考虑现存仓位，100股取整
   - 卖出：全量换仓模式下，不在目标持仓中的股票全部卖出
5. 风险检查：涨跌停偏离、最低金额、单只仓位上限
6. 输出交易指令JSON或通过xtquant实际下单
```

#### 脚本位置
- `~/.hermes/scripts/racing_to_qmt.py` — 一体化生成+执行脚本
- 详情见 `references/trading-execution-pipeline.md`

#### 关键命令
```bash
# 生成指令（Hermes端）
python3 ~/.hermes/scripts/racing_to_qmt.py --mode=generate-only \\
    --strategy="短周期机器学习时序交叉版" --capital=100000 --top-n=10

# 执行下单（QMT端，需安装xtquant）
python racing_to_qmt.py --mode=execute --account=1234567890
```
1. "你好！为了给你推荐最合适的量化策略，可以先回答几个问题吗？"
2. "你的投资周期更倾向于哪种？（短期/中期/长期）"
3. "你的风险承受能力大概是什么水平？（保守/稳健/激进）"
4. "你更喜欢哪种选股风格？比如：价值成长/红利低波/动量趋势/事件驱动..."
5. "有没有特别看好或者想要回避的行业？"
6. "还有其他特殊需求吗？"

## 工具调用规范

0. **数据校验强制要求（铁律）**：获取个股量价行情、财务估值、资金流向核心数据时，优先使用 Tushare MCP 获取专业金融数据，严格对照当前生效数据源（Tushare/new-akshare-stock/baostock）做字段核验，确保股价、市值、PE/PB、营收利润、主力资金等关键数值完整无误；异常空值、离谱极值需标注说明。**严禁编造任何具体数值，严禁沿用错误数据。数据获取失败时必须如实标注"数据获取失败"。** 违反此规则视为重大事故（参见陷阱#14）。
1. **数据库查询**：使用Node.js连接MySQL数据库，参考scripts目录下的数据库连接模板
2. **获取行情数据**：优先通过 Tushare MCP（`daily` / `daily_basic` / `pro_bar`）获取最新股价和各周期涨跌幅数据；Tushare 不可用时切换至`new-akshare-stock`；再不可用切换至`baostock`
3. **获取主力资金流向**：优先通过 Tushare MCP（`moneyflow`）获取每日主力资金数据；Tushare 不可用时切换至`new-akshare-stock`；再不可用切换至`baostock`
4. **基础信息搜索**：分析前先使用`cn-web-search`搜索股票最新公开信息、机构研报和市场数据
5. **深度报告搜索**：添加`wechat-article-search`深度搜索机制，搜索微信公众号最新发布的个股深度研究报告，获取市场最新观点和深度分析内容，并在最终报告中明确注释引用的公众号文章/深度报告标题
6. **融合分析**：整合量化策略数据库信息、行情数据、主力资金数据、公开市场数据和微信公众号深度研究报告内容，进行多维度融合分析
7. **严格框架**：严格按照5维度分析框架整理输出，不遗漏风险提示
8. **风险优先**：必须同时列出优势和风险，不做片面推荐
9. **输出格式适配**：用户可能要求不同场景的输出格式。若用户要求"雪球讨论区/评论区发帖格式"，输出应遵循：纯文本、无Markdown表格（用对齐文本替代）、用▍/▸/⚠/◆等Unicode符号增强可读性、段落短小精悍、口语化表达（"一句话：…"、"别装看不见"）、避免过度学术化措辞、风险清单用数字编号简洁列出、末尾保留免责声明。核心原则：像一篇有深度的球友帖子，不是研报。
10. **信息标注**：分析过程中引用的公开研报和公众号深度文章，需要在报告末尾注明信息来源
10. **数据源标注**：每份报告必须标注本次量化数据来源（Tushare MCP / new-akshare-stock / baostock），注明实际使用的具体接口
11. **免责声明**：所有分析结果末尾必须带有免责声明

## 陷阱与注意事项

### 环境依赖安装
- akshare 和 baostock 不一定预装在 hermes venv 中
- hermes venv python 路径：`/home/ubuntu/.hermes/hermes-agent/venv/bin/python3`
- 安装步骤：先 `python3 -m ensurepip`（venv 可能没有 pip），再 `python3 -m pip install akshare baostock`
- **必须在 venv python 下安装**，系统 python3 的 `--break-system-packages` 安装不会对 hermes 生效

### 网络限制与数据源降级
- akshare 的东方财富实时接口（`stock_zh_a_spot_em`、`stock_zh_a_hist`）可能因服务器网络限制返回 `RemoteDisconnected` 错误
- baostock 连接也可能超时（login 成功但 query 超时），但**批量K线查询通常稳定**（每次query约1秒）
- **多股票批量分析的最优数据源组合**：
  - **baostock**：批量K线+技术指标（MA/MACD/RSI）——最稳定，for循环批量查询不超时
  - **akshare**：仅用`stock_individual_fund_flow`（资金流向）和`stock_news_em`（新闻）——最稳定的两个接口
  - **akshare**：`stock_financial_abstract_ths`（财务摘要）——可用但注意indicator参数
  - **执行方式**：将Python脚本write_file到/tmp再执行，**不要用`python3 -c`传递含中文的复杂代码**——shell引号嵌套+中文字符极易SyntaxError
- **降级方案**：当 akshare/baostock Python 接口不可用时，使用 `web_fetch` 通过东方财富 Push API 获取实时行情：
  - 实时行情：`https://push2.eastmoney.com/api/qt/stock/get?secid=0.300308&fields=f43,f44,f45,f46,f47,f48,f50,f51,f52,f55,f57,f58,f60,f116,f117,f162,f167,f170,f171`
  - 字段映射：f43=最新价, f44=最高, f45=最低, f46=今开, f47=成交量, f48=成交额, f50=量比, f57=代码, f58=名称, f60=昨收, f116=总市值, f117=流通市值, f162=PE, f167=PB, f170=换手率, f171=涨跌幅
  - 沪市股票 secid 前缀用 `1.`，深市用 `0.`

### 财务数据 API 陷阱
- `stock_financial_abstract_ths(symbol, indicator="按报告期")` 默认按时间正序排列，`head(4)` 返回最早的数据而非最新的
- 应使用 `indicator="按年度"` 并 `tail(4)` 获取最近4年数据
- 或始终用 `tail()` 而非 `head()` 取最新数据

### 资金流向数据可靠性
- `stock_individual_fund_flow` 接口通常稳定可用，即使实时行情接口不通
- 可优先获取资金流向数据，作为行情数据的补充参考（含每日收盘价）

## 基本原则

1. **遵守规范**：严格按照既定流程和标准执行各项操作
2. **客观中立**：只整理公开信息和量化策略结果，不做主观判断
3. **风险提示**：风险提示清晰可见，不隐藏负面信息
4. **信息来源**：所有数据来自公开渠道和量化策略数据库
5. **责任豁免**：始终声明不构成投资建议，投资风险自负
6. **容错降级**：量化数据源支持自动降级切换（Tushare -> akshare -> baostock -> 东方财富API），保证系统稳定可用
7. **数据真实性铁律**：严禁编造数据。数据获取失败时必须如实标注，不得用任何估算值、猜测值或模型生成值替代真实数据。报告中每个数值必须可溯源至具体数据源调用

### 资源

### references/
- `signal-asset-matching-framework.md` — 信号-标的匹配框架：对外路演的核心叙事规范，三层信号体系+四层匹配机制，禁止从架构讲起
- `portfolio-analysis-workflow.md` — 全持仓深度分析的可复用工作流（数据采集→5维度分析→报告输出），含数据源可靠性、陷阱与报告模板
- `trading-execution-pipeline.md` — 策略持仓→QMT交易执行流水线，含 racing_to_qmt.py 脚本用法、模式对比、交易规则配置
- `strategy-drawdown-analysis.md` — 策略历史回撤分析方法论：月度持仓快照、换手率统计、持仓集中度追踪、ETF涨跌幅与持仓时长相关性分析
- `strategy-drawdown-analysis.md` — 策略历史回撤分析方法论：查询任意策略在指定时间段内的持仓变化、换手率、持仓集中度，并关联ETF/个股价格走势解释回撤原因

### references/
- `position-sizing-optimization.md` — 策略仓位优化回测框架：从MySQL拉取历史持仓→东方财富获取价格→模拟原始vs优化策略→对比指标。含最优参数(10%单仓上限+50%总仓位保底)回测验证结果
- `fintech-codebase-structure.md` — racingai.top网站(Go+React)代码结构、开发规范、部署流程。当用户要求修改网站功能时参考

### scripts/
### references/
- `multi-stock-analysis-workflow.md` - 多股票批量深度分析的完整工作流模板（数据源组合、技术指标计算、分析框架、Feishu导出）
- `concept-stock-analysis-workflow.md` - 概念股/主题驱动产业链分析工作流（搜索->识别标的->产业链分层->批量行情采集->综合研判->持仓交叉分析），含超节点算力产业链实战案例
- `tsauto_run-strategy-inventory.md` — 用户自研量化仓库 warwickInv/tsauto_run 的完整策略储备清单（数据ETL→因子工程→ML多因子模型20+变体→择时策略5种→行业轮动→运维辅助），私有Gitee仓库需token访问

### scripts/
包含可直接运行的数据库查询脚本：
- `check-json.js`：检查JSON格式正确性
- `desc-table.js`：输出策略描述表格
- `get-positions-correct.js`：获取策略最新正确持仓列表
- `get-positions.js`：获取策略持仓列表（原始版）
- `get-positions-json.js`：获取持仓JSON格式
- `get-position-table.js`：输出持仓表格
- `list-recommended.js`：列出所有推荐策略
- `read-strategies.js`：读取策略信息
- `strategy-history-analysis.js`：查询指定策略在任意时间段的持仓变化历史（月度快照+换手率+持仓数趋势），用法：`node strategy-history-analysis.js <strategy_id> <start_date> <end_date>`

## 依赖
- Node.js 环境
- `mysql2` 包：用于连接MySQL量化策略数据库（**必须在 scripts/ 目录下 `npm install mysql2`，旧版 `mysql` 包不可用**）
- **Tushare MCP（主数据源）**：MCP Server `tushareMcp` 已在 config.yaml 中配置，提供专业金融数据（行情/财务/资金流向/龙虎榜等）。需 Gateway 重启后自动发现工具。若 MCP 连接失败则自动降级至下方备用数据源
- `new-akshare-stock`技能：第一备用数据源（行情、财务、资金流向、龙虎榜等A股量化数据）
- `baostock`技能：第二备用数据源（行情、财务、基础证券数据，自动降级使用）
- `cn-web-search`技能：用于获取个股最新公开信息和机构研报
- `wechat-article-search` 深度搜索：搜索微信公众号最新深度研究报告
- `stock-analysis` 技能：提供结构化个股分析框架，自动适配 Tushare / new-akshare-stock / baostock 数据源

## 坑与陷阱（实战经验）

### 14. 数据幻觉事故防范（2026-07-24 重大事故修复）

**事故复盘**：每日持仓分析cron job（8c5674a53206）使用 `portfolio_report.py` 脚本采集行情。当 akshare 的 `stock_zh_a_spot_em()` 接口返回 `RemoteDisconnected` 时，脚本输出全 N/A。下游 LLM（deepseek-v4-flash）在收到全 N/A 数据后，**没有如实报告失败，而是编造了一整套虚假行情数据**（成交额、涨跌幅、换手率、大宗交易等全部捏造），推送至飞书群。

**根因**：
1. 脚本无降级方案（akshare 失败即全军覆没）
2. Prompt 无防幻觉护栏（未禁止编造数据）
3. 盘前9:00运行取实时行情（市场未开，数据无效）

**修复措施（已实施 v2.1）**：
1. **脚本降级**：`portfolio_report.py` 主数据源改为 baostock（稳定可靠），登录一次批量查询，3秒完成14只标的采集
2. **Prompt 硬护栏**：在 cron prompt 中添加 5 条数据完整性要求，明确禁止编造数据
3. **状态报告**：脚本输出开头包含采集状态摘要（成功/失败计数），失败品种标注"数据获取失败"

**铁律：任何分析报告中，行情数据只能来自脚本采集的表格。如果数据为 N/A/获取失败，必须如实标注，严禁编造任何具体数字。违反此规则视为重大事故。**

### 15. Tushare MCP 数据源使用规范（2026-07-24 新增）

**Tushare MCP 作为主数据源的调用优先级**：
1. 优先调用 `mcp_tushareMcp_*` 系列工具获取行情、财务、资金数据
2. Tushare MCP 连接失败时（工具未注册/连接超时/token失效），自动降级至 `new-akshare-stock` 技能
3. akshare 不可用时再降级至 `baostock` 技能
4. 所有 Python 接口不可用时，使用东方财富 Push API（curl方式）兜底

**Tushare 接口与原数据源的映射关系**：
| 数据需求 | Tushare 接口 | 原 akshare/baostock 接口 |
|---------|-------------|------------------------|
| 日线行情(OHLCV) | `daily` / `pro_bar`(前复权) | `stock_zh_a_hist` / `query_history_k_data_plus` |
| 每日指标(PE/PB/换手率/市值) | `daily_basic` | `stock_zh_a_spot_em` |
| 财务指标(ROE/净利率等) | `fina_indicator` | `stock_financial_abstract_ths` |
| 利润表 | `income` | 同上 |
| 资产负债表 | `balancesheet` | 同上 |
| 个股资金流向 | `moneyflow` | `stock_individual_fund_flow` |
| 龙虎榜 | `top_list` / `top_inst` | `stock_lhb_detail_em` |
| 涨跌停价 | `stk_limit` | 无直接对应 |
| 复权因子 | `adj_factor` | baostock `adjustflag`参数 |
| 交易日历 | `trade_cal` | `tool_trade_date_hist_sina` |
| 股票基本信息 | `stock_basic` | `stock_info_a_code_name` |

**注意事项**：
- Tushare MCP 工具需 Gateway 重启后才能发现注册，新会话中才能使用
- 检查 Tushare MCP 是否可用：观察是否有 `mcp_tushareMcp_*` 前缀工具
- Tushare 的日期格式为 `YYYYMMDD`（如 `20260724`），需注意与 akshare（`YYYY-MM-DD`）和 baostock（`YYYY-MM-DD`）的格式差异
- Tushare 部分高级接口需要更高积分权限，若返回权限不足错误，降级至 akshare/baostock
- **数据校验**：从 Tushare 获取数据后，与降级数据源进行关键字段交叉验证（如最新价、PE），确保数据一致性

### 1. 首次使用必须安装依赖
```bash
# Node.js 依赖（必须在 scripts/ 目录下执行）
cd ~/.hermes/skills/racing-quant-ai/scripts && npm install mysql2

# Python 依赖（hermes venv 需要先安装 pip 再装 akshare）
python3 -m ensurepip
python3 -m pip install akshare baostock
```
**如果跳过此步骤，所有数据库脚本和行情接口都会报 MODULE_NOT_FOUND。**

### 2. akshare 接口不稳定 — 必须准备降级方案

**接口可靠性矩阵（2026-05 实测）：**

| 接口 | 可用性 | 说明 |
|------|:------:|------|
| `stock_zh_a_spot_em()` | ❌ | 高频 `RemoteDisconnected`，**不可作唯一数据源** |
| `stock_zh_a_hist()` | ⚠️ | 同样受连接问题影响 |
| `fund_etf_spot_em()` | ⚠️ | 部分可用，但部分ETF返回NaN（如纳指ETF、现金流ETF），沪市ETF较稳定。**当stock_zh_a_spot_em失败时此接口仍可尝试** |
| `stock_individual_fund_flow()` | ✅ | **最可靠**的akshare接口，含每日收盘价和主力净流入 |
| `stock_financial_abstract_ths()` | ✅ | 可用，`indicator="按年度"` 取近年数据，**勿用"按报告期"**（返回2008年起旧数据） |
| `stock_news_em()` | ✅ | 个股新闻稳定可用，返回标题+时间 |
| `index_us_stock_sina()` | ⚠️ | 可用但返回全量历史数据（数万行），需 tail() 截取，否则极耗内存 |
| 黄金价格接口 | ❌ | `gold_price_history`、`fx_spot_quote` 等均不可用 |

**baostock 接口可靠性（2026-05 实测）：**

| 接口 | 可用性 | 说明 |
|------|:------:|------|
| `query_history_k_data_plus()` — **个股** | ✅ | 个股K线稳定，前复权取最新价 |
| `query_history_k_data_plus()` — **ETF** | ⚠️ | **仅返回近~120天数据**，不支持长历史回测！回测ETF需用东方财富历史K线API（见下方） |
| `query_profit_data()` | ✅ | 盈利能力数据稳定 |
| `query_growth_data()` | ✅ | 成长能力数据稳定 |
| `query_balance_data()` | ✅ | 偿债能力数据稳定 |

### 降级链路：Tushare MCP（daily/daily_basic/pro_bar）-> akshare实时行情 -> baostock K线（个股，前复权取最新价）-> 东方财富Push API
- ⚠️ 东方财富Push API（curl方式）在hermes环境下**返回空响应**，不可用！需通过akshare/baostock Python接口获取
- ⚠️ **baostock ETF K线仅返回近120天**，不支持长历史回测
- 若所有Python接口均不可用，可尝试 `web_fetch` 抓取东方财富网页版

### 东方财富历史K线API（回测/长历史数据专用）
当需要完整的历史K线数据（如策略回测、多年度涨跌幅计算）时，使用以下API：
```python
# API: https://push2his.eastmoney.com/api/qt/stock/kline/get
# 参数: secid={market}.{code}&fields1=f1,f2,f3&fields2=f51,f52,f53&klt=101&fqt=1&beg=YYYYMMDD&end=YYYYMMDD
# market: 1=沪市, 0=深市
# fields2: f51=date, f52=open, f53=close (还有f54=high, f55=low)
# klt=101=日线, fqt=1=前复权

import subprocess, json
url = f"https://push2his.eastmoney.com/api/qt/stock/kline/get?secid={market}.{code}&fields1=f1,f2,f3&fields2=f51,f52,f53&klt=101&fqt=1&beg=20230601&end=20260701"
result = subprocess.run(['curl', '-s', '--connect-timeout', '10', '--max-time', '15', url], capture_output=True, text=True, timeout=20)
data = json.loads(result.stdout)
klines = data.get('data', {}).get('klines', [])  # ["2023-06-01,1.474,1.523", ...]
```
**关键坑**：必须用 `subprocess.run(['curl', ...])` 而非 `urllib.request.urlopen` — 批量请求时urllib会大量失败（"Remote end closed connection"），curl带重试机制可靠。每个请求间隔0.15秒，3次重试。

### 3. Node.js 内联脚本在 terminal 中有转义陷阱
- 在 `terminal(command="node -e '...'")` 中写复杂 SQL 查询时，shell 引号嵌套极易出错
- **推荐做法**：先用 `write_file` 写入 `/tmp/xxx.js`，然后 `cp` 到 `scripts/` 目录再执行（因为 `scripts/` 下已有 `node_modules`）

### 4. 策略持仓扫描的正确做法
- 查询某只股票是否被策略持有时，不能仅查当前推荐策略（if_recommended=1）
- 应全库扫描所有36个策略的 `trading_info LIKE '%股票代码%'`
- 当前不持有不代表历史上没持有过 — **历史持仓回溯**能提供重要的量化信号（集体清仓时间点）

### 6. trading_info 字段在 mysql2 中返回为 Object 而非 String
- mysql2 默认会自动解析 JSON 类型的列，`trading_info` 字段返回时已经是 **JavaScript 对象**，不是字符串
- 对 Object 调用 `.substring()` 会报 `row.trading_info?.substring is not a function`
- **正确处理方式**：
```javascript
let holdings = row.trading_info;
if (typeof holdings === 'string') {
    try { holdings = JSON.parse(holdings); } catch(e) { holdings = {}; }
}
// holdings 现在是对象，直接用 Object.keys(holdings) 即可
```
- 如果用 `JSON.stringify(row.trading_info)` 反而会把已解析的对象再序列化成字符串，导致双重编码

### 7. 策略网页为 React SPA，curl 无法获取内容
- `http://racingai.top/strategy/{id}` 是 Vite + React 前端，curl 只返回空壳 HTML
- 需要直接查询策略数据库获取策略信息和持仓数据（strategy_information 表 + 对应 strategy_table）
- 策略ID映射：URL中的 `/strategy/stgetf0001` → `strategy_id = 'stgetf0001'` → 查询 `strategy_information` 表获取 `strategy_table` 名

### 8. 仓位优化代码必须放在信号生成脚本中
> ⚠️ 用户曾明确要求：撤销推送到 fintech 仓库 dev_hermes 分支的所有前后端改动，改为只改信号脚本。
- 仓位调整逻辑（如分层仓位管理）**直接写在 `stgetf0001_huaxia_pool.py` 等信号生成脚本中**
- **绝不在 fintech 前后端展示层修改**——前后端只负责读取和展示 `trading_info` 中的权重值，不参与仓位计算
- 部署到 quant-ai-4u 项目的 `dev_hermes` 分支，不要推到 fintech 仓库
- 优化完成后用户通常要求生成**非常详细**的总结报告（"不要遗漏任何点"），详见 `references/position-sizing-optimization.md` 第6-7节。报告须包含四大部分+9个分析维度+市场温度计ASCII可视化，并上传至飞书文档

### 9. 后端日志不在 journalctl 中
- fintech-backend.service 的 `StandardOutput/StandardError` 重定向到 `/var/log/fintech/backend.log`
- `journalctl -u fintech-backend` 只显示 systemd 层面的启停/崩溃日志，**看不到 Go 应用 `log.Printf` 输出**
- **正确做法**：`tail -50 /var/log/fintech/backend.log` 查看应用日志

### 10. GORM 全局 MAX(date) 反模式导致数据查不到
- 不同策略的监控数据更新日期可能不一致（如 stg000006 到 7-11，其他策略到 7-10）
- `GetLatestStrategyMonitoring` 先取全局 `MAX(calculate_date)`，再用该日期查特定策略 -> 大部分策略 `record not found` -> 500 错误 -> 净值曲线无法显示
- **正确做法**：MAX 查询加 `WHERE strategy_id = ?` 条件；批量查询用 INNER JOIN 子查询
- 详见 `references/fintech-codebase-structure.md` 的「调试指南」章节

### 12. cronjob 工具 action='update' 会覆盖 prompt（2026-07 实测）
- `cronjob(action='update')` **不是只读操作**——传入 `prompt` 参数会立即覆盖现有 prompt
- ⚠️ **绝对不要用 `cronjob(action='update', prompt='test')` 来"查看"当前 prompt**，这会直接把生产 prompt 替换为 "test"
- **查看完整 prompt 的正确方法**：直接读取 `~/.hermes/cron/jobs.json` 文件（`read_file` 工具），其中 `prompt` 字段包含完整内容
- `cronjob(action='list')` 返回的 `prompt_preview` 字段是被截断的，不足以查看全貌
- 如果已误覆盖：检查 `~/.hermes/cron/output/<job_id>/` 目录下的历史输出 .md 文件，其中 `## Prompt` 段落包含原始 prompt 全文

### 13. 融资融券/北向资金 akshare API 陷阱（2026-07 实测）
- `stock_margin_detail_szse()` **不接受 `code` 参数**，必须传 `date` 获取全量数据再过滤
- `stock_hsgt_individual_em()` 参数名是 `symbol` 不是 `stock`，且返回数据可能严重滞后（实测仅返回2024-08数据）
- 融资融券数据可用 `stock_margin_detail_szse(date="20260717")` 后过滤目标股票
- 龙虎榜用 `stock_lhb_detail_em(start_date, end_date)` 后过滤，大盘股通常不在龙虎榜
- 完整API调用示例见 `quant-finance` 技能的 `references/technical-indicators-computation.md`

### 8. 东方财富 ETF 名称/价格批量查询
- **ETF 名称**：`push2.eastmoney.com/api/qt/stock/get?secid={market}.{code}&fields=f57,f58`（f57=代码, f58=名称）
- **历史K线**：`push2his.eastmoney.com/api/qt/stock/kline/get?secid={market}.{code}&fields1=f1,f2,f3&fields2=f51,f52,f53,f54,f55,f56&klt=101&fqt=1&beg={YYYYMMDD}&end={YYYYMMDD}`
  - klines 格式：`date,open,close,high,low,volume`
- **secid 前缀**：沪市 `1.`，深市 `0.`
- 部分请求会失败（`Remote end closed connection without response`），需 retry 或间隔 `time.sleep(0.5-1)`
- 详见 `references/strategy-drawdown-analysis.md`

## 使用示例

### 示例1：列出所有推荐策略
```
cd ./scripts && node list-recommended.js
```

### 示例2：获取指定策略最新持仓并分析N只个股（N默认为5）
```
1. 获取持仓（通过策略名称，支持模糊匹配）
cd ./scripts && node get-positions-correct.js "短周期机器学习" 20
脚本执行流程：
- 先在 strategy_information 表查找匹配的策略
- 获取对应的 strategy_table 名称
- 查询该表的最新持仓数据
2. 对每只个股调用公开信息搜索
3. 调用微信文章深度搜索，获取最新公众号深度研究报告
4. 融合公开信息与深度报告内容，整理分析结果，并注释引用的公众号文章标题
5. 输出完整报告，末尾注明信息来源并添加免责声明
```

## 完整运行示例（如本文档编写过程）
1. 用户要求："现在开始对前5只重仓个股进行深度分析"
2. 执行`node list-recommended.js`获取推荐策略列表
3. 执行`node get-positions-correct.js "策略名称" 20`获取最新20只持仓（脚本会自动反查strategy_table）
4. 逐个对前5只股票调用公开搜索获取基础基本面信息
5. 逐个对前5只股票调用微信文章深度搜索，获取最新公众号深度研究报告
6. 融合整合公开信息与深度报告内容，按照结构化分析框架整理输出分析报告
7. 在报告中注释引用的公众号文章/深度报告标题，并注明信息来源，最后添加免责声明

## 上架信息
- 作者：Warwick
- 分类：金融/量化选股
- 标签：A股, 量化, 选股, 基本面分析, 深度分析, 投资
- 版本：1.10.0
- 更新日志：
  - v1.10.0 (2026-07-24): 数据源架构重构--Tushare MCP 升为主数据源（覆盖行情/财务/资金流向/龙虎榜），原 new-akshare-stock 降为第一备用，baostock 为第二备用，东方财富API为兜底。新增数据校验铁律强调（严禁编造数据，失败必标注）。降级链路更新为4级：Tushare -> akshare -> baostock -> 东方财富API。依赖列表和工具调用规范同步更新。
  - v1.9.3 (2026-07-23): 新增陷阱#12（cronjob工具action='update'会覆盖prompt，绝对不要用来"查看"prompt，正确方式是read_file读取jobs.json）；新增 `references/concept-stock-analysis-workflow.md`（概念股/主题驱动产业链分析工作流，含超节点算力产业链实战案例，覆盖搜索->分层->采集->研判->持仓交叉分析6步法）。
  - v1.9.2 (2026-07-20): 新增陷阱#11（融资融券/北向资金akshare API参数陷阱）；功能2新增stock-research-sop深度分析模式选择说明，当用户要求"stock-research-sop"分析时引导加载quant-finance技能模板。
  - v1.9.1 (2026-07-13): `fintech-codebase-structure.md` 新增「基础设施与运维」章节（nginx/systemd/双数据库/Entity表名映射/API路由总览）和「调试指南」章节（排查流程+GORM MAX(date)反模式）。SKILL.md 新增陷阱#9（后端日志不在journalctl）和#10（GORM全局MAX(date)反模式），触发条件扩展覆盖网站bug排查。
  - v1.9.0 (2026-07-02): 仓位优化报告规范——`position-sizing-optimization.md` 新增第7节：详细报告撰写规范。用户明确要求"不要遗漏任何点"，报告须包含四大部分（回撤分析/直觉验证/单仓上限对比/方案D深度回测）、9个分析维度、市场温度计ASCII可视化、飞书文档上传步骤。退回简略报告并要求补充所有数据点，是用户偏好强信号。
  - v1.8.0 (2026-07-02): 仓位优化落地生产部署——`position-sizing-optimization.md` 新增第5-6节（生产部署代码+Git流程+优化后总结报告工作流）。SKILL.md 新增陷阱#8：仓位优化代码必须放在信号生成脚本中，禁止在fintech前后端展示层修改。
  - v1.6.0：全量新增双数据源自动降级（new-akshare-stock→baostock），所有分析维度统一兜底，报告强制标注数据来源，强制校验数据准确性。
  - v1.5.0 (2026-03-31): 将直接读取akshare接口更改为调用成熟skill；集成微信文章深度搜索机制，支持搜索公众号最新发布的个股深度研究报告，并融合深度内容进行分析，自动注释引用的报告名称，提供更丰富的市场观点和深度分析内容
  - v1.4.0 (2026-03-30): `get-positions-correct.js`脚本升级，支持通过策略名称（strategy_name_cn）自动反查strategy_table，无需手动指定表名，使用更便捷
  - v1.3.0 (2026-03-30): 主力资金数据获取升级为`akshare`接口，可直接获取准确的单日/近5日/近20日/近一月主力净流入数据，资金面分析数据更精准
  - v1.2.0 (2026-03-30): 行情数据获取方式升级为`akshare`接口，自动获取准确的最新股价和各周期涨跌幅数据，数据来源更稳定可靠
  - v1.1.0 (2026-03-28): 添加微信文章深度搜索机制，支持搜索公众号最新发布的个股深度研究报告，并融合深度内容进行分析，自动注释引用的报告名称

