如何使用条件限制expand.grid的可能变化?

时间:2017-11-06 17:35:46

标签: r combinations portfolio

我正在尝试查找n个股票的所有可能的投资组合分配,加权步长为s。函数expand.grid()用于计算所有变体,子集使用rowSums()完成,将输出减少到权重为100的所有变体。

问题:

这种方式不适用于“较大”的数字。在expand.grid()之后使用子集似乎不是最好的方法。有什么想法吗?

以下是代码:

n <- 5 #number equities
s <- 20 #weighting steps

Ptf <- function(n, s){
  m <- expand.grid(rep(list(seq(0, 100, s)), n))
  subset(m, rowSums(m)==100)
}

Ptfs <- Ptf(n, s)

结果:

head(Ptfs)
   Var1 Var2 Var3 Var4 Var5
6   100    0    0    0    0
11   80   20    0    0    0
16   60   40    0    0    0
21   40   60    0    0    0
26   20   80    0    0    0
31    0  100    0    0    0
> tail(Ptfs)
     Var1 Var2 Var3 Var4 Var5
4321    0    0    0   40   60
5186   20    0    0    0   80
5191    0   20    0    0   80
5221    0    0   20    0   80
5401    0    0    0   20   80
6481    0    0    0    0  100

增加股票数量n <- 10会发出错误消息:

> n <- 10 #number equities
> s <- 20 #weighting steps
> 
...
> 
> Ptfs <- Ptf(n, s)
Error: cannot allocate vector of size 461.3 Mb

任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:2)

根据上面的链接,您可以使用partitions包...

轻松完成此操作
library(partitions)
Ptfs <- as.data.frame(s*t(as.matrix(compositions(100/s,n))))

Ptfs
     V1  V2  V3  V4  V5
1   100   0   0   0   0
2    80  20   0   0   0
3    60  40   0   0   0
4    40  60   0   0   0
5    20  80   0   0   0
6     0 100   0   0   0
7    80   0  20   0   0
8    60  20  20   0   0
9    40  40  20   0   0
10   20  60  20   0   0
11    0  80  20   0   0
12   60   0  40   0   0
13   40  20  40   0   0
14   20  40  40   0   0
15    0  60  40   0   0
16   40   0  60   0   0
17   20  20  60   0   0
18    0  40  60   0   0
19   20   0  80   0   0
20    0  20  80   0   0
21    0   0 100   0   0
22   80   0   0  20   0
...