贷款等额本金与等额本息还款计算器python3实现
等额本息还款计算逻辑
1、等额本息还款法每期应还额(月供)相等,计算公式为:
P
=
i
∗
(
1
+
i
)
n
(
1
+
i
)
n
−
1
∗
C
P = \frac{i*(1+i)^n}{(1+i)^n-1}*C
P=(1+i)n−1i∗(1+i)n∗C
P:每期应还额
i:月利率 = 年利率 / 12
n:期数
C:本金
2、计算出每期应还额后再计算每期应还利息和应还本金:
每期应还利息 = 剩余本金余额 * 月利率
每期应还本金 = 每期应还额 - 每期应还利息
等额本金还款计算逻辑
1、计算等额本金每期应还本金:
每期应还本金 = 本金 / 期数
2、计算每期应还利息和每期应还额
每期应还利息 = 剩余本金余额 * 月利率
每期应还额 = 每期应还本金 + 每期应还利息
python3计算等额本息与等额本金还款计划
import pandas as pd
class financeCalculator():
def __init__(self,Corpus,numOfPeriod,Interest):
'''3个入参:本金 / 期数 / 利率(年利率)'''
self.Corpus = Corpus
self.numOfPeriod = numOfPeriod
self.Interest = Interest
def calPayPerPeriod(self):
'''等额本息计算每期还款额的公式'''
r = self.Interest / 12 / 100
return r * (1+r)**self.numOfPeriod * self.Corpus / ((1+r)**self.numOfPeriod - 1)
def averageCorpusPlusInterest(self):
'''计算等额本息还款计划表'''
interestList,paidCorpus,unpaidCorpus = [],[],[]
r = self.Interest / 12 / 100
for i in range(self.numOfPeriod):
balance = self.Corpus - sum(paidCorpus)
payInte = balance * r
interestList.append(payInte)
payPerPeriod = self.calPayPerPeriod()
paidCorpus.append(payPerPeriod - payInte)
unpaidCorpus.append(balance)
unpaidCorpus = unpaidCorpus[1:] + [0]
df = pd.DataFrame({'期数':list(range(1,self.numOfPeriod+1)),'月供':[payPerPeriod]*self.numOfPeriod,
'月供本金':paidCorpus,'月供利息':interestList,'本金余额':unpaidCorpus})
df = df.set_index('期数').round(2).reset_index()
summary = ['总计',round(df['月供'].sum(),2),round(df['月供本金'].sum()),
round(df['月供利息'].sum(),2),'--']
df = df.append(pd.Series(summary,index=df.columns),ignore_index=True)
return df
def averageCorpus(self):
'''计算等额本金还款计划表'''
paidCorpus,unpaidCorpus,interestList,payPerPeriod = [],[],[],[]
r = self.Interest / 12 / 100
for i in range(self.numOfPeriod):
balance = self.Corpus - sum(paidCorpus)
payInte = balance * r
unpaidCorpus.append(balance)
paidCorpus.append(self.Corpus / self.numOfPeriod)
interestList.append(payInte)
payPerPeriod.append(self.Corpus / self.numOfPeriod + payInte)
unpaidCorpus = unpaidCorpus[1:] + [0]
df = pd.DataFrame({'期数':list(range(1,self.numOfPeriod+1)),'月供':payPerPeriod,
'月供本金':paidCorpus,'月供利息':interestList,'本金余额':unpaidCorpus})
df = df.set_index('期数').round(2).reset_index()
summary = ['总计',round(df['月供'].sum(),2),round(df['月供本金'].sum()),
round(df['月供利息'].sum(),2),'--']
df = df.append(pd.Series(summary,index=df.columns),ignore_index=True)
return df
调用例子
fc = financeCalculator(6000,3,24)
fc.averageCorpusPlusInterest()
fc.averageCorpus()