我有以下可重现的情况,这给了我错误:
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 日取回资金。内部收益率应该是-50%。
我可以看到有两种方法可以解决以下问题:
- 将dcfs更改为[0,1],然后就可以了
- 将初始猜测更改为 -0.05
但是,当我遇到更复杂的内部收益率为负的情况时,上述任何一种方法都有效(我无法将所有现金流更改为确切的年末,即使我将初始猜测更改为 -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)