我一直在研究一些示例代码,试图学习CVX,并旋转轮子,试图弄清楚CVXR中Kelly示例的扩展:
扩展:正如在上面的一些轨迹中观察到的,财富在最终增加之前往往会大幅下降。降低这种下降风险的一种方法是添加一个凸约束,如Busseti,Ryu和Boyd (2016,5.3)中所述,使用log_sum_exp原子,这可以在一行内完成。其他扩展,如财富目标,投注限制和风险值/风险值界限也很容易合并。
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,...)中导致错误: Problem不遵循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为真。
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时,我才会得到这个结果。
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实现会如此棘手。任何追求的途径,甚至只是确认有人让它工作(而不是一个bug),都会受到欢迎。
发布于 2019-05-05 07:06:58
这实际上是一个bug。感谢您的指点!我们刚刚在CVXR v0.99-5中发布了一个修复。
https://stackoverflow.com/questions/55737567
复制相似问题