我是优化/校准的新手,因此我想解释它的每一个细节。所以这将是一个很长的帖子,请多多包涵:)
我一直在尝试使用高频数据来校准 Heston (1993) 的期权价格模型。但我遇到了某些问题。
我有 5 个参数要估计(kappa、theta、sigma、rho、v0)。以下是我遵循的方法:
计算(猜测)要输入优化算法的参数的初始值。我已经通过命中和试验方法做到了这一点。
使用包
callHestoncf
的NMOF
计算期权价格。计算期权的市场价格与从 (2) 计算的价格之差
从(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
当我使用全局优化器SANN
orGenSA
时,经过几次迭代后出现以下错误
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.最后,我应该怎么做才能使这项工作:)
谢谢你陪我到最后。即使花了几天时间,我也找不到前进的方向。如果有人能帮我解决这个问题,那就太好了。
谢谢和问候,
希瓦姆