个股资讯推导
- 简介
- 基于脚本过滤与AI推导,评估个股资讯对业务发展的传导影响并生成评级。
- 触发词
- 个股资讯,资讯影响,传导路径,资讯评级,行业传导
- 分发渠道
- ARK Engine
- 功能测试
- ✅ 通过 · 业务评审:✅ 通过
- 技能包文件
- news-impact-reasoning-engine/SKILL.md、news-impact-reasoning-engine/references/industry-reasoning-framework.md、news-impact-reasoning-engine/references/recency_decay_config.json、news-impact-reasoning-engine/references/soft-phrasing-map.md、news-impact-reasoning-engine/references/source_tier_weights.json、news-impact-reasoning-engine/scripts/rank_and_dispatch.py、news-impact-reasoning-engine/scripts/score_and_gate.py
SKILL.md 全文
Frontmatter
| name | 个股资讯推导 |
|---|---|
| description | 个股资讯影响链推导引擎。当用户提供单个股票标的(名称/代码)并要求梳理近期资讯对该公司业绩/产品/销量/发展的潜在传导路径、生成资讯影响评级、TOP3资讯摘要或行业传导链分析时触发。核心机制是"大模型获取内容与语义推导 + 服务端脚本管控时效性/来源权威性/去重/权重排序/推理指令下达"的三段式流水线,用于消除大模型对时间、权重、来源的幻觉与输出不稳定性。不适用于股价预测、目标价、具体买卖时点建议、适当性判断(应转交理财师结合客户风险测评处理)。 |
个股资讯影响链推导引擎(news-impact-reasoning-engine)
基于个股近期公开资讯,通过脚本管控层确保时效/来源/去重的确定性,结合行业传导框架生成 TOP3 资讯影响评级与定性展望。不做股价预测或估值判断,仅梳理资讯对公司"业绩/产品/销量/发展"的潜在传导路径。
职责
| 职责 | 说明 |
|:----|:------|
| 资讯抓取 | 从六大源头抓取目标个股最近 N 日资讯 |
| 脚本管控 | 服务端脚本对时效性、来源权威性、去重做确定性计算与拦截,产出只读分数 |
| TOP3 筛选 | 脚本按三维权重公式(影响程度0.5 > 来源权威性0.3 > 时效性0.2)合成排序,取 TOP3 |
| 独立双步推导 | 每条资讯在脚本下达的 reasoning_directive 边界内独立推导,禁止跨资讯合并 |
| 综合总结 | 生成约150字综合总结(desc 字段),整合共振/背离关系 |
| 合规护栏 | 委婉化替换、禁止词过滤 |
输入
个股资讯影响推导(Step 1→Step 5)
入口判断:用户提供个股标的参数(名称或代码任一即可),且请求内容属于"个股资讯影响/评级推导"类分析
由主控传入(stock_name 和 stock_code 至少提供一个即可触发,缺失的由 Step 1 自动补全):
- stock_name:个股名称(缺失时由 Step 1 根据 stock_code 反查补全)
- stock_code:个股代码(缺失时由 Step 1 根据 stock_name 查询补全)
- stock_industry:所属行业(用于匹配行业推导框架,未命中回退通用模板;缺失时由 Step 1 补全)
- business_model:主营业务模式(一句话描述,用于展望生成时的业务锚点;缺失时由 Step 1 从公开信息推断)
- [可选] lookback_days:资讯检索窗口天数,默认 7
- [可选] pre_fetched_news:预抓取的资讯列表(提供则跳过 Step 2 检索)
- [可选] now_iso:服务器权威当前时间(ISO8601);缺省时脚本使用系统 UTC 时间,禁止 LLM 自行推算替代
引用路由表
| 用户意图 | 加载参考文件 |
|:---------|:------------|
| 行业推导框架、传导链、关键校验点 | {skill_root}/references/industry-reasoning-framework.md |
| 委婉表述映射表、禁止词规则 | {skill_root}/references/soft-phrasing-map.md |
| 来源权威分等级枚举 | {skill_root}/references/source_tier_weights.json |
| 时效衰减公式参数 | {skill_root}/references/recency_decay_config.json |
输出
直接返回结构化 JSON 响应消息(Schema 见 Step 5),在内存中拼接,不写磁盘文件。
⛔ 执行流程(强制检查点,按顺序执行,禁止跳步)
全局规则:
- 每个检查点必须完成后才能进入下一个,未输出📋行视为执行失败
- 所有 📋 Step N … 检查点行严禁出现在面向用户的最终 JSON 响应中
- 面向用户的最终响应必须且仅能是一个合法 JSON 对象(从{开始到}结束),不得在 JSON 前后附加任何字符(包括空行、换行、Markdown 代码块标记 \\\json / \\\、自然语言文字、📋检查点文本)
- 任何中途终止/失败场景,一律输出降级 JSON(success=false),不得输出自然语言提示或空对象
- 所有脚本调用必须使用execute_bash+ stdin 管道,严禁fs_write/str_replace创建临时文件
- 禁止调用的工具:mcp__serper-search__scrape。资讯检索统一使用mcp__serper-search__google_search
- mcp__securities-open-api__search_stock 仅限 Step 1 标的校验使用,Step 2 及之后禁止调用
- 脚本输出的recency_score/source_authority_score为只读常量,LLM 不得覆盖或重算
- 任何数据必须来自接口/检索真实返回,严禁用记忆/训练数据填充;缺失标注「数据缺失」
- 合规红线贯穿全流程:禁止预测股价/点位/目标价;禁止操作建议(完整清单见 {skill_root}/references/soft-phrasing-map.md)Step 1:触发判定与标的校验
操作:
1. 判断输入是否提供 stock_name 或 stock_code(至少一个即可触发),且请求意图属于资讯影响/评级推导类
2. 强制调用 mcp__securities-open-api__search_stock 查询标的基本信息(无论 stock_name/stock_code 是否齐全,本步骤必须执行搜索以获取权威标的数据):
- 确定搜索关键词(按优先级尝试):
US-TSLA)
b. 若返回结果为空(result 数组长度为0),则去掉市场前缀只取纯代码再搜索(如 TSLA)
c. 若仅有 stock_name 无 stock_code,则直接用 stock_name 搜索
- 从返回结果中选取目标标的:优先取
uniqueCode精确等于用户输入 stock_code 的那条;若无精确匹配,取generaType=1001(正股)的首条 - 从命中结果中提取并补全以下字段:
stock_name←chiName或name(优先 chiName,为空则取 name)stock_code←uniqueCode(带市场前缀的标准格式,如US-TSLA)stock_market←secExchange(交易所名称,用于后续搜索关键词优化)stock_eng_name←engName(英文名,用于英文资讯检索)
内嵌规则:
- 触发条件:提供 stock_name 或 stock_code 任一 + 分析类请求 → 执行 search_stock → 进入 Step 2
- 转交条件:请求涉及股价预测/目标价/买卖时点/适当性判断 → 输出降级 JSON 并终止
- 行情/交易类字段仅用于标的身份校验,不得作为推导依据
mcp__securities-open-api__search_stock仅在本步骤用于标的身份校验和参数补全,后续步骤不得调用- search_stock 的 key_words 参数注意事项:该接口对带市场前缀的代码(如
US-TSLA、HK-00700)可能返回空结果,因此必须实现"先完整代码 → 空则去前缀重试"的二级 fallback
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 1 触发判定:✅/❌ | stock_name=... | stock_code=... | stock_eng_name=... | industry_hit=是/否 | search_stock调用=[成功/失败] | 转交=否/[转交原因]
失败处理:
- stock_name 和 stock_code 均缺失 → 输出降级 JSON(success=false,desc="未提供有效个股标的信息。")
- search_stock 两次尝试均返回空 → 输出降级 JSON(success=false,desc="未找到匹配的股票标的信息。")
- 请求越界 → 输出降级 JSON(success=false,desc="本引擎仅做客观资讯影响推导,不提供股价预测或买卖建议。")
Step 2:数据获取(资讯抓取)
操作:
1. 优先调用 mcp__serper-search__google_search 检索目标个股最近 lookback_days 天内的相关资讯(已提供 pre_fetched_news 时跳过检索)
- 搜索关键词策略(利用 Step 1 获取的 stock_name / stock_eng_name / stock_code):
- 中文搜索:
[stock_name] 最新消息/[stock_name] 公告 研报 - 英文搜索:
[stock_eng_name] news/[stock_eng_name] latest(美股/港股标的必须包含至少一次英文搜索) - 至少发起 2 次搜索(如:一次中文、一次英文;或一次公告/研报类、一次新闻/行业类),以提高覆盖率
mcp__serper-search__google_search 返回为空或失败,允许使用其他可用的互联网搜索工具(如 web_search、web_fetch 等)进行补充检索,LLM 自行判断最合适的工具和关键词
3. 每条转成 NewsItem 结构:news_id / title / content / source / source_tier / publish_time / url / category,字段缺失填 null
4. source_tier 从 {skill_root}/references/source_tier_weights.json 的五级枚举 key 中选取,LLM 只做归类不赋分内嵌规则:
- 涉及未公开信息、内幕消息、传闻的资讯,一律不纳入候选池
- K线数据、机构目标价等点位类数据源禁止接入(仅 Step 1 标的身份校验可用)
- 无论使用何种搜索工具,数据必须来自真实接口返回,严禁用 LLM 记忆/训练数据编造资讯
Error Handling 标准表:
| 场景 | 响应策略 | |:-----|:--------| | google_search 返回空 | 更换关键词重试一次;仍为空 → 走 Fallback 其他搜索工具 | | Fallback 也为空/失败 | 跳转 Step 5 降级 JSON | | google_search 超时/异常 | 重试一次,仍失败 → 走 Fallback | | 候选不足3条 | 按实际数量纳入,不虚构补齐 | | 所有搜索手段均失败 | 跳转 Step 5 降级 JSON |
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 2 资讯检索:✅/❌ | 搜索次数=[N] | 候选资讯数=[N] | 降级=[无/具体说明]
Step 2.5:脚本管控层(时效/来源/去重)
操作(依赖 Step 2): 1. 将 NewsItem 候选池拼接为 JSON,通过 stdin 管道调用脚本:
echo '$NEWS_POOL_JSON' | python3 {skill_root}/scripts/score_and_gate.py \
--now-iso <now_iso> --lookback-days <lookback_days>
2. 读取 stdout JSON,每条追加只读字段:recency_score、source_authority_score、dedup_group_id、rejected / reject_reason脚本拦截条件(rejected=true):
publish_time缺失/非法/超出窗口/未来时间source_tier未命中枚举白名单- 同
dedup_group_id内非最高权威分的重复项
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 2.5 脚本管控:✅/❌ | 候选总数=[N] | 拦截数=[N] | 去重后剩余=[N] | 时间基准=[now_iso_used]
失败处理:
- 脚本执行异常 → 终止,标注「脚本管控环节暂不可用」,不回退为 LLM 手工估算
- 拦截后为空 → 跳转 Step 5 空结果降级 JSON
Step 3:确定性计算(权重排序 + 推理指令下达)
分工(依赖 Step 2.5):
1. LLM 任务:对 rejected=false 的每条候选给出 impact_relevance_score(0~1,是否直接关联业绩/产品/销量/发展)+ impact_relevance_rationale(≤20字审计用)。不得触碰脚本分数。
2. 脚本任务:通过 stdin 管道调用:
echo '{"scored_pool": $SCORED_POOL_JSON, "impact_scores": $IMPACT_SCORES_JSON}' | \
python3 {skill_root}/scripts/rank_and_dispatch.py --stock-industry "<stock_industry>" --top-n 3
$SCORED_POOL_JSON:Step 2.5 脚本score_and_gate.py的完整 stdout 输出对象(包含meta和items两个键),不要只传items数组$IMPACT_SCORES_JSON:LLM 在上一步给出的评分数组- 脚本按
final_score = impact0.5 + source0.3 + recency*0.2降序取 TOP3,内部按publish_time升序重排展示。
reasoning_directive(锁定 Step 4 推导边界):
{
"news_id": "news_1",
"allowed_industry_framework": "半导体/AI算力",
"must_avoid_terms": ["股价", "目标价", "PE提升"],
"max_projection_length": 60,
"require_info_gap_flag_if_missing": ["产能数据", "客户名称"]
}
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 3 TOP3筛选:✅/❌ | LLM评分=[N/N] | 脚本排序=[已执行] | TOP3=[news_id列表] | directive=[N条]
失败处理:
- 候选不足3条 → 脚本按实际数量返回
- LLM 未给某条评分 → 脚本排除该条
- 脚本异常 → 终止,不回退为 LLM 主观排序
Step 4:规则分析(独立双步推导)
操作(依赖 Step 3):
1. 按 reasoning_directive.allowed_industry_framework 加载 {skill_root}/references/industry-reasoning-framework.md 对应章节(未命中回退通用模板)
2. 每条 TOP3 独立构建:step_1_event(客观事实)→ step_4_projection(定性展望)
3. 标注 impact_direction:positive / neutral / negative
4. 提取 tagName(从资讯内容研判影响倾向,输出"有利"/"中性"/"不利"三选一)
directive 硬约束:
step_4_projection字数 ≤max_projection_length- 不得出现
must_avoid_terms中的任一词(命中则对照{skill_root}/references/soft-phrasing-map.md重写) - 因果链必须对应行业框架"典型传导链"中的某段
require_info_gap_flag_if_missing中字段确实缺失时标注「信息不足,待进一步跟踪」- 禁止跨资讯合并推导
tagName 提取:source_tier 映射(official_disclosure→公司公告, top_broker_research→机构研报)或从内容提炼(行业地位/产品动态/财务数据/政策影响等),结合资讯对业绩/产品/销量/发展的传导路径综合研判,仅输出三选一:"有利"、"中性"、"不利"。与 impact_direction 独立研判,可一致亦可不同
Step 4 中间产物结构(供 Step 5 组装):
{
"news_id": "news_1",
"tagName": "有利",
"step_1_event": "客观事实≤30字",
"step_4_projection": "定性展望≤60字",
"impact_direction": "positive",
"info_gap_note": ""
}
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 4 规则分析:✅/❌ | 行业命中=[行业名/通用模板] | 推导条数=[N] | 信息缺口=[N] | 禁用词自检=[通过]
失败处理:
- 信息不足 → 该条标注缺口,不跳步
- 行业未命中 → 回退通用模板
- 命中禁用词 → 整句重写
Step 5:合成输出(结构化 JSON)
操作(依赖 Step 4):
1. 生成约150字 desc(整合共振/背离关系,不引入 TOP3 之外的新事实)
2. 组装最终 JSON(Schema 如下)
3. 生成 3 个追问问题
4. 最终对照 {skill_root}/references/soft-phrasing-map.md 做禁用词扫描
输出 JSON Schema(唯一权威定义):
⚠️ 最终响应发射协议(纯净输出铁律):在所有工具调用、计算和内部自检完成后,最终面向用户的响应必须直接以{作为第一个字符,并且有且仅有一个合法 JSON 对象,以}作为最后一个字符。
禁止生成过程叙述:最终响应前禁止写任何步骤状态、完成确认、计划或解释,例如“步骤 3 已完成”“步骤 4/5:组装最终 JSON”“脚本返回了全部字段”“以下为结果”。这些文字即使事实正确也属于违规输出。
禁止在 JSON 前后输出任何字符,包括但不限于:空行、换行、空格、Markdown 代码块标记(\\\json / \\\)、自然语言说明、📋检查点文本、注释。违反此规则视为执行失败。
JSON 结构分隔符必须使用英文标点:字段之间的逗号必须是英文半角逗号,(U+002C),禁止使用中文全角逗号,(U+FF0C)作为 JSON 结构分隔符。字符串值内部的中文逗号不受限制,但字段与字段之间、数组元素之间的分隔符必须严格为英文逗号。
最终发射前静默自检:仅在内部确认“首字符为{、末字符为}、可被 JSON.parse() 解析、没有过程叙述”后,才输出 JSON;不要把自检结论写入响应。
标准输出示例(成功场景):
{"success":true,"title":"微软(US-MSFT)近期资讯影响速览","updateTime":"今天 08:00","desc":"近期资讯聚焦云区域扩张、AI芯片规划与OpenAI商业化,均围绕云与AI业务链条,整体对产品与发展形成观察支撑。","list":[{"tagName":"有利","title":"印度云区域上线","type":"positive"},{"tagName":"有利","title":"Maia 300芯片拟发布","type":"positive"},{"tagName":"有利","title":"披露OpenAI相关收入","type":"positive"}],"questions":[{"prompt":"请分析US-MSFT:印度云区影响","title":"印度云区影响"},{"prompt":"请分析US-MSFT:AI芯片进展","title":"AI芯片进展"},{"prompt":"请分析US-MSFT:OpenAI收入链","title":"OpenAI收入链"}]}
字段完整定义:
{
"success": true,
"title": "[stock_name]([stock_code])近期资讯影响速览",
"updateTime": "今天 HH:mm",
"desc": "约150字综合总结",
"list": [
{"tagName": "有利|中性|不利", "title": "客观事实≤30字", "type": "positive|neutral|negative"}
],
"questions": [
{"prompt": "请分析[stock_code]:问题≤15字", "title": "问题≤15字"}
]
}
字段约束:
success:固定true;数据不可用/降级时为falsetitle:[stock_name]([stock_code])近期资讯影响速览,stock_code 带市场前缀如HK-00700updateTime:今天 HH:mm,取now_iso_used按本地时区格式化desc:综合总结≤150字;不引入 TOP3 之外新事实;禁止追加任何免责声明/disclaimer 文案(如"不构成投资建议"、"仅供参考"、"市场有风险"等)list:长度=TOP3条数,按publish_time升序;type枚举三选一(positive/neutral/negative);tagName从内容研判,输出"有利"/"中性"/"不利"三选一questions:恰好 3 个对象,每个含:title:≤15字问题文本;从本次具体资讯要点/传导链/信息缺口中提炼;禁止操作指令词和泛化万金油问题prompt:请分析[stock_code]:+ title 内容,用于下游追问触发
降级 JSON(TOP3 为空 或 任何中途失败时):
{"success":false,"title":"[stock_name]([stock_code])近期资讯影响速览","updateTime":"今天 HH:mm","desc":"近期无可用相关资讯支撑评估。","list":[],"questions":[]}
- 若 stock_name/stock_code 已知则填入,未知则 title 填空字符串
- 降级 JSON 同样遵守纯净输出铁律:不得在 JSON 前后附加任何非 JSON 字符
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 5 合成输出:✅/❌ | JSON完整=[是] | desc字数=[约N字] | list=[N条] | questions=[3] | 禁用词=[通过]
通关标准:
| 检查项 | 标准 | 禁止 |
|:-------|:-----|:-----|
| 纯净度 | 输出第一个字符为 {,最后一个字符为 } | JSON 前后有任何非 JSON 字符 |
| 过程叙述隔离 | 最终响应只含 JSON,内部步骤状态保持静默 | “步骤已完成”/“组装 JSON”/“以下为结果”/脚本执行说明 |
| 格式 | 严格符合 JSON Schema,可被 JSON.parse() 直接解析 | 非法 JSON / 多余逗号 / 注释 |
| success | 正常为 true,降级为 false | 遗漏该字段 |
| 检查点隔离 | JSON 中无📋文本 | 检查点外泄 |
| desc | ≤150字 | 引入新事实/遗漏字段 |
| list | tagName/title/type 齐全,tagName 仅三选一 | type 不在枚举中 / tagName 为类别标签 |
| questions | 3个,每个含 title+prompt | 操作指令词/泛化问题/缺 prompt |
版本号
- v2.4(修复 Step 1 触发逻辑:stock_name/stock_code 任一即可触发;强制 search_stock 为流程必经首步,