信用卡分期年化利率计算方法

2012/08/30 20:29
阅读数 2.7K

背景

经常收到各个银行电话推销可以办理小额贷款/信用卡账单分期/万用金, 或者其他乱七八糟的名字的产品. 遂问电销人员, 你们这个最后年化利息多少? 这个时候, 一般销售人员都直接回避这个问题, 美其名曰: “我们不收利息, 我们只收取一定的手续费, 基于您这边的良好信用, 现在您有一笔5万的额度是可以立即提现的, 可以分12期还, 每月只需要XXXX元”

可能不太懂的同学, 听到电销的宣传, 感觉这利率还不算贵, 缺钱急用还挺划算的啊. 有可能直接被套路, 就接受了忽悠, 办理了这个贷款/分期产品.

下面我以浦发银行实际例子来算一下, 类似产品最后年化利率到底是多少.

如上图所示, 是浦发银行的贷款产品(万用金), 可以看到, 提现10000元, 分12期即分12个月还钱, 等额本息的还款方式, 每月需还款929.51元. 初略地看, 你可以会简单的认为这个利率就是, 一共还的钱为929.51*12, 然后借款本金为10000元, 那么年化利率即为: (929.51*12 - 10000)/10000*100%=11.54% 感觉似乎不那么高.

然而, 事实上, 这种算法是有问题的, 因为你借款的本金10000元, 并没有享受到1年的期限, 以后每个月都还了本金呀.

实际年化利率

我们用网上常见的房贷/借款计算器来算一下, 如果按照年化11.54%来计算, 每月的还款情况应该如下, 即每个月只需要等额本息还款886.34, 比929.51元少不少.

而如果每个月还款929.51元的话, 其利率远远不止11.54%, 直接仍然用那个借款计算器大概估计一下. 貌似现有的网上的工具都只能正向算, 即已知利率和贷款本金计算还款计划表, 没有一个工具能从每月还款额反推贷款利率, 初步多次尝试得到如下逼近的结果.

可以看到, 年化利率达到了20.66%, 比之前预想想象中多了太多了.
所以电话销售在推销的时候, 往往不会直接告诉你这个年化利率, 因为太高了, 说了你可能不太会接受.
而这个利率到底是怎么计算来的呢? 为啥会有前后这么大的差别?
实际上, 你借款本金1W并没有享受整年, 而是只享受到了1个月, 因为1个月之后, 你就有归还部分本金(和利息).

推导方法

我们来正向推到一下这个等额本息利率的计算过程.
假设借款总额为A, 月利率为R, 每月还款额为M, 抓住一点, 欠款总额为本金*(1+月利率)则有:

本来是markdown渲染的公式, 无奈结合table转成html之后太丑了, 于是就用截图的方式了, 点开后查看大图.

所以, 能得到第i个月的欠款情况, 上面的公式可以简化一下, 因为被减数M后边的是一个等比数列, 得到第i个月后, 欠款总额为

以上述浦发银行的这个例子为准, 其中A=10000, M=929.51, 代入上面的公式就可以算出R的值.
不太好直接解方程, 自己写了段小代码迭代搜索一下能算出来.

貌似这里能出一道给程序猿的面试题目了, 哈哈. 码农朋友们, 看看有哪些方法能够算出来? 我这边暂时不公布自己写的这段代码, 看看大家有思路? (敲黑板)
后面有空可以写个小程序, 供大家使用.

通过计算得到, 借款10000元, 每月还款额度为929.51元的情况下, 月利率为0.0171.7%, 年化利率即为 20.65%基本上与文首查到的一致. 月利率出来之后, 还款计划表也就自然而然能够出来了.

>>> monthRate = calcMonthRate(12, 10000, 929.51)

>>> print monthRate

0.0172138214111

>>> print monthRate * 12

0.206565856934

>>> schedules = repaymentSchedules(12, 10000, monthRate)

>>> for s in schedules: print s

...

[1, '929.49', '172.14', '757.35', '9242.65']

[2, '929.49', '159.10', '770.39', '8472.26']

[3, '929.49', '145.84', '783.65', '7688.61']

[4, '929.49', '132.35', '797.14', '6891.47']

[5, '929.49', '118.63', '810.86', '6080.61']

[6, '929.49', '104.67', '824.82', '5255.79']

[7, '929.49', '90.47', '839.02', '4416.77']

[8, '929.49', '76.03', '853.46', '3563.31']

[9, '929.49', '61.34', '868.15', '2695.16']

[10, '929.49', '46.39', '883.10', '1812.06']

[11, '929.49', '31.19', '898.30', '913.76']

[12, '929.49', '15.73', '913.76', '-0.00']

期数 还款本息 利息 本金 剩余本金
1 929.51 172.17 757.34 9242.66
2 929.51 159.13 770.38 8472.28
3 929.51 145.87 783.64 7688.64
4 929.51 132.38 797.13 6891.51
5 929.51 118.65 810.86 6080.65
6 929.51 104.69 824.82 5255.84
7 929.51 90.49 839.02 4416.82
8 929.51 76.05 853.46 3563.35
9 929.51 61.35 868.16 2695.19
10 929.51 46.40 883.11 1812.09
11 929.51 31.20 898.31 913.78
12 929.51 15.73 913.78 0.00

可以看出, 上面的还款计划表跟最开始网上通过房贷计算器得到的一致, 我们再来看看, 招行的有个现金分期业务.

上面的分期费率12期, 0.75%(表面的月息=(3270*12-36000)/36000/12), 申请分期36000, 每月还款3270. 通过上面的公式, 我们来看一下实际的费率情况, 月息相当于1.35%, 年利率 16.2%, 比表面的年息(0.75%*12=9%)高不少.

>>> calcMonthRate(12, 36000, 3270)

0.013513565063476562

>>> calcMonthRate(12, 36000, 3270)*12

0.16216278076171875

所以, 朋友们, 不要被表面现象所迷惑. 另外, 码农朋友们, 思考一下前面留出的问题哈, 看看大家都有什么方法来算.
欢迎留言讨论.

附:文中的年 利率计算代码

# 等额本息月供计算,P=贷款总额,nlx=年利率,month=贷款月数     【返回值】A=月供
def debx_calac(P=220500, nlx=0.0605, month=36):
    i = nlx / 12  # 公式里用的为月利率,年利率需要换算为月利率
    n = month
    A = P * (i * ((1 + i) ** n) / (((1 + i) ** n) - 1))  # 等额本息月供计算公式
    return A


# 计算贷款的实际利率(已知月供),P=贷款总额,A=月供,month=贷款月数,【返回值】i=实际利率
def debx_calac_lx(P=220500, A=6713, month=36):
    i = 0
    while i < 100:  # 根据假设利率计算月供和实际月供进行比较,找到实际利率
        i = i + 0.0001
        rA = debx_calac(P, i, month)  # 用假设利率计算月供
        if (int(rA) == int(A)):
            print(rA, A, i)
            return i


# 回报计算,用来计算每月需要付出月供的情况下的总回报和每月回报 P=贷款总额,hbl=预期回报率(年),payback=每月支付月供金额     ,【返回值:】allreback=总收益,monthback=每月收益
def huibaojisuan(P=220500, hbl=0.05, payback=6713):
    allreback = 0
    i = hbl / 12
    monthback = []

    while P > 0:
        sy = P * i  # 计算当月收益
        allreback = allreback + sy  # 总收益

        # P = P - payback + sy       #如果收益能够滚动成本金进行再投资,可以明显降低一些对回报率的需要
        P = P - payback  # 下月可投资本金扣除当月月供

        if P > 0:
            monthback.append((float('%.2f' % P), float('%.2f' % (sy))))
        else:
            monthback.append((0, float('%.2f' % (sy))))

    return allreback, monthback


# 需要多少利率能抵消利息即手续费开销,P=贷款总额,sxf=手续费(或其他一次性成本),nlx=年利率,month=贷款月数  ,【返回值】i=能覆盖成本的回报率
def howmanyRetrunCanbeenough(P=220500, sxf=6615, nlx=0.0605, month=36):
    ykk = debx_calac(P, nlx, month)  # 计算月供
    allCostmoney = sxf + (ykk - P / month) * month  # 计算手续费和全部利息开销之和
    print('allCostmoney {}:'.format(allCostmoney))

    i = 0
    while i < 100:  # 循环寻找最小能覆盖成本的投资收益率
        i = i + 0.001
        hbe, alb = huibaojisuan(P, i, ykk)
        if (hbe > allCostmoney):  # 将总成本和回报进行比较
            print(i)
            return i


if __name__ == '__main__':
    # howmanyRetrunCanbeenough()
    debx_calac_lx(10000, 929.51, 12)
    # 929.0033420430676 929.51 0.2055500000000648

Refer:

[1] 信用卡分期年化利率计算方法

https://www.tanglei.name/blog/the-way-to-calculate-apr.html

[2] 车贷计算.py

https://github.com/djl654321/calc_carcredits/blob/master/%E8%BD%A6%E8%B4%B7%E8%AE%A1%E7%AE%97.py

[3] 随机地买理财,一键算整体回报

http://bit.ly/2uQa97E

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部