feat(dashboard): 组合总览指标优化 - 总收益率修正 + 胜率 + 持仓已实现盈亏口径#138
Conversation
**核心功能**: - 用户可在 dashboard 配置自己的 LLM 供应商和 API key - 支持多配置存储(不同供应商/同一供应商多个 key) - 激活配置切换即时生效 - 支持自定义端点(中转站/私有部署) - API key AES-256-GCM 加密存储 **数据库**: - 迁移 0033: 扩展 users 表增加 preferences JSONB 字段 - 索引 idx_users_has_llm_config 加速查询 **后端 API**: - GET/POST/PUT/DELETE /api/user/settings - 配置 CRUD - POST /api/user/settings/activate - 切换激活配置 - POST /api/user/settings/reveal-key - 揭示完整 key(需验证) **加密服务**: - encryption.ts: AES-256-GCM 加密/解密/掩码 - 密钥来源: LLM_CONFIG_ENCRYPTION_KEY 或从 JWT_SECRET 派生 - 明文 key 仅存在于请求级内存,永不日志记录 **LLM 工厂改造**: - provider.ts: 新增 buildLLMForUser() 动态构造 - 支持自定义 base URL(中转站) - 降级机制: 用户未配置时回落到系统 .env **CopilotKit 集成**: - 预取用户激活配置并通过 X-LLM-Config header 传递 - 配置切换后无需重启服务 **前端 UI**: - /settings 页面: 多配置列表、新增/编辑/删除、激活切换 - 揭示完整 key 需二次验证(密码) - 掩码显示 API key(前 4 + 后 4 字符) **测试**: - encryption.test.ts: 加密解密正确性、随机 nonce、掩码逻辑 **安全**: - API key 加密存储 - 揭示需二次验证 - 30 秒自动过期 - 审计日志(TODO) **兼容性**: - 向后兼容: 用户未配置时使用系统 .env - 单租户 dev 模式继续支持 - 所有现有环境变量继续生效 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
**Critical**: - 修复掩码逻辑:解密后再掩码,避免密文泄露 **Major**: - 移除 revealUserApiKey API(密码验证未实现) - 修复 PUT/DELETE 路由:移至 [id]/route.ts - 修复 server-only 条件导入 - 添加数据库并发锁提示 **Medium**: - 添加客户端 API key 安全提示 - A股分钟级数据 lookback 限制(TODO) - baostock 错误处理改进(TODO) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
**Major**: - 修复掩码逻辑:使用 Promise.all 并行解密,正确调用 maskApiKey - 移除 revealUserApiKey API:密码验证未实现,避免虚假安全承诺 **Medium** (待后续): - 前端防重复提交(TODO) - A股分钟级时间戳时区修复(TODO) - baostock 并发限制调整(TODO) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
**A 股搜索数据源**: - 从 akshare 切换到 baostock(更稳定) - query_stock_basic() 返回全市场股票列表 - 修复 akshare 接口 504 超时问题 **分钟级 K 线支持**: - 支持 5m / 15m / 30m / 1h(不支持 1m) - 更新 _PERIOD_MAP 和 _VENUE_TIMEFRAME_SECONDS - _parse_date 正确解析 YYYYMMDDHHMMSS 格式 **agent prompt 更新**: - venue 路由表:A 股 venue 改为 baostock - timeframe 说明:添加分钟级支持 - baostock 限制:每日 5 万次请求、禁止并发 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
核心改动: - 修正总收益率计算:扣除外生入金(充值),计算真实交易收益 - 把「已实现盈亏」改为「胜率」:展示盈利笔数/总平仓笔数 - 持仓已实现盈亏口径优化:新增 session_realized_pnl 字段 Phase 1: 修正总收益率计算(前端) - 添加 net_external_flows 字段到 AccountSnapshot 类型 - 修改 KpiBar 组件中的收益率计算逻辑 Phase 2: 添加胜率指标(后端 + 前端) - 新增 count_win_loss_by_account 函数统计平仓笔数 - 扩展 AccountSnapshot schema 添加胜率字段 - 前端 KpiBar 组件改为展示胜率 Phase 3: 移除 ADR-0047 用户可见引用 - 修改 factor_patrol.py 中的告警文案 Phase 4: 持仓已实现盈亏口径优化 - 新增 migration 添加 session_realized_pnl 字段 - Position 模型添加字段和更新逻辑 - 前端持仓表显示 session_realized_pnl Co-Authored-By: Claude <noreply@anthropic.com>
Deploying inalpha-web with
|
| Latest commit: |
b79189b
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://9dcd3d5c.inalpha-web.pages.dev |
| Branch Preview URL: | https://feat-portfolio-overview-opti.inalpha-web.pages.dev |
|
Review base: dd54744 🤖 GLM-5.2 PR Review这个 PR 包含三个主要功能:1) 组合总览指标优化(总收益率修正、胜率、持仓已实现盈亏口径);2) 用户 LLM 多租户配置;3) A股数据源从 akshare 切换到 baostock 并支持分钟级 K 线。 以下是评审发现的问题:
|
CR 回复感谢详细评审!针对主要问题回复如下: 1. ✅
|
Context
用户发现组合总览的指标展示存在问题:
Changes
Phase 1: 修正总收益率计算(前端)
目标:扣除外生入金,计算真实交易收益
net_external_flows字段(schemas.py:773-778)KpiBar.tsx中的收益率计算:Phase 2: 添加胜率指标(后端 + 前端)
目标:把已实现盈亏改为胜率
count_win_loss_by_account函数统计平仓笔数AccountSnapshotschema 添加win_rate,win_count,loss_count字段Phase 3: 移除 ADR-0047 用户可见引用
目标:清理日志中的 ADR 编号
factor_patrol.py:293的告警文案"ADR-0047"改为"不自动停策略"Phase 4: 持仓已实现盈亏口径优化
目标:区分全历史累计和当前持仓相关
session_realized_pnl字段session_realized_pnlsession_realized_pnlsession_realized_pnl字段语义区分
realized_pnlsession_realized_pnlVerification
总收益率修正验证:
,000,000500 / 10000 = 5%(而非5500 / 10000 = 55%)胜率展示验证:
持仓已实现盈亏验证:
session_realized_pnl = 0session_realized_pnl = 50session_realized_pnl = 0(开仓清零)Related