问题
PortfolioRiskService.buildAllocation() 将持仓的 marketValueBase、原币 marketValue、以及 quantity × quote.lastPrice 当作同一币种金额,随后直接除以组合基币口径的 PortfolioSnapshot.marketValue。当跨币种持仓缺少折算值时,组合权重、HHI、集中度和行业风险信号会被汇率倍数扭曲。
例如基币 USD、组合市值 100,000 USD,某 HKD 持仓只有 marketValue: 780_000、没有 marketValueBase,当前得到权重 7.8(780%);这是把 HKD 当 USD。若 marketValue 缺失,报价兜底 quantity × lastPrice 同样没有验证报价币种与基币是否一致。
期望
- 优先使用有效的
marketValueBase。
- 仅在持仓与组合基币已知且一致时,用原币
marketValue 或报价推导值。
- 无法证明币种一致时,将该持仓金额标为未知,保留可用持仓的风险分析,并明确标识结果部分缺失;不猜汇率。
- 同币种、已折算、真实零值与仅有 positions 的场景不回退。
- 用实际
PortfolioRiskService.analyze() 的能力执行路径覆盖跨币种、同币种和报价兜底边界。
与 #158 属于同类货币口径问题,但本 Issue 范围仅组合风险报告;#158 的 Pulse 路径已另行处理。
问题
PortfolioRiskService.buildAllocation()将持仓的marketValueBase、原币marketValue、以及quantity × quote.lastPrice当作同一币种金额,随后直接除以组合基币口径的PortfolioSnapshot.marketValue。当跨币种持仓缺少折算值时,组合权重、HHI、集中度和行业风险信号会被汇率倍数扭曲。例如基币 USD、组合市值 100,000 USD,某 HKD 持仓只有
marketValue: 780_000、没有marketValueBase,当前得到权重 7.8(780%);这是把 HKD 当 USD。若marketValue缺失,报价兜底quantity × lastPrice同样没有验证报价币种与基币是否一致。期望
marketValueBase。marketValue或报价推导值。PortfolioRiskService.analyze()的能力执行路径覆盖跨币种、同币种和报价兜底边界。与 #158 属于同类货币口径问题,但本 Issue 范围仅组合风险报告;#158 的 Pulse 路径已另行处理。