使用numpy_financial时Excel与Python贷款摊销计算差异排查
问题原因与解决方法
核心差异原因:利率单位未转换
你遇到的结果差异本质是利率参数的单位错误:
- numpy_financial库的所有摊销计算函数(
pmt/ipmt/ppmt)要求输入的是每期的小数利率(比如4.5%年利率需转为0.045); - 你直接使用了输入的百分比数值4.5作为利率,导致计算时用
1500000 * 4.5得出首期利息6750000€,完全偏离实际逻辑。
而Excel的PMT函数会自动识别输入的百分比格式(或你输入的0.045),用正确的小数利率计算,因此得到合理的还款额。
解决步骤
- 转换利率单位:将输入的百分比利率除以100,转为小数形式;
- 对齐参数符号:numpy_financial对现金流方向有符号要求,贷款金额(pv)通常设为负数(代表现金流出),确保计算结果符号与Excel一致;
- 匹配还款频率:你的场景是按年还款,无需额外转换利率和期数;若为月度/季度还款,需将年利率除以还款次数,期数乘以还款次数。
修正后的代码示例
import numpy_financial as npf # 原始参数 input_rate = 4.5 # 年利率(百分比) loan_term_years = 10 loan_amount = 1500000 # 参数转换 rate = input_rate / 100 # 转为小数年利率 nper = loan_term_years # 按年还款,总期数=年数 pv = -loan_amount # 贷款金额设为负,匹配现金流方向 # 计算等额本息每期还款额 annual_payment = npf.pmt(rate, nper, pv) print(f"每期固定还款额:{annual_payment:.2f}€") # 输出189568.23€ # 计算首期利息与本金 first_interest = npf.ipmt(rate, 1, nper, pv) first_principal = npf.ppmt(rate, 1, nper, pv) print(f"首期利息:{first_interest:.2f}€") # 输出67500€ print(f"首期本金:{first_principal:.2f}€") # 输出122068.23€
额外验证点
- 后续期数的利息计算:修正后,Python计算的第二期利息应为
(1500000 - 122068.23) * 0.045 ≈ 62007.07€,与Excel结果一致; - 等额本金(Italian)计算:同样需要注意利率转换,每期本金固定为
1500000 / 10 = 150000€,利息按剩余本金乘以小数利率计算,即可与Excel对齐。
内容的提问来源于stack exchange,提问作者Jfel
相关产品推荐
相关产品推荐

