金融数值计算系列:2连续复利


#1

情景一:年初存入银行100块钱,银行承诺利率12%。于是年末能拿到112块钱。
这里的12块钱就是利息, 12% 就是实际利率。

情景二:年初存入银行100块钱,银行承诺利率12%。聪明的人发现一个漏洞(假设半年就是12%/2),银行承诺12%,也就是半年利率可记为6%。然后当存入100块半年后,取出来106块钱,接着转身去另一个柜员处存入106块半年,期末将得106*(1+6%)=112.36白白多得3毛6。这里的实际利率就是 12.36%

情景三:年初存入银行100块钱,银行承诺利率12%。更加聪明的人把100块钱存取了三次,就是100*(1+4%)^3=112.4864比聪明的人还多得1毛2分6厘4。此时的实际利率是 12.4864%

这里银行承诺的就是名义利率,而实际所得的是实际利率。(当然现实生活中的商业银行会把半年利率调低,而不是单纯的用一年的利率除以期数。)

而后面两种情景的计息方式为 复利。俗称利滚利。不要以为利滚利就能滚上天,有一个条件限制住了它,叫名义利率。随着存取次数的不断增加,每一个期数内的利率也在逐渐减小。现在把计息次数扩大到∞,实际利率就变成了(1+12%/∞)^∞,而这玩意计算出来就是e^12%。

see this: https://www.zhihu.com/question/21900193

###################################################################
以下code展示的是连续复利条件下的现金流折现,可以与前一code对比。在连续复利的条件下,现金流折现的结果要小一些。
see: 金融数值计算系列:1现金流折现模型

function cash_flow_pv(cflow_times, cflow_amounts, r)

    PV=0.0   
    
    for t in 1:length(cflow_times)
    PV += cflow_amounts[t] * exp(-r*cflow_times[t])     
    end   
    return PV 
end 

cflow_amounts_examp = [-100 75 75]
cflow_times_examp = [0 1 2]
r_examp = 0.1

ans1 = cash_flow_pv(cflow_times_examp, cflow_amounts_examp, r_examp)
ans2 = cflow_amounts_examp * exp.(-r_examp*cflow_times_examp')

#2

纯循环的话这样可能快点

function cash_flow_pv(cflow_times, cflow_amounts, r)
    PV=0.0   
    @inbounds @simd for t in 1:length(cflow_times)
        PV += cflow_amounts[t] * exp(-r*cflow_times[t])     
    end   
    return PV 
end 

cflow_amounts_examp = [-100 75 75]
cflow_times_examp = [0 1 2]
r_examp = 0.1

ans1 = cash_flow_pv(cflow_times_examp, cflow_amounts_examp, r_examp)
ans2 = cflow_amounts_examp * exp.(-r_examp*cflow_times_examp')

不过感觉直接broadcast就行,然后其实还可以使用1.0开始有个fused broadcast功能提高性能

sum(@. cflow_amounst * exp(-r * flow_times))

就一行搞定这个函数了。。。不过我没仔细测试,不懂这个理论可能写的有错误,不过思路大概是这样的。Julia也可以写的很简洁的。


#3

great advice! 金融方面的书的code有一套风格,就是便于理解的priority远远高于简洁,严格来讲+= 都不该用,怕没有编程背景的看不懂。


#4

对于没学过编程的,x+=1x=x+1好理解吧?


#5

:thinking: :thinking: :thinking:


#6

X = X +1 更容易, + = 或者 = + 对非计算机人员是不必要的新东西,虽然啰嗦一点


#7

难道不是 x = x + 1更简单么