f_heston,在g_heston函数中也使用了它。我需要将g_heston从0集成到无穷大。
f_heston=function(u,r,q,tau,V0,S0,sigma,rho,kappa,theta){
i=complex(imaginary = 1)
X0=log(S0)
M=sqrt((rho*sigma*i*u-kappa)^2+sigma^2*(i*u+u^2))
N=(rho*sigma*i*u-kappa-M)/(rho*sigma*i*u-kappa+M)
A=(r-q)*i*u*tau+kappa*theta/sigma^2*(-(rho*sigma*i*u-kappa-M)*tau-2*log((1-N*exp(M*tau))/(1-N)))
B=(exp(M*tau)-1)*(rho*sigma*i*u-kappa-M)/(sigma^2*(1-N*exp(M*tau)))
return(exp(A+B*V0+i*u*X0))
}
f_2=function(u,r,q,tau,V0,S0,sigma,rho,kappa,theta){
i=complex(imaginary = 1)
return(exp(-i*u*log(S0))*exp(-i*u*(r-q)*tau)*f_heston(u,r,q,tau,V0,S0,sigma,rho,kappa,theta))
}
g_heston=function(u,S0,K,r,q,kappa,theta,V0,tau,sigma,rho){
i=complex(imaginary = 1)
k=log(S0/K)+(r-q)*tau
g=Re(exp(-i*u*k)*f_2(-u-i/2,r,q,tau,V0,S0,sigma,rho,kappa,theta))/(u^2+1/4)
if(is.nan(g)) return(0) else return(g)
}
g_heston迅速达到应有的0,但是对于较大的u值,它开始生成NaN。我试图通过使函数返回0(如果g是NaN)来抵消这种情况。
integrate(g_heston, lower=0, upper= Inf ,S0=100,K=120,r=0.05,q=0.02,kappa=1,theta=1,V0=1,tau=2,sigma=1,rho=-0.3 )
这并没有消除错误:“非有限函数值”,此外,该函数现在还发出警告:
此外:警告消息: 1:如果if(is.nan(g))return(0)else return(g): 条件的长度> 1,并且只会使用第一个元素
我不知道is.nan(g)的长度如何> 1,为什么会产生错误(以及为什么stop.on.error条件无法捕获错误),以及g_heston为什么会首先产生NaN。