根据Julia中的约束最大化Sharpe比率

根据Julia中的约束最大化Sharpe比率,julia,julia-jump,Julia,Julia Jump,我想最大化q[1](夏普比率)的值,在julia中受以下约束 W的值元素为正。(W[i]>0) W的值之和为1。(和(W[1:5])==1) 参考::W是(5X1)向量,ex_mu是(5X1)向量,S是(5x5)矩阵。 我发现有两个julia库可以使用JuMP和Optim.jl,但无法按照库的要求转换函数getSharpeRatio 更新:到目前为止,我已经完成了,但在跳转库中似乎还没有实现转置 使用跳转 function getSharpeRatio(W,ex_mu,S) return

我想最大化q[1](夏普比率)的值,在julia中受以下约束

  • W的值元素为正。(W[i]>0)
  • W的值之和为1。(和(W[1:5])==1)

  • 参考::W是(5X1)向量,ex_mu是(5X1)向量,S是(5x5)矩阵。 我发现有两个julia库可以使用JuMP和Optim.jl,但无法按照库的要求转换函数getSharpeRatio

    更新:到目前为止,我已经完成了,但在跳转库中似乎还没有实现转置 使用跳转

    function getSharpeRatio(W,ex_mu,S)
       return dot(W', ex_mu) / sqrt(dot(W',S*W))
    end
    
    items  = [1;2;3;4;5]
    m = Model()
    @variable(m, 0 <= W[items] <= 1)
    @constraint(m, sum{ W[item] , item in items} == 1)
    @objective(m, Max, getSharpeRatio(W,ex_mu,S))
    solve(m)
    println(getvalue(W))
    
    函数getSharpeRatio(W,ex_mu,S) 返回点(W',ex_mu)/sqrt(点(W',S*W)) 结束 项目=[1;2;3;4;5] m=模型()
    @变量(m,0我认为您的函数需要在一个数组上。创建一个25+5+5长度的向量,并创建
    getSharpeRatio(v)
    start
    W,ex\u mu,S=translate(v)
    函数,该函数使用视图获取临时数组

    translate(v) = (view(v,1:5),view(v,6:10),reshape(view(11:35),5,5))
    
    这不会分配,但这意味着您的新功能可以

    function getSharpeRatio(v)
      W,ex_mu,S=translate(v)
      dot(W,ex_mu)/ sqrt(dot(W,S*W))
    end
    

    这与JuMP/Optim所期望的相符。从这里开始,您需要重新执行约束以匹配此处的索引…尽管我认为我设置了它(首先使用W),这样它才能工作。

    我相信您的函数需要在一个数组上。创建一个25+5+5长度的向量,并创建
    getSharpeRatio(v)
    开始
    W,ex_mu,S=translate(v)
    函数,该函数使用视图获取临时数组

    translate(v) = (view(v,1:5),view(v,6:10),reshape(view(11:35),5,5))
    
    这不会分配,但这意味着您的新功能可以

    function getSharpeRatio(v)
      W,ex_mu,S=translate(v)
      dot(W,ex_mu)/ sqrt(dot(W,S*W))
    end
    

    这与JuMP/Optim的预期相符。从这里开始,您需要重新执行约束以匹配此处的索引…尽管我认为我已经设置好了(首先使用W),这样它就可以工作。

    简单提示一下,使用q=dot(W,ex_mu)/sqrt(dot(W,S*W))相反,如果你想要一个标量。到目前为止你尝试了什么?我大约在一年前在Julia使用
    NLopt
    做了这件事。不幸的是,代码现在无法开源,但如果你尝试使用
    NLopt
    并遇到问题,我可以回答你可能遇到的任何特定问题。此外,你不必解决这个问题m使用数值优化。例如,见Irlicht(2014)“快速递归投资组合优化”,正如@pkofod所指出的,我已将我的getSharpeRatio函数更新如下:函数getSharpeRatio(W,ex_μ,S)返回点(W',ex_μ)/sqrt(点(W,S*W))现在结束,我打算添加两个约束并最大化计算的夏普比率。那么,我应该如何使用NLopt/JuMP/Optim.jl使用跳转函数getSharpeRatio(W,ex_μ,S)返回点(W',ex_μ)/sqrt(点(W',S*W))来定义它呢结束项=[1;2;3;4;5]m=Model()@变量(m,0只是一个简单提示,使用q=dot(W,ex_mu)/sqrt(dot(W,S*W))相反,如果你想要一个标量。到目前为止你尝试了什么?我大约在一年前在Julia使用
    NLopt
    做了这件事。不幸的是,代码现在无法开源,但如果你尝试使用
    NLopt
    并遇到问题,我可以回答你可能遇到的任何特定问题。此外,你不必解决这个问题m使用数值优化。例如,见Irlicht(2014)“快速递归投资组合优化”,正如@pkofod所指出的,我已将我的getSharpeRatio函数更新如下:函数getSharpeRatio(W,ex_μ,S)返回点(W',ex_μ)/sqrt(点(W,S*W))现在结束,我打算添加两个约束并最大化计算的夏普比率。那么,我应该如何使用NLopt/JuMP/Optim.jl使用跳转函数getSharpeRatio(W,ex_μ,S)返回点(W',ex_μ)/sqrt(点(W',S*W))来定义它呢结束项=[1;2;3;4;5]m=Model()@变量(m,0