quadprog优化

Ram*_*lia 9 optimization r linear-algebra mathematical-optimization quadratic

这是一个有趣的谜题.

下面是一个R片段,它标识二次函数相对于从y轴上的点(0,rf)绘制的直线的相切点.

对于熟悉投资组合理论的人来说,这一点是回报和风险空间,解决方案是一组权重,用于定义相切投资组合(最大锐度比).该片段允许负权重(即短路),并且存在一个等权重约束,其要求权重之和= 1.

require(quadprog)

# create artifical data
nO     <- 100     # number of observations
nA     <- 10      # number of assets
mData  <- array(rnorm(nO * nA, mean = 0.001, sd = 0.01), dim = c(nO, nA))
rf     <- 0.0001     # riskfree rate (2.5% pa)
mu     <- apply(mData, 2, mean)    # means
mu2    <- mu - rf                  # excess means

# qp
aMat  <- as.matrix(mu2)
bVec  <- 1 # set expectation of portfolio excess return to 1
zeros <- array(0, dim = c(nA,1))
solQP <- solve.QP(cov(mData), zeros, aMat, bVec, meq = 1)

# rescale variables to obtain weights
w <- as.matrix(solQP$solution/sum(solQP$solution))

# compute sharpe ratio
SR <- t(w) %*% mu2 / sqrt(t(w) %*% cov(mData) %*% w)
Run Code Online (Sandbox Code Playgroud)

我的问题 - 如何调整代码以求解最佳权重集,使得权重之和总和为任意数(包括权重总和为0的自筹资金投资组合的极端情况),而不是统一?

或者,您可以考虑将元素'cash'添加到协方差矩阵,方差 - 协方差为0,并添加一个等式约束,要求权重为现金= 1.但是这个矩阵不是正半正定的.我还怀疑非现金权重可能只是零.

Vin*_*ynd 9

让我们首先解释为什么这实际上产生了最大的夏普比率组合.

我们想要w最大化w' mu / sqrt( w' V w ).但是如果我们乘以w一个数字(它是"0级的同质"),那么这个数量就不会改变:因此我们可以强加w' mu = 1,而最大化的问题1 / sqrt( w' V w )等同于最小化w' V w.最大的夏普比率组合并不是唯一的:它们形成一条线.如果我们希望权重总和为1(或任何其他非零数字),我们只需重新调整它们.

如果我们希望权重总和为0,我们可以将该约束添加到问题中 - 它只能起作用,因为约束也是0度的同质.您仍然需要重新调整权重,例如,100%长并且100%做空.

solQP <- solve.QP(cov(mData), zeros, 
  cbind(aMat,1), 
  c(bVec,0), 
  meq = 2
)

# Let us compare with another solver
V <- cov(mData)
library(Rsolnp)
r <- solnp(
  rep(1/length(mu), length(mu)),
  function(w) - t(w) %*% mu2 / sqrt( t(w) %*% V %*% w ),
  eqfun = function(w) sum(w),
  eqB   = 0,
  LB = rep(-1, length(mu))
)
solQP$solution / r$pars  # constant
Run Code Online (Sandbox Code Playgroud)