从现金流量列表计算净现值的函数

时间:2019-03-30 22:53:36

标签: python python-3.x finance

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

3 个答案:

答案 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