hjhan
|
e2431e9d44
|
refactor(accrual): 计息类型整体迁入 DAL——新增 Accrual/InterestMath,删 Core 未接线孤儿
搬迁(算法体逐字未动,仅换命名空间与归属):
- SwapInterest.Round/AccrualDays/FundingLegPrecision + AccrualBoundary/InterestResult
→ YLErpDAL/Modules/SwapModule/Accrual/InterestMath.cs
- AccrualTrace → Accrual/AccrualTrace.cs(被迫同迁:其 MarkStart 引用 AccrualBoundary,
Core 不能反向依赖 DAL)
- 引用切换:Simple/CompoundInterestAccrual、AccrualPolicy、SwapCalcTrace、SwapDealService
(保留 using YLErp.Derivatives.Interest——IIndexFixer/IndexFixerBase 留 Core)
删除(零生产引用,孤儿清零):
- Core:SwapInterest.cs 算法方法(AccrueSimple/AccrueCompoundInArrears/ApplyUnwind/
AccrueUnrealized/ToInterestRate,未接线且与 DAL 生产实现舍入/rollover 口径已分叉)、
AccrualContext.cs、InterestRate.cs
- DAL:AccrualState.cs(零引用死类)
- 测试:SwapInterest_CompoundInArrears_RolloverTimingTests.cs(仅测已删原语)
验证:两解决方案 Rebuild 0 错误;磁盘 SwapInterest. 残留 0;影子/分红/场景 86/86 通过
(含 Accrual 3 影子对账、Margin 影子、divPower 新增 AutoUnwindMultiPartial)。
注:AccrualContext 默认精度 11 与生产 12 的分叉隐患随删除一并消除;
已删原语若将来重建须先补对账测试,勿凭记忆复原(ARCHITECTURE.md 已留警告)。
|
2026-08-14 15:31:04 +08:00 |
|
hjhan
|
b2cbbff9e7
|
refactor(margin): 删除未接线的保证金死代码预留抽象
- 删除 MarginAccount 整类、IMarginResolver 子树(MarginForm/CashMargin/CreditMargin/GuaranteeMargin)、MarginBalance 只读 struct:全仓零生产实例化,结构上无法适配 CalcMarginInterest 的盘中差分模型。
- 删除仅覆盖上述死代码的 MarginLegTest(不损失活代码覆盖率)。
- 保留被 CalcMarginInterest 实际使用的 MarginCalc/MarginModes 活代码。
- 同步修剪 ARCHITECTURE.md 树图与对账表,清理 AccrualContext.cs 过期注释。
|
2026-08-14 08:55:37 +08:00 |
|
hjhan
|
dea9c4cba5
|
docs(margin): 修复保证金计息重构后的过时文档与注释
按最新代码(CalcMarginInterest 已接生产、orginPv hack 已删、MarginAccount 未接线、保证金精度=12)修正:
- 删除 orginPv 维度重映射的孤儿 summary(方法已删)
- SwapDealService 注释:去掉 orginPv(InitSwapDealInterest)/保证金腿 引用
- SwapInterest/AccrualContext/InterestRate:去掉 Precision=11 是"保证金腿"、"保证金场景"等错误归因(保证金实际跑精度12)
- MarginAccount/MarginBalance:标注"尚未接线",生产入口指向 CalcMarginInterest,去掉"余额×利率×天数"过度简化
- 测试注释:去掉"无 orginPv/差分"(盘中保留差分)、"提交2 待切换"(已完成)
仅文档/注释,零代码行为变化。
|
2026-08-13 10:58:47 +08:00 |
|
hjhan
|
ff937f24e7
|
refactor(accrual): EOD去退化差分——删除baseNotional死参数
EOD路径 orginPv≡posiPrincipal(调用点line1091/1096实证),notional==baseNotional恒成立,
差分项 notional-baseNotional 恒为0,baseNotional 是死参数。
简化:
- AccrueSimpleEod: 删 notional+baseNotional 两参数,basis=priorNotional 直赋值
- AccrueCompoundEod: 删 baseNotional 参数,非重置日 basis=priorNotional
- SimpleEodBasis 整个删除(不再需要)
- CompoundEodBasis 去掉 baseNotional 参数
- EodContext trace 去掉 baseNotional
- 差分注释块删除(EOD不再有差分)
差分逻辑 notional-baseNotional 只该存在于 unwind 专用路径(Period函数本就没有baseNotional)
净减20行(18增/38删),SwapModule零回归(7基线/508通过/8跳过)
|
2026-08-12 10:58:53 +08:00 |
|
hjhan
|
3b02440979
|
refactor(accrual): 接线CalcDailyCompoundInterestByEod→AccrueCompoundEod + 全链路Trace
- AccrualTrace新增Segment(分段区间/天数/基数/利率)与EodContext(重置日/平仓比例/基数分量)语义方法
- AccrueSimplePeriod/AccrueCompoundPeriod补全AccrualTrace?参数:MarkStart→逐段Segment→复利Rollover→Unwind→MarkEnd
- CalcDailyCompoundInterestByEod内部实现下沉至FundingLegAccrual.AccrueCompoundEod纯函数
删除调试垃圾LogFactory('test').Error,取率/重置日/remainingFraction逻辑保留
- flowEvent.InterestPrincipal/FloatRate副作用在调用方保留(下游EOD播种次日TdInterestPrincipal)
- 全量SwapModule测试零回归(7基线失败/508通过/8跳过)
|
2026-08-12 10:37:52 +08:00 |
|
hjhan
|
3f194f7ccc
|
fix(accrual): Round收口到SwapInterest.Round + 复利分段边界修复
3项修复:
1. SwapInterest.Round 从 private 改为 public:
所有计息路径收口到一处, FundingLegAccrual 不再用裸 Math.Round
2. ApplyUnwind 精度警告:
注释标注'资金腿务必传 FundingLegPrecision=12', 默认11是易忘的坑
3. AccrueCompoundPeriod 分段边界修复(根因):
旧bug: 中间段 IncludeEnd=true 导致重置日利息用了旧本金
修复: 中间段 IncludeEnd=false(半开区间), 重置日归下一段用新本金
对齐旧逐日循环语义: 重置日先更新本金再算息
同时: 中间值不Round(对齐旧代码只在最终输出Round一次)
清理: 删除 SwapInterestAccrueCompoundInArrearsTest 半成品残留
验证: 编译0错误, 7个影子测试全过, 全量520测试7失败(基线一致)。
|
2026-08-12 09:59:53 +08:00 |
|
hjhan
|
5dc8bdbf9e
|
refactor(interest): 计息 trace 命名对齐业界最佳实践
- InterestTrace → AccrualTrace:追踪对象是"计息过程"而非泛指的 Interest,与仓库
既有的 SwapCalcTrace(-Trace 后缀约定) 及 AccrualContext/AccrualBoundary/AccrualPolicy
家族一致;AccrualTrace 经 SwapCalcTrace.Write 常驻落盘,二者职责分清(收集器 vs 落盘通道)。
- InterestStep → AccrualTraceEvent、InterestTraceEntry → AccrualTraceEntry:
条目类别对应 QuantLib/Strata 的"事件"概念(AccrualTraceEvent),命名自描述。
- SwapCalcTrace.Persist → Write:"Persist" 易误读为落库持久化;此处只是写入日志通道,
且类内已有私有 Record(string),故用 Write 避免歧义。
纯改名、数值逻辑零改动;YLErpDAL + UnitTestProject 编译 0 错。
|
2026-08-12 07:05:41 +08:00 |
|
hjhan
|
be3be877ec
|
refactor(interest): 引入 AccrualContext 并将 AccrueCompound 重命名为 AccrueCompoundInArrears
1. 新增 AccrualContext 只读值对象,把 annualDays/precision/trace 三个"与金额利率无关"
的横向参数打包为上下文成员。计息纯函数只吃一个 ctx,签名去噪、可读性提升;
ctx 为只读值对象(非类的实例/静态字段),不破坏纯函数(线程安全、可重入、可测)。
trace 因此成为"传入上下文的成员"而非散落参数,满足"默认成员而非参数"的诉求。
2. AccrueCompound → AccrueCompoundInArrears:精确表达 OIS/SOFR/FR007 的
compounded-in-arrears 语义(每子区间取定盘、段末滚入本金),与
InterestRate.Compounding.Compounded 闭式分支(TRS 下死路径)一刀两断、不再混淆。
纯增量、数值逻辑不变;YLErpDAL + UnitTestProject 编译 0 错 0 警;FR007 两段切换场景
实跑 trace 与旧版数值完全一致。
|
2026-08-12 06:13:38 +08:00 |
|
hjhan
|
fba87bd7cc
|
feat(interest): AccrueCompound 支持每段独立利率 + 发射 Reset/Rollover trace
重构为按重置日切段、每段可有独立利率(resetSchedule),适配 FR007 浮动逐段取价
(取价仍在编排层,原语只吃一个数,与 QuantLib/Strata 同范);trace 记录
重置日前后利率切换与段末并本金(本金增加),完整覆盖"重置日前后/利率切换/本金增减"。
|
2026-08-12 06:05:02 +08:00 |
|
hjhan
|
03861ea369
|
feat(interest): 新增 InterestTrace 结构化追踪收集器
纯值对象(零日志依赖):计息纯函数把"发生了什么"记录为语义化条目
(Day/ResetBefore/ResetAfter/Rollover/Unwind),由适配器统一经 SwapCalcTrace
常驻落盘。ToString 产出稳定可 diff 的逐行文本,新旧引擎同一笔交易可直接 diff
定位"是计算变了还是重构引入漂移"。
|
2026-08-12 06:05:01 +08:00 |
|
hjhan
|
39ec71f268
|
refactor(interest): SwapInterest 计息数学收敛为 InterestRate,新增资金腿精度常量
引入 ToInterestRate 入口把 TRS 利率收敛为通用原语;提取 FundingLegPrecision=12
公共常量,消除 SwapDealService 与 FundingLegAccrual 的重复定义。
|
2026-08-12 05:36:01 +08:00 |
|
hjhan
|
aff540801c
|
feat(interest): 新增通用利息原语 InterestRate(与互换解耦)
单利/复利/连续复利收敛为 Compounding 一个 switch 分支,利息计算不再住在
SwapModule/互换词汇里,谁需要算息都能直接用。连续复利仅 e^(r·t) 一行。
|
2026-08-12 05:36:01 +08:00 |
|
hjhan
|
250c41b925
|
refactor(interest): 抽取 IIndexFixer 取价接缝 + 清理固定值腿错误测试
为后续拆三类腿做准备,新增 FR007 取价的独立接口层(参考 QuantLib IborIndex
分层),本次零生产代码改动,全部为新增小文件。
新增文件(取价接缝,供后续 SwapDealService 6 处 inline 取价迁移用):
- Framework/YLErp.Core/Interest/IIndexFixer.cs
接口定义:给定取价日和标的代码返回当日利率,取价与计息解耦
- Framework/YLErp.Core/Interest/IndexFixerBase.cs
取价日计算工具:收敛原散落 6 处的 GetNonHolidayDefore(date.AddDays(rule))
- YLErpDAL/Modules/SwapModule/Fr007IndexFixer.cs
生产实现 + GetFixingOrThrow 辅助方法,独立文件便于单测
测试清理(删除基于错误假设的测试):
- 删除 SwapFixedInterestLegClosePercentBugTest.cs 整个文件
该文件假设'固定值腿利息应随平仓比例线性缩放',但固定值是合同写死的、
永远不随平仓比例变化。d1badfe4 的'修复'本身才是错的,当前分支已正确回退
- 修正 SwapUnwindPrepayPrincipalBugTdd.cs 固定值测试方法
断言从'应=Fix×0.5'改为'恒=Fix不随比例变化',对齐正确的业务定义
已知失败(非本次引入,留待后续与拆腿一起修):
- BondTrsAutoSwapScenarioTest 的 AS_001/004/008/009/010/011 共 6 个
原因:SaveAutoSwapDeal 直接调 AddClientCashInCashOut(非virtual)绕过
AddClientCash(virtual)封装,无库环境抛'客户信息未找到'。
从 096d2609 引入时即失败,需 AddClientCashInCashOut 加 virtual + 客户数据
mock,与拆腿那次可测性改造一起做
|
2026-08-10 18:01:37 +08:00 |
|
hjhan
|
d78d5a46c4
|
feat(interest): 新增 TRS 利息腿纯函数库 SwapInterest
独立于 SwapDealService / SwapEodPositionService 的纯函数计息层:无副作用、
同 input 同 output,正交轴(算头算尾 / 单利复利 / unwind / 待实现收益)各自独立。
术语采用金融标准 Unwind / Realized / Unrealized。纯新增零接入核心计息逻辑,
待 Excel 对账确认"绿而不错"后 pilot 替换。
|
2026-08-09 16:07:27 +08:00 |
|