| name | fund-analysis |
| description | 当用户询问"分析基金"、"基金分析"、"评估基金"、"基金投资建议"、"选基金"、"推荐基金"、"fund analysis",或提到"我的持仓"、"添加持仓"、"更新持仓"、"查看持仓"、"持仓列表"、"帮我记录基金"、"分析我的所有基金"、"帮我推荐基金"、"基金推荐"时使用此技能。通过多维度分析(技术面、基本面、舆情)为用户提供专业的基金投资建议,支持持仓列表管理(记忆、增删改查)、批量持仓组合分析和基于持仓分析的智能基金推荐。 |
| version | 1.2.1 |
基金分析技能
通过多维度深度分析,为用户提供专业的基金投资建议和详细的分析报告。
概述
此技能通过以下方式自动创建全面的基金分析报告:
- 从蛋卷基金API获取基金基础信息、净值历史、持仓数据等
- 执行技术面分析(MA均线、多空排列、趋势判断)
- 分析持仓结构和基金经理资历
- 评估历史业绩和风险指标
- 分析舆情和市场情绪
- 生成精确的买卖点位建议
- 提供操作检查清单
- 生成结构化的Markdown分析报告
核心功能:
- ✅ 支持所有类型基金(股票型、债券型、混合型、指数型等)
- ✅ 多维度综合分析(技术面、基本面、舆情)
- ✅ 精确的买卖点位建议
- ✅ 完整的操作检查清单
- ✅ 专业的Markdown格式报告
- ✅ 持仓列表管理:记录、新增、更新、删除用户持仓(持久化本地存储)
- ✅ 批量持仓分析:一键分析用户所有持仓基金
- ✅ 智能基金推荐:基于多维度评分为用户推荐优质基金
持仓管理
📌 持仓管理概述
用户可以维护一份私人持仓列表,技能会将其持久化保存到本地 JSON 文件(data/portfolio.json),跨会话记忆。支持以下操作:
| 操作 | 自然语言示例 | 对应命令 |
|---|
| 查看持仓 | "查看我的持仓" / "我持有哪些基金" | portfolio |
| 新增持仓 | "添加持仓 008975 易方达蓝筹精选混合" | add 008975 [名称] |
| 更新持仓 | "更新持仓 008975,持有10万份,成本净值1.5" | add 008975 ...(覆盖更新) |
| 删除持仓 | "删除持仓 008975" / "我卖掉了008975" | remove 008975 |
| 分析全部 | "分析我所有持仓" / "帮我看看持仓情况" | portfolio-analyze |
🔄 持仓管理交互流程
Step 1 — 理解用户意图
当用户提到持仓相关内容时,识别意图:
- 含"我持有"、"我买了"、"添加持仓"、"记录一下" → 新增/更新持仓
- 含"我卖了"、"已清仓"、"删除持仓"、"去掉" → 删除持仓
- 含"我的持仓"、"持仓列表"、"查看" → 展示持仓列表
- 含"分析我所有"、"持仓分析"、"组合分析" → 批量分析
Step 2 — 提取持仓信息
从用户输入中提取:
fund_code:6位数字(必填)
fund_name:基金名称(可选)
shares:持有份额(可选,如"10万份" → 100000)
cost_nav:买入净值/成本净值(可选)
cost_amount:买入金额(可选,如"投了5万" → 50000)
note:备注(可选)
Step 3 — 执行持仓操作
根据意图运行对应方法:
from scripts.fund_analyzer import FundAnalyzer
analyzer = FundAnalyzer()
result = analyzer.portfolio_add(
fund_code="008975",
fund_name="易方达蓝筹精选混合",
shares=100000,
cost_nav=1.5000,
cost_amount=50000,
note="长期持有"
)
print(result)
print(analyzer.portfolio_list())
print(analyzer.portfolio_remove("008975"))
report = analyzer.portfolio_analyze_all()
print(report)
Step 4 — 展示结果
将返回的 Markdown 内容直接展示给用户。
💡 典型对话示例
示例1:用户首次告知持仓
用户: 我持有易方达蓝筹精选混合(008975)和中欧医疗健康(003095),帮我记录一下
操作:
analyzer.portfolio_add("008975", fund_name="易方达蓝筹精选混合")
analyzer.portfolio_add("003095", fund_name="中欧医疗健康")
响应: 展示更新后的持仓列表
示例2:用户更新持仓细节
用户: 更新一下,008975我买了10万份,成本净值是1.52,总共投了15.2万
操作:
analyzer.portfolio_add("008975", shares=100000, cost_nav=1.52, cost_amount=152000)
响应: 展示更新后的持仓条目和完整列表
示例3:用户卖出基金
用户: 我已经卖掉了003095
操作:
analyzer.portfolio_remove("003095")
响应: 确认删除,展示剩余持仓列表
示例4:分析全部持仓
用户: 帮我分析一下我所有持仓基金
操作:
report = analyzer.portfolio_analyze_all()
响应: 展示组合分析报告,报告结构:
1. 持仓总结摘要表(操作建议、涨跌幅、净值、持仓收益、收益率、近1年收益、核心结论一览)
2. 目录(可点击跳转到每只基金的详细章节)
3. 持仓列表(成本等基础信息)
4. 各基金详细分析报告(含 HTML 锚点,支持目录跳转)
📁 持仓数据存储
- 文件位置:
data/portfolio.json
- 格式: JSON 数组,每条记录包含
fund_code、fund_name、shares、cost_nav、cost_amount、note、current_nav、current_profit、current_return_rate、added_at、updated_at
- 持久化: 每次增删改操作后自动保存,跨会话保留
- 示例:
[
{
"fund_code": "008975",
"fund_name": "易方达蓝筹精选混合",
"shares": 100000.0,
"cost_nav": 1.52,
"cost_amount": 152000.0,
"note": "长期持有",
"current_nav": 1.4850,
"current_profit": -3500.00,
"current_return_rate": -2.30,
"added_at": "2026-03-07 15:00:00",
"updated_at": "2026-03-07 16:30:00"
}
]
使用方法
基本使用
当用户询问基金分析相关问题时,使用以下命令:
cd /Users/weijiahao03/AI/AI_workshop/.catpaw/skills/skills-market/fund-analysis
python scripts/fund_analyzer.py <基金代码>
示例:
python scripts/fund_analyzer.py 008975
用户交互流程
-
收集基金代码
- 询问用户要分析的基金代码(6位数字)
- 示例: 008975(易方达蓝筹精选混合)
-
执行分析
-
呈现报告
- 将生成的Markdown报告展示给用户
- 保存报告到文件
-
保存位置
- 报保存在
examples/ 目录
- 文件名格式:
fund_analysis_{基金代码}_{时间戳}.md
分析维度说明
1. 技术面分析
分析内容:
- 移动平均线: MA5、MA10、MA20、MA60
- 多空排列: 判断多头/空头/无明确形态
- 技术信号: 突破、破位、超买、超卖等信号
- 趋势判断: 上升、下降、震荡
- 近期收益率: 30天、60天、90天涨跌幅
解读要点:
- 多头排列 + 上升趋势 = 强烈买入信号
- 空头排列 + 下降趋势 = 卖出信号
- 超买信号 = 注意风险,不宜追高
- 超卖信号 = 可能是买入机会
2. 持仓分析
分析内容:
- 前十大重仓股: 展示基金主要持仓
- 持仓集中度: 前10大持仓占比
- 行业分布: 主要投资行业
- 持仓风格: 价值型/成长型/平衡型
解读要点:
- 持仓集中度 > 60% = 集中度高,波动大
- 持仓集中度 < 40% = 分散投资,风险较低
- 成长型 = 关注成长股,波动较大
- 价值型 = 关注低估值股票,相对稳健
3. 基金经理分析
分析内容:
- 从业年限: 投资经验
- 管理该基金年限: 对该基金的了解程度
- 管理基金数量: 投资者可以评估基金经理的精力分配
- 历史业绩: 平均收益率和最大回撤
- 资深程度: 是否为资深基金经理
解读要点:
- 从业年限 > 5年 = 经验丰富
- 管理该基金 > 3年 = 对基金了解深入
- 年化收益 > 10% = 表现优秀
- 最大回撤 < 20% = 风险控制较好
4. 业绩分析
分析内容:
- 各时间段收益率: 1月、3月、6月、1年、3年、5年
- 年化收益率: 长期平均收益
- 最大回撤: 历史最大亏损
- 同类排名: 相对同类基金的表现
- 超额收益: 相对基准的收益
解读要点:
- 1年收益 > 10% = 短期表现优秀
- 3年收益 > 15% = 中期表现优秀
- 5年收益 > 10% = 长期表现优秀
- 最大回撤 < 30% = 风险可控
- 同类排名 > 70% = 表现优异
5. 公告信息(原舆情分析简化)
说明:
- 由于公告标题关键词匹配难以准确反映市场情绪,已移除情绪评分
- 仅展示最近5条重要公告,供投资者参考
- 重要公告会标注类型(分红、限购、经理变更等)
展示内容:
- 最新公告: 最近5条公告标题和日期
- 重要标记: 💰 分红、🚫 限购、👤 经理变更、⚠️ 清盘风险等
6. 投资建议
分析内容:
- 核心结论: 一句话总结投资建议
- 操作建议: 买入/持有/卖出/观望
- 理想买点: 建议的买入价格区间
- 次要买点: 补仓机会
- 止盈位: 建议止盈价格
- 止损位: 建议止损价格
- 操作检查清单: 投资前的检查项目
解读要点:
- 买入: 综合得分高,建议积极配置
- 持有: 表现平稳,继续持有观察
- 卖出: 表现不佳,建议减仓或退出
- 观望: 趋势不明,等待明确信号
操作检查清单
在使用本技能进行基金分析前,请确保:
常见问题处理
问题1: 基金代码不存在
症状: 提示"基金代码不存在或格式错误"
解决方案:
- 检查基金代码是否为6位数字
- 确认基金代码是否正确
- 提示用户在蛋卷基金或雪球网查询正确代码
问题2: 数据获取失败
症状: 提示"数据获取失败"或"API请求失败"
解决方案:
- 检查网络连接
- 确认pysnowball库路径配置正确
- 尝试稍后重试
- 查看日志文件获取详细错误信息
问题3: 分析速度慢
症状: 分析时间超过60秒
解决方案:
- 检查网络速度
- 查看日志确定哪个步骤慢
- 可能是数据源响应慢,建议稍后重试
问题4: 部分数据缺失
症状: 报告中某些模块显示"数据暂不可用"
解决方案:
- 这是正常现象,某些基金可能不提供所有数据
- 不影响其他模块的分析
- 在报告中明确标注了数据不可用
输出格式
分析报告使用Markdown格式,包含以下章节:
- 投资建议摘要 - 快速了解核心建议
- 基金基本信息 - 基金概况
- 实时行情 - 当前净值和涨跌幅
- 技术面分析 - MA均线、趋势、信号
- 持仓分析 - 重仓股、行业分布
- 基金经理分析 - 经验、业绩
- 业绩分析 - 各时间段收益率
- 舆情分析 - 新闻、情绪
- 详细投资建议 - 买卖点位、检查清单
- 免责声明 - 风险提示
数据来源
单只基金分析数据源
- 蛋卷基金API (通过pysnowball库)
- 基金基础信息 (名称、类型、成立日期等)
- 净值历史 (365天历史净值)
- 持仓数据 (前十大持仓、行业分布等)
- 基金经理信息 (名称、年限、资历等)
- 业绩数据 (各时间段收益、最大回撤等)
推荐基金数据源
推荐基金列表来自以下来源(优先级顺序):
-
用户持仓列表 (优先)
- 从本地
data/portfolio.json 读取
- 包含用户已经添加的基金代码
- 用途:推荐用户已有或相似风格的基金
-
默认热门基金集合 (降级方案)
- 包含10只代表性基金,涵盖不同风格:
- 低波指数型 (007751)
- 价值风格 (008975)
- 行业主题 (003095, 110022)
- 平衡配置 (017043, 470018)
- 成长风格 (519674, 000968)
- 趋势跟踪 (420018, 163402)
- 用途:演示、基准对比
📌 数据来源说明
| 数据类型 | 来源 | 覆盖范围 | 更新频率 |
|---|
| 基金基础信息 | 蛋卷API | 全市场基金 | 实时 |
| 历史净值 | 蛋卷API | 最近365天 | 每日 |
| 持仓数据 | 蛋卷API | 最近1-3个月 | 定期 |
| 经理信息 | 蛋卷API | 实时 | 实时 |
| 业绩数据 | 蛋卷API | 全历史 | 每日 |
| 舆情数据 | 东方财富 | 最近15条公告 | 实时 |
| 推荐基金列表 | 用户持仓 + 默认集合 | 10-N只 | 按需 |
技术架构
核心模块
-
DataFetcher - 数据获取模块
-
TechnicalAnalyzer - 技术面分析
-
HoldingAnalyzer - 持仓分析
-
ManagerAnalyzer - 基金经理分析
-
PerformanceAnalyzer - 业绩分析
-
SentimentAnalyzer - 舆情分析
-
InvestmentAdvisor - 投资建议
-
ReportGenerator - 报告生成
性能优化
- 并发数据获取: 使用ThreadPoolExecutor并发获取6个数据源
- 数据缓存: 实时数据缓存5分钟,历史数据缓存24小时
- 错误隔离: 单个数据获取失败不影响其他模块
注意事项
-
数据时效性:
- 净值数据可能有1天延迟
- 持仓数据可能有1-3个月延迟
- 建议定期更新分析
-
分析局限性:
- 历史业绩不代表未来
- 技术分析仅供参考
- 市场环境变化可能影响判断
-
投资风险:
- 基金投资有风险
- 建议分散投资
- 根据风险承受能力选择基金
示例报告
完整的分析报告示例请查看 examples/ 目录。
智能基金推荐 ✨ (v1.2.0+)
📌 推荐功能概述
智能推荐系统基于用户持仓分析和多维度评分算法,为用户推荐优质基金。系统通过以下方式帮助用户优化投资组合:
- 持仓风格分析 - 自动分析用户持仓的基金类型分布
- 缺失补充 - 推荐不足的基金类型来平衡配置
- 多维度评分 - 综合考虑技术面、基本面和舆情三个维度
- 排重机制 - 自动排除已持仓的基金,避免重复购买
🎯 推荐维度
技术面评分 (50% 权重)
- 趋势权重 40%:上升=100分,震荡=70分,下降=40分
- 信号权重 40%:买入信号数量 × 10(上限100)
- 偏离度权重 20%:超买/超卖信号判断
基本面评分 (50% 权重)
- 收益权重 50%:近3年收益率(相对排名)
- 经理权重 30%:资深经理=90分,中等=70分,新手=50分
- 持仓权重 20%:持仓集中度 < 40%=100分,40-60%=70分,>60%=40分
公告信息(仅展示,不参与评分)
💻 使用方法
基本推荐命令
python scripts/fund_analyzer.py recommend --risk 中 --period long --top 10
python scripts/fund_analyzer.py recommend --risk 高 --period short --top 5
python scripts/fund_analyzer.py recommend --risk 低
python scripts/fund_analyzer.py recommend --period long
参数说明
| 参数 | 可选值 | 说明 |
|---|
--risk | 低、中、高 | 风险偏好,不指定表示不筛选 |
--period | short、medium、long | 投资期限(短期<1年、中期1-3年、长期>3年) |
--top | 数字,默认10 | 推荐基金数量 |
风险等级含义
| 等级 | 近1年收益 | 最大回撤 | 波动率 | 适合投资者 |
|---|
| 低 | 5-8% | < 10% | < 5% | 保守型,风险承受能力弱 |
| 中 | 8-15% | 10-20% | 5-10% | 平衡型,风险承受能力中等 |
| 高 | > 15% | 20-30% | > 10% | 激进型,风险承受能力强 |
📊 推荐报告格式
推荐报告包含以下信息:
# 推荐基金列表(中风险,长期投资)
## 📊 推荐摘要
- 扫描基金数量: 500+
- 推荐基金数: 10
- 推荐时间: 2026-03-09 22:52:18
- 平均得分: 65.3/100
## 🏆 推荐基金
### #1 基金名称 (基金代码)
**综合评分**: ⭐⭐⭐⭐ 85.0/100
**维度评分**:
- 📈 技术面: 80/100 (上升趋势)
- 💰 基本面: 90/100 (3年收益 +50%,超越同类 85%)
- 📢 舆情: 85/100 (正面)
**推荐理由**: 基本面扎实,技术面强势,长期表现优异
**关键指标**:
- 近1年收益: +18.5%
- 最大回撤: -12.3%
- 基金经理: 张三(从业15年)
... (更多推荐基金)
## 📌 使用建议
- 建议定期更新分析,市场环境可能变化
- 根据个人风险承受能力调整选择
- 优先考虑排名前三的基金
- 结合自身投资目标和时间框架综合判断
## ⚠️ 免责声明
本推荐仅供参考,不构成投资建议。基金投资有风险,过往业绩不代表未来表现。
请根据自身风险承受能力进行投资决策。
🔄 推荐工作流
Step 1 — 持仓读取与分析
系统自动从 data/portfolio.json 读取用户持仓,分析如下:
- 识别已持有的基金代码
- 分类基金类型(股票型、混合型、债券型、指数型)
- 计算各类型基金的占比权重
Step 2 — 理解用户需求
识别用户的推荐意图:
- "帮我推荐基金" → 使用默认参数(所有风险等级、任意投资期限、Top 10)
- "推荐适合长期的基金" →
period=long
- "推荐低风险基金" →
risk=低
- "推荐5只高收益基金" →
risk=高, top=5
Step 3 — 提取推荐参数
从用户输入中识别:
risk_level:风险等级 (低/中/高)
investment_period:投资期限 (short/medium/long)
top_n:推荐数量(默认10)
Step 4 — 智能推荐流程
系统执行以下推荐策略(优先级顺序):
- 策略1 - 从蛋卷API获取热门基金 (如实现)
- 策略2 - 基于持仓风格匹配推荐 ⭐
- 分析用户持仓的风格分布
- 推荐权重最低的风格基金
- 自动排除已持仓基金
- 策略3 - 使用默认热门基金库
Step 5 — 多维度评分
对候选基金进行评分:
- 技术面 (40%):趋势、信号、偏离度
- 基本面 (40%):收益率、基金经理、持仓集中度
- 舆情 (20%):市场情绪评分
Step 6 — 风险和期限筛选
根据用户偏好筛选:
- 按风险等级分类
- 按投资期限匹配
- 返回Top N推荐
Step 7 — 展示结果
将推荐报告直接展示给用户,并保存到本地文件 (reports/YYYYMMDD/recommend_*.md)
💡 典型对话示例
示例1:用户要求基于持仓推荐补充基金
用户: 帮我分析一下持仓,然后推荐一些适合长期投资的基金来补充
背景: 用户持仓中债券型占33%,混合型占33%,股票型仅11%
操作:
1. 系统读取 data/portfolio.json 中的9只持仓基金
2. 分析风格分布:混合型、债券型各3只,股票型1只,指数型2只
3. 识别不足:股票型权重过低
4. python scripts/fund_analyzer.py recommend --risk 中 --period long --top 10
响应: 推荐列表优先推荐股票型基金来补充不足,所有推荐都排除了9只持仓基金
示例2:用户要求高风险基金推荐
用户: 我比较激进,想要一些高收益的基金,推荐5只就可以
操作: python scripts/fund_analyzer.py recommend --risk 高 --top 5
响应:
1. 系统分析用户持仓
2. 推荐5只高风险基金(均不在持仓中)
3. 每只基金显示综合评分、维度评分和推荐理由
例: "基金A - 85.0/100 分 (技术面80分,基本面90分,舆情85分)"
示例3:用户保守型投资者
用户: 我风险承受能力比较弱,给我推荐一些稳定的基金
操作: python scripts/fund_analyzer.py recommend --risk 低
响应:
1. 系统自动读取并排除持仓
2. 推荐低风险、稳定收益的基金
3. 优先推荐缺失的风格类型
4. 保存报告到 reports/YYYYMMDD/recommend_低_*.md
示例4:用户查看持仓和推荐
用户: 分析我所有持仓基金,然后帮我推荐一些补充基金
操作:
1. python scripts/fund_analyzer.py portfolio-analyze (分析所有持仓)
2. python scripts/fund_analyzer.py recommend --risk 中 (基于持仓推荐)
响应:
1. 展示持仓组合分析报告
2. 展示推荐基金列表(自动排除了已持仓基金)
3. 帮助用户优化投资组合结构
🛠️ 推荐引擎架构
核心模块
-
FundRecommender - 主推荐器
- 读取用户持仓 (data/portfolio.json)
- 分析持仓的风格分布
- 执行智能推荐策略
- 并发分析候选基金
- 处理推荐逻辑
-
FundScorer - 基金评分器
- 计算技术面、基本面、舆情三个维度的评分
- 加权合成综合评分(0-100)
- 判断基金风险等级
-
FundRanker - 基金排序器
- 按综合评分排序
- 按风险等级筛选
- 按投资期限匹配
- 返回Top N推荐基金
-
RecommendationCardGenerator - 推荐卡片生成
- 生成格式化的推荐卡片
- 展示维度评分和推荐理由
- 提取关键指标
-
RecommendationReportGenerator - 推荐报告生成
- 生成完整的推荐报告
- 包含摘要、推荐列表、使用建议和免责声明
- 自动保存到 reports/YYYYMMDD/recommend_*.md
✅ 推荐质量保证
持仓排重机制
系统实现多层次排重确保不推荐已持仓基金:
- 第1层:读取持仓代码集合
- 第2层:风格匹配时过滤持仓
- 第3层:默认基金库返回前再过滤
- 结果:推荐列表100%不包含持仓基金
属性基础测试
系统使用属性基础测试验证以下通用正确性属性:
- 评分边界性 - 所有评分严格在 0-100 之间
- 排序幂等性 - 重复排序结果一致
- 最优保留 - 排序后评分最高的基金排在第一位
- 排重完整性 - 所有推荐都不在持仓中
单元测试
- 17+ 个单元测试覆盖所有核心功能
- 测试评分算法、排序逻辑、报告生成
- 测试持仓风格分析和排重机制
- 全部测试通过,零失败
📁 推荐报告存储
- 文件位置:
reports/YYYYMMDD/recommend_{风险等级}_{时间戳}.md
- 格式: Markdown
- 自动保存: 每次推荐后自动保存
- 跨会话保留: 报告持久化存储
- 示例:
reports/20260309/recommend_中_20260309_233801.md
🚀 后续升级规划 (方案 C)
未来可升级为机器学习推荐 (方案 C):
- 收集用户选择的基金和后续收益数据
- 训练机器学习模型
- 实现个性化推荐
- 预测用户持仓的未来表现
更新日志
v1.3.0 (2026-03-14)
- 📋 持仓组合报告新增"总结摘要"和"目录"
- 🗂 报告顶部自动生成持仓总结表(操作建议、日涨跌幅、当前净值、近1年收益、核心结论)
- 📊 操作分布统计(买入/持有/卖出各几只,一眼掌握组合状态)
- 📑 自动生成带锚点的目录,每条目录项显示操作建议和涨跌幅,点击可跳转对应基金报告
- 🔗 各基金报告标题前注入 HTML 锚点,实现文档内部精准定位
- 🔍 基于正则从报告正文提取关键元数据,无需修改分析流程
v1.2.1 (2026-03-09)
- 🎯 完善智能推荐基金功能
- ✅ 实现基于用户持仓的智能推荐
- 🔄 自动分析持仓风格分布,推荐缺失类型基金
- 🚫 多层次排重机制,确保不推荐已持仓基金
- 📊 完整的持仓风格分析和权重计算
- 🧪 新增持仓排重和风格匹配的单元测试
- 📖 更新 SKILL.md 和 README.md 文档
- 🏗️ 预留蛋卷API实时热门基金接口
v1.2.0 (2026-03-09)
- ✨ 新增智能推荐基金功能(基础版)
- 🎯 多维度综合评分(技术面 40% + 基本面 40% + 舆情 20%)
- 🔍 支持按风险等级和投资期限筛选
- 📊 生成详细的推荐报告和推荐卡片
- ✅ 17 个单元测试 + 3 个属性基础测试,全部通过
- 🏗️ 预留方案 C (机器学习推荐) 的升级接口
- 📁 推荐报告自动按日期分类保存
v1.1.0 (2026-03-07)
- 新增持仓列表管理功能(增删改查 + JSON 持久化)
- 新增批量持仓组合分析(
portfolio_analyze_all)
- SKILL.md 加入持仓管理完整交互流程和对话示例
- description 新增持仓相关触发词
v1.0.0 (2026-03-07)
- 初始版本发布
- 实现多维度基金分析功能
- 支持所有类型基金
- 生成Markdown格式报告