我有以下等式:
Rp,t+1
=投资组合的回报.. fr
=免费风险率.. rt+1
:策略的回归。
beta
具有以下表达式:
beta=x0+x1*A+ x2*B+ x3*C+x4*D
(使用广义矩量法(GMM)估算(1)
A
,B
,C
和D
是与rt+1
相关的风险因素。
我的目标是找到最大化投资者效用函数的x1
,x2
,x3
和x4
的最佳值。
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'
如果你能帮助我,我将非常感激!谢谢
答案 0 :(得分:1)
我会为你的func函数编写一个单元测试。您可以使用browser()
逐步完成它。
将ret和factor放入数据框中。 df <- data.frame(ret, A=factors$A*x[1], ...)
然后运行m <- gmm(ret~., data=df); beta <- coef(m)