我已经在R中查看了一些不同的优化方法来解决我的优化解决方案,但似乎所有的算法都不适用于我的问题。我有以下问题:
m=n-1 #length option sample (...)
n=5
Dmat <- matrix(0,nrow=n-1,ncol=n+1)
Dmat[row(Dmat)==col(Dmat)]<-1
Dmat[row(Dmat)+1==col(Dmat)]<--2
Dmat[row(Dmat)+2==col(Dmat)]<-1
#for(j in 0:n){
# para<-c(par[j])#Try to have n+1 Parameters(original formula from 0:N)
#}
Amat=matrix(NA,ncol=n+1,nrow=m)
for(u in 1:m){
for(k in 1:(n+1)){
Amat[u,k]=pmax(S[k]-K[u],0)
}
}
para>=0
sum(para)==1
S_0=exp((-r+q)*TTM)*sum(para*S)
objfunc=sum(para*Dmat)^2+alpha*exp(-r*TTM)*(rowsum(Amat*para)-V)
我还有一个使用optim的方法,但是这个使用了Matrix表单。我的问题是如何使用这种优化,因为他们的算法通常优化公式如quandprog可能无法正常工作。我应该研究不同的方法吗?
谢谢你的建议!
编辑:
这是我迄今为止尝试的新代码:
objcfunc<-function(P){#build the central minimization function
n=12
r=0.03
V=test[,"Price"]
alpha=0.001
S=S
K=test[,"strike"]
TTM=test[,"TTM"]
m=n-1
Dmat <- matrix(0,nrow=n-1,ncol=n+1)
Dmat[row(Dmat)==col(Dmat)]<-1
Dmat[row(Dmat)+1==col(Dmat)]<--2
Dmat[row(Dmat)+2==col(Dmat)]<-1
Amat=matrix(NA,ncol=n+1,nrow=m) # build the matrix for model option prices
for(u in 1:m){
for(k in 1:(n+1)){
Amat[u,k]=pmax(S[k]-K[u],0)
}
}
y=(Dmat %*% P)^2+alpha*exp(-r*TTM)*((Amat %*% P)-V)^2
return(sum(y))
}
constr<-function(P){
S0=test[,"Settle"]
r=0.03
q=0
TTM=test[,"TTM"]
S=S
f=NULL
f1=rbind(f,S0-exp(-(r-q)*TTM)*sum(P*S))
f2=rbind(f,sum(P)-1)
return(c(f1,f2))
}
n=12
#NlcOptim(X=rep(0,n+1),objfun=objcfunc,confun=constr,lb=rep(0,n+1))#try to get rid from this rbind solution
library(Rsolnp)
solnp(pars=rep(0,n+1),objcfunc,constr,LB=rep(0,n+1))
问题是我在conf $ c中得到错误错误:$ operator对原子向量无效。
是因为NlcOptim使用$来调用任何东西吗?
我提供了我在这里使用的简短样本数据:
Date strike Price Settle TTM Average Moneyness implvola deltaM
2009-09-15 70.0 1.64 70.93 0.12 60.76036 1.01 0.09625975 0.01
2009-09-15 70.5 1.32 70.93 0.12 60.76036 1.01 0.09656526 0.01
2009-09-15 71.0 1.04 70.93 0.12 60.76036 1.00 0.09677672 0.00
2009-09-15 71.5 0.81 70.93 0.12 60.76036 0.99 0.09784297 0.01
2009-09-15 72.0 0.62 70.93 0.12 60.76036 0.99 0.09890358 0.01
2009-09-15 72.5 0.46 70.93 0.12 60.76036 0.98 0.09918868 0.02
2009-09-15 73.0 0.33 70.93 0.12 60.76036 0.97 0.09897400 0.03
2009-09-15 73.5 0.24 70.93 0.12 60.76036 0.97 0.10025021 0.03
2009-09-15 74.0 0.16 70.93 0.12 60.76036 0.96 0.09923239 0.04
2009-09-15 74.5 0.11 70.93 0.12 60.76036 0.95 0.09998572 0.05
2009-09-15 75.0 0.07 70.93 0.12 60.76036 0.95 0.09938658 0.05
示例位于Dataframe测试中。问题贯穿了solnp,所以我将编辑上面的公式。