0

我正在尝试使用 Julia(0.5)和 Convex.jl(使用 ECOS 求解器)来计算,给定 2 只股票的投资组合,我如何在两只股票之间分配我的分配(百分比),以便我最大化我的投资组合回报并最小化我的风险(回报的标准开发)。我想最大化所谓的夏普比率,它是根据我在两只股票中的每只股票的百分比计算得出的。所以我想最大化夏普比率并让求解器找出两只股票的最佳分配(我希望它告诉我我需要股票 1 的 x% 和股票 2 的 1-x%)。唯一真正的限制是分配百分比的总和增加到 100%。我有下面的代码运行,但没有给我我期望的最佳权重/分配(Supertech 为 36.3%,Slowpoke 为 63.7%)。

我的直觉是我要么为求解器错误地建模了目标函数,要么我需要对约束做更多的事情。我对凸优化没有很好的掌握,所以我正在努力。此外,我的目标函数使用 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]
4

0 回答 0