如何使用多个参数来获取复杂函数的导数?

时间:2015-07-08 03:53:25

标签: python derivative

以下是获取CDS传播的代码。 这是一个非常复杂的功能。 无论如何都有这个函数的衍生物?

似乎numdifftools不会使用多个参数。 另外mpmath.diff给了我错误,例如type unsafe。 任何人都可以帮忙吗?非常感谢。

   1639         cond = cond0 & cond1
   1640         output = zeros(shape(cond), 'd')
-> 1641         place(output, (1-cond0)+np.isnan(x), self.badvalue)
   1642         place(output, cond2, 1.0)
   1643         if any(cond):  # call only if at least 1 entry

TypeError:ufunc' isnan'不支持输入类型,并且根据投射规则无法安全地将输入强制转换为任何支持的类型'''

def  CDS(r, R,lamb,sigma,L,S,D,T):
    '''Adjust equity volatility to get asset volatility'''
    sigma=sigma*S/(S+L*D) 
    d=(S+L*D)*exp(pow(lamb,2))/(L*D)
    xi=min(pow(lamb,2)/pow(sigma,2),20)
    zeta=math.sqrt(0.25+2*r/pow(sigma,2))
    '''print("r=%f,xi=%f G(d,zeta,sigma,T+xi)=%f, G(d,zeta,sigma,xi)=%f" %(r,xi,G(d,zeta,sigma,T+xi),G(d,zeta,sigma,xi)))'''
    G_T=pow(d, zeta+1/2)*norm.cdf(-math.log(d)/(sigma*math.sqrt(T))- zeta*sigma*math.sqrt(T))+ pow(d, -zeta+1/2)*norm.cdf(-math.log(d)/(sigma*math.sqrt(T))+zeta*sigma*math.sqrt(T))
    G_xi=pow(d, zeta+1/2)*norm.cdf(-math.log(d)/(sigma*math.sqrt(T))- zeta*sigma*math.sqrt(T))+ pow(d, -zeta+1/2)*norm.cdf(-math.log(d)/(sigma*math.sqrt(T))+zeta*sigma*math.sqrt(T))
    H=math.exp(r*xi)*(G_T-G_xi)
    c=r*(1-R)*(1-SurvProb(d,sigma,lamb,0)+H)/(SurvProb(d,sigma,lamb,0)-SurvProb(d,sigma,lamb,T)*math.exp(-r*T)-H)
    return c

0 个答案:

没有答案