两个贷款摊销函数结果不一致:如何让amort.table匹配mortgage输出?
调整financialMath包amort.table函数匹配自定义mortgage函数结果的方案
1. 定位差异核心原因
两个函数结果差异的常见根源集中在三个维度:
- 月供的四舍五入规则:自定义函数通常会将月供四舍五入到分(两位小数),再以此计算每期摊销;部分内置函数可能默认保留更多小数位,导致总利息累计差异。
- 利率转换逻辑:确认是否都采用月复利(抵押贷款标准),比如自定义函数用
月利率=年利率/12,而amort.table可能误将年利率直接用于计算。 - 总期数与最后一期处理:自定义函数可能按整月(25*12=300期)计算,最后一期直接结清剩余本金;amort.table可能存在按实际天数计息或最后一期重新计算的逻辑。
2. 具体调整步骤(以R语言financialMath包为例)
步骤1:核对核心计算公式
先提取自定义mortgage函数的月供计算逻辑,通常标准年金公式为:
# 自定义函数的月供计算示例 P <- 200000 annual_rate <- 0.02 n_years <- 25 monthly_rate <- annual_rate / 12 n_months <- n_years * 12 custom_payment <- round(P * (monthly_rate * (1 + monthly_rate)^n_months) / ((1 + monthly_rate)^n_months - 1), 2)
运行这段代码得到自定义月供值,再对比amort.table默认输出的月供:
library(financialMath) # 先按默认参数调用 default_amort <- amort.table(principal = 200000, interest.rate = 0.02, years = 25, payments = "monthly") default_payment <- default_amort$payment
如果两者月供不一致,优先调整利率参数或四舍五入规则。
步骤2:修正利率与期数参数
- 若amort.table的
interest.rate参数要求输入月利率(而非年利率),则调用时传入interest.rate = 0.02/12,并明确指定期数为300:corrected_amort <- amort.table(principal = 200000, interest.rate = 0.02/12, n.periods = 300, payments = "monthly") - 若函数默认按年复利计算,需强制转换为月复利逻辑(需修改函数内部代码,见步骤3)。
步骤3:修改amort.table的月供四舍五入逻辑
查看amort.table的源码(运行print(amort.table)),找到计算月供的代码段。假设原代码未做四舍五入,添加round(..., 2):
# 修改后的amort.table核心计算部分示例 payment <- round(principal * (interest.rate * (1 + interest.rate)^n.periods) / ((1 + interest.rate)^n.periods - 1), 2)
若无法直接修改包内函数,可复制函数源码到本地,修改后重新定义:
# 复制原函数源码并修改 my_amort.table <- function(principal, interest.rate, n.periods, payments = "monthly") { # 保留原函数其他逻辑 # 修改月供计算行 payment <- round(principal * (interest.rate * (1 + interest.rate)^n.periods) / ((1 + interest.rate)^n.periods - 1), 2) # 保留原函数剩余逻辑 } # 调用修改后的函数 adjusted_result <- my_amort.table(principal = 200000, interest.rate = 0.02/12, n.periods = 300)
步骤4:对齐最后一期处理逻辑
对比两个函数的最后一期数据:
- 若自定义函数最后一期直接结清剩余本金(不单独计算利息),则修改amort.table的最后一期计算,将剩余本金作为当期本金,利息设为0;
- 若自定义函数按剩余本金计算最后一期利息,则确保amort.table采用相同逻辑。
3. 验证调整结果
- 对比月供值:确认修改后的amort.table输出月供与自定义函数完全一致;
- 逐期核对:抽取前3期、中间期、最后3期的本金、利息、剩余本金,确保两者完全匹配;
- 计算总利息:总利息=(月供×总期数)-贷款本金,或逐期利息求和,确认差异消除。
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

