优化r中的函数(solve.default中的错误)

时间:2016-05-31 10:35:41

标签: r

我有以下等式:

enter image description here(1)

Rp,t+1 =投资组合的回报.. fr =免费风险率.. rt+1:策略的回归。 beta具有以下表达式:
beta=x0+x1*A+ x2*B+ x3*C+x4*D(使用广义矩量法(GMM)估算(1) ABCD是与rt+1相关的风险因素。

我的目标是找到最大化投资者效用函数的x1x2x3x4的最佳值。

enter image description here

U(Rp,t+1;x)是投资者实用工具 x是最大化参数的向量 Zt列出了4个风险因素。

代码是:

ret<-cbind(ret)  #ret= rt+1
factors<-cbind(A,B,C,D)

func<-function(x,ret,factors) {
df <- data.frame(A=factors$A*x[1],B=factors$B*x[2],C=factors$C*x[3], D=factors$D*x[4])
H<-as.matrix(factors)
HH<-matrix(H,179,4)
m <- gmm(ret~., data=df, HH)
b<- coef(m)
beta<- b[1]+b[2]*factors$A+b[3]*factors$B+b[4]*factors$C+b[5]*D
beta=cbind(beta)

r=RF+beta*ret  #equation (1)
#Annual Sharpe ratio of the portfolio
averp<-mean(r)*12 
sigmap<-sqrt(12)*sd(r)
Sharpe<-averp/sigmap

#Calculating utility
u<-1/nrow(r)*sum((1+r)^(1-5)/(1-5))
obj<-u
result <- list(obj=obj,u=u,beta=beta,r=r,averp=averp,sigmap=sigmap,Sharpe=Sharpe)
return(result)
}

#Catching the obj from the function    
Final<-function(x,ret,factors){
bra<-func(x,ret,factors)
#print(bra$obj)
return(-bra$obj)
}
p<-optim(par = c(0,1,2,3),Final,method="Nelder-Mead",ret=ret,factors=factors)
bra<-func(x=p$par,ret=ret,factors=factors)

当我运行代码时,我收到以下错误:  对于p - &gt;

Error in solve.default(crossprod(hm, xm), crossprod(hm, ym)) : 
  Lapack routine dgesv: system is exactly singular: U[2,2] = 0 

for bra - &gt;

Error in is.data.frame(x) : 
  (list) object cannot be coerced to type 'double' 

如果你能帮助我,我将非常感激!谢谢

1 个答案:

答案 0 :(得分:1)

我会为你的func函数编写一个单元测试。您可以使用browser()逐步完成它。

将ret和factor放入数据框中。 df <- data.frame(ret, A=factors$A*x[1], ...)

然后运行m <- gmm(ret~., data=df); beta <- coef(m)