如何解决constrOptim:最小化损失函数以使用 Feller 条件校准期权模型参数
我想使用包 callHestoncf
中的函数 NMOF
校准 Heston SV 模型 (http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.139.3204&rep=rep1&type=pdf)。为此,我需要使用损失函数来估计四个结构参数(vT、rho、k 和 sigma)。损失函数是形式为 1/N * sum(w_i * (market_price - model_price)^2) 的平方误差的加权和,其中权重为 1/market_price。代码结构如下:
来自整个集合的随机样本数据:
index_level strike T mid_price riskfree_rate tau
1 2883.98 3070 37 1.70 0.0197700 0.10136986
2 3112.76 3070 27 74.00 0.0191700 0.07397260
3 3141.63 3150 100 94.05 0.0194325 0.27397260
4 2980.38 3040 16 7.00 0.0218863 0.04383562
5 2937.78 2970 16 18.15 0.0189688 0.04383562
6 2924.43 2975 30 70.85 0.0195425 0.08219178
代码:
par_vec <- vector(mode = "double",length = 4)
market_price <- calibration_file$mid_price
w_i <- 1/market_price
### loss function with generated Heston prices
objective_function <- function(par_vec){
S <- calibration_file$index_level
K <- calibration_file$strike
tau <- calibration_file$tau
r <- calibration_file$riskfree_rate
q <- rep(0,1374)
y <- vector(mode = "double",length = 6)
for (i in 1:6){
y[i] <- callHestoncf(S = S[i],X = K[i],tau = tau[i],r = r[i],q = q[i],v0 = 0.04,vT = par_vec[1],rho = par_vec[2],k = par_vec[3],sigma = par_vec[4],implVol = FALSE)
print(i)
}
error <- sum(w_i*(market_price-y)^2)/6
return(error)
}
### initial values and bounds
x0 <- c(0.05,-0.85,3.00,0.32)#initial values
lb <- c(0.01,-1,1,0.01) #lower bound
ub <- c(1,-0.2,10,1) #upper bound
### Feller condition
confun=function(par_vec){
f=NULL
f=rbind(f,par_vec[4]^2-2*par_vec[1]*par_vec[2])
list(ceq=NULL,c=f)
}
### optimisation with Feller condition imposed
parameters <- solnl(x0,objfun=objective_function,confun=confun,A = NULL,B = NULL,Aeq = NULL,Beq = NULL,lb = lb,ub = ub,tolX = 1e-05,tolFun = 1e-06,tolCon = 1e-06,maxnFun = 1e+07,maxIter = 4000)
parameters
当输入大数据集时优化失败(我尝试使用 1374 个 obs)但使用 50 个但需要一些时间,我猜是由于 callHestoncf
中的数值积分。当我输入大量数据时,出现错误 > 找不到函数“A”
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。