“浮动”对象不可调用。期权定价

时间:2019-12-16 19:46:55

标签: python function numpy scipy

我使用的脚本给出了以下错误。我以为该错误可能与np.inf的浮点数有关,但是尝试使用np.iinfo(np.int32).max,但它没有执行任何操作。我没有人可以咨询,所以在这里问。

def BCC_call_value(S0,K,T,r,kappa_v,theta_v,sigma_v,rho,v0,lamb,mu,delta):
    int_value=quad(lambda u:BCC_int_func(u,S0,K,T,r,kappa_v,theta_v,sigma_v,rho,v0,lamb,mu,delta),0,np.inf,limit=250)[0]
    call_value=max(0,S0-np.exp(-r*T)*np.sqrt(S0*K)/np.pi*int_value)
    return call_value

def BCC_int_func(u,S0,K,T,r,kappa_v,theta_v,sigma_v,rho,v0,lamb,mu,delta):
    '''Valuation of European call option in BCC97 model via Lewis (2001)
    Fourier-based approach:integration function.

    Parameter definitions see function BCC_call_value.'''
    char_func_value=BCC_char_func(u-1j*0.5,T,r,kappa_v,theta_v,sigma_v,rho,v0,lamb,mu,delta)
    int_func_value=1/(u**2+0.25)*(np.exp(1j*u*np.log(S0/K))*char_func_value).real
    return int_func_value

TypeError                                 Traceback (most recent call last)
<ipython-input-5-874d91836da1> in <module>
----> 1 BCC_call_value(S0,K,T,r,kappa_v,theta_v,sigma_v,rho,v0,lamb,mu,delta)

<ipython-input-3-02bea979d7ba> in BCC_call_value(S0, K, T, r, kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta)
     68 
     69     '''
---> 70     int_value=quad(lambda u:BCC_int_func(u,S0,K,T,r,kappa_v,theta_v,sigma_v,rho,v0,lamb,mu,delta),0,np.inf,limit=250)[0]
     71     call_value=max(0,S0-np.exp(-r*T)*np.sqrt(S0*K)/np.pi*int_value)
     72     return call_value

D:\Anaconda\lib\site-packages\scipy\integrate\quadpack.py in quad(func, a, b, args, full_output, epsabs, epsrel, limit, points, weight, wvar, wopts, maxp1, limlst)
    339     if weight is None:
    340         retval = _quad(func, a, b, args, full_output, epsabs, epsrel, limit,
--> 341                        points)
    342     else:
    343         retval = _quad_weight(func, a, b, args, full_output, epsabs, epsrel,

D:\Anaconda\lib\site-packages\scipy\integrate\quadpack.py in _quad(func, a, b, args, full_output, epsabs, epsrel, limit, points)
    448             return _quadpack._qagse(func,a,b,args,full_output,epsabs,epsrel,limit)
    449         else:
--> 450             return _quadpack._qagie(func,bound,infbounds,args,full_output,epsabs,epsrel,limit)
    451     else:
    452         if infbounds != 0:

<ipython-input-3-02bea979d7ba> in <lambda>(u)
     68 
     69     '''
---> 70     int_value=quad(lambda u:BCC_int_func(u,S0,K,T,r,kappa_v,theta_v,sigma_v,rho,v0,lamb,mu,delta),0,np.inf,limit=250)[0]
     71     call_value=max(0,S0-np.exp(-r*T)*np.sqrt(S0*K)/np.pi*int_value)
     72     return call_value

<ipython-input-3-02bea979d7ba> in BCC_int_func(u, S0, K, T, r, kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta)
    144 
    145     Parameter definitions see function BCC_call_value.'''
--> 146     char_func_value=BCC_char_func(u-1j*0.5,T,r,kappa_v,theta_v,sigma_v,rho,v0,lamb,mu,delta)
    147     int_func_value=1/(u**2+0.25)*(np.exp(1j*u*np.log(S0/K))*char_func_value).real
    148     return int_func_value

<ipython-input-3-02bea979d7ba> in BCC_char_func(u, T, r, kappa_v, theta_v, sigma_v, rho, v0, lamb, mu, delta)
    167 
    168     Parameter definitions see function BCC_call_value.'''
--> 169     BCC1=H93_char_func(u,T,r,kappa_v,theta_v,sigma_v,rho,v0)
    170     BCC2=M76_char_func(u,T,lamb,mu,delta)
    171     return BCC1 * BCC2

<ipython-input-3-02bea979d7ba> in H93_char_func(u, T, r, kappa_v, theta_v, sigma_v, rho, v0)
    179     c2=-np.sqrt((rho*sigma_v*u*1j-kappa_v)**2-sigma_v**2*(-u*1j-u**2))
    180     c3=(kappa_v-rho*sigma_v*u*1j+c2)/(kappa_v-rho*sigma_v*u*1j-c2)
--> 181     H1=(r*u*1j*T(c1/sigma_v**2)*((kappa_v-rho*sigma_v*u*1j+c2)*T-2*np.log((1-c3*np.exp(c2*T))/(1-c3))))
    182     H2=((kappa_v - rho*sigma_v*u*1j+c2)/sigma_v**2*((1-np.exp(c2*T))/(1-c3*np.exp(c2*T))))
    183     char_func_value=np.exp(H1+H2*v0)

TypeError: 'float' object is not callable

1 个答案:

答案 0 :(得分:1)

我认为问题出在您的H93_char_func

H1=(r*u*1j*T(c1/sigma_v**2)*((kappa_v-rho*sigma_v*u*1j+c2)*T-2*np.log((1-c3*np.exp(c2*T))/(1-c3))))
#          ^ here you attempt to call T...                 ^ here you use it as a number

T是一个函数还是一个数字?从上下文来看,我认为这是一个数字,这意味着您需要将T(c1 / sigma_v ** 2)更改为它的含义(也许是T * (c1 / sigma_v ** 2)?)。

我也强烈建议添加空格,也许添加一个或两个变量以保存中间结果。这很难读。