【发布时间】:2016-08-18 13:10:51
【问题描述】:
在 StackOverflow 贡献者的大力帮助下,我设法组合了一个函数来导出 2 资产投资组合的权重,从而使夏普比率最大化。不允许卖空并且权重总和为 1。我现在想做的是限制资产 A 与用户定义的权重相差不超过或少于 10%。例如,我想将资产 A 的权重限制为不小于 54% 或大于 66%(即 60% +/- 10%)。所以在下面的例子中,我最终会得到 (0.54,0.66) 而不是不受约束的 (0.243,0.7570) 的权重。我认为这可以通过调整 bVect 来完成,但我不太确定如何去做。任何帮助,将不胜感激。
asset_A <- c(0.034320510,-0.001209628,0.031900161,0.023163947,-0.001872938,-0.010322489,0.006090395,-0.003270854,0.017778990,0.017204915)
asset_B <- c(0.047103261,0.055175057,0.021019816,0.020602347,0.007281368,-0.006547404,0.019155238,0.005494798,0.025429958,0.014929124)
require(quadprog)
HR_solve <- function(asset_A,asset_B) {
vol_A <- sd(asset_A)
vol_B <- sd(asset_B)
cor_AB <- cor(cbind(asset_A,asset_B),method="pearson")
ret_A_B <- as.matrix(c(mean(asset_A),mean(asset_B)))
vol_AB <- c(vol_A,vol_B)
covmat <- diag(as.vector(vol_AB))%*%cor_AB%*%diag(as.vector(vol_AB))
aMat <- cbind(rep(1,nrow(covmat)),diag(1,nrow(covmat)))
bVec <- c(1,0,0)
zeros <- array(0, dim = c(nrow(covmat),1))
minw <- solve.QP(covmat, zeros, aMat, bVec, meq = 1 ,factorized = FALSE)$solution
rp <- as.numeric(t(minw) %*% ret_A_B)
sp <- sqrt(t(minw) %*% covmat %*% minw)
wp <- t(matrix(minw))
sret <- sort(seq(t(minw) %*% ret_A_B,max(ret_A_B),length.out=100))
aMatt <- cbind(ret_A_B,aMat)
for (ri in sret[-1]){
bVect <- c(ri,bVec)
result <- tryCatch({solve.QP(covmat, zeros, aMatt, bVect, meq = 2,factorized = FALSE)},
warning = function(w){ return(NULL) } , error = function(w){ return(NULL)}, finally = {} )
if (!is.null(result)){
wp <- rbind(wp,as.vector(result$solution))
rp <-c(rp,t(as.vector(result$solution) %*% ret_A_B))
sp <- c(sp,sqrt(t(as.vector(result$solution)) %*% covmat %*% as.vector(result$solution))) }
}
HR_weights <- wp[which.max(rp/sp),]
as.matrix(HR_weights)
}
HR_solve(asset_A,asset_B)
[,1]
[1,] 0.2429662
[2,] 0.7570338
【问题讨论】:
-
好的,我已经找到了如何做到这一点.....
-
你检查过
PortfolioAnalytics包吗? -
是的,我有,但我希望能够指定我自己的协方差矩阵和风险估计值,所以 quadprog 对我来说效果更好......
-
仅供参考 - PortfolioAnalytics 在后台使用
quadprog(与其他几个求解器一起)。 -
您也可以这样做。 PortfolioAnalytics 允许您使用自定义矩函数(“统计矩”中的矩)设置投资组合矩,因此您可以定义投资组合并告诉它使用您自己的(稳健的)协方差估计,因此您可以运行
optimize.portfolio(returns, portfolio, optimize_method="quadprog", momentFUN="myCustomRobustFunction"和 @987654326 @返回带有sigma的列表。参见例如cran.r-project.org/web/packages/PortfolioAnalytics/vignettes/…
标签: r optimization portfolio quadprog