refactor: 提取融资腿计息领域模型 (AccrualPolicy/FundingLegRate/AccrualState/FundingLegAccrual) - 将 CalcDailySimpleInterestByEod 纯数学下沉至 FundingLegAccrual.AccrueSimpleEod, 消除 double 往返转换, 引入值对象收敛散落参数
This commit is contained in:
@@ -142,6 +142,49 @@ curretEod.PosiQuantity = qty < 0 ? 0 : Math.Abs(qty);
|
||||
|
||||
---
|
||||
|
||||
## 4.1 阶段1 落地形态建议:独立 `CorporateActions` 模块(新增建议 · **待深度验证与评审**)
|
||||
|
||||
> ⚠️ 以下为**架构建议草案**,尚未经过逐文件源码复核与评审。仅作方向性参考,落地前须:
|
||||
> 1. 逐文件确认现有 `DividendService` / `BondPaymentService` / `ex_dividend_info` 的调用边,避免重复造轮子;
|
||||
> 2. 确认 `YLErp.Core` 是否合适承载(须被 OMS / 期权 / TRS 多程序集引用,不能反向依赖业务层);
|
||||
> 3. 与**利息核心(复利/部分平仓)**明确划界——见下方"边界警示"。
|
||||
|
||||
### 4.1.1 为什么必须新模块,而不是往现有屎山堆
|
||||
|
||||
- 现有 `SwapDealService` / `SwapEodPositionService` 已高度耦合(计息、平仓、EOD 递推、公司行为全搅在一起),继续往里加 if/else 只会放大"隐式不变量跨函数跨日不可见"的风险(这正是"测试绿但全错"的温床)。
|
||||
- 公司行为域(除权除息 / 复权 / 付息 / 分红 / 拆股 / 送股 / 配股)在 **OMS、期权、TRS** 多个业务都要用,**必须抽到共享核心程序集**,各业务只消费、不各写一份。
|
||||
|
||||
### 4.1.2 推荐目录形态
|
||||
|
||||
```
|
||||
YLErp.Core / CorporateActions/ ← 共享核心,被 OMS/期权/TRS 引用,不反向依赖业务层
|
||||
CorporateAction.cs # 统一实体:actionType + record/ex/effective/payment 四日期 + factor/splitRatio + 金额
|
||||
ICorporateActionSource.cs # 上游数据源适配(聚源付息日历已含全日期,仅做映射)
|
||||
ActionType.cs # 枚举:CashDividend / StockDividend / Split / BondCoupon / RightsIssue / Merger ...
|
||||
handlers/ # 每种行为一个 typed handler(新增行为 = 加类,不动旧代码)
|
||||
CashDividendHandler.cs # 现金分红(含债券 ETF 分红)
|
||||
BondCouponHandler.cs # 债券付息(record 日快照归属)
|
||||
SplitHandler.cs # 拆股
|
||||
StockDividendHandler.cs # 送股
|
||||
RightsIssueHandler.cs # 配股
|
||||
IAdjustmentFactorProvider.cs # 前复权 / 后复权 / 累计 CAF(t)=1(t≥ex)/=ratio(t<ex)
|
||||
EodHooks/ # EOD 收盘链上的接入口(与现有 SwapEodPositionService 解耦的薄适配层)
|
||||
IRecordDateHandler.cs # 登记日收盘:按快照确认 dividendin/accruedCash(金额钉死)
|
||||
IExDateHandler.cs # 除息日:价格自动剔息 + 穿越持仓因子(开盘前第一步,绝不可收盘后补)
|
||||
IPaymentDateHandler.cs # 支付日:纯现金划付,不重算归属
|
||||
```
|
||||
|
||||
### 4.1.3 边界警示(重要,避免域混淆)
|
||||
|
||||
- **债券 ETF 分红 / 付息 = 公司行为域** → 走 `CorporateActions` 模块。
|
||||
- **复利 / 部分平仓 / T+1 本金继承 / 重置日动态本金** = **利息计息域**,现居 `SwapDealService.cs`(`InitSwapDealInterest` / `CalcDailyCompoundInterest` / `CalcUnwindInterest`)+ `SwapEodPositionService.cs`(`SaveAutoEodWithCloseInterestPosition`)。这是**另一回事**,与"公司行为"正交:
|
||||
- 付息(coupon)的**金额**由 corp action 决定(按登记日快照);
|
||||
- 付息的**利息滚存/复利/部分平仓结算**由利息核心决定。
|
||||
- 两者通过 `swap_flow_event`(付息流水)衔接,**不要在 corp action 模块里实现复利逻辑**,也不要在利息核心里硬编码某种公司行为的日期语义。
|
||||
- 当前 `_0808` 分支的 4 个复利部分平仓修复(见分支对比分析)属于**利息核心**,与本模块无关;合并时利息核心以 `_0808` 为准,corp action 模块独立演进。
|
||||
|
||||
---
|
||||
|
||||
## 5. 待确认 / 下一步
|
||||
|
||||
- [ ] 阶段 0 是否现在落地(加字段 + 改 `DealDividends` + 补「登记日快照」回归测试)?
|
||||
|
||||
Reference in New Issue
Block a user