持股雷达
SKILL_598959000 · vv1.0 · iARK 线上 · Owner:— · 发布于 2026-08-18
调用 14
下载 0
点赞 0
浏览 0
- 简介
- 专为港美股组合提供结构诊断,输出资产、集中度与盈亏结论的体检卡,不含交易建议。
- 触发词
- 持仓体检,组合诊断,仓位结构,风险评估,集中度
- 分发渠道
- ARK Engine
- 功能测试
- ✅ 通过 · 业务评审:✅ 通过
- 技能包文件
- iark-portfolio-checkup-min/SKILL.md、iark-portfolio-checkup-min/scripts/calc_portfolio_min.py
使用示例:帮我看看我的持仓,组合健康吗,仓位结构有没有问题?
SKILL.md 全文
Frontmatter
| name | 持股雷达 |
|---|---|
| version | v2.04 |
| description | iARK「持股雷达」Skill。当用户询问「帮我看看我的持仓/我的组合健康吗/我的仓位结构有没有问题/我整体风险大不大/持仓集中度高不高」等针对港美股组合的整体诊断类问题时触发。通过 get_complete_portfolio 接口获取证券总资产与持仓,输出「组合体检卡」:资产全景、产品/持仓集中度、盈亏结构、体检结论。覆盖范围仅港美股证券与现金;不含 A 股、基金、其他市场。不输出任何买卖/调仓建议。 |
iARK · 港美股组合体检
研判你港美股组合的持仓结构是否健康——仓位、产品集中度、盈亏分布。是否调整、如何调整,决定权始终在用户。
职责
| 职责 | 说明 | |:-----|:-----| | 组合结构诊断 | 仓位占比、产品/持仓集中度、盈亏分布的事实呈现 | | 体检卡输出 | 资产全景 + 集中度 + 盈亏 + 结论,一张结构化组合体检卡 | | 覆盖范围 | 仅港股 + 美股证券及对应现金;A 股、公募基金、其他市场资产不在范围内 |输入
[组合诊断入口](Step 1→Step 5)
由主控传入:- 用户问题(自然语言,含持仓/组合/仓位/集中度等关键词)
输出
返回给主控:- 直接返回 Agent 响应消息(JSON 体检卡,格式见 Step 5)
- 检查点证据(必须包含 Step 1~Step 5 所有 📋 输出行)
不落盘原则:所有中间数据在内存中处理,产出作为 Agent 响应消息直接返回,不写磁盘文件。
⛔ 执行流程(强制检查点,按顺序执行,禁止跳步)
执行规则:每个检查点必须完成后才能进入下一个。每个检查点的「强制输出」是推进的唯一依据,未输出视为执行失败。
⛔ 检查点输出禁止外泄:所有📋 Step N …检查点行仅用于内部执行验证与调试日志,严禁出现在面向用户的最终响应消息中。用户看到的只能是最终体检卡/分析结果与 disclaimer,不得包含任何📋开头的检查点文本。
Step 1:触发判定
操作: 1. 判断用户问题是否属于本 Skill 处理范围 2. 匹配则继续;不匹配则转交或终止 3. 调用trade_get_account_info 检证券账户状态(已开通/休眠/未开通),休眠或未开通则走「失败处理」短路
内嵌规则:
- 触发条件(命中任一即触发):
- 「帮我看看我的持仓」「我的组合健康吗」「仓位结构有没有问题」
- 「整体风险大不大」「持仓集中度高不高」
- 其他针对港美股组合整体诊断类问题
- 转交条件:
- A 股相关 → 不适用本 Skill,终止
- 单标的买入决策 → 转交「上车裁决」(iark-stock-verdict)
- 基金/ETF 筛选 → 转交「基金猎场」(iark-screener-fund)
- 不满足触发条件且无明确转交目标 → 终止,不强行执行
📋 Step 1 触发判定:✅ 命中触发条件「[匹配关键词]」 / ❌ 转交 [目标Skill] / ❌ 终止核心原则(禁止行为):
- 禁止在用户问 A 股/基金/单标的时强行执行本 Skill
- 禁止用模糊匹配代替明确触发条件
- 条件不符 → 转交对应 Skill 或终止
- 账户休眠 → 终止并输出激活账户卡片,不进入 Step 2(不调
get_complete_portfolio、不跑脚本)。 - 检测规则:
trade_get_account_info返回数组;取所有元素,若任一元素的openingStatus === "10"→ 判定账户休眠(openingStatus顶层码 10=休眠/9=正常;休眠时股票账户 desc 仍是「证券账户不可用」不含「休眠」,故必须用openingStatus码值判,不能靠股票 desc 文本。休眠 → 无法看港美股持仓 → 激活卡片)。 - 输出(用户可见,操作前置提示,非投资建议),逐字符使用下方卡片,
data-function-type="1"为 URL 动作按钮:
- 检查点(内部验证,不外泄):
📋 Step 1 触发判定:⛔ 账户休眠 | 已输出激活账户卡片 | 流程终止 - 证券账户未开通 → 终止并输出极速开户卡片,不进入 Step 2(不调
get_complete_portfolio、不跑脚本)。 - 检测规则:(非休眠,即未命中上方休眠分支)
hkStockStatusDesc与usStockStatusDesc均不含「已开通」(即港股、美股证券账户均为「不可用/未开通」)→ 判定无证券账户。(本 skill 只看港美股证券,故只检证券账户 HK/US stock,不检基金账户——基金账户状态与本 skill 无关。若要「基金未开通也触发」,加一条fundAccountStatusDesc不含「已开通」即可。) - 输出(用户可见,操作前置提示,非投资建议),逐字符使用下方卡片,
data-function-type="1"为 URL 动作按钮:
- 检查点(内部验证,不外泄):
📋 Step 1 触发判定:⛔ 证券账户未开通 | 已输出极速开户卡片 | 流程终止
Step 2:数据获取
操作: 1. 调用get_complete_portfolio 获取证券资产与持仓数据
2. 🔴 无持仓短路判定(取回后立即执行,在换汇 / 跑脚本之前):若 hkPositions 与 usPositions 均为空(证券账户已开通但无港美股持仓)→ 输出股票转入卡片并终止(不调 trade_convert、不跑 calc_portfolio_min.py、不进入 Step 3–5)。逐字符使用下方卡片,data-function-type="1" 为 URL 动作按钮:
您可以等有港美股持仓或通过以下入口转入股票后再进行体验。
<span data-function-type="1" data-url="https://static-resource-cdn.noahgroup.com/h5/trans-stock/index.html?appLogin=1&appTradeCheck=2&appJumpType=&appContainer=h5¤tLanguage=zh-Hans&theme=stock-back-white#/" data-text="股票转入"></span>
- 检查点(内部验证,不外泄):
📋 Step 2 数据获取:⛔ 无港美股持仓 | 已输出股票转入卡片 | 流程终止
trade_convert_ufg_money_balance 获取汇率
4. 校验返回数据完整性
内嵌规则:
- MCP 调用编排:
get_complete_portfolio | query_scope=["hk_positions","us_positions","sec_asset"] | secAsset[]:各币种 asset_value/market_value/cash_value;hkPositions[]+usPositions[]:各持仓 code、currency、market_value、pnl |
| 2 | trade_convert_ufg_money_balance | from_money_type、to_money_type、balance | 换汇:返回 balance(换算后金额),用于求基准币汇率 |
- 真实返回结构:
get_complete_portfolio返回secAsset[]字段为 snake_case(money_type/asset_value/cash_value/market_value),持仓在hkPositions[]/usPositions[]中,code形如HK-01810/US-TSLA(横杠),金额均为字符串。脚本已内置展平、兼容 snake/camel、字符串转数值,可直接喂原始返回。 - 取数纪律:数字只来自接口真实返回;缺失就标注缺失、按降级处理,严禁用记忆/常识填充。
- 币种折算(写死,用真实汇率接口):
get_complete_portfolio返回的secAsset[]按币种分行、持仓market_value按currency计价,须折算到基准币(默认 USD)。 - 基准币本身 → 乘数 1.0。
- 其他币种 → 调
trade_convert_ufg_money_balance(如from=HKD,to=USD,balance=10000),fx_to_base[币种] = 返回 balance / 10000(用大额换算再除,避免精度损失)。每个出现的非基准币各调一次。 - 汇率拿不到时脚本判
insufficient_data,不估算。 - 调用建议:调用
get_complete_portfolio(query_scope=["hk_positions","us_positions","sec_asset"])一次取回全部数据;拿到持仓涉及的币种后,对每个非基准币调一次trade_convert_ufg_money_balance求汇率。最后把secAsset、合并后的hkPositions+usPositions、fx_to_base一起喂计算脚本。 - 后续扩展预留(超出最小版,需更多接口):
get_stock_basicinfo(逐只取行业、证券类型) |
| 实时风险信号(主力资金流) | get_capital_flow / trade_get_sec_capital_flow |
| 内部人增减持 | shareholder_inc_red_hold_by_ucode |
加这些时,沿用完整版 iark-portfolio-checkup 的口径与脚本即可。最小版刻意只保留"两个接口能算准"的部分。
强制输出(仅用于内部执行验证,严禁出现在面向用户的最终响应中):
📋 Step 2 数据获取:✅ secAsset [n]条 / hkPositions [n]条 / usPositions [n]条 / 汇率 [已获取币种列表] / ❌ 缺失项 [缺失列表]核心原则(禁止行为):
- 禁止用记忆/常识填充缺失数据
- 禁止估算汇率
- 禁止跳过币种折算直接使用原始金额
- 接口无返回 → 标注缺失,Step 3 判
insufficient_data - 汇率缺失 → 标注缺失,Step 3 判
insufficient_data
Step 3:确定性计算
操作: 1. 将 Step 2 获取的数据组装为标准化 JSON 2. 通过 stdin 管道传给{skill_root}/scripts/calc_portfolio_min.py
3. 读取脚本 stdout 返回的计算结果
内嵌规则:
- 工作流:LLM 构造 JSON 字符串 → 通过 stdin 管道传给脚本(不写临时文件)→ 脚本计算后通过 stdout 返回结果 → LLM 读输出 → 填入 Step 5 模板
- 把下列标准化 JSON 喂给
{skill_root}/scripts/calc_portfolio_min.py,由它确定性算出权重、TopN、现金比例、市场分布、盈亏结构、flags 与status_hint:
{
"base_currency": "USD",
"fx_to_base": { "USD": 1.0, "HKD": 0.128 },
"sec_asset": [ / get_complete_portfolio → secAsset 原样 / ],
"positions": [ / get_complete_portfolio → hkPositions + usPositions 合并,字段 code/market/currency/market_value/pnl / ]
}
- 脚本内置健壮性(自动,无需模型干预):
- 数值校验:金额接受数字或数字字符串,统一转浮点;NaN/Inf/不可转 → 现金非法整体
insufficient_data、单只非法市值按缺市值 →insufficient_data,绝不崩溃。 - 同证券合并:按
market + code汇总市值(防同标的拆多行低估集中度)。 - 阈值用原始全精度权重判定,仅输出舍入。
- 口径:
- 统一分母
denominator = Σ(持仓 marketValue 折基准币) + Σ(各币种 cashValue 折基准币)。 w_stock_i = 持仓_i 基准币市值 / denominator;top3/top5= 权重最高 3/5 只合计(产品/持仓集中度)。securities_position_ratio = 持仓合计 / denominator,cash_ratio为其补。- 脚本负责所有计算,LLM 禁止心算
- 输入输出均通过 stdin/stdout 管道,不得创建临时文件、不得修改/删除磁盘文件
- 脚本版本与 Skill 版本绑定
📋 Step 3 确定性计算:✅ status_hint=[status] / denominator=[值] / holdings=[n]只 / ❌ [缺失原因]核心原则(禁止行为):
- 禁止 LLM 心算权重、比例、阈值判定
- 禁止将 JSON 写入临时文件再调用脚本
- 禁止修改脚本返回结果
- 脚本返回
insufficient_data→ 进入 Step 4 降级处理 - 脚本返回
no_holdings→ 进入 Step 4 输出空持仓结论
Step 4:规则分析
操作(依赖 Step 3): 1. 读取脚本返回的status_hint 和 flags
2. 按阈值表映射体检结论
3. 按固定枚举生成 headline
内嵌规则:
- 阈值表(默认,可在配置层按客户风险等级覆盖):
single_stock_concentration |
| 前 3 大合计 | >50% | >70% | top_holdings_concentration |
- 袖珍仓门槛:
securities_position_ratio < 20%时,集中度警示不升attention,至多watch(脚本已处理,附low_equity_base)。 - 综合上面,输出组合健康度态度(非买卖/调仓指令),以脚本
status_hint为准:
sound 结构稳健 | 结构稳健 · 未见明显集中风险 |
| watch 需留意 | 需留意 · 存在集中度提示项 |
| attention 需关注 | 需关注 · 存在集中度警示项 |
| insufficient_data 暂无法判断 | 暂无法判断 · 关键数据缺失 |
| no_holdings 无可体检标的 | 无可体检标的 · 账户无港美股持仓 |
- no_holdings 的转股卡片已前移至 Step 2 短路:常规「无港美股持仓」(
hkPositions+usPositions均空)在 Step 2 即输出股票转入卡片并终止,不进入本 Step。仅当脚本因「组合分母为 0」(持仓存在但市值全 0、且无现金)返回no_holdings时,本 Step 用固定 headline「无可体检标的 · 账户无港美股持仓」,并同样补输出股票转入卡片(格式见 Step 2)。 - 结论附3 个最重要结构特征,措辞一律「从结构看…/ 集中度在…/ 仓位在…」,绝不出现买入/卖出/加仓/减仓/清仓/调出/分散建议/必涨/稳赚等操作指令或收益承诺。盈亏只做结构呈现,不预测后市、不暗示止盈止损。
- 每条规则只能引用自身的判定值,禁止跨规则套用
- 不做超出规则范围的推断性判断
📋 Step 4 规则分析:✅ status=[status] / headline=[固定枚举文本] / flags=[flag列表] / 结构特征=[3条]核心原则(禁止行为):
- 禁止自由生成 headline(必须取固定枚举)
- 禁止输出任何买卖/调仓/操作指令
- 禁止预测后市或暗示止盈止损
- 禁止做收益承诺
- status_hint 不在枚举内 → 降级为
insufficient_data
Step 5:合成输出
操作(依赖 Step 2-Step 4): 1. 将 Step 3 计算结果 + Step 4 规则分析填入体检卡输出模板 2. 填充合规字段(固定值) 3. 输出完整体检卡作为 Agent 响应消息 内嵌规则:- 产出为 Agent 响应消息,包含体检卡各字段(资产全景、集中度、盈亏结构、体检结论、合规声明)
- 输出规范:
- 固定输出合规边界文案:「本内容仅作信息参考与研究性观察,不构成投资建议或交易指令」,
ai_generated恒true disclaimer必须含「AI 生成」「过往业绩不预示未来」「市场有风险」三要素verdict.headline只能取 Step 4 固定枚举,不得自由生成- 覆盖范围固定为"港股 + 美股证券及对应现金",不含 A 股、公募基金、其他市场资产
no_holdings(无港美股持仓)的股票转入卡片已在 Step 2 短路输出并终止,通常不进入本 Step;仅脚本因「分母为 0」返回 no_holdings 时,于 headline 之后补输出股票转入卡片(格式见 Step 2)- 合规护栏内置:输出中合规字段按以下规则填充:
- 「本内容仅作信息参考与研究性观察,不构成投资建议或交易指令」
disclaimer含三要素(AI 生成 + 过往业绩不预示未来 + 市场有风险)suitability_note引导用户结合风险承受能力自行判断- 本 Skill 输出属针对特定客户真实持仓的个性化分析,上线前须经合规部门审核业务定性,确认投资咨询资质覆盖与持牌人员审核留痕
- 所有数据在内存中组装完成即输出,不写临时文件
📋 Step 5 合成输出:✅ 体检卡已输出 / skill=iark-portfolio-checkup-min / status=[status] / 合规边界文案已输出核心原则(禁止行为 — 反面写法清单):
- 禁止输出买卖/加仓/减仓/清仓/调仓/分散等任何方向的操作指令
- 禁止作收益或价格承诺
- 禁止在
verdict.headline中使用固定枚举之外的文本 - 禁止集中度、盈亏给出"该怎么办"的建议(只给"是什么/超没超阈值")
- 禁止数据缺失时估算或编造(如实降级
insufficient_data/ 标注缺失) - 禁止省略
disclaimer或suitability_note - 禁止面向用户文案出现贬低同业或比较式营销话术
- 禁止将中间数据写入磁盘文件
- 输出组装失败 → 降级为纯文本输出,标注
format_degraded - 合规字段缺失 → 不输出,修复后重试
🚫 措辞红线(写死,不可绕过)
1. 禁止输出"低风险":涉及产品/资产风险等级描述时,严禁使用"低风险"字样,可使用"风险相对较低"替代。 2. 禁止输出投资类"建议"话术:面向用户的结论/结构特征措辞中严禁出现"建议"字样(如"建议分散/建议调仓"),须使用"可以考虑"替代。合规声明中的"不构成投资建议"等否定性法律措辞保留原样。 3. 禁止输出"压舱石缓冲"及类似表述:当资产较为集中时,严禁使用"压舱石""压舱石缓冲""压舱"等字眼,须使用"分散持仓风险"替代。 4. 开户/激活/转股卡片为账户操作型引导:「极速开户」「激活账户」「股票转入」卡片属开户、激活、转股入金前置操作,非产品推荐或收益暗示,不受第 2 条「投资类建议」话术禁令约束;卡片措辞须中性操作语(「先完成开户」「激活账户」「转入股票」),不得附带收益/产品指向。 ---追问引导(回答完成后固定追加)
在 disclaimer 之后追加追问区块。动态生成 2 个与本次分析相关的追问问题。 ⚠️ 中止时不输出追问(写死):若流程因任一卡片分支提前中止——证券账户未开通(极速开户)/ 账户休眠(激活账户)/ 账户状态不可用 / 无港美股持仓(股票转入)等——严禁输出本追问区块。追问仅在流程正常完成(到达 Step 5 / 全量分析输出)时输出。 约束:每题 ≤15 字 | 方向:某维度深入分析、风险指标跟踪、集中度拆解、市场分布细节、盈亏结构追踪等 | 禁止操作指令词(买入/卖出/加仓/减仓/建仓/上车/下车) 输出格式(单行,不得有实际换行符):猜你想继续问<br/><br/><span data-function-type="0" data-text="[问题1]">[问题1]</span><br/><br/><span data-function-type="0" data-text="[问题2]">[问题2]</span>示例:
猜你想继续问<br/><br/><span data-function-type="0" data-text="我的港股集中度如何?">我的港股集中度如何?</span><br/><br/><span data-function-type="0" data-text="盈亏结构有什么特征?">盈亏结构有什么特征?</span>