株式ポートフォリオのシャープレシオを最大化するために CVXPY を使用しようとしています。
変数 w はポートフォリオの重みベクトル、Sigma は nxn 相関行列、mu は各ポートフォリオ株式の平均リターン、rf はリスクフリー レート (スカラー値) です。
最初に、問題を次のように構築しようとしました: Maximise((ret-rf)/(sqrt(risk)))、これにより TypeError: Can only Division by a scalar constant が発生しました。最大化しようとしている値のログを取得してこの問題を回避しようとしましたが、「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