试图编写一个函数来计算现金流量表的现值。我知道numpy可以很容易地做到这一点,但是对于分配,我必须为此编写自己的函数:/。
以下是列表中的三个现金流量以及折现率。
cfList = [20, 50, 90]
r = 0.05
这是我到目前为止编写的函数。 f = 0,因为我想从第一个现金流量开始(在这种情况下为20)。 i = 1,因为对于第一个流,其上升到第一幂,第二个流(50)将平方,依此类推。
def npv(cfList, r):
f = 0
i = 1
pv = cfList[f] / ((1 + r) ** i)
while i < len(cfList):
f += 1
i += 1
return pv
print(npv(cfList, r))
但是,此输出仅给我第一笔现金流量的PV,而不是列表中这三笔现金的总和。如果您能帮助我,我非常感谢!
答案 0 :(得分:1)
您需要对函数中的各个现金流量求和并将其返回。目前,您正在返回第一个现金流量的pv值,因为您的for循环中有一个return语句。
此外,我认为您根据i
检查while循环的方式将意味着您将错过最后一个付款金额。通常,您不需要自己实例化计数器变量(请参见下面的示例):
def npv(cfList, r):
f = 0
i = 1
pv = cfList[f] / ((1 + r) ** i) # <-- this needs to be in the loop
while i < len(cfList): # <-- i will break loop before last payment is calculated.
f += 1
i += 1
return pv # <-- this return here is the issue
print(npv(cfList, r))
NPV是所有未来现金流量的PV的总和,这是您需要计算的。例如:
def npv(cfList, r):
sum_pv = 0 # <-- variable used to sum result
for i, pmt in enumerate(cfList, start=1): # <-- use of enumerate allows you to do away with the counter variables.
sum_pv += pmt / ((1 + r) ** i) # <-- add pv of one of the cash flows to the sum variable
return sum_pv # <-- only return the sum after your loop has completed.
永远记住,for循环中的return
语句将在第一次遇到return
时跳出循环。
另一种实现方式是从PV发电机中产生单个PV并求和:
def pv_gen(cfList, r):
for i, pmt in enumerate(cfList, start=1):
yield pmt / ((1 + r) ** i)
print(sum(pv_gen(cfList, r)))
答案 1 :(得分:1)
如果您使用while循环在列表中进行迭代,那么您应该在while循环中在 内执行一行代码。
看起来第二次迭代中i = 2 = len(cflist)时,循环将更早中断(不要忘记python uses 0 based indexing),因为return调用位于while循环内。 / p>
这应该有效:
<li role="button">
答案 2 :(得分:0)
返回现金流量列表的NPV如下:
def npv(cfList, r):
return sum(f / ((1 + r) ** i) for i, f in enumerate(cfList, 1))
In []:
cfList = [20, 50, 90]
r = 0.05
npv(cfList, r)
Out[]:
142.14447683835436