Групповые / портфельные ограничения в линейном программировании

#r #linear-programming

#r #линейное программирование

Вопрос:

Я делаю оптимизацию портфеля как задачу линейного программирования. У меня есть 500 акций, и я хочу — с набором ограничений — максимизировать мою переменную решения.

Из приведенного ниже кода я получаю предложение портфолио.. но мне нужно еще одно ограничение: в портфеле может быть не менее 20 разных акций. Как мне ввести это ограничение?

Я немного обновил код .. но я не могу заставить его работать … из приведенного ниже кода я ожидал бы получить портфель из 7 акций.. идея, лежащая в основе кода, — это ответ, приведенный ниже

 

df_temp <-temp <- data.frame(stock_number= seq(1:50), OPT= runif(50), 
                   ctrl=1, alt=0)
df_temp_1 <- data.frame(stock_number= paste("a",seq(1:50)), OPT= 0, 
                        ctrl=0, alt=1)
df_temp <- rbind(df_temp, df_temp_1)

require(lpSolveAPI)


example <- make.lp(1,NROW(df_temp))

row.add.mode(example,"on")
add.constraint(example,xt=df_temp$ctrl ,type="=",rhs=1,indices=c(1: nrow(df_temp)))
add.constraint(example,xt=df_temp$alt ,type="=",rhs=7,indices=c(1: nrow(df_temp)))

for (i in 1:50)
{
  add.constraint(example,df_temp$ctrl[i] ,type="<=",rhs=0.2,indices=c(i))
  add.constraint(example,df_temp$alt[i 50]*999 - df_temp$ctrl[i],type=">=",rhs=0,indices=c(i))
  add.constraint(example,df_temp$alt[i 50]-df_temp$ctrl[i] ,type="<=",rhs=0,indices=c(i))
}

row.add.mode(example,"off")

set.type(example,c(1:50), "real" )
set.type(example,c(51:100), "binary" )
         
lp.control(example, sense="max")
set.objfn(example,obj=df_temp$OPT )
solve(example)
df_temp$PFW <- get.variables(example)

df_temp

 

Комментарии:

1. CVXR может быть более простым инструментом для выражения моделей портфеля. Это работает на более высоком уровне, поэтому вы можете выражать вещи более естественно. Кроме того, это позволит вам формировать квадратичные модели (часто используемые для моделирования риска).

Ответ №1:

Если x (i) = количество акций, предлагаемых для акции i, где i варьируется от 1 до 500, то вам нужны вспомогательные двоичные переменные, которые будут равны 1, если предлагается акция i, и 0, если нет. Таким образом, вы могли бы ввести двоичные переменные y (i) от i = 1 до 500 и добавить в набор ограничений

M * y (i) > = x (i)

y(i) <= x(i)

Где M — большое число. Эти ограничения говорят, что если мы не покупаем акции i, (поэтому x (i) = 0), тогда y (i) должно быть 0. Если мы покупаем акции i, (так что x (i)> 0), тогда y (i) должно быть 1.

Затем вы можете использовать эти новые переменные для удовлетворения вашего нового отдельного ограничения

сумма (все y (i)) > = 20

Примечание: попробуйте сайт исследования операций для этих типов вопросов о моделировании линейного программирования

Комментарии:

1. Я не могу заставить это работать .. я вижу логику, но RsolveAPI возвращает ошибку, что xt и indicies имеют разную длину … можете ли вы привести пример кодирования?

2. Кто-нибудь знает, как перевести это в код RsolveAPI?