扩展到CVXR示例cvxr_kelly-strategy是否不符合DCP?

时间:2019-04-18 00:18:02

标签: r convex-optimization cvx cvxr

我一直在研究一些示例代码,以尝试学习CVX,并摸索着尝试找出CVXR中Kelly示例的扩展名:

“扩展名: 正如以上某些轨迹所观察到的,财富在最终增加之前往往会大量下降。降低这种缩水风险的一种方法是添加一个凸约束,如Busseti,Ryu和Boyd(2016,5.3)中所述。 使用CVXR,可以使用log_sum_exp原子在一行中完成此操作。财富目标,下注限制和VaR / CVaR范围之类的其他扩展也很容易合并。”

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

public class AndroidPostBuildProcessor : IPostGenerateGradleAndroidProject
{
    public int callbackOrder
    {
        get
        {
            return 999;
        }
    }


    void IPostGenerateGradleAndroidProject.OnPostGenerateGradleAndroidProject(string path)
    {
        Debug.Log("Bulid path : " + path);
        string gradlePropertiesFile = path + "/gradle.properties";
        if (File.Exists(gradlePropertiesFile))
        {
            File.Delete(gradlePropertiesFile);
        }
        StreamWriter writer = File.CreateText(gradlePropertiesFile);
        writer.WriteLine("org.gradle.jvmargs=-Xmx4096M");
        writer.WriteLine("android.useAndroidX=true");
        writer.WriteLine("android.enableJetifier=true");
        writer.Flush();
        writer.Close();

    }
}

这很好用。

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

“有限结果RCK问题(11)可以用CVXPY表示为”

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

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

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

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

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

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

正面和未知

因此看来,最终的记录是取消其资格的原因。

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

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

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

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

此外,在lambda_risk @ value设置为零的情况下,它应该只返回直接的Kelly最佳下注。仅当我用数字0覆盖变量lambda_risk时,才会得到该结果。

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

TRUE&TRUE

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

我很困惑。

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

1 个答案:

答案 0 :(得分:0)

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