【问题标题】:Extension to the CVXR example cvxr_kelly-strategy not DCP compliant?CVXR 示例 cvxr_kelly-strategy 的扩展不符合 DCP?
【发布时间】:2019-04-18 00:18:01
【问题描述】:

我一直在研究一些示例代码,试图学习 CVX 并旋转我的轮子,试图找出 CVXR 中 Kelly 示例的扩展:

“扩展: 正如在上面的一些轨迹中所观察到的,财富在最终增加之前往往会大幅下降。降低这种回撤风险的一种方法是添加凸约束,如 Bussti、Ryu 和 Boyd (2016, 5.3) 中所述 使用 CVXR,这可以使用 log_sum_exp 原子在一行中完成。其他扩展,如财富目标、投注限制和 VaR/CVaR 界限也很容易合并。”

CVXR 示例的 R 版本(不带扩展名)在这里:https://cvxr.rbind.io/cvxr_examples/cvxr_kelly-strategy/

## Solve for Kelly optimal bets
b <- Variable(n)
obj <- Maximize(t(ps) %*% log(rets %*% b))
constraints <- list(sum(b) == 1, b >= 0)
prob <- Problem(obj, constraints)
result <- solve(prob)
bets <- result$getValue(b)

这很好用。

带有扩展名的python版本(来自参考论文)在这里:https://github.com/cvxgrp/kelly_code

“有限结果 RCK 问题 (11) 在 CVXPY 中可以表述为”

b = Variable(n)
lambda_risk = Parameter(sign = ’positive’)
growth = ps.T*log(rets.T*b)
risk_constraint = (log_sum_exp (log(ps) - lambda_risk * log(rets.T*b)) <= 0)
constraints = [ sum_entries(b) == 1, b >= 0, risk_constraint ]
risk_constr_kelly = Problem(Maximize(growth),constraints)
risk_constr_kelly.solve()

在具有上述公式的 R 中,lambda_risk 和 risk_constraints 应如下所示:

lambda_risk = Parameter(sign =  "POSITIVE")
risk_constraint = (log_sum_exp(log(ps) - lambda_risk * log(rets %*% b) ) ) 

但是,这会导致 CVXR::psolve(a, b, ...) 中出现错误:问题不遵循 DCP 规则。

is_atom_convex(log_sum_exp(log(ps) - lambda_risk * log(rets %*% b) ))

是的

is_convex(log_sum_exp(log(ps) - lambda_risk * log(rets %*% b) ))

错误

is_dcp(log_sum_exp(log(ps) - lambda_risk * log(rets %*% b) ))

错误

curvature((sum(exp( log(ps) - lambda_risk * log(rets %*% b) ))))
curvature(log(sum(exp( log(ps) - lambda_risk * log(rets %*% b) ))))

凸的和未知的

sign((sum(exp( log(ps) - lambda_risk * log(rets %*% b) ))))
sign(log(sum(exp( log(ps) - lambda_risk * log(rets %*% b) ))))

阳性和未知

所以看来最终的日志是不合格的。

如果我用原始迭代的实际结果“赌注”替换变量 b,它确实说它 is_dcp TRUE

is_dcp(log_sum_exp(log(ps) - lambda_risk * log(rets %*% bets) ))

是的

可能是这个未回答的帖子(相同的基本问题) Log_sum_exp of a convex function is not dcp compliant? 建议 CVXR::log_sum_exp “无法推断 log_sum_exp 的凸性” ,可能是因为它不识别变量的符号?

如果存在 R 错误,而不是我的代码中缺少某些内容,我会感到惊讶。

此外,当 lambda_risk@value 设置为零时,它应该只返回直接的 Kelly Optimal 赌注。如果我用数字 0 覆盖变量 lambda_risk,我只会得到这个结果。

is_dcp( log_sum_exp( log(ps) - 0 * log(rets %*% b) ) )
is_dcp(log_sum_exp( log(ps) - 0))

真实与真实

lambda_risk@value= 0
is_dcp( log_sum_exp( log(ps) - lambda_risk * log(rets %*% b) ) ) 

错误

我被难住了。

到处都有可用的 python 解决方案,而且我也得到了我上面尝试的公式在 DEOPTIM 中工作(在相当长的时间内),所以我没想到 CVXR 实现会那么棘手。任何追求的途径,甚至只是确认有人让它工作(不是错误),都将不胜感激。

【问题讨论】:

    标签: r convex-optimization cvx cvxr


    【解决方案1】:

    这实际上是一个错误。感谢您指出!我们刚刚在CVXR v0.99-5 中发布了一个修复程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2012-10-22
      • 2011-05-10
      • 2015-07-22
      • 1970-01-01
      • 2016-05-20
      相关资源
      最近更新 更多