我一直在研究一些示例代码,以尝试学习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实现那么棘手。任何追求的途径,甚至只是确认有人可以使用它的方式(不是错误),都将不胜感激。