Вот интересная головоломка.оптимизация quadprog
Ниже приведено значение R snippet, которое идентифицирует точку касания квадратичной функции относительно линии, проведенной из точки (0, rf) по оси y.
Для тех, кто знаком с теорией портфеля, эта точка находится в обратном и пространстве риска, а решение представляет собой набор весов, определяющих портфолио касаний (максимальное отношение шара). Сниппет позволяет отрицательных весов (то есть шорты) и есть один равенство веса ограничение, которое требует сумму весов = 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), в отличие от единицы?
В качестве альтернативы вы можете добавить элемент «cash» в матрицу ковариации с ковариацией дисперсии 0 и добавить ограничение равенства, требующее веса на деньги = 1. Однако эта матрица не будет положительной полуопределенной , Также я подозреваю, что неденежные веса могут быть тривиально нулевыми.
Внутри вашего 'решающегоQP' вызова, я не вижу ограничения, обеспечивающего, чтобы весы суммировались с одним. Вместо этого 'aMat, bVec, meq = 1' требует, чтобы ваш избыток портфеля был единым, что вы можете проверить с помощью' sum (aMat * solQP $ solution) '. Внутри вашего 'solve.QP' вызов, не следует ли использовать вектор из них вместо' aMat'? – flodel
@flodel - вы правы. Типичный фиксированный, хороший улов –