【问题标题】:Group/Portfolio constraints in a linear programming线性规划中的组/投资组合约束
【发布时间】:2021-01-01 21:14:31
【问题描述】:

我正在将投资组合优化作为线性规划问题进行。我有 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

【问题讨论】:

  • CVXR 可能是一种更容易表达投资组合模型的工具。它在更高层次上工作,因此您可以更自然地表达事物。此外,它还允许您形成二次模型(通常用于对风险进行建模)。

标签: r linear-programming


【解决方案1】:

如果 x(i) = 为股票 i 建议的股票数量,其中 i 的范围从 1 到 500,那么您需要辅助二进制变量,如果建议股票 i,则等于 1,如果不建议,则等于 0。所以你可以引入从 i = 1 到 500 的二进制变量 y(i),并加入约束集

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

y(i)

其中 M 是一个大数。这些约束表明,如果我们不购买股票 i,(so x(i) = 0) 那么 y(i) 必须为 0。如果我们购买股票 i,(so x(i) > 0) 那么 y (i) 必须为 1。

然后你可以使用这些新变量来满足你新的单一约束

sum(所有 y(i)) >= 20

注意:请访问运筹学网站,了解有关线性规划建模的此类问题

【讨论】:

  • 我不能让它工作..我看到了逻辑,但是 RsolveAPI 返回错误,xt 是并且索引长度不同......你能提供编码示例吗?
  • 有谁知道如何将其翻译成 RsolveAPI 代码?
猜你喜欢
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多