refactor(accrual): 拆分FundingLegAccrual→SimpleInterestAccrual/CompoundInterestAccrual
单利与复利语义完全不同(单利本金恒定/复利重置日并本金), 拆成两个独立静态类,各自只含自己的方法: SimpleInterestAccrual: - AccrueEod (原AccrueSimpleEod) - AccruePeriod (原AccrueSimplePeriod) CompoundInterestAccrual: - EodBasis (原CompoundEodBasis) - AccrueEod (原AccrueCompoundEod) - AccruePeriod (原AccrueCompoundPeriod) 方法名去掉Simple/Compound前缀(类名已携带类型),消除冗余 SwapModule零回归(7基线/510通过)
This commit is contained in:
@@ -13,7 +13,7 @@ using YLErp.Core.Interest;
|
||||
namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
{
|
||||
/// <summary>
|
||||
/// 影子测试:CalcDailyCompoundInterestByEod(旧逐日循环)vs FundingLegAccrual.AccrueCompoundEod(新纯函数)。
|
||||
/// 影子测试:CalcDailyCompoundInterestByEod(旧逐日循环)vs CompoundInterestAccrual.AccrueEod(新纯函数)。
|
||||
/// 构造同一组参数,两套实现并行跑,断言结果一致(到分)。
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
@@ -99,7 +99,7 @@ namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
var rate = FundingLegRate.Fixed(FixedRate);
|
||||
var policy = new AccrualPolicy(AccrualBoundary.Both, true, 7, AnnualDays, true);
|
||||
var remainingPercent = Math.Max(0m, Math.Min(1m, Notional / Notional));
|
||||
var result = FundingLegAccrual.AccrueCompoundEod(
|
||||
var result = CompoundInterestAccrual.AccrueEod(
|
||||
50_000m, Notional, Notional, 1m, rate, policy,
|
||||
isResetDay: true, remainingPercent, EodDate);
|
||||
|
||||
@@ -131,7 +131,7 @@ namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
// 新方法
|
||||
var rate = FundingLegRate.Fixed(FixedRate);
|
||||
var policy = new AccrualPolicy(AccrualBoundary.Both, true, 7, AnnualDays, true);
|
||||
var result = FundingLegAccrual.AccrueCompoundEod(
|
||||
var result = CompoundInterestAccrual.AccrueEod(
|
||||
30_000m, Notional, Notional, 1m, rate, policy,
|
||||
isResetDay: false, 0m, nonResetDate);
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ using YLErp.Modules.SwapModule.Accrual;
|
||||
namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
{
|
||||
/// <summary>
|
||||
/// 影子测试:CalcDailyCompoundInterest(旧逐日循环)vs FundingLegAccrual.AccrueCompoundPeriod(新分段纯函数)。
|
||||
/// 影子测试:CalcDailyCompoundInterest(旧逐日循环)vs CompoundInterestAccrual.AccruePeriod(新分段纯函数)。
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class CompoundPeriodShadowTest
|
||||
@@ -86,7 +86,7 @@ namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
(StartDate.AddDays(7), allInRate),
|
||||
(StartDate.AddDays(14), allInRate),
|
||||
};
|
||||
var result = FundingLegAccrual.AccrueCompoundPeriod(
|
||||
var result = CompoundInterestAccrual.AccruePeriod(
|
||||
notional: Notional,
|
||||
segmentRates: segRates,
|
||||
startDate: StartDate,
|
||||
@@ -133,7 +133,7 @@ namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
(StartDate.AddDays(7), allInRate),
|
||||
(StartDate.AddDays(14), allInRate),
|
||||
};
|
||||
var result = FundingLegAccrual.AccrueCompoundPeriod(
|
||||
var result = CompoundInterestAccrual.AccruePeriod(
|
||||
notional: Notional * closePct,
|
||||
segmentRates: segRates,
|
||||
startDate: StartDate,
|
||||
@@ -177,7 +177,7 @@ namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
(StartDate.AddDays(7), allInRate),
|
||||
(StartDate.AddDays(14), allInRate),
|
||||
};
|
||||
var result = FundingLegAccrual.AccrueCompoundPeriod(
|
||||
var result = CompoundInterestAccrual.AccruePeriod(
|
||||
notional: Notional,
|
||||
segmentRates: segRates,
|
||||
startDate: StartDate,
|
||||
|
||||
@@ -12,7 +12,7 @@ using YLErp.Derivatives.Interest;
|
||||
namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
{
|
||||
/// <summary>
|
||||
/// 影子测试:CalcDailySimpleInterest(旧逐日循环)vs FundingLegAccrual.AccrueSimplePeriod(新分段纯函数)。
|
||||
/// 影子测试:CalcDailySimpleInterest(旧逐日循环)vs SimpleInterestAccrual.AccruePeriod(新分段纯函数)。
|
||||
/// </summary>
|
||||
[TestClass]
|
||||
public class SimplePeriodShadowTest
|
||||
@@ -106,7 +106,7 @@ namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
// 旧代码差分: dynomicPrincipal = preEod.TdInterestPrincipal(=0) + posiPrincipal - orginPv = 0
|
||||
var segRates = new List<(DateTime, decimal)> { (StartDate, Spread) };
|
||||
var accrualPrincipal = 0m + Notional - Notional; // 差分 = 0
|
||||
var result = FundingLegAccrual.AccrueSimplePeriod(
|
||||
var result = SimpleInterestAccrual.AccruePeriod(
|
||||
priorAccrued: 0m,
|
||||
notional: 0m,
|
||||
unwindFraction: 1m,
|
||||
@@ -152,7 +152,7 @@ namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
// 差分本金 = preEod.TdInterestPrincipal + posiPrincipal - orginPv
|
||||
var accrualPrincipal = Notional + Notional - Notional;
|
||||
var segRates = new List<(DateTime, decimal)> { (StartDate, Spread) };
|
||||
var result = FundingLegAccrual.AccrueSimplePeriod(
|
||||
var result = SimpleInterestAccrual.AccruePeriod(
|
||||
priorAccrued: 200_000m * 0.5m,
|
||||
notional: accrualPrincipal,
|
||||
unwindFraction: 0.5m,
|
||||
@@ -215,7 +215,7 @@ namespace UnitTestProject.Modules.SwapModule.Accrual
|
||||
|
||||
// 差分本金 = preEod.TdInterestPrincipal + posiPrincipal - orginPv
|
||||
var accrualPrincipal = Notional + Notional - Notional;
|
||||
var result = FundingLegAccrual.AccrueSimplePeriod(
|
||||
var result = SimpleInterestAccrual.AccruePeriod(
|
||||
priorAccrued: 200_000m * closePct,
|
||||
notional: accrualPrincipal,
|
||||
unwindFraction: closePct,
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace YLErp.Modules.SwapModule
|
||||
/// 【同日多次部分平仓 · unwind 基数滚动表征测试】
|
||||
/// ============================================================================
|
||||
/// 背景:unwind 计息基数公式 basis = priorNotional + notional - baseNotional
|
||||
/// (FundingLegAccrual / CalcDailyCompoundInterestByEod 同源),其中
|
||||
/// (CompoundInterestAccrual / CalcDailyCompoundInterestByEod 同源),其中
|
||||
/// - priorNotional = 上一日终归档 eod_swap_position.TdInterestPrincipal
|
||||
/// - baseNotional = orginPv = ResolveUnwindPreviousNotional(lastEod)(上一日终浮动端名义本金)
|
||||
/// - notional = 当前持仓名义本金(posiNotionalValue,来自实时持仓)
|
||||
|
||||
Reference in New Issue
Block a user