Расширение примера CVXR cvxr_kelly-strategy не совместимо с DCP?

Я проработал некоторые примеры кода, пытаясь изучить CVX и крутясь в колесах, пытаясь выяснить расширение примера Келли в CVXR:

«Расширения: как отмечалось в некоторых приведенных выше траекториях, богатство имеет тенденцию к значительному падению, прежде чем в конечном итоге возрастет. Один из способов уменьшить этот риск проседания - добавить выпуклое ограничение, как описано в Буссети, Рю и Бойд (2016, 5.3) с CVXR, это может быть выполнено в одной строке с помощью атома log_sum_exp. Другие расширения, такие как цели богатства, ограничения ставок и границы VaR / CVaR, также легко включаются ».

Версия R примера CVXR (без расширения) находится здесь: 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 ИСТИНА.

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

ИСТИННЫЙ

Может быть, это сообщение без ответа (тот же основной вопрос) Log_sum_exp выпуклой функции не совместим с dcp? предположил, что CVXR :: log_sum_exp« не может вывести выпуклость log_sum_exp », возможно, потому, что он не распознает знак переменных?

Я был бы удивлен, если бы в моем коде была ошибка R, а не что-то пропало.

Кроме того, если значение lambda_risk @ установлено на ноль, он должен просто вернуть прямую ставку Kelly Optimal. Я получаю этот результат, только если перезаписываю переменную lambda_risk числом 0.

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 будет настолько сложной. Будем признательны за любые способы преследования или даже просто подтверждение того, что кто-то заставил его работать (а не баг).


person SCW    schedule 18.04.2019    source источник


Ответы (1)


На самом деле это ошибка. Спасибо, что указали на это! Мы только что выпустили исправление в CVXR v0.99-5 .

person anqif    schedule 04.05.2019