我的目的是找出最佳参数。
首先,我有函数“func”,它产生5个参数的结果。 其次,我使用R的函数'nlminb'来找出最佳参数。 功能“func”似乎没问题。但是在运行'nlminb'之后我收到错误消息,消息是:integrate(function(u)){:non-finite function value}。 集成是函数“func”的一部分。如果它有错误,函数“func”不应该工作。但是,它工作正常。所以我不明白错误在哪里。
func<- function(params){
lambda<-params[1]
rho<-params[2]
eta<-params[3]
vbar<-params[4]
v<-params[5]
res <- function(k,t){
fj <- function(u, t, j){
al <- -exp(log(u)+log(u))*(1/2) - exp(log(1i)+log(u))*(1/2) + exp(log(1i)+log(u))*j;
bet <- lambda - rho*eta*exp(log(1i)+log(u))-rho*eta*j;
gam <- eta^2/2;
d <- sqrt(bet*bet - 4*al*gam);
rp <- (bet + d)/(2*gam);
rm <- (bet - d)/(2*gam);
g <- rm / rp;
D <- rm * (1 - exp(-d*t))/ (1 - g*exp(-d*t));
C <- lambda * (rm * t - 2/eta^2 * log( (1 - g*exp(-(d*t)))/(1 - g) ) );
return(exp(C*vbar + D*v));}
x <- -k;
p1 <- 1/2+1/pi*integrate(function(u){Re(fj(u,t,1)*exp(1i*u*x)/(1i*u))},lower=0,upper=Inf,stop.on.error=FALSE)$value;
p0 <- 1/2+1/pi*integrate(function(u){Re(fj(u,t,0)*exp(1i*u*x)/(1i*u))},lower=0,upper=Inf,stop.on.error=FALSE)$value;
return(exp(k)*(exp(x)*p1-p0));
}
return(res);
}
我的初始参数是
params<-c(1.15,-0.64,0.39,0.04,0.04)
为了运行函数'nlminb',我还应该定义目标函数,上下边界:
lower<-c(0,-1,0,0,0)
upper<-c(10,1,1,1,5)
目标函数是
obj<-function(params)
{
re<-NULL
for(i in 1:length(k))
{re[i]<-func(params)(k[i],myExpiry[i])*2072-resDF$Mid[i]}
return(sum(re^2))
}
k,myExpiry和resDF $ Mid是导入的数据。 最后一步是运行'nlminb':
nlminb(start=params,objective = obj,lower=lower,upper=upper)
提前感谢您的帮助!