Как использовать выпуклую оптимизацию для оптимизации портфеля в Julia

Я пытаюсь использовать Julia (0.5) и Convex.jl (с решателем ECOS), чтобы выяснить, учитывая портфель из 2 акций, как я могу распределить свои ассигнования (в процентах) по обеим акциям так, чтобы я максимизировал доходность своего портфеля и минимизировать мой риск (стандартное отклонение прибыли). Я хочу максимизировать так называемый коэффициент Шарпа, который рассчитывается исходя из того, какой процент у меня есть в каждой из моих двух акций. Поэтому я хочу максимально увеличить коэффициент Шарпа и решить, каково оптимальное распределение для этих двух акций (я хочу сказать, что мне нужно x% акций 1 и 1-x% акций 2). Единственным реальным ограничением является то, что сумма процентных ассигнований увеличивается до 100%. У меня есть код, который запускается, но не дает мне ожидаемого оптимального веса / распределения (что составляет 36,3% для Supertech и 63,7% для Slowpoke). Решатель вместо этого возвращается с 50/50.

Моя интуиция заключается в том, что у меня либо целевая функция неправильно смоделирована для решателя, либо мне нужно больше работать с ограничениями. Я не очень хорошо разбираюсь в выпуклой оптимизации, так что я готов к этому. Кроме того, моя целевая функция использует атрибут variable.value для получения правильного вывода, и я подозреваю, что вместо этого мне нужно работать с объектом выражения Variable.

Вопрос в том, для чего я пытаюсь достичь чего-то, для чего предназначен решатель Convex, и мне просто нужно лучше смоделировать целевую функцию и ограничения, или мне просто нужно перебрать весовые коэффициенты и перебрать их?

Код с комментариями:

using Convex, ECOS
Supertech = [-.2; .1; .3; .5];
Slowpoke = [.05; .2; -.12; .09];
A = reshape([Supertech; Slowpoke],4,2)
mlen = size(A)[1]
R = vec(mean(A,1))
n=rank(A)
w = Variable(n)
c1 = sum(w) == 1;
λ = .01
w.value = [λ; 1-λ]
sharpe_ratio = sqrt(mlen) * (w.value' * R) / sqrt(sum(vec(w.value' .* w.value) .*  vec(cov(A,1,false))))
# sharpe_ratio will be maximized at 1.80519 when w.value = [λ, 1-λ] where λ = .363
p = maximize(sharpe_ratio,c1);
solve!(p, ECOSSolver(verbose = false));  # when verbose=true, says is 'degenerate' because I don't have enough constrains...
println(w.value) # expecting to get [.363; .637] here but I get [0.5; 0.5]

0 ответов

Другие вопросы по тегам