Максимизируйте уклон, используя CVXPY
Я пытаюсь использовать CVXPY, чтобы максимизировать коэффициент Шарпа портфеля акций.
Переменная w представляет собой вектор веса портфеля, Sigma - это корреляционная матрица nxn, mu - средняя доходность каждой акции портфеля, а rf - безрисковая ставка (скалярное значение).
Сначала я попытался построить проблему следующим образом: Maximize((ret-rf)/(sqrt(risk))), которая вызвала ошибку TypeError: может делиться только на скалярную константу. Я попытался обойти эту проблему, взяв в журнал значение, которое я пытаюсь максимизировать, однако теперь я получаю "недопустимый синтаксис", вызванный "prob.solve()". Я почти уверен, что проблема возникает из формулы максимизации, но я не уверен, что это такое.
(Я пробовал обе формулы журнала CVXPY, а именно log_det() и log_sum_exp())
Вот код ниже:
from cvxpy import *
def portfolio(mu, Sigma, rf):
n = len(mu)
w = Variable(n)
ret = mu.T*w
risk = quad_form(w, Sigma)
prob = Problem(Maximize(log_det(ret-rf)-log_det(sqrt(risk)),
[sum_entries(w) == 1])
prob.solve()
return w.value
1 ответ
Я считаю, что это не выпукло. Из того, что я понимаю, есть несколько способов решения этой проблемы.
- Используйте универсальный решатель НЛП (этот метод я использовал)
- Проследите эффективную границу, чтобы найти точку на этой границе с лучшим соотношением Шарпа
- При некоторых условиях эта проблема может быть преобразована в выпуклое QP (см., Например, Gerard Cornuejols, Reha Tütüncü, Методы оптимизации в финансах, 2007).