v1.9.4 · 财富水位不再骗你说「需要至少 2 期」
财富水位不再骗你说「需要至少 2 期」
维护者报的 prod 问题:已经关账 3 期,报表页的财富水位一直显示
财富水位需要至少 2 期净资产数据 + 宏观基准
这句提示两个条件都不是真的
宏观基准根本不是条件 —— 缺了走三法均值 fallback。真正的判定只有两条:窗口内 <2 期,或者序列首点 ≤ 0。命中的是第二条,而且是结构性的。
给财富水位用的那条序列每期都减掉「本期首次出现账户的期末净值」,包括窗口首期 —— 而首期的「首次出现账户」按定义就是全部账户,于是首点恒等于 0。水位以首点为锚,锚 ≤ 0 直接判不可用。
结论:只要时间范围包含你家的首期,财富水位就永远不出现。
- 新用户只有两三期 → 任何时间范围都含首期 → 这一节从来没出现过
- 不只影响新用户:老用户新加一个账户后,1M / 3M 这种短窗口的首期会含「首次出现账户」,同样被打死
在 beta 上用 range=ALL 复现(1Y 正常、ALL 不可用)后才动手。
这个性质代码里早有记录:ReportsController v1.6.29 的注释写着「该序列首点按构造恒为 0(首期全部账户都算首次出现)→ 长年显示『期初净资产 −¥0』」。但当时只把 tooltip 那个消费方换成了另一条序列,财富水位这个主消费方留在了坏序列上 —— 典型的半修:发现了性质,只治了眼前的症状。
修法:首期那笔本金是起跑线,不是「注入」
窗口首期的开账基线不减。购买力线要拿这笔存量本金当基数复利;第二期起新出现的账户仍然剔除(那才是「本来就有、现在才开始记」的外部资本纳入,不该算成增值)。
零差异验证 —— 改指标口径前先建基线,基线取已发布的 v1.9.3 jar,采六个时间范围的 nominal/cpiLine/m2Line 序列指纹与全部百分比,改后逐项比对:
| 范围 | 修前 | 修后 | 结论 |
|---|---|---|---|
| 1M | 不可用 | 不可用(原因:期数不足) | 一致 · 窗口里确实只有 1 期 |
| 3M / 6M / YTD / 1Y | 可用 | 可用 | 指纹与百分比逐字相同 |
| ALL | 不可用 | 可用 · 16 点 | 修复 |
已经能用的窗口一个数字都没动,只把坏掉的救回来。
顺带:兜底文案改成说真话
原文案三个错:① 期数够了也可能不可用(就是这个 bug),用户照提示继续记账永远不会好;② 「宏观基准」根本不是条件;③ 两种完全不同的处境给同一句话,没法自查。
现在按原因分开:
- 期数不足 → 「这个时间范围里只有不到 2 期净资产数据。继续记账并关账……」
- 起点净资产 ≤ 0(比如房贷大于总资产)→ 「购买力线是『起跑本金 × 通胀复利』,从零或负数起算没有意义……换一个起点净资产已转正的时间范围就能看到」
第二种是真实处境而不是数据不足,得说清楚,别让人白记几个月。
升级注意
- 无 DB 迁移,回滚只回 jar
- 只影响财富水位这一节的可用性判定与曲线锚点;已经能显示的时间范围数字不变(上表已验证)
- 升级后如果某个时间范围仍然不显示,看提示语:说「不到 2 期」就是真的期数不够,说「起点净资产不是正数」就换一个更近的范围
486 单元测试(新增 NetWorthTrendExOpeningTest / WaterLevelServiceTest,其中 3 条专钉首点语义与零差异)· 554 黑盒回归(新增 v194-WL-ANCHOR / v194-WL-REASON)· 74 条 e2e 断言
设计文档:prd/v1.9.md 附录