DEoptim 没有 return 最优参数
DEoptim does not return optimal parameters
我正在尝试使用 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))
在下一步中,我想定义我想要最小化的函数(实际价格和赫斯顿价格之间的差异)并设置一些初始参数。为了优化,我是 运行 一个循环,不幸的是最后只有 returns 实际期权价格和赫斯顿价格之间的差异使用初始参数作为最佳值而不是最小化实际参数差异。
#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
}
非常感谢任何帮助!
第一个问题是您的 objective 函数只有一个参数(要优化的参数),因此必须查找函数内部使用的所有其他对象。明确传递它们是更好的做法。
此外,您的示例中未定义许多必要的值(例如 S
、X
等)。您要优化的所有参数都将通过第一个参数传递给您的 objective 函数。如果您在 objective 函数中明确分配每个元素,它可以帮助澄清事情。所以更健壮的 objective 函数定义是:
# 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
将最小化 objective 函数,因此当您希望它接近于零时,它会尝试使 P - callHestoncf()
尽可能负。
您为不变的参数指定了框约束 upper
和 lower
。最好只让 DEoptim
为确实变化的参数生成一个群体,所以我从框约束中删除了不变的参数。我还在 for 循环之外定义了它们。
# 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)
现在开始真正的 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])
我只运行 for循环的一次迭代,因为callHestoncf()
函数经常因为数值积分例程失败而抛出错误。这将停止优化。你应该调查一下原因,如果有问题再问一个新问题。
我还注意到您错误地指定了一个不变的输入。您的股息收益率百分比太大了 100 倍。您的不变输入应该是:
# 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)
顺便说一句,您应该花一点时间来更好地格式化您的代码。它使它更具可读性,这应该可以帮助您避免类似拼写错误的错误。
我正在尝试使用 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))
在下一步中,我想定义我想要最小化的函数(实际价格和赫斯顿价格之间的差异)并设置一些初始参数。为了优化,我是 运行 一个循环,不幸的是最后只有 returns 实际期权价格和赫斯顿价格之间的差异使用初始参数作为最佳值而不是最小化实际参数差异。
#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
}
非常感谢任何帮助!
第一个问题是您的 objective 函数只有一个参数(要优化的参数),因此必须查找函数内部使用的所有其他对象。明确传递它们是更好的做法。
此外,您的示例中未定义许多必要的值(例如 S
、X
等)。您要优化的所有参数都将通过第一个参数传递给您的 objective 函数。如果您在 objective 函数中明确分配每个元素,它可以帮助澄清事情。所以更健壮的 objective 函数定义是:
# 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
将最小化 objective 函数,因此当您希望它接近于零时,它会尝试使 P - callHestoncf()
尽可能负。
您为不变的参数指定了框约束 upper
和 lower
。最好只让 DEoptim
为确实变化的参数生成一个群体,所以我从框约束中删除了不变的参数。我还在 for 循环之外定义了它们。
# 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)
现在开始真正的 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])
我只运行 for循环的一次迭代,因为callHestoncf()
函数经常因为数值积分例程失败而抛出错误。这将停止优化。你应该调查一下原因,如果有问题再问一个新问题。
我还注意到您错误地指定了一个不变的输入。您的股息收益率百分比太大了 100 倍。您的不变输入应该是:
# 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)
顺便说一句,您应该花一点时间来更好地格式化您的代码。它使它更具可读性,这应该可以帮助您避免类似拼写错误的错误。