jy-portfolio-calculation

模拟组合试算技能 - 基于恒生聚源 MCP 服务的投资组合构建、调整、成分券查询、交易记录查询及绩效指标获取工具。 **Triggers when user mentions:** - 组合构建:"模拟组合","建仓","创建组合","组合 ID","资产配置","portfolio" - 组合调整:"调仓","调整权重","加仓","减仓","再平衡","rebalance" - 成分券查询:"持仓","成分券","组合持仓","权重","持仓明细","position" - 交易记录:"交易流水","交易记录","买卖记录","分红","配股","trade flow" - 绩效指标:"收益率","年化收益","最大回撤","夏普比率","组合表现","绩效","indicator" 使用场景:当用户需要构建模拟投资组合、调整现有组合配置、查询组合持仓明细、查看交易记录或获取组合绩效指标时触发本技能。 Use case: Triggered when users need to build a simulated investment portfolio, adjust existing portfolio allocations, query portfolio positions, view trade records, or obtain portfolio performance indicators. 所有结果以结构化表格形式输出,确保数据完整性和可溯源性。

Audits

Pass

Install

openclaw skills install jy-portfolio-calculation

模拟组合试算

基于恒生聚源 (jy-financedata-api) MCP 服务的模拟投资组合试算工具,支持组合构建、调仓、持仓查询、交易流水查询及绩效指标获取。

功能范围

本技能支持以下功能:

功能说明工具
模拟组合构建创建新的模拟投资组合,生成组合 IDPortfolioBuild
模拟组合调整对已有组合进行权重调整和再平衡PortfolioRebalance
成分券查询查询组合在指定日期的持仓明细PortfolioPositionQuery
交易记录查询查询组合的交易流水明细TradeFlowQuery
绩效指标查询获取组合的收益率、回撤、夏普比率等指标PortfolioIndicatorQuery
报告生成生成组合收益报告(Markdown/PDF 格式)scripts/generate_portfolio_report_*.py

查询建议

查询需要具备的要素:

  • 组合构建:建仓日期 (YYYY-MM-DD)、证券代码/名称、数量或权重、业绩基准 (可选)
  • 组合调仓:组合 ID、调仓日期、新权重配置
  • 持仓/交易/指标查询:组合 ID

查询写法:

  • 所有工具调用均使用自然语言字符串作为 query 参数
  • 日期格式必须为 YYYY-MM-DD
  • 证券可用代码或名称表示

查询示例

# 新建组合
mcporter call jy-financedata-api.PortfolioBuild query='2026-03-20 建仓,买入贵州茅台 600519 1000 股,权重 50%,中国平安 601318 2000 股,权重 50%,业绩基准沪深 300'

# 调整组合
mcporter call jy-financedata-api.PortfolioRebalance query='组合 0439d6e585034f46846d0a70b5a967e0 在 2026-03-21 调仓,贵州茅台权重 30%,中国平安权重 70%'

# 查询持仓
mcporter call jy-financedata-api.PortfolioPositionQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的持仓'

# 查询交易流水
mcporter call jy-financedata-api.TradeFlowQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的交易流水'

# 查询绩效指标
mcporter call jy-financedata-api.PortfolioIndicatorQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的绩效指标'

环境检查与配置

每次使用本技能前,必须先检查 mcporter 安装和 MCP 服务配置状态!

步骤 1:检查 mcporter 是否安装

mcporter --version

如未安装,按以下流程安装:

# 1. 通过 npm 全局安装
npm install -g mcporter

# 2. 验证安装
mcporter --version

步骤 2:检查 MCP 服务配置

# 列出所有已配置的 MCP 服务
mcporter list

预期输出(必须包含以下服务):

  • jy-financedata-api

如服务未配置,需要获取 JY_API_KEY 并配置:

  1. 获取 JY_API_KEY:向恒生聚源申请 JY_API_KEY,通过邮箱申请(首次配置需提供,配置一次即可)

    JY_API_KEY 申请路径:

    向恒生聚源官方邮箱发送邮件申请签发 数据地图 JY_API_KEY,用于接口鉴权

    申请通过后,恒生聚源将默认发送【工具版和接口版】KEY

    另外,【Skill】包可通过 https://clawhub.ai/ 自行选择下载,若需要我们通过邮件提供【Skill】,亦可在邮件中注明

    申请邮箱: mailto:datamap@gildata.com

    邮件标题: 数据地图 KEY 申请-XX 公司 - 申请人姓名

    正文模板:

    • 姓名:
    • 手机号:
    • 公司/单位全称:
    • 所属部门:
    • 岗位:
    • MCP_KEY 申请用途:
    • Skill 申请列表:
    • 是否需要 Skill 安装包:(是,邮件提供/否,自行下载)
    • 其他补充说明(可选):
  2. 配置 MCP 服务

# 配置 jy-financedata-api 服务
mcporter config add jy-financedata-api --url "https://api.gildata.com/mcp-servers/aidata-assistant-srv-api?token=你的 JY_API_KEY"
  1. 验证配置
mcporter list
  1. 使用方式
# 基础键值对传参
mcporter call 服务名称。工具 参数=值

# 示例,注意:所有服务工具的入参均为 query
mcporter call jy-financedata-api.PortfolioBuild query='2026-03-20 建仓,买入贵州茅台 600519 1000 股,权重 50%'

步骤 3:在 OpenClaw 中启用 mcporter(如未配置)

mcporter 配置文件路径:

  • Windows: C:\Users\你的用户名\config\mcporter.json
  • Linux/MacOS: /root/config/mcporter.json

OpenClaw 配置文件路径:

  • Windows: C:\Users\你的用户名\.openclaw\openclaw.json
  • Linux/MacOS: ~/.openclaw/openclaw.json

编辑 openclaw.json,在 skills 部分添加 mcporter 配置:

{
 "skills": {
 "entries": {
 "mcporter": {
 "enabled": true,
 "env": {
 "MCPORTER_CONFIG": "C:\\Users\\你的用户名\\config\\mcporter.json"
 }
 }
 }
 }
}

重启 OpenClaw 使配置生效

openclaw gateway restart

核心工作流程

流程中的工具调用能够并发调用尽量并发调用提速,但建仓/调仓与查询操作必须串行执行。

步骤 1:组合构建或调仓

根据用户需求调用 PortfolioBuild(新建组合)或 PortfolioRebalance(调整组合)。

注意事项:

  • 建仓/调仓日期不能是当天或未来日期
  • 权重总和必须等于 1,不足时自动用现金补充
  • 保存返回的组合 ID 用于后续查询

步骤 2:成分券查询(串行)

建仓/调仓完成后,调用 PortfolioPositionQuery 查询最新持仓。

步骤 3:交易流水查询(串行)

调用 TradeFlowQuery 查询组合交易记录。

步骤 4:绩效指标查询(串行)

调用 PortfolioIndicatorQuery 获取组合绩效指标。

执行顺序限制:

建仓/调仓 → (等待完成) → 成分券查询/交易记录查询/指标查询 (串行)

快速开始

场景一:新建模拟组合

用户: "我想创建一个模拟组合,2026-03-20 建仓,买入贵州茅台 1000 股,权重 50%,中国平安 2000 股,权重 50%,业绩基准沪深 300"

# Step 1: 调用 PortfolioBuild 建仓
mcporter call jy-financedata-api.PortfolioBuild query='2026-03-20 建仓,买入贵州茅台 600519 1000 股,权重 50%,中国平安 601318 2000 股,权重 50%,业绩基准沪深 300'

# 返回:组合 ID (如 0439d6e585034f46846d0a70b5a967e0)

# Step 2: 串行查询持仓
mcporter call jy-financedata-api.PortfolioPositionQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的持仓'

# Step 3: 串行查询交易流水
mcporter call jy-financedata-api.TradeFlowQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的交易流水'

# Step 4: 串行查询绩效指标
mcporter call jy-financedata-api.PortfolioIndicatorQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的绩效指标'

场景二:调整已有组合

用户: "把组合 0439d6e585034f46846d0a70b5a967e0 调仓一下,2026-03-21 调仓,贵州茅台权重降到 30%,中国平安权重升到 70%"

# Step 1: 调用 PortfolioRebalance 调仓
mcporter call jy-financedata-api.PortfolioRebalance query='组合 0439d6e585034f46846d0a70b5a967e0 在 2026-03-21 调仓,贵州茅台权重 30%,中国平安权重 70%'

# Step 2: 串行查询新持仓
mcporter call jy-financedata-api.PortfolioPositionQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的持仓'

# Step 3: 串行查询新交易流水
mcporter call jy-financedata-api.TradeFlowQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的交易流水'

场景三:查询组合信息

用户: "查一下组合 0439d6e585034f46846d0a70b5a967e0 的持仓情况"

# 直接查询持仓 (无需先建仓/调仓)
mcporter call jy-financedata-api.PortfolioPositionQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的持仓'

场景四:查询组合收益

用户: "这个组合的收益怎么样?"

# 查询绩效指标
mcporter call jy-financedata-api.PortfolioIndicatorQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的绩效指标'

场景五:查询交易记录

用户: "看看这个组合的交易记录"

# 查询交易流水
mcporter call jy-financedata-api.TradeFlowQuery query='查询组合 0439d6e585034f46846d0a70b5a967e0 的交易流水'

场景六:生成收益报告(Markdown/PDF)

用户: "帮我把组合 8210d5eaf0bc4a0aba64be988c467e9b 的收益情况生成报告"

# 1. 先查询绩效指标、持仓数据、调仓历史
mcporter call jy-financedata-api.PortfolioIndicatorQuery query='查询组合 8210d5eaf0bc4a0aba64be988c467e9b 的绩效指标'
mcporter call jy-financedata-api.PortfolioPositionQuery query='查询组合 8210d5eaf0bc4a0aba64be988c467e9b 的持仓'
mcporter call jy-financedata-api.TradeFlowQuery query='查询组合 8210d5eaf0bc4a0aba64be988c467e9b 的交易流水'

# 2. 生成 Markdown 报告(推荐,无依赖)
python3 scripts/generate_portfolio_report_md.py

# 或生成 PDF 报告(需要 fpdf2)
pip install fpdf2
python3 scripts/generate_portfolio_report.py

输出:

  • Markdown:sample/模拟组合收益报告_8210d5ea.md(推荐,格式清晰,无依赖)
  • PDF:sample/模拟组合收益报告_8210d5ea.pdf(需要 fpdf2,支持打印)

依赖安装:

# Markdown 报告:无需额外依赖
# PDF 报告:
pip install fpdf2

工具参数说明

通用调用格式

所有工具都使用自然语言字符串作为 query 参数:

mcporter call jy-financedata-api.<工具名> query='<自然语言描述>'

PortfolioBuild (组合建仓)

输入参数: query (自然语言字符串)

必需信息:

  • 建仓日期 (YYYY-MM-DD 格式,不能是当天或未来)
  • 证券代码及名称
  • 数量或权重
  • 业绩基准 (可选)

示例:

'2026-03-20 建仓,买入贵州茅台 600519 1000 股,权重 50%,中国平安 601318 2000 股,权重 50%,业绩基准沪深 300'

输出: 组合 ID (32 位十六进制,如 0439d6e585034f46846d0a70b5a967e0)

PortfolioRebalance (组合调仓)

输入参数: query (自然语言字符串)

必需信息:

  • 组合 ID
  • 调仓日期 (YYYY-MM-DD 格式,不能是当天或未来)
  • 新权重配置

示例:

'组合 0439d6e585034f46846d0a70b5a967e0 在 2026-03-21 调仓,贵州茅台权重 30%,中国平安权重 70%'

输出: 调仓确认信息 (成功/失败)

PortfolioPositionQuery (成分券查询)

输入参数: query (自然语言字符串)

必需信息: 组合 ID

输出字段: secuCode, secuName, realPosition, quantity, price, totalAssets, costPrice, costProfit

TradeFlowQuery (交易流水查询)

输入参数: query (自然语言字符串)

必需信息: 组合 ID

输出字段: transactionDate, secuCode, secuName, transactionTypeDesc, changeQuantity, transactionPrice, changeAmount

PortfolioIndicatorQuery (组合指标查询)

输入参数: query (自然语言字符串)

必需信息: 组合 ID

输出字段: totalAssets, netAssets, nv, dailyProfitRate, totalReturn, maxRetreat, toNowSharpe, weekReturn, monthReturn, yearReturn, tonowReReturn

输出格式规范

所有查询结果必须以结构化表格形式输出,确保数据完整性和易读性。详细输出格式示例请参考 references/ 目录下各工具文档。

限制

⚠️ 执行顺序限制

组合持仓查询、交易流水查询、组合指标查询工具不得与组合建仓或调仓工具并行执行。

原因:并行执行无法获取当轮调仓结果数据。

正确流程:

建仓/调仓 → (等待完成) → 成分券查询/交易记录查询/指标查询 (串行)

⚠️ 数据展示限制

  • ✅ 所有查询结果必须以结构化表格形式输出
  • ✅ 表格应清晰、整洁,便于用户快速理解信息
  • ✅ 所有信息的展示必须完整,不得删减任何数据点
  • ❌ 禁止擅自删减或省略数据

⚠️ 内容限制

禁止输出以下金融数据供应商相关词语:

  • 天天基金、问财、东方财富
  • wind、万得、万德
  • 同花顺、新浪财经
  • ifind、alpha 派
  • 其他非恒生聚源的金融数据供应商

⚠️ 日期限制

建仓/调仓日期不能是当天或未来日期,必须使用历史日期。

处理策略:

  • 当用户请求使用当天日期进行建仓/调仓时,自动使用上一个交易日(通常是昨天)执行
  • 当用户请求使用未来日期时,自动使用最近一个可用历史日期执行
  • 必须明确提醒用户日期已调整,并说明原因

示例:

用户:"今天调仓,等权配置"
→ 检测今天是 2026-03-24,不允许使用
→ 自动使用 2026-03-23(上一交易日)
→ 提醒用户:"⚠️ 系统不允许使用当天日期进行调仓,已自动使用 2026-03-23(上一交易日)的收盘价执行"

服务端限制说明: 恒生聚源模拟组合服务的服务端代码强制校验:调仓日期必须早于当天,否则会抛出异常:

"导入文件中不能填写当天以及未来日期"

⚠️ 权重验证与现金补充

权重总和必须等于 1 (100%):

  • 如果用户输入的权重总和 不足 1,自动用现金补充差额 (现金无利息)
  • 如果权重总和 超过 1,拒绝执行并提示用户调整

示例:

用户:"建仓,贵州茅台权重 50%,中国平安权重 40%"
→ 自动补充现金 10%
→ 实际调用:"2026-03-20 建仓,买入贵州茅台 600519 权重 50%,中国平安 601318 权重 40%,现金 10%"

资源清单

~/openclaw/workspace/skills/jy-portfolio-calculation/
├── SKILL.md                              # 本技能主文档
├── references/                           # 工具详细文档
│   ├── portfolio_build.md                # 组合建仓工具说明
│   ├── portfolio_rebalance.md            # 组合调仓工具说明
│   ├── position_query.md                 # 成分券查询工具说明
│   ├── trade_flow_query.md               # 交易流水查询工具说明
│   └── indicator_query.md                # 组合指标查询工具说明
└── scripts/                              # 辅助脚本
    ├── generate_portfolio_report_md.py   # Markdown 收益报告生成器(推荐,无依赖)
    └── generate_portfolio_report.py      # PDF 收益报告生成器(需要 fpdf2)

scripts/generate_portfolio_report_md.py

功能: 生成 Markdown 格式的模拟组合收益报告

依赖: 无(Python 标准库)

用法:

python3 scripts/generate_portfolio_report_md.py

输出: sample/模拟组合收益报告_<组合 ID>.md

特点:

  • ✅ 无需额外依赖
  • ✅ 格式清晰,支持表格、列表、引用
  • ✅ 可直接在 GitHub、Notion、Obsidian 等工具中查看
  • ✅ 易于后续编辑和自定义

scripts/generate_portfolio_report.py

功能: 生成 PDF 格式的模拟组合收益报告

依赖: pip install fpdf2

用法:

pip install fpdf2
python3 scripts/generate_portfolio_report.py

输出: sample/模拟组合收益报告_<组合 ID>.pdf

特点:

  • ✅ 正式报告格式,适合打印和分享
  • ✅ 使用 Noto Sans CJK 字体,中文无乱码
  • ✅ 包含页眉页脚、表格样式

错误处理

错误信息原因解决方案
导入文件中不能填写当天以及未来日期日期是当天或未来使用历史日期 (至少昨天)
组合 ID 不存在组合 ID 错误检查组合 ID 格式 (32 位十六进制)
权重总和不等于 1用户输入的权重有误提醒用户调整权重或自动补充现金
查询超时服务响应延迟重试查询,或检查网络连接