name: portfolio-quick-diagnosis description: 用于快速分析投资组合的持仓概览、集中度检查和总体评价。适用于用户请求组合快速诊断、持仓概览、集中度分析或面向客户的结构化结果说明时。
投资组合快速诊断
目的
把用户提供的持仓列表整理成一份结构化的快速诊断结果。该技能负责收集必要信息、补全缺失内容、触发分析,并把最终结果整理成可直接转述给客户的结构化文字。
适用场景
当任务是以下内容时使用本技能:
- 快速概览一个组合
- 将持仓统一整理为仓位比例
- 检查集中度和明显的重叠风险
- 输出简洁的中文持仓分析
总体分工
SKILL.md:负责流程控制、信息收集、确认步骤和调用顺序。analysis_prompt.md:负责分析逻辑、检索范围、推断边界和风险判断。report_prompt.md:负责最终结构化交付文案、章节结构和输出措辞。
核心规则
- 全程使用中文。
- 不要声称自己知道实时价格、最新基金持仓,或任何未提供、未验证的外部事实。
- 不要给出买卖指令,也不要预测市场走势。
- 清楚区分已知事实和粗略假设。
- 如果用户给出的持仓比例加总不足 100%,不能假设剩余部分就是现金。必须追问用户:剩余部分是现金、货币基金,还是有其他持仓没有列出。只有在用户明确确认后,才能把剩余部分归入现金或其他类别。
- 如果用户没有提供明确仓位,需要追问完成归一化所必需的最少信息。
- 即使持仓信息看起来完整,最终报告前也要先进入确认步骤。
- 最多进行 3 轮补充信息对话。
- 默认不要生成 HTML、PDF 或其他本地报告文件。优先输出结构化中文结果。
路径约定
SKILL_ROOT = 本 SKILL.md 的父目录(即 portfolio-health-check/ 技能根目录)。所有 cd "$SKILL_ROOT" 命令均指向技能根目录,不要硬编码绝对路径。
标的识别规则
阶段一的第一步必须先做标的识别,通过 QVeris identify 命令一次性获取:
- 股票名称和证券代码的互查
- 公司简介(全称、主营业务、主要产品、概念标签)
- 行业分类(申万一级/二级/三级,仅限个股)
如果用户给的是名称,先查代码;如果用户给的是代码,先查名称。
如果一个名称可能对应多个标的(返回结果中 is_ambiguous: true),先标记为待确认,并把候选代码列出来让用户选择。
如果 QVeris 找不到,再用公开网络信息补全。
QVeris 用法
单个标的:
cd "$SKILL_ROOT" && python scripts/portfolio-health-check/qveris_client.py identify "贵州茅台"
多个标的(批量):
cd "$SKILL_ROOT" && python scripts/portfolio-health-check/qveris_client.py identify "贵州茅台" "中国平安" "沪深300ETF"
identify 命令会按优先级尝试候选工具,第一个成功的就用:
hangseng_polysource.stock.basicCorpInfo.retrieve.v2— 主候选,返回公司全称、申万/证监会/中信行业分类、注册地、主营、概念板块等完整字段ths_ifind.company_basics.v1— fallback,补 name;industry 字段上游返空属数据源限制
支持的输入格式:
- 公司名称:
"贵州茅台"、"中国平安" - 完整代码:
"600519.SH"、"000001.SZ" - 纯数字代码:
"600519" - ETF/基金名称:
"沪深300ETF"
返回字段说明
| 字段 | 说明 |
|---|---|
code_lookup.codes |
匹配到的 THS 代码列表 |
code_lookup.is_ambiguous |
是否有多个候选代码 |
primary_code |
首选代码(多候选时取第一个) |
company |
公司全称、主营业务、产品、概念标签 |
asset_type |
"stock" 或 "fund_or_etf" |
industry |
申万行业层级(个股才有,ETF/基金为 null) |
处理歧义
- 如果
is_ambiguous为true,把所有候选代码列出来,在确认表中标注"待确认"。 - 多市场上市(如 A+H 股)的情况下,默认取第一个代码(通常是 A 股),在确认表备注中列出其他代码。
- 如果
identify返回resolved: false,再改用search命令做更宽泛的搜索。
第一阶段输出顺序
阶段一先输出两块内容,再进入持仓确认表:
名称/代码互查表- 放每个标的的名称、代码、候选代码、是否待确认
- 这里只负责把名称和代码对上,不放长篇简介
公司与行业简介- 用简短中文说明公司主营、业务特点、所属行业、行业位置
- 这部分是给用户快速理解标的用的,不放进表格里
然后再输出:
持仓确认表- 资产名称
- 代码
- 占比
- 资产类别
- 备注
状态存储
- 第 1 阶段的标的识别结果、公司与行业简介、持仓确认表,会写入
state/portfolio_state.json。 - 这份文件是后续 Python 脚本读取的标准结构化输入。
- 如果用户后续补充了新的名称/代码更正,应该更新同一个 state 文件,而不是另存新文件。
信息收集流程
收到用户持仓后,按以下顺序处理:
- 用
identify命令批量识别所有标的,一次性获取代码、公司简介、行业分类。 - 检查返回结果中是否有
is_ambiguous: true或resolved: false的标的。 - 识别每个资产的名称、可能代码、输入形式和仓位信息。
- 如果只有名称没有代码,先根据公开信息自动补全常见代码。
- 判断是比例、金额、股数还是仅名称。
- 如果名称可能对应多个标的,再追问用户确认。
- 识别现金、货币基金或“剩下没动”等用户明确提到的现金线索。注意:比例加总不足 100% 本身不算现金线索,必须追问用户剩余部分是什么。
- 若信息不足,只追问完成归一化和确认所必需的最少信息。
- 所有追问尽量合并成一次,避免来回过多。
- 无论初始信息是否完整,都要先生成名称/代码互查表、公司与行业简介,再生成持仓确认表并等待确认。
输入识别规则
从用户消息中提取这些信息:
- 资产名称
- 可能的证券代码
- 输入形式:金额、比例、股数,还是仅名称
- 现金线索,例如“现金”“货币基金”“剩余”等
如果用户给的是金额,就按总金额归一化为比例。 如果用户只给了股数,不要凭记忆或直觉估算权重,应该要求补充大致市值或仓位。
确认步骤
确认表必须先于最终结构化结果输出,格式如下:
| 资产名称 | 代码 | 占比 | 资产类别 | 备注 |
|---|---|---|---|---|
| 示例资产 | 示例代码 | 10% | 股票/ETF/债券/现金/其他 | 如有必要可写“待确认” |
如果某个字段无法确认,请写 待确认 或 无法确认。
确认提示语应简洁明确,例如:
“请确认以下持仓信息;如果有不准确之处,请直接修改名称、仓位或现金占比。”
调用顺序
- 先用
identify命令做标的识别(代码互查 + 公司简介 + 行业分类)。 - 再收集并整理用户输入。
- 如有必要,先追问缺失信息。
- 生成并展示确认表。
- 在用户明确确认后,调用
analysis_prompt.md生成分析要点。 - 再调用
report_prompt.md生成最终结构化文字。 - 如果 3 轮后仍未确认,基于当前信息和必要假设继续,但要在最终结果中明确说明局限。
边界规则
- 不要把不确定的信息写成确定事实。
- 不得编造实时价格、实时净值、基金最新持仓、指数最新成分股、精确市值或汇率。
- 对 ETF 与个股重叠,只能做保守判断,例如“可能存在重叠”。
- 对无法识别的简称、代码或资产,明确写“无法确认”,并在确认阶段请求客户澄清。
- 资产配置建议只能停留在方向性层面,不要给出具体买卖指令。