Ограничение CVXR не выполнено, но статус оптимален - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь использовать CVXR для решения моей проблемы оптимизации, код, который я написал (я использовал ECOS_BB по умолчанию):

w = Variable(nrow(sigma))
n = Int(nrow(pweights))
objective = Minimize(quad_form(w,sigma-diag(specRisk^2)))
constraints1 = list(w+maxTradeSize*n >= pweights$pctEquity, #Constraint 1
                   w-maxTradeSize*n <= pweights$pctEquity,  #Constraint 2
                   w*sign(pweights$pctEquity) >= 0,         #Constraint 3
                   sum_entries(n)<=numTrades,               #Constraint 4
                   sum_entries(sign(pweights$pctEquity)*w)<=1.01*grossExposure, #Constraint 5
                   sum_entries(sign(pweights$pctEquity)*w)>=.99*grossExposure,  #Constraint 6
                   quad_form(w,sigma) <= (volTarget^2),        #Constraint 7
                   n<=1, #Constraint 8
                   n>=0) #Constraint 9
problem = Problem(objective, constraints1)
result <- psolve(problem, MAXIT=as.integer(2000))
result$status

Это дает мне статус как оптимальный, но когда я проверяю Выходное ограничение 7 не выполняется. Значение (quad_form (w, sigma)) оказывается равным 0,002733956, когда ограничение требует, чтобы оно было ниже 0,0025. Я попробовал следующий код с меньшими ограничениями (здесь ограничение 7 из предыдущего кода было сделано 1-м):

w = Variable(nrow(sigma))
n = Int(nrow(pweights))
objective = Minimize(quad_form(w,sigma-diag(specRisk^2)))
constraints2 = list(quad_form(w,sigma) <= (volTarget^2), #Constraint 1
                   sum_entries(sign(pweights$pctEquity)*w)<=1.01*grossExposure, #Constraint 2
                   sum_entries(sign(pweights$pctEquity)*w)>=.99*grossExposure)  #Constraint 3
problem = Problem(objective, constraints1)
result <- psolve(problem, MAXIT=as.integer(2000))
result$status

Это дает мне оптимальный вывод с удовлетворением ограничения. Я не могу понять, в чем проблема. Любая помощь по этому вопросу будет принята с благодарностью.

...