ValueError:计算负 IRR 时的数学域错误

Posted

技术标签:

【中文标题】ValueError:计算负 IRR 时的数学域错误【英文标题】:ValueError: math domain error when calculating Negative IRR 【发布时间】: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... 【参考方案1】:

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

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 中的其他一些求解器是否可以在不尝试将负数提升为实数的情况下解决它

【讨论】:

以上是关于ValueError:计算负 IRR 时的数学域错误的主要内容,如果未能解决你的问题,请参考以下文章

Objective C IRR 计算与 Excel IRR 函数的比较

Spotfire 7.6 中的 NPV 和 IRR

ValueError:未知标签类型:拟合数据时的“连续多输出”

ValueError:将json读取为熊猫数据框时的预期对象或值

ValueError:未知损失函数:使用我的自定义损失函数加载模型时的focal_loss_fixed

ValueError:来自 math.acos 的数学域错误和来自 numpy.arccos 的 NaN