首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ValueError: f(a)和f(b)必须有不同的符号

ValueError: f(a)和f(b)必须有不同的符号
EN

Stack Overflow用户
提问于 2018-12-05 12:08:47
回答 2查看 9.9K关注 0票数 2

我有一个列日期,现金,利率,名字的数据。当我尝试按名称分组时,我能够找到XIRR的值,但是当我尝试按速率分组时,错误出现如下

文件"C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\zeros.py",第519行,以brentq r= _zeros._brentq(f,a,b,xtol,rtol,maxiter,args,full_output,disp)为单位 ValueError: f(a)和f(b)必须有不同的符号“

代码语言:javascript
运行
复制
def xnpv(rate, values, dates):    
    if rate <= -1.0:
        return float('inf')
    d0 = dates.min()   # or min(dates)
    return sum([ vi / (1.0 + rate)**((di - d0).days / 365.0) for vi, di in zip(values, dates)])
def xirr(values, dates):  
    try:
        return scipy.optimize.newton(lambda r: xnpv(r, values, dates), 0.0)
    except RuntimeError:    # Failed to converge?
        return scipy.optimize.brentq(lambda r: xnpv(r, values, dates), -1.0, 1e10) 

def f(x):

    x["XNPV"] = xnpv(0.1, x["Cash"], x['Date'])
    x["XIRR"] = xirr( x["Cash"], x['Date'])
    return x

f2 = f1.groupby('RATE').apply(f)
EN

回答 2

Stack Overflow用户

发布于 2018-12-05 12:14:14

错误信息相当清楚。来自文档

返回浮点数,a和b之间的f值为零,f必须是一个连续函数,a,b必须是一个符号变化区间。

这种情况之所以发生,是因为brentq致力于修改“二分法”的寻根技术,而牛顿法则不然。如果保证区间之间存在根(这意味着符号必须在区间之间改变),brentq将始终收敛。

这与牛顿方法形成了鲜明对比,牛顿法不受同样的要求,但由于最初的根猜测而无法收敛。

在这里,的底线是 scipy.optimize.brentq(lambda r: xnpv(r, values, dates), -1.0, 1e10),该间隔被处理为-1.0,1e10,并且对于这两个值,函数必须计算为相同的符号。您需要为f(a)f(b)提供一个具有不同值的间隔,以确保根位于两者之间。

票数 1
EN

Stack Overflow用户

发布于 2022-04-06 19:57:36

我想出了一个解决同样错误的解决方案。我相信错误是由于你有一些极小的数字,如1.1e-33,这会带来麻烦。

代码语言:javascript
运行
复制
X_train = round(X_train,8)

解决了我的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53631988

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档