累积计算 定投带来的收益
数字职场
本期知识:累积计算
知识运用:会计软件、管理软件等
本期题目:一个人计划参加20年的基金定投,每月定投500元,申购手续费为1.5%,假设基金平均每年收益率5%,每5年赎回10000元,赎回手续费为0.5%,20年后资产是多少元?你能编程算出来?
题目是今年来年轻人比较关注的基金定投,非常生活化。根据题目的意思,我们知道每月的实际购买基金的投入是500×(1 - 0.015) = 492.5元,而年收益率为5%的话,则月收益率为0.42%,这样如果从2010年1月开始计算的话,结果如下:
2010年1月份 492.5元
2010年2月份 492.5 ×(1 + 0.0042) + 492.5
2010年3月份 2010年2月份的资金总和 ×(1 + 0.0042) + 492.5
2010年4月份 2010年3月份的资金总和 × (1 + 0.0042) + 492.5
……
考虑到每5年赎回10000元,则只需要在满5年的时候从总资金中去除10000元,然后再进行后续的累积计算即可。这样的计算在数学上处理起来很麻烦,但编程算起来就简单多了。
思路1:使用Java
本题的难点在于两点:1.收益计算;2.赎回计算。
对于收益的计算来说,我们将年度收益率近似地折算成月收益率0.42%,按照前面的介绍,每月计算收益率,然后将计算出的总资产用于下月的收益计算。而对于赎回来说,每满5年(60个月)则从本金中扣除10000元,同时扣除0.5%的手续费以后,用剩余的总资金用于后续的收益计算。代码如下所示:
int months = 20 * 12; //20年的月份
int money = 500; //每月定投数量
int outMoney = 10000; //每次赎回钱数
int outMonths = 5 * 12; //赎回间隔月数
double d1 = 0.0042; //月收益率
double d2 = 0.015; //定投手续费
double d3 = 0.005; //赎回手续费
double totalMoney = 0;//总值
for(int i = 0;i < months;i++){
//每满5年赎回10000元
if(i != 0 && (i % outMonths == 0)){
totalMoney -= outMoney * (1 + d3);
}
totalMoney = totalMoney * (1 + d1) + money * (1 - d2);
System.out.println(totalMoney);
}
思路2:使用VB
除了使用Java语言,也可以使用VB语言,设计思路上相同。关键代码如下所示(完整代码下载地址:http://www.icpcw.com/bzsoft):
months = 20 * 12
money = 500
outMoney = 10000
outMonths = 5 * 12
d1 = 0.0042
d2 = 0.015
d3 = 0.005
totalMoney = 0
For i = 0 To months - 1
'每满5年赎回10000元
If (i <> 0 And (i Mod outMonths = 0)) Then
totalMoney = totalMoney - outMoney * (1 + d3)
End If
totalMoney = totalMoney * (1 + d1) + money * (1 - d2)
Next i
MsgBox "总收益:"& totalMoney
实际应用
累积计算是很多软件的基本功能,在会计软件和管理软件中常常被用到。例如存贷款利率计算、房贷(在实际的银行贷款计算中,由于利率变动等因素,实际的计算过程要比想象中的还要复杂,如果再考虑到提前还款等因素,则会更加复杂),税务管理系统中的纳税额计算以及滞纳金计算等都大量使用了累积计算。大家常见的理财软件,例如理财计算器等,也要用到累积计算,可以说在生活中,累积计算无处不在。
露一手
上次的挑战题目,很多编程爱好者踊跃参与,其中来自北京的赵昆,非常耀眼,他设计的代码考虑了非管理员账号的权限问题,考虑非常周到。我们将给予赵昆现金奖励。