0

Julia (0.5) と Convex.jl (ECOS ソルバーを使用) を使用して、2 つの株式のポートフォリオが与えられた場合に、ポートフォリオの収益を最大化するために、両方の株式に配分 (パーセント) を配分する方法を見つけようとしています。リスクを最小限に抑えます(リターンの標準偏差)。シャープレシオと呼ばれるものを最大化したいと考えています。これは、保有する 2 つの株式のそれぞれのパーセンテージから算出される計算です。そこで、シャープレシオを最大化し、ソルバーに 2 つの株式の最適な割り当てを割り出させます (株式 1 の x% と株式 2 の 1-x% が必要であると教えてもらいたい)。唯一の実際の制約は、割合の割り当ての合計が 100% になることです。以下のコードが実行されますが、期待する最適な重み/割り当てが得られません (Supertech の場合は 36.3%、Slowpoke の場合は 63.7%)。

私の直観は、目的関数がソルバーに対して正しくモデル化されていないか、制約をさらに処理する必要があるということです。私は凸最適化についてよく理解していないので、翼を広げています。また、私の目的関数は variable.value 属性を使用して正しい出力を取得しており、代わりに Variable 式オブジェクトを操作する必要があると思われます。

質問は、凸ソルバーが設計されている何かを達成しようとしているのですか?目的関数と制約をより適切にモデル化する必要がありますか?

コメント付きのコード:

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