个股资金流分析
- 简介
- 基于脚本客观计算并输出个股近7日主力趋势、多空情绪与散户占比,严禁预测涨跌或提供操作建议。
- 触发词
- 资金流分析,主力趋势,散户情绪,小单占比,多空情绪
- 分发渠道
- ARK Engine
- 功能测试
- ✅ 通过 · 业务评审:✅ 通过
- 技能包文件
- stock-fund-flow-analysis/SKILL.md、stock-fund-flow-analysis/scripts/stock_fund_flow_analysis.py
SKILL.md 全文
Frontmatter
| name | 个股资金流分析 |
|---|---|
| description | 个股资金流多空情绪分析技能。当用户要求生成个股资金流分析、判断主力资金对近7个交易日趋势的影响(延续/扭转/加速)、分析散户情绪与小单占比变化时触发。调度 Job 负责决定触发时间;Skill 收到任务后必须实际获取资金流和 K 线数据。核心机制是"脚本计算衍生字段 + LLM 生成结构化总结"。不适用于股价预测、点位判断、买卖操作建议或适当性判断。 |
个股资金流多空情绪分析技能(stock-fund-flow-analysis)
基于个股资金流数据,通过脚本计算衍生字段(主力口径、小单占比、近7日趋势),LLM 将只读数值组织为结构化 JSON 分析。不做股价预测或估值判断,仅描述客观资金流方向与规模。
职责
| 职责 | 说明 | |:----|:------| | 触发时机 | 由外部 Job 或主控决定;Skill 内不查询或限制市场开闭状态 | | 资金流数据获取 | 调用 Noah MCP 资金流 + K线接口获取原始数据 | | 确定性计算 | 脚本计算衍生字段,LLM 不心算 | | 结构化输出 | 将脚本只读字段组织为 JSON 响应 | | 合规护栏 | 不预测涨跌、不出操作建议 |
输入
定时触发模式(Step 1→Step 5)
入口判断:由外部定时 Job 决定何时发起;Skill 不校验交易日、市场状态或开盘时段由主控传入:
- stock_code:个股代码(如 HK-00700、US-AAPL)
- stock_name:个股名称
- market:市场标识(HK/US)
- [可选] trigger_time_iso:触发时刻 ISO8601,仅用于记录
用户主动查询模式(Step 1→Step 5)
入口判断:用户主动请求某个股的资金流分析;无论市场状态如何均执行数据获取由主控传入(stock_name 和 stock_code 至少提供一个即可触发,缺失的由 Step 1 自动补全):
- stock_code:个股代码(缺失时由 Step 1 根据 stock_name 查询补全)
- stock_name:个股名称(缺失时由 Step 1 根据 stock_code 反查补全)
- market:市场标识(缺失时由 Step 1 从 stock_code 前缀自动推断,如
US-TSLA→US)
引用路由表
| 用户意图 | 加载参考文件 |
|:---------|:------------|
| 脚本计算逻辑与衍生字段定义 | {skill_root}/scripts/stock_fund_flow_analysis.py(只读) |
输出
直接返回结构化 JSON 响应消息(Schema 见 Step 5),在内存中拼接,不写磁盘文件。
⛔ 执行流程(强制检查点,按顺序执行,禁止跳步)
全局规则:
- 每个检查点必须完成后才能进入下一个,未输出📋行视为执行失败
- 禁止跳步铁律:Step 1→2→3→4→5 必须严格按序执行,不得以任何理由跳过中间步骤。即使 LLM 认为"可以直接用原始数据生成输出",也必须先调用 Step 3 脚本。违反此规则视为执行失败。
- 所有 📋 Step N … 检查点行严禁出现在面向用户的最终 JSON 响应中
- 面向用户的最终响应必须且仅能是一个合法 JSON 对象(从{开始到}结束),不得在 JSON 前后附加任何字符(包括空行、换行、Markdown 代码块标记 \\\json / \\\、自然语言文字、📋检查点文本)
- 任何中途终止/失败场景,一律输出降级 JSON(success=false),不得输出自然语言提示或空对象
- 脚本强制执行铁律:Step 3 的 stock_fund_flow_analysis.py 脚本调用是整个流程的必经环节,不可省略、不可替代、不可用 LLM 心算代替。未执行脚本就生成 desc 视为严重违规。
- 脚本调用必须使用execute_bash+ stdin 管道,严禁fs_write/str_replace创建临时文件
- search_stock 仅限 Step 1 标的校验使用,Step 2 及之后禁止调用
- 脚本输出的衍生字段为只读常量,LLM 不得覆盖、心算或二次加工
- desc 数据来源铁律:Step 5 中 desc 的所有数值(金额、倍数、百分比、方向词)必须且只能来自 Step 3 脚本输出的 derived_fields 中的 7 个字段。禁止直接引用 Step 2 原始接口返回的数值(如 inFlow、superInFlow、capitalFlowItemTime 等原始字段)。
- 任何数据必须来自 MCP 接口真实返回,严禁用记忆/训练数据填充;缺失标注「数据缺失」
- 合规红线贯穿全流程:禁止预测涨跌/点位/目标价;禁止操作建议;禁止适当性判断
Step 1:触发判定与标的校验
操作:
1. 判断输入是否提供 stock_name 或 stock_code(至少一个即可触发),且请求属于资金流分析类。
2. 强制调用 search_stock 查询标的基本信息,确定搜索关键词(按优先级尝试):
- 先用用户提供的完整 stock_code 原样搜索(如
US-TSLA)。 - 若返回结果为空(
result数组长度为 0),则去掉市场前缀只取纯代码再搜索(如TSLA)。 - 若仅有 stock_name 无 stock_code,则直接用 stock_name 搜索。
uniqueCode 精确等于用户输入 stock_code 的那条;若无精确匹配,取 generaType=1001(正股)的首条,并补全:
stock_name←chiName或name(优先 chiName,为空则取 name)stock_code←uniqueCode(带市场前缀的标准格式)market← 从uniqueCode前缀推断(US-→ US,HK-→ HK)
get_market_state,不调用 request_trading_days,不根据市场开闭、是否交易日、盘前盘后或触发时间终止或降级。内嵌规则:
search_stock的key_words对带市场前缀的代码可能返回空,必须执行“完整代码 → 空则纯代码”的二级 fallback。search_stock仅在本步骤用于标的身份校验和参数补全,后续步骤不得调用。- 市场状态不属于资金流/K线数据可用性的判断条件。无论市场显示开盘、休市或非交易日,只要标的校验成功,都必须调用 Step 2 的
get_capital_flow与get_cur_kline。 - 外部 Job 负责定时任务的触发时点;Skill 不承担调度、交易日校验或市场状态校验。
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 1 标的校验:✅/❌ | stock_name=... | stock_code=... | market=[HK/US] | search_stock=[成功/失败] | 下一步=[Step 2]
失败处理:
- stock_name 和 stock_code 均缺失 → 输出降级 JSON。
- search_stock 两次尝试均返回空,且无法获得可供后续接口使用的 stock_code → 输出降级 JSON。
- 禁止因市场休市、非交易日、盘前盘后或
get_market_state结果输出降级 JSON。
Step 2:数据获取(资金流 + K线)
强制取数门控:Step 1 标的校验成功后,必须并行实际调用本步骤两项接口;不得基于市场状态、交易日、盘前盘后或历史经验预判接口无数据并跳过调用。
操作:
1. 并行调用 get_capital_flow(num=8)和 get_cur_kline(K_DAY, QFQ, num=8)。
2. 以接口实际返回为准,按日期对齐并校验可用于计算的交易日数据覆盖≥7日。
MCP 调用编排:
| # | 接口 | 入参 | 取什么 | 用途 |
|---|------|------|--------|------|
| 1 | get_capital_flow | stock_code, num=8 | superInFlow/bigInFlow/midInFlow/smlInFlow/capitalFlowItemTime | 各档资金流 |
| 2 | get_cur_kline | code, ktype=K_DAY, autype=QFQ, num=8 | turnover/tradeDateTime/closePrice | 成交额(占比分母)+ 日期对齐 |
Error Handling:
| 场景 | 策略 | |:-----|:-----| | capital_flow 接口实际失败或返回空 | 重试一次;仍失败才输出降级 JSON | | kline 接口实际失败或返回空 | 重试一次;仍失败才输出降级 JSON | | 可对齐数据不足7日 | 输出降级 JSON |
核心原则:
- 不得调用或引用
get_market_state、request_trading_days。 - 不得因为市场休市或非交易日跳过本步骤;是否降级只能由本步骤两项接口的实际返回决定。
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 2 数据获取:✅/❌ | capital_flow=[已调用,N条] | kline=[已调用,N条] | 日期范围=[...] | 完整性=[完整/缺失说明]
Step 3:确定性计算(脚本衍生字段)⚠️ 不可跳过
⚠️ 本步骤为流程硬性必经环节:无论 Step 2 数据多么"直观"或"简单",LLM 都必须调用脚本而非自行计算。
没有 Step 3 的 derived_fields 输出,Step 4 和 Step 5 的所有后续操作均为非法。操作(依赖 Step 2): 1. 将 Step 2 获取的原始数据拼接为 JSON,通过 stdin 管道调用脚本:
echo '{"capital_flow_raw": [...], "kline_raw": [...], "stock_name": "..."}' | \
python3 {skill_root}/scripts/stock_fund_flow_analysis.py
capital_flow_raw:Step 2 中get_capital_flow的原始返回数组,每条需包含字段映射:trade_date←capitalFlowItemTime前8位(yyyyMMdd)in_flow←inFlowsuper_in_flow←superInFlowbig_in_flow←bigInFlowmid_in_flow←midInFlowsml_in_flow←smlInFlowkline_raw:Step 2 中get_cur_kline的原始返回数组(保留原字段名即可)
derived_fields 对象,包含 7 个只读字段:| 字段 | 含义 | 格式示例 |
|:-----|:-----|:--------|
| today_main_net | 当日主力净流入金额 | -1.5亿、340万 |
| today_dir | 方向 | 净流入 / 净流出 |
| today_vs_avg | 当日相对6日均值倍数 | 0.2倍、1.8倍 |
| today_impact | 定性判断 | 延续 / 扭转 / 加速 |
| flow_7d_change | 7日主力变化描述 | 从34.6亿降至-1.5亿(-104%) |
| trend_7d | 7日趋势描述 | 净流入(累计60.6亿) |
| retail_ratio_trend | 散户占比趋势 | 0%-2%,最新2%(上升) |
3. 门控校验:确认 stdout 返回的 JSON 中存在 derived_fields 且 7 个字段均非空。任何字段缺失 → 重试一次,仍失败则输出降级 JSON。
脚本计算逻辑(LLM 不可替代):
- 主力口径 = superInFlow + bigInFlow
- 倍数 = |当日主力| / |6日均值|;同向且>1.5为加速,同向为延续,反向为扭转
- 小单占比 = |sml_inflow| / turnover × 100
- 7日变化 = 末日主力 - 首日主力(delta 绝对差 + 方向词)
- 金额格式化:≥1亿显示"X.X亿",≥1万显示"X万",<1万显示原值
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 3 脚本计算:✅/❌ | today_main_net=[值] | today_dir=[方向] | today_impact=[判定] | trend_7d=[值] | retail_ratio_trend=[值] | 执行=[成功/失败]
失败处理:脚本输出 error / 超时 / 解析失败 → 重试一次,仍失败则输出降级 JSON
Step 4:规则分析(要点组装)
前置门控:进入本步骤前,必须确认 Step 3 的 derived_fields 已成功获取。若 Step 3 未执行或失败,禁止进入本步骤。操作: 1. 使用 Step 2 实际返回并经 Step 3 对齐计算的最近7个交易日数据,固定使用全部5个要点。 2. 基于 Step 3 的衍生字段生成标题和描述所需的客观结论;不使用市场状态或开盘时长判定分析范围。
五大要点(字段值必须原样引用 Step 3 脚本 derived_fields 输出,禁止改写数值、禁止用原始接口数据替代):
1. 当日主力动向:{today_main_net}({today_dir}),规模为均值的 {today_vs_avg}。
2. 当日对近7日格局影响:{today_impact}。
3. 主力近7日趋势:{flow_7d_change},整体呈 {trend_7d}。
4. 散户情绪:小单占比 {retail_ratio_trend}。
5. 博弈透视:基于1-4客观数据的定性分析(LLM 生成)。
禁止行为:
- ❌ 根据市场开闭状态、交易日或模式 A/B 省略任一要点。
- ❌ 在要点中引用 Step 2 原始接口的数值(如
inFlow、superInFlow、capitalFlowItemTime原始字段值)。 - ❌ 自行计算金额/占比/倍数(必须用脚本已格式化的结果)。
- ❌ 展示原始时间戳格式(如
20260804100823),日期引用必须使用 MM/DD 格式。
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 4 规则分析:✅/❌ | 分析窗口=[最近7个交易日] | 要点=[1,2,3,4,5] | 数值来源=[全部来自derived_fields] | 数值校验=[通过]
Step 5:合成输出(结构化 JSON)
操作(依赖 Step 1~4):
1. 生成 title:动态摘要,概括近7日主力方向、末日影响判定与散户情绪关键变化,≤25字。
2. 生成 desc:整合全部5个要点为一段约150-200字连贯自然语言正文。
3. 生成 3 个 questions(追问问题)。
4. 组装最终 JSON
5. 对照禁用词做最终扫描
输出 JSON Schema(唯一权威定义):
⚠️ 最终响应发射协议(纯净输出铁律):在所有工具调用、计算和内部自检完成后,最终面向用户的响应必须直接以{作为第一个字符,并且有且仅有一个合法 JSON 对象,以}作为最后一个字符。
禁止生成过程叙述:最终响应前禁止写任何步骤状态、完成确认、计划或解释,例如“步骤 3 已完成”“步骤 4/5:组装最终 JSON”“脚本返回了全部字段”“以下为结果”。这些文字即使事实正确也属于违规输出。
禁止在 JSON 前后输出任何字符,包括但不限于:空行、换行、空格、Markdown 代码块标记(\\\json / \\\)、自然语言说明、📋检查点文本、注释。违反此规则视为执行失败。
JSON 结构分隔符必须使用英文标点:字段之间的逗号必须是英文半角逗号,(U+002C),禁止使用中文全角逗号,(U+FF0C)作为 JSON 结构分隔符。字符串值内部的中文逗号不受限制,但字段与字段之间、数组元素之间的分隔符必须严格为英文逗号。
最终发射前静默自检:仅在内部确认“首字符为{、末字符为}、可被 JSON.parse() 解析、没有过程叙述”后,才输出 JSON;不要把自检结论写入响应。
标准输出示例(成功场景):
{"success":true,"title":"腾讯控股主力扭转流出散户上升","updateTime":"08/12 10:16","desc":"腾讯控股今日主力资金为-1.5亿,方向为净流出,规模为近6日均值的0.2倍,对7日资金格局形成扭转。从7日变化看,主力资金从34.6亿降至-1.5亿(-104%),但7日累计仍呈净流入(累计60.6亿),说明短线方向与阶段累计方向出现分化;小单占比处于0%-2%,最新2%(上升),散户参与度有所抬升,需继续观察后续资金结构是否延续分化。","questions":[{"prompt":"请分析HK-00700:主力结构如何","title":"主力结构如何"},{"prompt":"请分析HK-00700:小单占比变化","title":"小单占比变化"},{"prompt":"请分析HK-00700:多日趋势延续吗","title":"多日趋势延续吗"}]}
字段完整定义:
{
"success": true,
"title": "动态摘要≤25字",
"updateTime": "MM/DD HH:mm",
"desc": "约150-200字连贯段落",
"questions": [
{"prompt": "请分析[stock_code]:问题≤15字", "title": "问题≤15字"}
]
}
字段约束:
success:固定true;数据不可用时为falsetitle:[stock_name]+ 核心结论关键词(如"主力扭转流出散户上升"),≤25字,动态生成updateTime:格式MM/DD HH:mm,取数据获取时刻按本地时区格式化(如08/12 10:16)desc:- 固定包含全部5个要点融合为连贯段落,约150-200字。
- 所有数值必须直接引用脚本输出,不可心算。
- 不引入脚本输出之外的新事实或预测性结论。
- 禁止在 desc 末尾或任何位置追加免责声明/disclaimer 类文案(如"不构成投资建议"、"仅供参考"、"市场有风险"等),输出中不需要任何合规声明文案。
questions:恰好 3 个对象,每个含:title:≤15字问题文本;从资金面细节、时段拆解、同业对比、结构变化等方向提炼;禁止操作指令词prompt:请分析[stock_code]:+ title 内容,用于下游追问触发
降级 JSON(数据不可用 或 任何中途失败时):
{"success":false,"title":"[stock_name]资金流数据暂不可用","updateTime":"MM/DD HH:mm","desc":"当前资金流数据源暂不可用,无法生成分析。","questions":[]}
- 若 stock_name 已知则填入,未知则 title 填"资金流数据暂不可用"
- 降级 JSON 同样遵守纯净输出铁律:不得在 JSON 前后附加任何非 JSON 字符
自检点(仅内部验证,禁止输出到最终响应):
📋 Step 5 合成输出:✅/❌ | JSON完整=[是] | title字数=[N] | desc字数=[约N字] | questions=[3] | 禁用词=[通过]
通关标准:
| 检查项 | 标准 | 禁止 |
|:-------|:-----|:-----|
| 纯净度 | 输出第一个字符为 {,最后一个字符为 } | JSON 前后有任何非 JSON 字符 |
| 过程叙述隔离 | 最终响应只含 JSON,内部步骤状态保持静默 | “步骤已完成”/“组装 JSON”/“以下为结果”/脚本执行说明 |
| 格式 | 严格符合 JSON Schema,可被 JSON.parse() 直接解析 | 非法 JSON / Markdown / 多余逗号 |
| success | 正常为 true,降级为 false | 遗漏该字段 |
| title | ≤25字动态摘要 | 固定模板/超长 |
| updateTime | MM/DD HH:mm 格式 | 遗漏/格式错误 |
| desc 字数 | 固定150-200字,覆盖全部5个要点 | 超长(>250字)/ 过短(<80字) |
| desc 数据溯源 | 所有数值必须可追溯到 Step 3 脚本 derived_fields 的 7 个字段 | 引用原始接口数值 / 自行心算 / 出现原始时间戳格式 |
| desc 金额格式 | 使用"X.X亿"/"X万"等脚本格式化值 | 出现未格式化的原始数字(如 43287472.46) |
| desc 日期格式 | 使用 MM/DD 或"今日"/"近7日"等可读格式 | 出现原始时间戳(如 20260804100823) |
| questions | 3个,每个含 prompt+title | 数量错/缺 prompt/含操作词 |
| 检查点隔离 | JSON 中无📋文本 | 检查点外泄 |
| 脚本执行验证 | Step 3 脚本已实际调用且返回成功 | 跳过脚本直接生成 desc |
禁用词红线(输出前逐条对照):
- ❌ 预测涨跌/点位/目标价
- ❌ 建议买入/卖出/加仓/减仓/持有/适合投资
- ❌ 必涨/稳赚/保本/预期年化/高回报
- ❌ 主力吸货完毕即将拉升/散户接盘必亏(确定性预测)
- ❌ 适合你/不适合你(适当性结论)