ここに興味深いパズルがあります。
以下は、y 軸上の点 (0,rf) から引かれた線に対する二次関数の接点を識別するR スニペットです。
ポートフォリオ理論に精通している人にとって、この点はリターンとリスク空間にあり、解決策は正接ポートフォリオ (最大シャープレシオ) を定義する重みのセットです。このスニペットでは、負の重み (ショートパンツなど) が許可されており、重みの合計 = 1 を必要とする均等重み制約が 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)
私の質問 - 重みの合計が任意の数 (重みの合計 = 0 である自己資金調達ポートフォリオのコーナーケースを含む) とは対照的に、最適な重みのセットを解決するためにコードを適応させる方法団結?
あるいは、分散共分散が 0 の共分散行列に要素「現金」を追加し、現金の重み = 1 を必要とする等式制約を追加することを検討することもできます。ただし、この行列は半正定値ではありません。また、現金以外のウェイトは自明にゼロである可能性があると思います。