1

我有以下可重现的情况,这给了我错误:

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%。

我可以看到有两种方法可以解决以下问题:

  1. 将dcfs更改为[0,1],然后就可以了
  2. 将初始猜测更改为 -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)
4

1 回答 1

0

作为一种解决方法,您可以将现金流期转换为天而不是年 - (并在需要时调整初始猜测)

dcfs = [_*365.25 for _ in dcfs]
initialGuess = -0.05/365.25

sol, info, ier, msg = fsolve(npvFromIrr, initialGuess, full_output=True)

这给出了 array([-0.00191507]) 的值 - 您可以将其转换回年率

annual_rate = math.pow((1 + sol[0]), 365.35) - 1
# -0.5035836839765218

或者,您可以查看内部的其他一些求解器是否scipy.optimize可以在不尝试将负数提升为实数的情况下求解

于 2021-09-15T10:29:22.997 回答