Brent函数中的参数太多

2024-07-04 06:02:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码:

class ImpliedVol:

    def __init__(self, flag, mkt_price, spot_price, strike, time_to_maturity,
                 lower_bound, upper_bound, risk_free_rate=0, maxiter=1000, 
                 method='f'):

        self.flag = flag
        self.mkt_price = mkt_price
        self.S = spot_price
        self.K = strike
        self.T = time_to_maturity
        self.r = risk_free_rate
        self.a = lower_bound
        self.b = upper_bound
        self.n = maxiter
        self.method = method

    def func(self, vol):

        p = Pricer(self.flag, self.S, self.K, self.T, vol, self.r, self.method)

        return p.get_price() - self.mkt_price

    def get(self):

        implied_vol = brentq(self.func, self.a, self.b, self.n)

        return implied_vol

使用某些参数创建类的实例可以很好地工作,还可以根据需要调用方法func完美地工作:

^{pr2}$

但是在我的实例上调用方法get返回以下错误:

/Users/~/miniconda3/lib/python3.5/site-packages/scipy/optimize/zeros.py in brentq(f, a, b, args, xtol, rtol, maxiter, full_output, disp)
    436     if rtol < _rtol:
    437         raise ValueError("rtol too small (%g < %g)" % (rtol, _rtol))
--> 438     r = _zeros._brentq(f,a,b,xtol,rtol,maxiter,args,full_output,disp)
    439     return results_c(full_output, r)
    440 

TypeError: func() takes 2 positional arguments but 3 were given

Tags: selfgetreturndefpricemethodfullflag
1条回答
网友
1楼 · 发布于 2024-07-04 06:02:42

您正在定义:self.n = maxiter并将其作为第4个参数调用brentq。但是,brentq的签名是:scipy.optimize.brentq(f, a, b, args=(), xtol=1e-12, rtol=4.4408920985006262e-16, maxiter=100, full_output=False, disp=True)

所以给它指定所需的位置参数(fab),并将maxiter作为关键字arg传递。像这样:

brentq(self.func, self.a, self.b, maxiter=self.n)

(另外,帮你自己一个忙,不要使用那些单字母的变量名)

相关问题 更多 >

    热门问题