DEoptim不返回最佳参数

时间:2017-04-14 23:36:40

标签: r mathematical-optimization nonlinear-optimization

我正在尝试使用DEoptim来优化Heston定价模型(NMOF包)的参数。我的目标是尽量减少实际期权价格和赫斯顿价格之间的差异。但是,在运行我的代码时,DEoptim不会保存最佳结果,但始终显示使用初始参数而不是优化参数获得的值。不幸的是,我对R(以及任何类型的编程)都是全新的,因此我似乎无法解决问题。

我的数据,对于一个选项的一个示例性子集看起来像这样。

    #Load data    
    #Real option price
    C0116_P=as.vector(c(1328.700000, 1316.050000, 1333.050000, 1337.900000, 1344.800000))
    #Strike price
    C0116_K=as.vector(c(500, 500, 500, 500, 500))
    #Time to maturity in years
    C0116_T_t=as.vector(c(1.660274, 1.657534, 1.654795, 1.652055, 1.649315))
    #Interest rate percentage
    C0116_r=as.vector(c(0.080000, 0.080000, 0.090000, 0.090000, 0.090000))
    #Dividend yield percentage
    C0116_DY=as.vector(c(2.070000, 2.090000, 2.070000, 2.070000,2.060000))
    #Price underlying
    C0116_SP_500_P=as.vector(c(1885.08, 1872.83, 1888.03, 1892.49, 1900.53))

在下一步中,我想定义我想要最小化的函数(实际和heston价格之间的差异)并设置一些初始参数。为了优化,我正在运行一个循环,不幸的是最终只返回实际期权价格和heston价格之间的差异,使用初始参数作为最佳值而不是最小化差异的实际参数。

    #Load packages
    require(NMOF)
    require(DEoptim)

        #Initial parameters
        v0=0.2
        vT=0.2
        rho=0.2
        k=0.2
        sigma=0.2
        #Define function
        error_heston<-function(x)
        {error<-P-callHestoncf(S, X, tau, r, q, v0, vT, rho, k, sigma)
        return(error)}
        #Run optimization
        outDEoptim<-matrix()
        for (i in 1:5)
        {
        #I only want the parameters v0, vT, rho, k and sigma to change. That is why I kept the others constant
lower<-c(C0116_P[i],C0116_SP_500_P[i],C0116_K[i],C0116_T_t[i],C0116_r[i]/100,C0116_DY[i]/100,0.0001,0.0001,-1,0.0001,0.0001)  
     upper<-c(C0116_P[i],C0116_SP_500_P[i],C0116_K[i],C0116_T_t[i],C0116_r[i]/100,C0116_DY[i]/100,10,10,1,10,10)

        outDEoptim<-(DEoptim(error_heston, lower, upper, DEoptim.control(VTR=0,itermax=100)))  
        print(outDEoptim$opti$bestval)

        i=i+1 
        }

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

最初的问题之一是你的目标函数只有一个参数(要优化的参数),因此必须查找函数内部使用的所有其他对象。明确传递它们是更好的做法。

另外,您的示例中未定义许多必要值(例如SX等)。您要优化的所有参数将通过第一个参数传递给您的目标函数。如果您在目标函数中明确指定每个元素,它可以帮助澄清事情。因此,更健壮的目标函数定义是:

# Define objective function
error_heston <- function(x, P, S, K, tau, r, q) {
  v0 <- x[1]
  vT <- x[2]
  rho <- x[3]
  k <- x[4]
  sigma <- x[5]
  error <- abs(P - callHestoncf(S, K, tau, r, q, v0, vT, rho, k, sigma))
  return(error)
}

另请注意,我采取了绝对错误。 DEoptim将最小化目标函数,因此当您希望P - callHestoncf()接近于零时,它会尝试使upper为负值。

您指定了框约束lowerDEoptim,即使对于不变的参数也是如此。最好只让# Only need to set bounds for varying parameters lower <- c(1e-4, 1e-4, -1, 1e-4, 1e-4) upper <- c( 10, 10, 1, 10, 10) 为变量参数生成总体,因此我从框约束中删除了不变参数。我也在for循环之外定义了它们。

DEoptim

现在进行实际的DEoptim通话。您可以在此处传递所有非变化参数的值。您将它们设置为i <- 1 outDEoptim <- DEoptim(error_heston, lower, upper, DEoptim.control(VTR=0, itermax=100), P = C0116_P[i], S = C0116_SP_500_P[i], K = C0116_K[i], tau = C0116_T_t[i], r = C0116_r[i], q = C0116_DY[i]) 调用的命名参数,正如我在下面所做的那样。

callHestoncf()

我只运行了for循环的一次迭代,因为# Real option price C0116_P <- c(1328.70, 1316.05, 1333.05, 1337.90, 1344.80) # Strike price C0116_K <- c(500, 500, 500, 500, 500) # Time to maturity in years C0116_T_t <- c(1.660274, 1.657534, 1.654795, 1.652055, 1.649315) # Interest rate percentage C0116_r <- c(0.08, 0.08, 0.09, 0.09, 0.09) # Dividend yield percentage C0116_DY <- c(2.07, 2.09, 2.07, 2.07, 2.06) / 100 # Price underlying C0116_SP_500_P <- c(1885.08, 1872.83, 1888.03, 1892.49, 1900.53) 函数经常抛出错误,因为数值集成例程失败了。这会停止优化。您应该查看原因,并在遇到问题时提出新问题。

我还注意到你错误地指定了其中一个非变化输入。您的股息收益率百分比是100倍。您的非变化输入应为:

int a = INT_MAX;
int b = INT_MAX;
int result = a * b;
printf("%d x %d = %d\n",a, b, result);

顺便说一句,您应该花一点时间来更好地格式化代码。它使它更具可读性,可以帮助您避免类似错误的错误。