普惠级金融终端 AI 助手 (fin-terminal)
用途
面向中小投资机构和个人投资者的轻量化金融终端。输入股票代码/公司名称,一键生成专业级投研分析报告(HTML),含:
- 📊 数据聚合 — A股/港股/美股实时行情 + 核心财务数据 + 近期重大新闻
- 📈 财务指标速算 — ROE / ROA / PE / PB / PEG / 毛利率 / 净利率 / 资产负债率 等 12+ 核心指标一键计算
- 🏢 可比公司筛选 — 同行业/相似体量公司自动匹配,横向对比各维度指标
- 📉 专业图表 — K线趋势图 / 财务指标对比柱状图 / 多维雷达图
- 📋 报告导出 — HTML 交互式报告 + 一键导出 PDF/Word
核心理念:用 AI 替代彭博终端 80% 的日常查询功能,成本降至零。
使用方法
直接告诉我以下信息(不提供则交互式引导):
| 参数 | 说明 | 默认值 | 示例 |
|---|---|---|---|
股票代码 |
A股/港股/美股代码 | 必填 | 600519 / 0700.HK / AAPL |
市场 |
cn/hk/us | 自动识别 | cn |
分析深度 |
quick/standard/deep | standard | standard |
可比公司数量 |
对标的同行数量 | 5 | 5 |
报告格式 |
html/pdf/word/all | html | html |
市场自动识别规则:
- 纯数字(6位)→ A股(上证/深证)
- 数字.HK → 港股
- 字母(1-5位)→ 美股
执行步骤
收到用户请求后,按以下线性流水线执行:
Step 1:参数解析与股票确认
从用户输入中提取股票代码和市场,缺失项使用默认值。
若用户只输入公司名称(如"贵州茅台"),先通过 WebSearch 搜索确认股票代码。
输出确认信息:
✅ 已确认分析目标:贵州茅台(600519.SH)
📊 分析深度:standard | 🏢 可比公司:5家 | 📋 格式:HTML
Step 2:数据聚合模块
目标:获取股票实时行情、核心财务数据、近期新闻。
2.1 使用金融数据源
优先级策略(多源回退):
| 优先级 | 数据源 | 适用市场 | 获取方式 |
|---|---|---|---|
| 1 | westock-data Skill |
A股/港股/美股 | 调用 Skill 工具 |
| 2 | neodata-financial-search Skill |
A股/港股/美股 | 调用 Skill 工具 |
| 3 | WebSearch + WebFetch | 全市场 | 搜索引擎抓取 |
2.2 数据结构
聚合后统一为以下结构(保存为 Python dict,后续步骤复用):
stock_data = {
"basic": {
"code": "600519", "name": "贵州茅台", "market": "cn",
"industry": "白酒", "sector": "食品饮料",
"market_cap": 2100000000000, # 总市值(元)
"price": 1680.50, "change_pct": 1.25,
"pe_ttm": 28.5, "pb": 9.8
},
"financials": {
"revenue": 150560000000, # 营业收入
"net_profit": 74730000000, # 归母净利润
"total_assets": 280000000000, # 总资产
"total_equity": 220000000000, # 股东权益
"total_liabilities": 60000000000, # 总负债
"current_assets": 180000000000,
"current_liabilities": 50000000000,
"gross_profit": 138000000000, # 毛利润
"operating_profit": 95000000000, # 营业利润
"ebitda": 100000000000,
"roe": 0.34, "roa": 0.27,
"revenue_growth": 0.175, # 营收同比增长率
"profit_growth": 0.192, # 利润同比增长率
"gross_margin": 0.917, # 毛利率
"net_margin": 0.497, # 净利率
"debt_ratio": 0.214, # 资产负债率
"current_ratio": 3.6, # 流动比率
},
"news": [
{"title": "...", "source": "...", "date": "...", "sentiment": "positive"}
]
}
2.3 数据缺失处理
若某个字段获取不到,标注为 None,报告中显示"N/A",不阻塞流水线。
Step 3:财务指标速算模块
目标:补全所有核心财务指标,并进行行业百分位排名。
3.1 指标计算公式
| 指标 | 公式 | 说明 |
|---|---|---|
| ROE | 净利润 / 股东权益 × 100% | 净资产收益率 |
| ROA | 净利润 / 总资产 × 100% | 总资产收益率 |
| PE(TTM) | 总市值 / 近12月净利润 | 滚动市盈率 |
| PB | 总市值 / 股东权益 | 市净率 |
| PEG | PE / 净利润增长率 | 市盈增长比 |
| 毛利率 | (营收 - 营业成本) / 营收 × 100% | |
| 净利率 | 净利润 / 营收 × 100% | |
| 资产负债率 | 总负债 / 总资产 × 100% | |
| 流动比率 | 流动资产 / 流动负债 | |
| 速动比率 | (流动资产 - 存货) / 流动负债 | |
| EV/EBITDA | (市值 + 净负债) / EBITDA | 企业价值倍数 |
| 股息率 | 每股股息 / 股价 × 100% |
3.2 实现方式
编写并执行 scripts/financial_metrics.py,输入 stock_data,输出 metrics_result:
# 核心:调用 westock-data 和 neodata-financial-search
# 从 Skills 获取原始数据后,用 Python 补全计算指标
# 输出结构化指标 + 行业百分位排名
行业百分位排名:通过 WebSearch 获取同行业公司数据,计算目标公司在行业中的排名位置(如"ROE在白酒行业排名前20%")。
Step 4:可比公司筛选模块
目标:自动匹配5家同行业可比公司,进行多维度横向对比。
4.1 筛选算法(三级匹配)
| 优先级 | 匹配维度 | 权重 |
|---|---|---|
| 1 | 行业分类(同申万二级/三级行业) | 必须匹配 |
| 2 | 市值体量(目标市值 ±50%) | 40% |
| 3 | 业务相似度(主营构成相似) | 30% |
| 4 | 市场关注度(研报覆盖/交投活跃) | 30% |
4.2 实现方式
编写并执行 scripts/peer_screener.py:
- 通过 westock-data / WebSearch 获取同行业公司列表
- 按市值/业务相似度排序
- 返回 Top 5 可比公司 + 关键指标
4.3 输出对比表
| 目标公司 | 可比1 | 可比2 | 可比3 | 可比4 | 可比5 | 行业中位数 | |
|---|---|---|---|---|---|---|---|
| 市值(亿) | 21,000 | ... | ... | ... | ... | ... | ... |
| PE | 28.5 | ... | ... | ... | ... | ... | ... |
| ROE | 34% | ... | ... | ... | ... | ... | ... |
| 营收增速 | 17.5% | ... | ... | ... | ... | ... | ... |
| 毛利率 | 91.7% | ... | ... | ... | ... | ... | ... |
Step 5:图表自动生成模块
目标:生成3张专业图表,嵌入最终报告。
5.1 图表清单
| 序号 | 图表类型 | 内容 | 工具 |
|---|---|---|---|
| 1 | K线趋势图 | 近6个月股价走势 + 成交量 | matplotlib + mplfinance |
| 2 | 财务对比柱状图 | 目标公司 vs 可比公司 核心指标 | matplotlib |
| 3 | 多维雷达图 | 估值/盈利/成长/偿债/营运/现金流 六维评分 | matplotlib |
5.2 实现方式
编写并执行 scripts/chart_generator.py:
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
# 1. K线图 — 使用 mplfinance(如果可用)否则用 matplotlib 模拟
# 2. 柱状图 — 分组柱状图,多公司多指标对比
# 3. 雷达图 — 六维评分,matplotlib polar projection
# 输出到 assets/ 目录:
# - kline.png
# - comparison_bar.png
# - radar.png
图表规格:
- DPI: 150(清晰但文件不大)
- 尺寸: 10×6 inches
- 风格: seaborn-darkgrid 或 ggplot
- 配色: 专业金融配色(红涨绿跌,中国习惯)
- 中文字体: SimHei / Microsoft YaHei
- 输出格式: PNG(Base64编码嵌入HTML)
5.3 降级策略
若 mplfinance 不可用:
- K线图降级为 matplotlib 收盘价折线图
- 图表参数保持一致
Step 6:报告一键导出模块
目标:生成美观的 HTML 投研报告,支持导出 PDF/Word。
6.1 HTML 报告结构
┌─────────────────────────────────────────────┐
│ 🏦 普惠金融终端 — XYZ公司 投研分析报告 │
│ 生成时间:2026-05-31 | 数据源:多方聚合 │
├─────────────────────────────────────────────┤
│ 📊 一、公司概览 │
│ ┌──────┬──────┬──────┬──────┐ │
│ │ 股价 │ 市值 │ PE │ 行业 │ │
│ └──────┴──────┴──────┴──────┘ │
├─────────────────────────────────────────────┤
│ 📈 二、K线走势图(6个月) │
│ [图表: kline.png] │
├─────────────────────────────────────────────┤
│ 💰 三、核心财务指标 │
│ 指标表格 + 行业百分位排名 │
├─────────────────────────────────────────────┤
│ 🏢 四、可比公司横向对比 │
│ 对比表 + 柱状图 [comparison_bar.png] │
├─────────────────────────────────────────────┤
│ 🎯 五、多维雷达评分 │
│ [图表: radar.png] │
├─────────────────────────────────────────────┤
│ 📰 六、近期重大新闻与舆情分析 │
│ 新闻列表 + 情绪标签 │
├─────────────────────────────────────────────┤
│ ⚠️ 七、风险提示 │
│ 免责声明 + 风险因子 │
└─────────────────────────────────────────────┘
6.2 HTML 技术规范
- 独立文件:所有 CSS/JS/图片内联(Base64 编码图片、内联样式)
- 响应式:PC + 移动端适配
- 打印友好:
@media print样式优化 - 交互功能:表格排序、图表悬停高亮
- 配色方案:深蓝专业风格(#1a237e 主色 + #0d47a1 辅色 + 白色卡片)
6.3 导出选项
| 格式 | 实现方式 | 说明 |
|---|---|---|
| HTML | 直接生成 | 默认格式,交互式报告 |
| 浏览器打印或 weasyprint | "在此下载PDF"按钮触发浏览器打印 | |
| Word | python-docx 或 HTML→Word | 备选格式,供编辑使用 |
Step 7:写入文件与预览
- 将生成的 HTML 报告写入工作区:
{workspace}/fin_report_{code}.html - 将图表 PNG 文件写入:
{workspace}/charts/目录 - 调用
preview_url展示 HTML 报告 - 输出报告摘要
输出格式
执行完成后,输出:
- 分析摘要(文字,3-5句话核心结论)
- 报告文件路径
- 预览
- 数据完整性说明(哪些字段为估算值 / N/A)
示例输出:
✅ 贵州茅台(600519)投研分析完成!
📊 核心结论:
• ROE 34.0%,行业排名前5%,盈利能力极强
• PE(TTM) 28.5x,处于近3年历史中位水平
• 可比公司中毛利率(91.7%)遥遥领先
• 六维雷达综合评分 87/100,白酒行业标杆
📋 报告文件:fin_report_600519.html
📁 图表目录:charts/
注意事项
- 数据时效性:行情数据为实时/准实时,财报数据为最近一期公开披露数据
- 免责声明:报告中自动包含"本报告由AI生成,不构成投资建议"的免责声明
- 数据缺失:任何字段获取不到均标注"N/A",不阻塞整体流程
- 积分消耗:单次标准分析约 10-25 Credits(使用默认模型),深度分析约 30-60 Credits
- 中国市场颜色规范:涨→红色,跌→绿色(中国习惯)
- 多市场货币符号(v1.0.2 新增):A股→¥,港股→HK$,美股→$,根据
market字段自动适配 - 银行业特殊处理(v1.0.2 新增):银行业资产负债率90%+属正常,评价/评分/百分位均使用银行专属阈值
- WebSearch 策略:优先使用 westock-data / neodata-financial-search Skill;若均不可用,降级为 WebSearch + WebFetch
- 图表中文字体:运行时自动检测可用中文字体(SimHei > Microsoft YaHei > WenQuanYi > Noto Sans CJK > PingFang SC > STHeiti > SimSun > KaiTi > FangSong > STSong),无中文字体时使用英文标签,bold 警告已抑制
- 行业预设库(v1.0.2 扩展):白酒/互联网/银行/新能源汽车/半导体/游戏/传媒/消费电子/科技 共 9 个行业预设
- 数据来源降级链(v1.0.1 明确):
- Level 1:westock-dataSkill(A股/港股/美股详细行情+财务)→ 最高优先级
- Level 2:neodata-financial-searchSkill(通用金融数据搜索)→ Level 1 不可用时降级
- Level 3:WebSearch + WebFetch(搜索引擎抓取公开财报/行情)→ Level 2 不可用时降级
- Level 4:预设行业可比公司库(scripts/peer_screener.py 内置 9 个行业)→ 所有外部源不可用时兜底
- 注意:当前 v1.0.2 的降级链在 SKILL.md 层面已文档化,但脚本层面的自动探测仍需 AI 助手按 Step 2 指引手动执行降级判断。未来 v1.1 计划将降级逻辑封装为data_fetcher.py模块实现全自动降级。
示例对话
用户: 帮我分析一下贵州茅台
助手: (执行Step 1-7)
✅ 已确认:贵州茅台(600519.SH),白酒行业
[数据聚合中...] → 获取实时行情、财务数据、近期新闻
[指标计算中...] → ROE 34.0% | PE 28.5x | 毛利率 91.7%
[可比公司筛选中...] → 匹配五粮液、泸州老窖、洋河股份...
[图表生成中...] → K线图 ✓ | 对比柱状图 ✓ | 雷达图 ✓
[报告导出中...] → HTML 交互式报告已生成
📋 报告已生成,正在预览...
用户: 分析腾讯,对比阿里巴巴、美团、拼多多、百度、京东
助手: (执行完整流程,深度分析模式)
依赖说明
Python 依赖(运行时自动安装):
- matplotlib >= 3.7.0(图表生成)
- numpy >= 1.24.0(数值计算)
- mplfinance >= 0.12.0(可选,K线图)
- python-docx >= 0.8.11(可选,Word导出)
Skills 依赖(可选,优先使用):
- westock-data — A股/港股/美股详细数据
- neodata-financial-search — 通用金融数据搜索
无需外部API Key:所有数据通过 WebSearch + 内置 Skills 获取,零额外成本。
版本历史
v1.0.2 (2026-07-21)
修复的 Bug:
| # | 问题 | 修复说明 |
|---|---|---|
| 1 | 多市场货币符号硬编码 | HTML报告原统一用¥符号,港股/美股货币显示错误。新增 currency_map(cn→¥, hk→HK$, us→$),报告 header/公司概览/市值显示均自动适配 |
| 2 | 银行资产负债率评价不当 | 银行业90%+资产负债率原显示"❌偏高",实际属正常。_get_rating / _get_rating_and_class 新增 industry 参数,银行业特殊阈值(85→极低, 92→正常, 95→关注, 97+→偏高) |
| 3 | 银行偿债能力评分过低 | calc_six_dimension_score 原对90%+负债率统一给30分。新增银行业特殊评分逻辑(88→90分, 92→75分, 95→60分) |
| 4 | 市值显示无货币前缀 | _fmt_cap 原只显示"123亿",现根据市场显示"¥123亿"/"HK$123亿"/"$123亿" |
| 5 | 银行业百分位基准缺失 | estimate_industry_percentile 新增银行业 ROE/净利率/PE/PB/资产负债率 行业基准 |
新增功能:
| # | 功能 | 说明 |
|---|---|---|
| 1 | 消费电子行业预设 | 新增 5 家消费电子可比公司(微软、谷歌、三星电子、小米集团、索尼) |
| 2 | 科技行业预设 | 新增 5 家科技行业可比公司(微软、谷歌、英伟达、Meta、亚马逊) |
| 3 | 三市场测试脚本 | 新增 test_three_markets.py,以招商银行(600036)/腾讯控股(00700.HK)/苹果(AAPL)验证 A股/港股/美股全流程 |
| 4 | compute_all_metrics 增加 market 字段 | 结果中新增 market 字段,供下游模块获取市场信息 |
验证测试:
- A股 招商银行(600036) 全流程通过 ✓ — 银行行业特殊处理正确
- 港股 腾讯控股(00700.HK) 全流程通过 ✓ — HK$ 货币符号正确
- 美股 苹果(AAPL) 全流程通过 ✓ — $ 货币符号正确,超高ROE(171%)评分正确限制在100以内
- 游族网络(002174) 回归测试通过 ✓
v1.0.1 (2026-07-21)
修复的 Bug:
| # | 问题 | 修复说明 |
|---|---|---|
| 1 | 行业百分位计算错误 | estimate_industry_percentile 原返回首个匹配阈值(最低档),修复为从高到低匹配返回最高档。茅台 ROE 34% 原显示"后25%"→现正确显示"前25%" |
| 2 | PE/PB/PEG 评价方向错误 | "越低越好"的指标(PE/PB/PEG/EV-EBITDA/资产负债率)原用 >= 逻辑,修复为 <= 从低到高匹配。PE 28.5x 原显示"🔍极低"→现正确显示"✅合理" |
| 3 | 营收/利润增速显示错误 | 增长率存储为小数(0.175)但展示时未×100,原显示"0.17%"→现正确显示"17.50%" |
| 4 | 可比公司表头不匹配 | 行数据用 "indicator" 键但表头用 "指标",导致首列显示 N/A。修复为统一使用 indicator 键读取 |
| 5 | 行业中位数计算错误 | 原中位数只填入目标公司一列且被后续指标覆盖。重构为独立"行业中位数"列,每行显示对应指标的可比公司中位数 |
| 6 | 负值指标无评价 | ROE/净利率为负时评价返回空。新增"❌亏损"档位处理负值场景 |
| 7 | 盈利能力评分为负 | calc_six_dimension_score 中 nm * 2 产生负分。修复为 max(10, ...) 保底 |
| 8 | 中文字体 bold 警告 | findfont: Failed to find font weight bold 噪音日志。抑制 font_manager 日志 + 扩展字体候选列表 |
新增功能:
| # | 功能 | 说明 |
|---|---|---|
| 1 | 游戏/传媒行业预设 | 新增 6 家游戏行业可比公司(三七互娱、巨人网络、完美世界、吉比特、昆仑万维、恺英网络) |
| 2 | PE/PB 行业百分位 | 新增白酒和游戏行业的 PE/PB 百分位基准 |
| 3 | 营收/利润增速百分位 | 新增增速指标的默认百分位基准 |
| 4 | 全流程测试脚本 | 新增 test_full_pipeline_002174.py,以游族网络(002174)为案例验证完整流水线 |
验证测试: 游族网络(002174) 全流程通过 ✓
v1.0 (初始版本)
- 完成核心流水线:数据聚合 → 财务指标速算 → 可比公司筛选 → 图表生成 → 报告导出
- 支持白酒/互联网/银行/新能源汽车/半导体 5 个行业预设
- 3 张专业图表(K线/柱状对比/雷达评分)
- HTML 交互式报告(含排序/打印/导出Word)