0

株式ポートフォリオのシャープレシオを最大化するために 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
4

1 に答える 1

3

これは凸ではないと思います。私が理解していることから、この問題を攻撃する方法はいくつかあります

  1. 汎用 NLP ソルバーを使用する (これは私が使用した方法です)
  2. 効率的なフロンティアをトレースして、このフロンティア上で最適なシャープ レシオのポイントを見つけます。
  3. いくつかの条件下では、この問題は凸 QP に変換される可能性があります (Gerard Cornuejols、Reha Tütüncü、Optimization Methods in Finance、2007 などを参照)。
于 2016-08-09T15:46:46.317 に答える