#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 за помощь и пояснения, теперь все намного понятнее