racing-quant-ai-赛马量化ai选股系统-x

内容来源:clawhub · 原始地址 · 查看安装指南

原始内容


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)时,启用此工作流。

工作流程

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
  1. "你好!为了给你推荐最合适的量化策略,可以先回答几个问题吗?"
  2. "你的投资周期更倾向于哪种?(短期/中期/长期)"
  3. "你的风险承受能力大概是什么水平?(保守/稳健/激进)"
  4. "你更喜欢哪种选股风格?比如:价值成长/红利低波/动量趋势/事件驱动..."
  5. "有没有特别看好或者想要回避的行业?"
  6. "还有其他特殊需求吗?"

工具调用规范

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

陷阱与注意事项

环境依赖安装

  • 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_emstock_zh_a_hist)可能因服务器网络限制返回 RemoteDisconnected 错误
  • baostock 连接也可能超时(login 成功但 query 超时),但批量K线查询通常稳定(每次query约1秒)
  • 多股票批量分析的最优数据源组合
    • baostock:批量K线+技术指标(MA/MACD/RSI)——最稳定,for循环批量查询不超时
    • akshare:仅用stock_individual_fund_flow(资金流向)和stock_news_em(新闻)——最稳定的两个接口
    • aksharestock_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. 首次使用必须安装依赖

# 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_historyfx_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,然后 cpscripts/ 目录再执行(因为 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/stgetf0001strategy_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): 添加微信文章深度搜索机制,支持搜索公众号最新发布的个股深度研究报告,并融合深度内容进行分析,自动注释引用的报告名称