Функция, которая вычисляет NPV из списка денежных потоков

#python #python-3.x #finance

#python #python-3.x #финансы

Вопрос:

пытаюсь написать функцию, которая будет вычислять текущую стоимость списка денежных потоков. Я знаю, что 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 первого денежного потока, а не сумму всех трех из списка. Если вы можете помочь, я очень ценю это, спасибо!

Комментарии:

1. Итак, вы хотите суммировать NPV денежных потоков? Каков ваш ожидаемый результат для приведенного вами примера. return В while цикле означает, что он завершится немедленно, что маловероятно, что вы хотите, вы не вычисляете последующие термины, которые вы, вероятно, захотите добавить в pv , а затем return pv вне while цикла.

Ответ №1:

Вам нужно суммировать отдельные денежные потоки в вашей функции и возвращать это. На данный момент вы возвращаете значение pv первого денежного потока, поскольку у вас есть оператор возврата в вашем цикле for.

Кроме того, я думаю, что способ, которым вы проверяете свой цикл 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)))
  

Ответ №2:

Возврат 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
  

Ответ №3:

Если вы выполняете итерацию по списку, используя цикл while, то у вас должна быть строка кода, выполняющая действие, внутри цикла while.

Также похоже, что ваш цикл будет прерван раньше, поскольку i = 2 = len(cflist) на второй итерации (не забывайте, что python использует индексацию на основе 0) и потому, что обратный вызов находится в цикле 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
  

Комментарии:

1. спасибо вам и @SuperShoot за помощь и пояснения, теперь все намного понятнее