从现金流列表中计算NPV的函数

问题描述 投票:0回答:3

试图编写一个能计算现金流清单现值的函数。我知道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,而不是列表中所有三个的总和。如果你能帮我,我非常感谢!

python python-3.x finance
3个回答
1
投票

您需要对函数中的各个现金流求和并返回。当你返回第一个现金流的pv值时,你的for循环中有一个return语句。

此外,我认为你检查你的while循环对i的方式将意味着你将错过最后一个支付价值。通常,您不需要自己实例化计数器变量(请参阅下面的示例):

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.

永远记住,在第一次遇到return时,for循环中的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
投票

如果您使用while循环遍历列表,那么您应该在while循环中执行代码行。

看起来你的循环会在第二次迭代时因为i = 2 = len(cflist)而提前切割(不要忘记python uses 0 based indexing)并且因为返回调用在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

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
© www.soinside.com 2019 - 2024. All rights reserved.