diff --git a/项目文档/双入口口径裁决-复利mode2部分平仓-20260816.md b/项目文档/双入口口径裁决-复利mode2部分平仓-20260816.md new file mode 100644 index 00000000..11432d30 --- /dev/null +++ b/项目文档/双入口口径裁决-复利mode2部分平仓-20260816.md @@ -0,0 +1,56 @@ +# 裁决申请:复利×mode2×部分平仓 双入口结息额分歧 + +> 2026-08-16 | 来源:`GetInterestsEntrySemanticsTest.复利_mode2_部分平仓_双入口口径钉住现状`(b01b485e 实测钉住) +> 状态:**待业务裁决**——同一经济事件,两个入口算出两种结息额,当前测试锁死两值防漂移。 + +## 一、分歧事实(生产代码实测,已钉住) + +场景:合约名义本金(mode2)×复利×浮动 FR007×部分平仓 30% +参数:本金 1000,平掉 300,剩余 700;FR007=0.1%,利差=1.0%;[4/27 起息,4/30 平仓] 算头算尾 4 天;重置周期 3 天。 + +| 入口 | 结息额 | 计算方式 | +|---|---|---| +| 盘中平仓试算 | **0.036165** | 平掉额 300 从 4/27 到 4/30 全程复利重放 | +| EOD 平仓后收盘 | **0.059042** | 剩余持仓全部待实现利息(0.05) + 平掉额 4/30 末段增量(0.009042) | + +**EOD 比盘中多结 63%**(多出的 0.023 ≈ 剩余 700 份额对应的待实现利息,却在平 30% 时被全额结走)。 + +## 二、契约验算(确认书公式,模板:国联民生收益互换确认书-现券/ETF 四份一致) + +``` +参考利率(绝对) = ∏[i=1..k] ( 1 + (FR007i + 利差) × di / 365 ) − 1 +结息额(平仓部分) = 实际平掉额 × 参考利率(绝对) +``` + +手算(300×[(1+0.011×3/365)×(1+0.011×1/365)−1])= **0.0361652** + +**= 盘中口径**(差 3.7e-7 为引擎利率舍入量级)。EOD 口径无法由契约公式推出。 + +## 三、机制定位(为什么 EOD 会算成这样) + +`SwapDealService.cs:1220` 的 `closePrecent == 1m` 分支,设计意图是**最终全平专属** +(注释原文:"最终全平只重放上一日终之后的新增利息……以上一日 InterestIncomeSum 为起点,保证之前攒下的尾差最后一次带走")—— +全平时该公式正确。 + +但 EOD 平仓后收盘入口的传参惯例是 **closePrecent 恒 1**(见 `InterestCalcRequest.EodPostCloseSettle` 工厂, +"结算本次事件覆盖的全部")。于是 **EOD 部分平仓 30% 也掉进全平专属分支**,把剩余 100% 持仓的 +待实现利息全部结走。数字 1 承载了两种语义:"平仓比例=100%" vs "本次事件全额结息"。 + +## 四、请业务裁决 + +1. **部分平仓(含 EOD 自动平仓)应结利息**:是否 = 确认书公式下"实际平掉额 × 全程利率"? + (即盘中口径 0.036165)——契约公式直接支持,推荐。 +2. **最终全平应结利息**:维持现公式"剩余持仓待实现 + 末段增量"(尾差一次带走)——合理,建议维持。 + +## 五、裁决后的修复方案(技术侧已就绪,预计 1~2 天) + +- EOD 入口改为传**真实比例**(实际平掉额/剩余)而非恒 1;部分平仓自然走重放路径(与盘中同语义) +- 全平保留 percent=1,1220 分支回归"全平专属"设计意图 +- `GetInterests` 内 mode2 无条件覆盖/mode9 兜底(2035e1df 粘合)随之退役删除 +- 钉住测试翻转为"两入口相等" oracle 断言;黄金回放 diff 仅允许出现在本格子的 EOD 结息额(=裁决修正值) + +## 六、生产影响面(待查证) + +- 受影响格子:EOD 自动平仓 × mode2/9 × 复利 × **部分**平仓(若生产存在此路径的存量交易) +- 建议内网查:swap_flow_event 中 EventType=平仓 且当日 closePercent<1 的复利 mode2/9 事件, + 与盘中口径重算值比对差值