【问题标题】:Maximise Sharpe ratio subject to contraints in Julia在 Julia 的约束下最大化夏普比率
【发布时间】:2017-02-10 12:45:37
【问题描述】:

我想最大化 q[1](Sharpe Ratio) 的值,但要遵守 julia 中的以下约束。

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

    function getSharpeRatio(W,ex_mu,S)
      q = ( W'*ex_mu ) / sqrt((W'*S*W))
      return q[1]
    end
    

供参考 :: W 是 (5X1) 向量,ex_mu 是 (5x1) 向量, S 是 (5x5) 矩阵。 我找到了两个使用 JuMP 和 Optim.jl 的 julia 库,但无法按照库的要求翻译函数 getSharpeRatio。

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

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))

任何建议如何去做。

【问题讨论】:

  • 只是一个快速提示,如果您想要一个标量,请改用 q = dot(W, ex_mu) / sqrt(dot(W, S*W))。到目前为止,您尝试过什么?
  • 大约一年前,我在 Julia 中使用 NLopt 做到了这一点。不幸的是,代码目前无法开源,但如果您使用 NLopt 并遇到问题,我可以回答您可能遇到的任何特定问题。此外,您没有必须使用数值优化来解决这个问题。见,例如Irlicht(2014 年)“快速递归投资组合优化”
  • 正如@pkofod 所指出的,我已将我的getSharpeRatio 函数更新如下: function getSharpeRatio(W,ex_mu,S) return dot(W', ex_mu) / sqrt(dot(W, S* W)) 结束现在我打算添加两个约束并最大化计算出的锐度比率。那么我应该如何使用 NLopt/JuMP/Optim.jl 来定义它
  • 使用 JuMP 函数 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

标签: julia julia-jump


【解决方案1】:

我相信你的函数需要在一个数组上。制作一个 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),这样它就可以工作了。

【讨论】:

    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2021-12-19
    相关资源
    最近更新 更多