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

赛马量化AI选股系统,集成量化策略选股+个股智能推荐分析。从量化策略数据库筛选符合需求的策略,获取持仓个股,再进行深度分析,最终给出投资参考。触发词:量化选股,racing quant,策略选股,数据库选股,量化分析,AI选股。

chenxyzcyxpp

@chenxyzcyxpp

What This Skill Does

A-share quantitative stock selection system that matches user investment needs to strategies from a MySQL database, retrieves the latest holdings, and performs structured deep analysis on individual stocks across five dimensions (trading data, price trends, fundamentals, capital flows, and technical indicators). Outputs a comprehensive investment reference.

Replaces manual stock screening and scattered research by automating the full pipeline from strategy matching to individual stock analysis with a single query.

When to Use It

  • Find quantitative strategies matching your risk tolerance and investment preferences
  • Get the latest holdings from a recommended quant strategy for A-shares
  • Analyze a batch of stocks from a strategy portfolio using the five-dimension framework
  • Search the strategy database by keywords or categories like momentum or value
  • Request a deep dive on a specific stock with trading data, fundamentals, and capital flows

Install

$ openclaw skills install @chenxyzcyxpp/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_tabletext策略对应持仓数据表名称
strategy_nametext策略英文名称
strategy_idtext策略ID(唯一标识)
benchmarktext对标指数
owner_nametext策略创建人姓名
owner_idtext创建人ID
start_datedatetime策略开始回测时间
online_datedatetime策略上线时间
strategy_name_cntext策略中文名称
strategy_summtext策略简介
strategy_desctext策略详细描述
strategy_cattext策略分类(量价/基本面/事件驱动/量化选股等)
how_to_tradetext交易调仓规则
if_recommendedbigint是否推荐(1=推荐,0=不推荐)

策略持仓表字段说明

字段类型说明
trade_datetext交易日期
strategy_nametext策略名称
strategy_idtext策略ID
trading_infotext交易信息(持仓信息json,主键为证券代码、值为权重,举例 {'300001.SZ':'0.1'})
trade_pricetext交易价格(open/close)
update_timedatetime更新时间

支持的查询操作

  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_basicstock_zh_a_spot_em
财务指标(ROE/净利率等)fina_indicatorstock_financial_abstract_ths
利润表income同上
资产负债表balancesheet同上
个股资金流向moneyflowstock_individual_fund_flow
龙虎榜top_list / top_inststock_lhb_detail_em
涨跌停价stk_limit无直接对应
复权因子adj_factorbaostock adjustflag参数
交易日历trade_caltool_trade_date_hist_sina
股票基本信息stock_basicstock_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): 添加微信文章深度搜索机制,支持搜索公众号最新发布的个股深度研究报告,并融合深度内容进行分析,自动注释引用的报告名称

Top skills in this category

Stock Analysis

@udiedrichsen

Analyze stocks and cryptocurrencies using Yahoo Finance data. Supports portfolio management, watchlists with alerts, dividend analysis, 8-dimension stock scoring, viral trend detection (Hot Scanner), and rumor/early signal detection. Use for stock analysis, portfolio tracking, earnings reactions, crypto monitoring, trending stocks, or finding rumors before they hit mainstream.

25758k

Stock Market Pro

@kys42

Yahoo Finance (yfinance) powered stock analysis skill: quotes, fundamentals, ASCII trends, high-resolution charts (RSI/MACD/BB/VWAP/ATR), plus optional web a...

15532k

A股量化 AkShare

@mbpz

A股量化数据分析工具,基于AkShare库获取A股行情、财务数据、板块信息等。用于回答关于A股股票查询、行情数据、财务分析、选股等问题。

10131k

Stock Watcher

@robin797860

Manage and monitor a personal stock watchlist with support for adding, removing, listing stocks, and summarizing their recent performance using data from 10jqka.com.cn. Use when the user wants to track specific stocks, get performance summaries, or manage their watchlist.

8736k

Intelligent Stocks Screener

@financial-ai-analyst

基于东方财富数据库,支持通过自然语言输入筛选A港美股、基金、债券等多种资产,支持多元指标筛选,含技术面、消息面、基本面及市场情绪等,可用于全球资产速筛、跨市场监控、投资组合构建、策略回测等场景。返回结果包含数据说明及 csv 文件。Natural language screener for investment...

10626k