2017-11-06 3 views
3

s의 가중 단계를 사용하여 n 주식 수에 대한 모든 가능한 포트폴리오 할당을 찾으려고합니다. 함수 expand.grid() 모든 변화를 계산하는데 사용되며, 서브 세트의 가중치는 100조건을 사용하여 expand.grid의 변형을 제한하는 방법은 무엇입니까?

문제 모든 변화에 대한 출력을 감소 rowSums()을 사용하여 수행된다

이 방법은 작동하지 않음을 "큰"숫자. 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) 

결과 : 어떤 도움이 정말 감사하겠습니다

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

:

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의 수를 증가는 오류 메시지를 전달 여기

코드입니다!

+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 
... 
+1

그게 정확히 내가 찾고 있었던거야! 위대한 작품! 고마워요! –

관련 문제