首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对CVXR示例cvxr_kelly的扩展-策略不符合DCP?

对CVXR示例cvxr_kelly的扩展-策略不符合DCP?
EN

Stack Overflow用户
提问于 2019-04-18 08:18:02
回答 1查看 205关注 0票数 0

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

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

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

代码语言:javascript
复制
## 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中公式化并求解为”

代码语言:javascript
复制
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应该如下所示:

代码语言:javascript
复制
lambda_risk = Parameter(sign =  "POSITIVE")
risk_constraint = (log_sum_exp(log(ps) - lambda_risk * log(rets %*% b) ) ) 

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

代码语言:javascript
复制
is_atom_convex(log_sum_exp(log(ps) - lambda_risk * log(rets %*% b) ))

真的

代码语言:javascript
复制
is_convex(log_sum_exp(log(ps) - lambda_risk * log(rets %*% b) ))

错误

代码语言:javascript
复制
is_dcp(log_sum_exp(log(ps) - lambda_risk * log(rets %*% b) ))

错误

代码语言:javascript
复制
curvature((sum(exp( log(ps) - lambda_risk * log(rets %*% b) ))))
curvature(log(sum(exp( log(ps) - lambda_risk * log(rets %*% b) ))))

凸性&未知

代码语言:javascript
复制
sign((sum(exp( log(ps) - lambda_risk * log(rets %*% b) ))))
sign(log(sum(exp( log(ps) - lambda_risk * log(rets %*% b) ))))

积极和未知

因此,最终的日志似乎就是取消资格的原因。

如果我用来自原始迭代的实际结果“投注”替换变量b,它就会说is_dcp为真。

代码语言:javascript
复制
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 bug,而不是我的代码中缺少了什么,我会感到惊讶。

此外,随着lambda_risk@value设置为零,它应该只返回直接的凯利最优赌注。只有当我用数字0覆盖变量lambda_risk时,我才会得到这个结果。

代码语言:javascript
复制
is_dcp( log_sum_exp( log(ps) - 0 * log(rets %*% b) ) )
is_dcp(log_sum_exp( log(ps) - 0))

真与真

代码语言:javascript
复制
lambda_risk@value= 0
is_dcp( log_sum_exp( log(ps) - lambda_risk * log(rets %*% b) ) ) 

错误

我被难住了。

到处都有可用的python解决方案,而且我还得到了上面我尝试过的在DEOPTIM中工作的公式(在相当长的时间内),所以我不会想到CVXR实现会如此棘手。任何追求的途径,甚至只是确认有人让它工作(而不是一个bug),都会受到欢迎。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-05 07:06:58

这实际上是一个bug。感谢您的指点!我们刚刚在CVXR v0.99-5中发布了一个修复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55737567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档