微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

constrOptim:最小化损失函数以使用 Feller 条件校准期权模型参数

如何解决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 举报,一经查实,本站将立刻删除。