Я пытаюсь использовать 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))
На следующем шаге я хочу определить функцию, которую я хочу минимизировать (разница между реальной ценой и ценой Хестона), и установить некоторые начальные параметры. Для оптимизации я запускаю цикл, который, к сожалению, в конце возвращает только разницу между реальной ценой опциона и ценой Хестона, используя начальные параметры в качестве наилучшего значения, а не фактические параметры, минимизирующие разницу.
#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
}
Любая помощь высоко ценится!