从现金流列表计算 NPV 的函数
Function that calculates NPV from a list of cash flows
尝试编写一个函数来计算现金流量表的现值。我知道 numpy 可以很容易地做到这一点,但对于一项任务,我必须为此编写自己的函数:/.
下面是列表中的三个现金流量以及贴现率。
cfList = [20, 50, 90]
r = 0.05
这是我到目前为止编写的函数。 f = 0 因为我想从第一笔现金流开始(在本例中为 20)。 i = 1 因为对于第一个流量,它会升至 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,而不是列表中所有三个现金流的总和。如果您能提供帮助,我将不胜感激!
返回现金流量列表的 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
您需要对函数内的各个现金流量求和,return。目前您正在 return 计算第一个现金流的 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)))
如果您使用 while 循环遍历列表,那么您应该在 while 循环中执行代码行。
看起来你的循环会在第二次迭代时提前结束,因为 i = 2 = len(cflist)(不要忘记 python uses 0 based indexing),因为 return 调用是在 while 循环中。
这应该有效:
def npv(cfList, r):
f = 0
i = 1
pv = 0
while f <= len(cfList):
pv += (cfList[f] / ((1 + r) ** i))
f += 1
i += 1
return pv
尝试编写一个函数来计算现金流量表的现值。我知道 numpy 可以很容易地做到这一点,但对于一项任务,我必须为此编写自己的函数:/.
下面是列表中的三个现金流量以及贴现率。
cfList = [20, 50, 90]
r = 0.05
这是我到目前为止编写的函数。 f = 0 因为我想从第一笔现金流开始(在本例中为 20)。 i = 1 因为对于第一个流量,它会升至 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,而不是列表中所有三个现金流的总和。如果您能提供帮助,我将不胜感激!
返回现金流量列表的 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
您需要对函数内的各个现金流量求和,return。目前您正在 return 计算第一个现金流的 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)))
如果您使用 while 循环遍历列表,那么您应该在 while 循环中执行代码行。
看起来你的循环会在第二次迭代时提前结束,因为 i = 2 = len(cflist)(不要忘记 python uses 0 based indexing),因为 return 调用是在 while 循环中。
这应该有效:
def npv(cfList, r):
f = 0
i = 1
pv = 0
while f <= len(cfList):
pv += (cfList[f] / ((1 + r) ** i))
f += 1
i += 1
return pv