我正在尝试使用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
}
非常感谢任何帮助!
答案 0 :(得分:1)
最初的问题之一是你的目标函数只有一个参数(要优化的参数),因此必须查找函数内部使用的所有其他对象。明确传递它们是更好的做法。
另外,您的示例中未定义许多必要值(例如S
,X
等)。您要优化的所有参数将通过第一个参数传递给您的目标函数。如果您在目标函数中明确指定每个元素,它可以帮助澄清事情。因此,更健壮的目标函数定义是:
# 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
为负值。
您指定了框约束lower
和DEoptim
,即使对于不变的参数也是如此。最好只让# 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);
顺便说一句,您应该花一点时间来更好地格式化代码。它使它更具可读性,可以帮助您避免类似错误的错误。