【发布时间】:2021-11-10 09:21:15
【问题描述】:
我有以下可重现的情况,这给了我错误:
return reduce(lambda a, b: a + b, map(lambda x: x[1] / math.pow(1 + i, x[0]),zip(dcfs, values)))
ValueError:数学域错误
这已经是一个非常简单的案例了。如果我投资 100 美元,但在将近一年(0.99)后才收回 50 美元,这可能发生在现实世界中,假设我在 1 月 1 日存入资金,并在 12 月 28 日收回资金。 IRR 应该是 -50%。
我可以看到有两种方法可以解决以下问题:
- 将 dcfs 更改为 [0,1] 即可使用
- 将初始猜测更改为 -0.05
但是,当我遇到更复杂的 IRR 为负的情况时,上述任何一种方法都有效(我无法将所有现金流更改为确切的年末,即使我将初始猜测更改为 -0.05,它仍然会因错误而中断)。有人可以帮忙吗?
import math
from scipy.optimize import fsolve
from functools import reduce
dcfs = [0,0.99]
values = [-100,50]
initialGuess = 0.05
def npvFromIrr(i):
return reduce(lambda a, b: a + b, map(lambda x: x[1] / math.pow(1 + i, x[0]),zip(dcfs, values)))
sol, info, ier, msg = fsolve(npvFromIrr, initialGuess, full_output=True)
print(sol)
【问题讨论】:
-
ValueError: math domain error在您对无法计算的负数或零数执行数学函数时引发。要解决此错误,请确保您使用的数学函数的数字有效。 -
你的代码中的错误是由
values = [-100,50]中的-100引起的。如果您将其替换为正数,则该代码运行良好。你到底想在这里实现什么? ` -
计算内部收益率,负数表示流出的现金流,正数表示流入的现金流。负数不是问题,因为您可以看到如果我将 dcf 更改为 [0,1] 那么它可以工作。问题出在fsolve上,应该可以很容易找到答案-0.5...