原始内容
name: racing-quant-ai description: 赛马量化AI选股系统,集成量化策略选股+个股智能推荐分析。从量化策略数据库筛选符合需求的策略,获取持仓个股,再进行深度分析,最终给出投资参考。触发词:量化选股,racing quant,策略选股,数据库选股,量化分析,AI选股。
Racing Quant AI 赛马量化AI选股系统
Overview
Racing Quant AI是一套集成化的A股量化选股分析系统,其本质是一个 「信号→资产」的智能匹配引擎。系统在三个层面产生信号(策略信号→持仓信号→交易信号),并通过四层匹配机制(用户需求→策略→标的→交易指令)完成从策略研究到交易执行的全链路闭环。
核心功能包含两大部分:
- 策略选股:从远程MySQL量化策略数据库中,根据用户需求智能匹配推荐量化策略,并获取策略对应的最新持仓股票
- 深度分析:对筛选出的持仓个股,使用结构化分析框架进行个股深度分析,给出客观的投资参考
整个工作流闭环:用户需求 → 匹配策略 → 获取持仓 → 个股分析 → 综合推荐
⚠️ 路演/系统说明时的叙事规范:不要从数据库表结构或技术架构讲起。必须围绕「信号」和「匹配」展开——每个功能点都要回答:它产生什么信号?信号怎么找到对应的资产?详见
references/signal-asset-matching-framework.md。
触发条件
当用户满足以下任意一种场景时,自动启用本skill:
- 用户要求"量化选股"、"AI选股"、"策略选股"
- 用户提到"racing quant"、"赛马量化"、"赛马量化AI"
- 用户需要从数据库选股并进行深度分析
- 用户要求根据量化策略推荐股票并分析
- 用户要求优化策略仓位管理(如调整单仓上限、分仓规则)或回测对比优化方案
- 用户要求修改或排查 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
- 日线行情(OHLCV):
- 优势:专业金融数据接口,数据准确性和稳定性优于 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 | 更新时间 |
支持的查询操作
- 获取全部策略列表:查询数据库中所有注册策略,展示策略基本信息
- 关键词搜索策略:根据关键词搜索策略名称/简介/描述,返回匹配结果
- 分类筛选:按策略分类(量价/基本面等)筛选策略
- 推荐策略筛选:只筛选标记为if_recommended=1的优质推荐策略
- 需求智能匹配:根据用户描述的投资需求,语义匹配最符合的策略
- 互动偏好匹配:通过多轮互动提问,了解用户的投资偏好和风险承受能力,从strategy_desc字段中匹配最契合的策略
- 获取最新持仓:根据选中的策略,查询对应持仓表获取最新一期持仓股票列表 备注:多策略命中时,仅列表展示,不自动择优,需用户确认后再获取持仓。
功能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)时,启用此工作流。
工作流程
1. 连接MySQL策略数据库 → 获取指定策略的最新持仓(代码+权重)
2. 调用东方财富批量API获取实时行情(前20只的现价/涨跌幅/昨收)
3. 加载当前持仓快照(如有)
4. 计算买卖指令:
- 买入:按权重分配资金,考虑现存仓位,100股取整
- 卖出:全量换仓模式下,不在目标持仓中的股票全部卖出
5. 风险检查:涨跌停偏离、最低金额、单只仓位上限
6. 输出交易指令JSON或通过xtquant实际下单
脚本位置
~/.hermes/scripts/racing_to_qmt.py— 一体化生成+执行脚本- 详情见
references/trading-execution-pipeline.md
关键命令
# 生成指令(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
- "你好!为了给你推荐最合适的量化策略,可以先回答几个问题吗?"
- "你的投资周期更倾向于哪种?(短期/中期/长期)"
- "你的风险承受能力大概是什么水平?(保守/稳健/激进)"
- "你更喜欢哪种选股风格?比如:价值成长/红利低波/动量趋势/事件驱动..."
- "有没有特别看好或者想要回避的行业?"
- "还有其他特殊需求吗?"
工具调用规范
- 数据校验强制要求(铁律):获取个股量价行情、财务估值、资金流向核心数据时,优先使用 Tushare MCP 获取专业金融数据,严格对照当前生效数据源(Tushare/new-akshare-stock/baostock)做字段核验,确保股价、市值、PE/PB、营收利润、主力资金等关键数值完整无误;异常空值、离谱极值需标注说明。严禁编造任何具体数值,严禁沿用错误数据。数据获取失败时必须如实标注"数据获取失败"。 违反此规则视为重大事故(参见陷阱#14)。
- 数据库查询:使用Node.js连接MySQL数据库,参考scripts目录下的数据库连接模板
- 获取行情数据:优先通过 Tushare MCP(
daily/daily_basic/pro_bar)获取最新股价和各周期涨跌幅数据;Tushare 不可用时切换至new-akshare-stock;再不可用切换至baostock - 获取主力资金流向:优先通过 Tushare MCP(
moneyflow)获取每日主力资金数据;Tushare 不可用时切换至new-akshare-stock;再不可用切换至baostock - 基础信息搜索:分析前先使用
cn-web-search搜索股票最新公开信息、机构研报和市场数据 - 深度报告搜索:添加
wechat-article-search深度搜索机制,搜索微信公众号最新发布的个股深度研究报告,获取市场最新观点和深度分析内容,并在最终报告中明确注释引用的公众号文章/深度报告标题 - 融合分析:整合量化策略数据库信息、行情数据、主力资金数据、公开市场数据和微信公众号深度研究报告内容,进行多维度融合分析
- 严格框架:严格按照5维度分析框架整理输出,不遗漏风险提示
- 风险优先:必须同时列出优势和风险,不做片面推荐
- 输出格式适配:用户可能要求不同场景的输出格式。若用户要求"雪球讨论区/评论区发帖格式",输出应遵循:纯文本、无Markdown表格(用对齐文本替代)、用▍/▸/⚠/◆等Unicode符号增强可读性、段落短小精悍、口语化表达("一句话:…"、"别装看不见")、避免过度学术化措辞、风险清单用数字编号简洁列出、末尾保留免责声明。核心原则:像一篇有深度的球友帖子,不是研报。
- 信息标注:分析过程中引用的公开研报和公众号深度文章,需要在报告末尾注明信息来源
- 数据源标注:每份报告必须标注本次量化数据来源(Tushare MCP / new-akshare-stock / baostock),注明实际使用的具体接口
- 免责声明:所有分析结果末尾必须带有免责声明
陷阱与注意事项
环境依赖安装
- 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接口通常稳定可用,即使实时行情接口不通- 可优先获取资金流向数据,作为行情数据的补充参考(含每日收盘价)
基本原则
- 遵守规范:严格按照既定流程和标准执行各项操作
- 客观中立:只整理公开信息和量化策略结果,不做主观判断
- 风险提示:风险提示清晰可见,不隐藏负面信息
- 信息来源:所有数据来自公开渠道和量化策略数据库
- 责任豁免:始终声明不构成投资建议,投资风险自负
- 容错降级:量化数据源支持自动降级切换(Tushare -> akshare -> baostock -> 东方财富API),保证系统稳定可用
- 数据真实性铁律:严禁编造数据。数据获取失败时必须如实标注,不得用任何估算值、猜测值或模型生成值替代真实数据。报告中每个数值必须可溯源至具体数据源调用
资源
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 数据后,没有如实报告失败,而是编造了一整套虚假行情数据(成交额、涨跌幅、换手率、大宗交易等全部捏造),推送至飞书群。
根因:
- 脚本无降级方案(akshare 失败即全军覆没)
- Prompt 无防幻觉护栏(未禁止编造数据)
- 盘前9:00运行取实时行情(市场未开,数据无效)
修复措施(已实施 v2.1):
- 脚本降级:
portfolio_report.py主数据源改为 baostock(稳定可靠),登录一次批量查询,3秒完成14只标的采集 - Prompt 硬护栏:在 cron prompt 中添加 5 条数据完整性要求,明确禁止编造数据
- 状态报告:脚本输出开头包含采集状态摘要(成功/失败计数),失败品种标注"数据获取失败"
铁律:任何分析报告中,行情数据只能来自脚本采集的表格。如果数据为 N/A/获取失败,必须如实标注,严禁编造任何具体数字。违反此规则视为重大事故。
15. Tushare MCP 数据源使用规范(2026-07-24 新增)
Tushare MCP 作为主数据源的调用优先级:
- 优先调用
mcp_tushareMcp_*系列工具获取行情、财务、资金数据 - Tushare MCP 连接失败时(工具未注册/连接超时/token失效),自动降级至
new-akshare-stock技能 - akshare 不可用时再降级至
baostock技能 - 所有 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. 首次使用必须安装依赖
# 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:
# 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 - 正确处理方式:
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
- klines 格式:
- 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. 输出完整报告,末尾注明信息来源并添加免责声明
完整运行示例(如本文档编写过程)
- 用户要求:"现在开始对前5只重仓个股进行深度分析"
- 执行
node list-recommended.js获取推荐策略列表 - 执行
node get-positions-correct.js "策略名称" 20获取最新20只持仓(脚本会自动反查strategy_table) - 逐个对前5只股票调用公开搜索获取基础基本面信息
- 逐个对前5只股票调用微信文章深度搜索,获取最新公众号深度研究报告
- 融合整合公开信息与深度报告内容,按照结构化分析框架整理输出分析报告
- 在报告中注释引用的公众号文章/深度报告标题,并注明信息来源,最后添加免责声明
上架信息
- 作者: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): 添加微信文章深度搜索机制,支持搜索公众号最新发布的个股深度研究报告,并融合深度内容进行分析,自动注释引用的报告名称