TradingAgents-CN 报告详情页关键指标增强:置信度评分与风险等级可视化实践
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
导读
本文聚焦 TradingAgents-CN(基于多智能体 LLM 的中文金融交易框架)报告详情页面的关键指标展示增强方案:以 Element Plus 圆形进度条呈现 0-100 分置信度评分、以 1-5 星脉冲动画呈现风险等级,并配套投资建议与关键要点的卡片化展示。读完本文,你将掌握该增强功能的前端实现细节、后端数据字段约定(特别是confidence_score的 0-1 小数格式与前端百分制转换)、样式与动画设计,以及可复用的兼容性处理与后续优化思路。
一、增强背景:为什么报告详情页需要"关键指标"
TradingAgents-CN 的分析报告由多智能体协作生成——市场分析师、基本面分析师、新闻分析师、情绪分析师、技术分析师共同产出报告,最终形成交易决策。原始报告详情页以长文 Markdown 为主,用户需要通读全文才能抓住"模型有多确信、风险有多高"这两个最核心的信息。
本次增强的目标是在 frontend/src/views/Reports/ReportDetail.vue 中新增"关键指标"卡片,将两个最影响决策的量化信息可视化:
- 模型置信度:多智能体对最终决策的信心程度(0-100 分);
- 风险评估:基于历史数据给出的风险等级(低/中低/中等/中高/高)。
该卡片同时保留投资建议(Markdown 富文本)与关键要点(带勾选图标的列表),让用户在进入详情页的第一屏即可完成"可信度—风险—结论—要点"的信息闭环。
二、数据契约:前端字段与后端来源
增强功能依赖以下报告数据结构,前端类型定义位于 frontend/src/types/analysis.ts:
interface Report { id: string stock_symbol: string recommendation: string // 投资建议(Markdown 格式) confidence_score: number // 置信度评分(0-1 的小数,例如 0.85 表示 85%) risk_level: string // 风险等级(低/中低/中等/中高/高) key_points: string[] // 关键要点数组 // ... 其他字段 }重要说明:后端返回的confidence_score是0-1 的小数(例如 0.85),前端展示前必须转换为 0-100 的百分制。
后端侧,报告详情的序列化逻辑位于 app/routers/reports.py,接口GET /api/reports/{report_id}/detail会返回:
"recommendation": r.get("recommendation", ""), "confidence_score": r.get("confidence_score", 0.0), "risk_level": r.get("risk_level", "中等"), "key_points": r.get("key_points", []),数据模型层(app/models/analysis.py)中这些字段均为可选字段:
recommendation: Optional[str] = None confidence_score: Optional[float] = None risk_level: Optional[str] = None key_points: List[str] = Field(default_factory=list)而confidence_score与risk_level的实际赋值来自分析服务在最终交易决策阶段从多智能体产出中提取的字段,例如 app/services/analysis_service.py:
confidence_score=decision.get("confidence_score", 0.0), risk_level=decision.get("risk_level", "中等"),这意味着:置信度与风险等级并非前端虚构,而是多智能体最终决策输出的结构化指标,前端只负责将它们以更直观的方式呈现。
三、置信度评分:圆形进度条实现
3.1 组件结构
使用 Element Plus 的el-progress组件,以type="circle"渲染圆形进度条,并通过默认插槽自定义中心文本:
<el-progress type="circle" :percentage="normalizeConfidenceScore(report.confidence_score || 0)" :width="120" :stroke-width="10" :color="getConfidenceColor(normalizeConfidenceScore(report.confidence_score || 0))" > <template #default="{ percentage }"> <span class="confidence-text"> <span class="confidence-number">{{ percentage }}</span> <span class="confidence-unit">分</span> </span> </template> </el-progress>参数说明:
| 参数 | 值 | 说明 |
|---|---|---|
type | circle | 圆形进度条形态 |
percentage | 0-100 的数值 | 归一化后的置信度分数 |
width | 120 | 圆环整体宽度(px) |
stroke-width | 10 | 圆环描边宽度(px) |
color | 函数返回值 | 随分数动态变化的圆环颜色 |
中心插槽展示"85 分"这样的大号数字 + 单位,配合下方的信心等级文字(getConfidenceLabel返回值),形成"分数 + 等级"双重信息。
3.2 核心辅助函数
// 将后端返回的 0-1 小数转换为 0-100 的百分制 const normalizeConfidenceScore = (score: number) => { // 如果已经是 0-100 的范围,直接返回 if (score > 1) { return Math.round(score) } // 如果是 0-1 的小数,转换为百分制 return Math.round(score * 100) } // 根据评分返回颜色 const getConfidenceColor = (score: number) => { if (score >= 80) return '#67C23A' // 高信心 - 绿色 if (score >= 60) return '#409EFF' // 中高信心 - 蓝色 if (score >= 40) return '#E6A23C' // 中等信心 - 橙色 return '#F56C6C' // 低信心 - 红色 } // 根据评分返回标签 const getConfidenceLabel = (score: number) => { if (score >= 80) return '高信心' if (score >= 60) return '中高信心' if (score >= 40) return '中等信心' return '低信心' }关键设计点——归一化兼容:normalizeConfidenceScore通过score > 1判断当前是 0-1 小数还是 0-100 百分制。这一判断兼容了新旧两种后端数据格式:旧版本若直接输出百分制数值,不会因乘以 100 而放大 100 倍;新版本输出 0.85 这样的标准小数则正确映射为 85 分。该函数在模板中被调用两次(percentage 与 color),为避免重复计算,实际生产代码可在computed中缓存归一化结果。
3.3 颜色语义
| 分数区间 | 颜色 | 色值 | 信心等级 |
|---|---|---|---|
| 80-100 | 绿色 | #67C23A | 高信心 |
| 60-79 | 蓝色 | #409EFF | 中高信心 |
| 40-59 | 橙色 | #E6A23C | 中等信心 |
| 0-39 | 红色 | #F56C6C | 低信心 |
颜色选用 Element Plus 语义色,与全站设计语言保持一致;红橙蓝绿的渐变过渡符合"越低越危险、越高越可信"的直觉认知。
四、风险等级:星级显示实现
4.1 组件结构
风险等级使用 1-5 颗星表示(StarFilled图标),通过star <= getRiskStars(...)判断星星是否激活:
<div class="risk-display"> <div class="risk-stars"> <el-icon v-for="star in 5" :key="star" class="star-icon" :class="{ active: star <= getRiskStars(report.risk_level || '中等') }" > <StarFilled /> </el-icon> </div> <div class="risk-label" :style="{ color: getRiskColor(report.risk_level || '中等') }"> {{ report.risk_level || '中等' }}风险 </div> <div class="risk-description">{{ getRiskDescription(report.risk_level || '中等') }}</div> </div>结构分三层:星级图标、带动态颜色的等级文字、风险描述。风险等级与星级映射关系如下:
| 风险等级 | 星星数 | 语义 |
|---|---|---|
| 低 | ⭐ | 低风险 |
| 中低 | ⭐⭐ | 中低风险 |
| 中等 | ⭐⭐⭐ | 中等风险 |
| 中高 | ⭐⭐⭐⭐ | 中高风险 |
| 高 | ⭐⭐⭐⭐⭐ | 高风险 |
4.2 核心辅助函数
// 根据风险等级返回星星数量 const getRiskStars = (riskLevel: string) => { const riskMap: Record<string, number> = { '低': 1, '中低': 2, '中等': 3, '中高': 4, '高': 5 } return riskMap[riskLevel] || 3 } // 根据风险等级返回颜色 const getRiskColor = (riskLevel: string) => { const colorMap: Record<string, string> = { '低': '#67C23A', // 绿色 '中低': '#95D475', // 浅绿色 '中等': '#E6A23C', // 橙色 '中高': '#F56C6C', // 红色 '高': '#F56C6C' // 深红色 } return colorMap[riskLevel] || '#E6A23C' } // 根据风险等级返回描述 const getRiskDescription = (riskLevel: string) => { const descMap: Record<string, string> = { '低': '风险较小,适合稳健投资者', '中低': '风险可控,适合大多数投资者', '中等': '风险适中,需要谨慎评估', '中高': '风险较高,需要密切关注', '高': '风险很高,建议谨慎投资' } return descMap[riskLevel] || '请根据自身风险承受能力决策' }三个映射表的设计要点:
- getRiskStars:未匹配时默认返回 3(中等),保证未知等级不会显示 0 星或空状态;
- getRiskColor:中高与高共用红色
#F56C6C,仅在等级文字上区分"中高风险/高风险",颜色语义不产生歧义; - getRiskDescription:为每个等级提供面向投资者的白话描述,降低理解门槛。
4.3 星星动画
激活的星星通过starPulse关键帧实现脉冲效果(在 ReportDetail.vue 样式区定义):
@keyframes starPulse { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.2); } } .star-icon { color: #DCDFE6; transition: all 0.3s ease; &.active { color: #F7BA2A; animation: starPulse 0.6s ease-in-out; } }未激活星星为灰色#DCDFE6,激活星星为金色#F7BA2A,0.6 秒的脉冲动画在页面加载时给予视觉反馈,突出当前风险等级。
五、投资建议与关键要点
5.1 投资建议:Markdown 富文本
投资建议保持原有 Markdown 渲染链路,通过marked库解析:
import { marked } from 'marked' marked.setOptions({ breaks: true, gfm: true }) const renderMarkdown = (content: string) => { if (!content) return '' try { return String(marked.parse(content)) } catch (e) { return `<pre style="white-space: pre-wrap; font-family: inherit;">${content}</pre>` } }- 启用
gfm(GitHub Flavored Markdown)与breaks(换行即<br>); - 解析失败时降级为
<pre>原样输出,保证内容不丢失; - 在模板中通过
v-html="renderMarkdown(report.recommendation || '暂无')"渲染。
5.2 关键要点:带勾选图标的列表
<div v-if="report.key_points && report.key_points.length > 0" class="key-points"> <h4> <el-icon><List /></el-icon> 关键要点 </h4> <ul> <li v-for="(point, index) in report.key_points" :key="index"> <el-icon class="point-icon"><Check /></el-icon> {{ point }} </li> </ul> </div>- 使用
v-if守卫:key_points为空或不存在时整块隐藏; - 每项前置绿色
Check勾选图标; - 列表项带圆角背景、悬停背景色加深的交互效果。
六、样式增强细节
6.1 卡片样式
- 关键指标卡片(
.metrics-card)内每个指标项(.metric-item)圆角边框12px; - 悬停效果:
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1)+transform: translateY(-2px)轻微上移; transition: all 0.3s ease渐变过渡动画。
6.2 图标与标签
所有指标标签(分析参考 / 风险评估 / 模型置信度)均配备对应图标(TrendCharts、Warning、DataAnalysis)与QuestionFilled悬浮提示,图标大小统一为 18px;置信度、风险卡片旁的解释 tooltip 明确提示"仅供参考,不构成投资建议""不代表实际投资成功率",体现金融工具的审慎性。
6.3 响应式布局
使用 Element Plus 栅格系统,三列等宽:
<el-row :gutter="24"> <el-col :span="8"> <!-- 分析参考 --> </el-col> <el-col :span="8"> <!-- 风险评估 --> </el-col> <el-col :span="8"> <!-- 模型置信度 --> </el-col> </el-row>- 每列
span="8",三列合计 24,等宽铺满一行; gutter="24"统一列间距;- 关键要点区域以
border-top分隔线挂在指标卡片下方,形成独立的视觉分区。
七、视觉效果示意
置信度评分
┌─────────────────────┐ │ 📊 置信度评分 │ │ │ │ ╱───╲ │ │ ╱ 85 ╲ │ │ │ 分 │ │ │ ╲ ╱ │ │ ╲───╱ │ │ │ │ 高信心 │ └─────────────────────┘风险等级
┌─────────────────────┐ │ ⚠️ 风险等级 │ │ │ │ ⭐⭐⭐⭐⭐ │ │ │ │ 高风险 │ │ │ │ 风险很高,建议谨慎 │ │ 投资 │ └─────────────────────┘八、使用示例与预期效果
访问路径
- 进入分析报告列表页面(路由
/reports,对应 frontend/src/views/Reports/index.vue); - 点击任意报告的"查看详情"按钮,跳转至
GET /api/reports/{report_id}/detail(后端实现见 app/routers/reports.py); - 在报告详情页查看增强后的关键指标卡片。
预期效果
- 置信度评分:圆形进度条 + 动态颜色 + 信心等级标签;
- 风险等级:1-5 星 + 等级文字着色 + 白话风险描述 + 星星脉冲动画;
- 投资建议:Markdown 富文本渲染,支持加粗、列表、链接等格式;
- 关键要点:勾选图标列表,悬停有背景反馈。
与"应用到交易"的联动
confidence_score与risk_level不仅用于展示,还参与交易决策确认流程:parseRecommendation()从建议文本解析买卖方向与目标价,将置信度按百分制展示((confidence * 100).toFixed(1) + '%')、风险等级原样带入ElMessageBox确认弹窗,并给出"不代表实际成功率""实际风险可能更高"的提示,使可视化指标贯穿从"看报告"到"下单"的完整链路。
九、兼容性设计
数据兼容
| 字段缺失场景 | 兜底行为 |
|---|---|
confidence_score为空 | 默认显示 0 分 |
risk_level为空 | 默认"中等"风险(3 星) |
key_points为空/不存在 | 隐藏关键要点整块 |
前端模板中统一使用report.confidence_score || 0、report.risk_level || '中等'的写法,后端 app/routers/reports.py 的序列化同样提供0.0与"中等"默认值,双端兜底保证旧报告数据不会出现渲染异常。
浏览器兼容
- 支持所有现代浏览器(Chrome、Firefox、Safari、Edge);
- 动画与过渡全部基于 CSS3(
@keyframes、transition、transform),无 JS 动画依赖; - 组件层统一使用 Element Plus,保证跨浏览器渲染一致性。
十、后续优化建议
数据可视化
- 添加历史置信度评分趋势图,观察模型信心随时间变化;
- 添加风险等级变化趋势,识别风险演化路径。
交互增强
- 点击置信度评分,展开详细计算依据(各分析师贡献度);
- 点击风险等级,展开风险因素分析明细。
个性化
- 允许用户自定义风险等级阈值;
- 允许用户自定义置信度评分的颜色映射。
导出功能
- 支持将关键指标导出为图片;
- 支持将关键指标包含进 PDF 报告中(仓库已具备 Markdown/Word/PDF/JSON 下载能力,可复用 app/routers/reports.py 中的导出逻辑)。
十一、总结
本次报告详情页关键指标增强,为 TradingAgents-CN 的多智能体分析报告补齐了"一眼可读"的量化摘要层:
- ✅ 置信度评分使用圆形进度条 + 分级配色 + 信心标签,一目了然;
- ✅ 风险等级使用 1-5 星 + 分级配色 + 白话描述,符合用户直觉;
- ✅ 动态颜色与星星脉冲动画提升体验,不牺牲信息准确性;
- ✅ 双端默认值兜底,兼容旧数据,不会出现显示错误;
- ✅ 指标数据源自后端最终交易决策的结构化输出,与多智能体分析链路闭环。
这些改进使用户能够更快理解报告核心信息,将注意力从"读长文"转向"看结论、评估可信度与风险",从而做出更审慎的投资决策。相关实现均可在 frontend/src/views/Reports/ReportDetail.vue 中查阅与复现。
【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考