以下是获取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