1

我是优化/校准的新手,因此我想解释它的每一个细节。所以这将是一个很长的帖子,请多多包涵:)

我一直在尝试使用高频数据来校准 Heston (1993) 的期权价格模型。但我遇到了某些问题。

我有 5 个参数要估计(kappa、theta、sigma、rho、v0)。以下是我遵循的方法:

  1. 计算(猜测)要输入优化算法的参数的初始值。我已经通过命中和试验方法做到了这一点。

  2. 使用包callHestoncfNMOF计算期权价格。

  3. 计算期权的市场价格与从 (2) 计算的价格之差

  4. 从(3)得到的差值被输入到优化函数中。

以下是我正在使用的数据的输入:

输入(头(温度))
结构(列表(EXPDATE = 结构(c(1296066600、1296066600、1296066600、1296066600、1296066600、1296066600)、类 = c(“POSIXct”、“POSIXt”))、STRIKE = c(6400L、6400L、6400L、6400L、6400L , 6400L ), TTE = c(17, 17, 17, 17, 17, 17), SPOT = c(6146.39759036145, 6146.16962025316, 6148.28617021277, 6147.04015151515, 6140.85952380952, 6139.94405940594), RATE = c(0.0745855265628133, 0.0745855265628133, 0.0745855265628133, 0.0745855265628133, 0.0745855265628133, 0.0745855265628133), DIV = c(0.0101, 0.0101, 0.0101, 0.0101, 0.0101, 0.0101), DATE = c("2011-01-04", "2011-01-04-0,", " "2011-01-04", "2011-01-04", "2011-01-04"), 数量 = c(2000L, 2400L, 1600L, 2500L, 2000L, 1500L), 价格 = c(16.05, 16,15.9, 16.4, 15, 15)), .Names = c("EXPDATE", "STRIKE", "TTE", "SPOT", "RATE", "DIV", "DATE", "QUANT", "PRICE" ), row.names = c(NA, 6L), class = "data.frame")

下面是计算要最小化的目标的函数:

#callHestoncf <- function(S,X,tau,r,q,v0,vT,rho,k,sigma,implVol = FALSE)
#input = [kappa theta sigma rho v0]
function(initial, df){
    hdiff = rep(0, nrow(df))
    if (2*initial[1]*initial[2]-initial[3]^2<0){    ##condition on parameters
            initial[1]=initial[1]+0.1
            initial[2]=initial[2]+0.05}
    else if (2*initial[1]*initial[2]-initial[3]^2>=0){
            for (i in 1:nrow(df)){
                    hdiff[i] = abs((df['PRICE'][i,] - callHestoncf(df['SPOT'][i,], df['STRIKE'][i,], df['TTE'][i,]/250, df['RATE'][i,], 
                                                                   df['DIV'][i,], initial[5], initial[2], initial[4], initial[1], initial[3])))
            }
            #return(as.numeric(max(hdiff)))
            return(as.numeric(mean(hdiff)))
            #return(as.numeric(hdiff))
    }}

我使用了以下函数进行优化:
nlminb(stats)
DEoptim(DEoptim)
optim(stats)-方法“L-BFGS-B”,“SANN”
GenSA(GenSA)

下面是我编写的一个函数,用于使用优化参数计算定价误差。

calcdiff=function(df, initial2){
    A=rep(0,nrow(df))
for (i in 1:nrow(df)){
    A[i] = abs((df['PRICE'][i,] - callHestoncf(df['SPOT'][i,], df['STRIKE'][i,], df['TTE'][i,]/250, df['RATE'][i,], 
                                               df['DIV'][i,], initial2[5], initial2[2], initial2[4], initial2[1], initial2[3])))

}    
return (A)}

下面是我如何称呼它

initial2=c(0.3131582,0.01,0.2480684,-0.7201562,0.2845104)   ####parameter set obtained after optimization
ans = calcdiff(temp, initial2)
summary(ans)

下面是我如何调用优化函数:

initial = c(0.6, 0.01, 0.15, -0.5, 0.0196)
lb = c(0.01, 0.01, 0.01, -1, 0.01)
ub = c(1, 0.4, 1, 1, 0.4)
soln = nlminb(start=initial,objective=hestdiff,lower=lb, upper=ub, df=temp)

soln = DEoptim(hestdiff,lower=lb, upper=ub, df=temp, DEoptim.control(trace=FALSE, CR=0.7))

soln = optim(par = initial, fn = hestdiff, gr = NULL, method = "SANN", lower = lb, upper = ub, df = temp, control = list(maxit = 30000, trace = TRUE))

soln = optim(par = initial, fn = hestdiff, gr = NULL, method = "L-BFGS-B", lower = lb, upper = ub, df = temp, control = list(trace = 2))

soln=GenSA(par=initial, fn=hestdiff, lower=lb, upper=ub, df=temp,control=list(smooth=FALSE, verbose=TRUE))

使用该函数nlminb,我可以获得对参数的合理准确估计,以及较低的定价误差(平均值=Rs.3.7,中位数=Rs.3.5),但据我了解,它是一种局部优化方法,因此选择输入非常关键。此外,由于我必须在很多天中进行此校准,因此每天对初始估计进行命中和试验并不是很可行。因此,我正在寻找一个全局优化器。

使用DEoptim(使用与上面相同的值):它运行 200 次迭代,并产生参数:c(0.7239727, 0.01, 0.5224246, 0.9484754, 0.2316809)。使用这些值,我得到了极大的错误(平均值 = 211 卢比,中值 = 208 卢比)。

使用L-BFGS-B有类似的问题nlminb

当我使用全局优化器SANNorGenSA时,经过几次迭代后出现以下错误

Error in integrate(P2, lower = 0, upper = Inf, S, X, tau, r, q, v0, vT,  : 
  the integral is probably divergent 

我知道发生错误是因为积分对于参数范围内的某些值是不可解的。但是不应该有一个内置的机制来忽略这种情况吗?
这里的问题可能是多方面的,尽管我觉得这不是因为下面的第 1-4 点:
1. 我是否正确计算了目标?
2. 我是否将正确的目标函数返回给优化算法?(上面的函数'hestdiff')
3. 我计算定价错误的方式有问题吗?(上面的函数'calcdiff')
4. 我调用优化函数的方式有问题吗?
5. 还有其他我可以/应该使用的优化功能吗?
6.最后,我应该怎么做才能使这项工作:)

谢谢你陪我到最后。即使花了几天时间,我也找不到前进的方向。如果有人能帮我解决这个问题,那就太好了。

谢谢和问候,
希瓦姆

4

0 回答 0