refactor(accrual): referenceNotional→baseNotional, notional统一

- referenceNotional → baseNotional(更短更清晰)
- 新代码统一用 notional(不用 principal):
  QuantLib/Strata 对 swap leg 用 notional 是业界标准
- DB字段(InterestPrincipalFix等)保持不动(legacy)
- 注释标注 legacy 对照(orginPv/originalPv/dynomicPrincipal)

验证: 编译0错误, 7影子测试全过, 全量523测试7失败(基线一致)。
This commit is contained in:
hjhan
2026-08-12 10:20:13 +08:00
parent ce6c0812e1
commit 2f7caa7a1f
3 changed files with 153 additions and 23 deletions
@@ -7,12 +7,12 @@ namespace YLErp.Modules.SwapModule.Accrual;
/// 融资腿计息编排层——纯数学部分(替换 SwapDealService 内 CalcDaily* 家族的纯计算)。
///
/// 命名规范(对齐 QuantLib / Strata):
/// - notional/principal → 计息基数
/// - notional → 计息名义本金(不用 principalswap leg 用 notional 是业界标准)
/// - accrued → 累计应计利息
/// - unwindFraction → 平仓比例(0~1
/// - realizedInterest → 历史已结利息(legacy: consumedInterest
/// - referenceNotional → 差分公式参考本金legacy: orginPv/originalPv
/// - accrualBasis → 逐段滚动的计息基数(legacy: dynomicPrincipal
/// - baseNotional → 差分公式基数legacy: orginPv/originalPv
/// - accrualBasis → 逐段滚动的计息基数(legacy: dynomicPrincipal=dynamicPrincipal typo
/// </summary>
public static class FundingLegAccrual
{
@@ -21,23 +21,18 @@ public static class FundingLegAccrual
/// <summary>
/// 单利日终计息(替换 CalcDailySimpleInterestByEod 的纯数学部分)。
/// </summary>
/// <param name="priorAccrued">上一日终累计应计利息。</param>
/// <param name="priorNotional">上一日终计息基数。</param>
/// <param name="notional">当前持仓名义本金。</param>
/// <param name="unwindFraction">平仓比例(EOD 恒为 1)。</param>
/// <param name="referenceNotional">差分公式参考本金(legacy: orginPv)。</param>
public static InterestResult AccrueSimpleEod(
decimal priorAccrued,
decimal priorNotional,
decimal notional,
decimal unwindFraction,
decimal referenceNotional,
decimal baseNotional,
FundingLegRate rate,
AccrualPolicy policy,
DateTime eodDate,
AccrualTrace? trace = null)
{
var basis = priorNotional + notional - referenceNotional;
var basis = priorNotional + notional - baseNotional;
var displayBasis = basis * unwindFraction;
var allInRate = rate.AllInRate;
@@ -62,14 +57,14 @@ public static class FundingLegAccrual
/// <summary>
/// 复利日终计息(替换 CalcDailyCompoundInterestByEod 的纯数学部分)。
/// 重置日:basis = notional + priorAccrued × remainingFraction。
/// 非重置日:basis = priorNotional + notional - referenceNotional。
/// 非重置日:basis = priorNotional + notional - baseNotional。
/// </summary>
public static InterestResult AccrueCompoundEod(
decimal priorAccrued,
decimal priorNotional,
decimal notional,
decimal unwindFraction,
decimal referenceNotional,
decimal baseNotional,
FundingLegRate rate,
AccrualPolicy policy,
bool isResetDay,
@@ -79,7 +74,7 @@ public static class FundingLegAccrual
{
var basis = isResetDay
? notional + priorAccrued * remainingFraction
: priorNotional + notional - referenceNotional;
: priorNotional + notional - baseNotional;
var displayBasis = basis * unwindFraction;
var allInRate = rate.AllInRate;
@@ -105,11 +100,6 @@ public static class FundingLegAccrual
/// 单利多日计息(替换 CalcDailySimpleInterest 的纯数学部分)。
/// 本金全程恒定,按重置日分段取利率。
/// </summary>
/// <param name="priorAccrued">上一日终累计应计利息。</param>
/// <param name="notional">计息基数(差分,全程恒定)。</param>
/// <param name="unwindFraction">平仓比例。</param>
/// <param name="segmentRates">分段利率表:(段起日, all-in利率),按日期升序。</param>
/// <param name="priorValueDate">上一日终归档日(只算此日之后的利息)。</param>
public static InterestResult AccrueSimplePeriod(
decimal priorAccrued,
decimal notional,
@@ -157,10 +147,6 @@ public static class FundingLegAccrual
/// 复利多日计息(替换 CalcDailyCompoundInterest 的纯数学部分)。
/// 从 startDate 到 endDate 全程重放,每个重置日把累计利息并入本金。
/// </summary>
/// <param name="notional">本次平仓名义本金(已按 unwindFraction 缩放)。</param>
/// <param name="resetCarryInterest">末日重置时的存量利息(非末日传 0)。</param>
/// <param name="realizedInterest">历史已结利息(legacy: consumedInterest)。</param>
/// <param name="unwindFraction">平仓比例。</param>
public static InterestResult AccrueCompoundPeriod(
decimal notional,
IReadOnlyList<(DateTime StartDate, decimal Rate)> segmentRates,
@@ -1605,7 +1605,7 @@ namespace YLErp.Modules.SwapModule
priorNotional: preEodPosition.TdInterestPrincipal,
notional: posiPrincipal,
unwindFraction: closePercent,
referenceNotional: orginPv,
baseNotional: orginPv,
rate: legRate,
policy: accrualPolicy,
eodDate: endDate,