将一项分析工作划分为若干个可操作的小部分。
根据操作顺序进行分解
- 确定工作流程
- 按工作流程将复杂工作划分成简单的部分
- 对各个部分进行程序设计,并一步步执行,并加以注释
- 组装成完整的程序
例1 分析一个项目的IRR
- 首先确定IRR计算步骤,计算NPV和期初投入相等时的收益率即为内部收益率IRR
- 先做出货币的时间价值的计算方法,即求现金流的现值
- 将计算NPV的方法打包成函数
- 计算循环无限逼近IRR
例2 计算现金流的现值
假设投资者未来10年每年收到10000元的退休金,期间贴现率为5%,请问这笔投资的现值为?
很明显,这里可以使用Python的循环求和的方法,即计算每一期的现金流,将他们以次加起来;
首先需要写出每一期i(i从0开始)现金流的计算方法 cf_i = 10000/(1+5/100)**i;
在循环开始前定义一个储存总现值的变量total,每一期total=total+cf i;
把各部分组成完整循环如下:
def discount(n,cp,r)
total = 0
for i in range(n):
cf_i = cp/(1 + r)**(i + 1)
total = total + cf_i
print(total)
discount(10,10000,0.05)
代码运行结果如下:
例3 净现值分析投资项目
净现值时未来现金流(带正负号表明其流入流出方向)贴现后的加总python简单代码画爱心。
假设贴现率为5%,有A、B两个项目,前期均需投入120万,A项目第一年至第五年分别收入10、30、50、40、10万,而项目B第一至五年分别收入30、40、40、20、10万,项目A和项目B那个投资价值高?
判断哪个项目的投资价值更高,可以考虑分别计算2个项目的净现值。
首先考虑项目计算的输入为贴现率、现金流,输出为净现值。项目的现金流可以用列表表示,项目的总值可以用类似例1中的循环表示。定义一个函数,输入贴现率和现金流,输出为净现值。
def npv_function(rate,cashflows):
total = 0
for i, cashflow in enumerate(cashflows):
#(0,-120),(1,10),(2,30)
total = total +cashflow /(1 + rate)**i
return total
cashflows_A = [-120,10,30,50,40,10]
cashflows_B = [-120,30,40,40,20,10]
net_value_A = npv_f(0.05,cashflows_A)
net_value_B = npv_f(0.05,cashflows_B)
print(net_value_A,net_value_B)
代码运行结果如下:
例4 IRR方法分析投资项目
投资项目的净现值为0时,其贴现率的值即为内部回报率IRR。
假设贴现率为5%,有A、B两个项目,前期均需揉入120万,A项目第一年至第五年分别收入10、30、50、40、10万,而项目B第一至五年分别收入30、40、40、20、10万,项目A和B哪个投资价值高?
判断哪个项目的投资价值更高,可以考虑分别计算2个项目的IRR并进行对比。
这里可以考虑调用例2中已经写好的函数,简化IRR的计算。同时采用迭代的思路对投资项目的IRR进行计算。
def irr_f(cashflows,iteration=10000):
rate_d = 0
rate_u = 1
rate = (rate_d + rate_u)/2
npv = npv_f(rate,cashflows)
while abs(npv)>0.0001:
if npv > 0:
rate_d = rate
rate = (rate_u+ rate_d)/2
npv = npv_f(rate,cashflows)
else:
rate_u = rate
rate(rate_u + rate_d)/2
npv = npv(rate,cashflows)
return rate
irr_f(cashflows_A,iterations=10000)
irr_f(cashflows_B,iterations=10000)