【发布时间】:2021-05-29 21:03:31
【问题描述】:
我想创建一个名为“npv_zero”的函数。 它的输入参数应该是一个现金流向量和一个起始值。它的输出参数应该是 NPV(r) 的零。我想包括 Newton-Raphson 方法来计算函数 NPV(x)=C1+2C2x+3C3x**2+...
的零带有显式导数。最后我想重新转换 x 并获得 IRR(内部收益率)。总结一下,我想使用迭代步骤 k=10 和容差 eps=10**-5。
我尝试了这段代码,但它不包含这两个输入参数,我不知道如何使用向量创建 Newton-Raphson,这就是我创建这些单独值 C0、C1、C2、C3 的原因。
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve
# Defining variables for Newton Raphson Calculation
CO = -100 # Cashflow in t=0
C1 = 10 # Cashflow in t=1
C2 = 20 # Cashflow in t=2
C3 = 60 # Cashflow in t=3
x = 0.88 # the inital guess
# Newton Raphson function
def npv_zero(fn, x, tol = 0.00000000001, maxiter = 100):
for i in range(maxiter):
x_new = x - fn[0](x)/fn[1](x)
if abs(x_new - x) < tol: break
x = x_new
return x_new, i
y = [lambda x: CO + C1*x + C2*x**2 + C3*x**3, # f(x)
lambda x: C1 + 2*C1*x + 3*C3*x**2] # f'(x)
x, n = npv_zero(y, 0.88)
print('the root is %f at %d iterations.' % (x,n))
结果:11 次迭代的根为 1.041930。 接下来是 IRR 计算:
# IRR-Calculation
def irr(x):
"""
Function to calculate the IRR of a project
Parameter
---------
x (numpy array): cashflow vector
Returns
-------
float: IRR
"""
t = np.arange(len(x))
npv = lambda r: x @ (1 / (1+r)) ** t
return fsolve(npv, 0)
cashflow = [CO, C1, C2, C3]
print(irr(cashflow))
print(np.npv(0.11397637333244609, cashflow))
结果:-0.04024282,-31.503021914119515
欢迎在下方发表评论! 问候:)
【问题讨论】:
-
您好,感谢您邀请我写评论。我的评论是:你的问题到底是什么?
-
我还有一条评论:您显示的代码没有正确缩进。
-
你好 mkrieger1,我的问题是如何通过使用现金流量向量而不是变量来改进我的实际代码。这是我目前学习中的一项练习。对于我写的任何情况,我感到抱歉。这是我第一次提问
标签: python function numpy loops finance