는 R

2013-10-06 5 views
4

에 격자 경로를 생성 예를 들어, 나는이처럼 보이는 격자가있는 경우 :는 R

  133.1 
     /
     121 
    /\ 
    110 108.9 
/\/
100 99 
    \/\ 
    90 89.1 
     \/
     81 
     \ 
      72.9 

격자 (100)에서 시작하여 두 요소 1.1로 상승하고 요소 0.9로 내려갑니다. 이 격자는 위 또는 아래로 이동하는 3 개의 기간을가집니다. 이 행렬은 더 많은 기간 동안 채워질 수 있습니다.

매트릭스 형태의 격자는 다음과 같습니다 : 나는 다음과 같이 격자 행렬이 생성 R.의 코드를 일하고 있어요

 [,1] [,2] [,3] [,4] 
[1,] 100 110 121 133.1 
[2,] NA 90 99 108.9 
[3,] NA NA 81 89.1 
[4,] NA NA NA 72.9 

:

#Parameters 
S0 <- 100 #price at t0 
u <- 1.1 #up factor 
d <- 0.9 #down factor 
n <- 3 #number of periods 

#Matrix for the prices 
prices <- matrix(data=NA, nrow=(n+1), ncol=(n+1)) 
prices[1,1] <- S0 

#Fill the matrix 
for(column in 2:(n+1)){ 

    for(row in 1:(column-1)){ 

    prices[row,column] <- u*prices[row,column-1]; 
    } 

    prices[column,column] <- d*prices[column-1,column-1]; 
} 

내가 만들고 싶습니다 격자를 통해 가능한 모든 경로가있는 행렬을 생성하는 코드입니다. 이 예를 들어, 다음과 같이 보일 것이다 : 지금 시간이 코드 조각으로 고전을 면치 못하고, 그래서 어떤 도움이 많이 주시면 감사하겠습니다

 [,1] [,2] [,3] [,4] 
[1,] 100 110 121 133.1 
[2,] 100 110 121 108.9 
[3,] 100 110 99 108.9 
[4,] 100 110 99 89.1 
[5,] 100 90 99 108.9 
[6,] 100 90 99 89.1 
[7,] 100 90 81 89.1 
[8,] 100 90 81 72.9 

! 미리 감사드립니다! :)

답변

5

각 경로 길이 n은 위로 이동 및 아래로 이동의 시퀀스에 에 해당합니다. 모든 시퀀스를 열거하면됩니다. 이미 매트릭스 u, 로 길이 n-1, 의 시퀀스가있는 경우 길이 n의 시퀀스

rbind( 
    cbind(u, .9), 
    cbind(u, 1.1) 
) 

로 얻을 수 있습니다 당신은 n 시간을 함수에 넣어, 그것을 호출 할 수 있습니다.

n <- 4 
up <- 1.1 
down <- .9 
m <- Reduce( 
    function(u,v) rbind(cbind(u, up), cbind(u, down)), 
    rep(NA,n), 
    100 
) 
t(apply(m, 1, cumprod)) 
# [1,] 100 110 121 133.1 146.41 
# [2,] 100 90 99 108.9 119.79 
# [3,] 100 110 99 108.9 119.79 
# [4,] 100 90 81 89.1 98.01 
# [5,] 100 110 121 108.9 119.79 
# [6,] 100 90 99 89.1 98.01 
# [7,] 100 110 99 89.1 98.01 
# [8,] 100 90 81 72.9 80.19 
# [9,] 100 110 121 133.1 119.79 
# [10,] 100 90 99 108.9 98.01 
# [11,] 100 110 99 108.9 98.01 
# [12,] 100 90 81 89.1 80.19 
# [13,] 100 110 121 108.9 98.01 
# [14,] 100 90 99 89.1 80.19 
# [15,] 100 110 99 89.1 80.19 
# [16,] 100 90 81 72.9 65.61 
2

마찬가지로, 당신은 같은 것을 할 수 있습니다

next.period<-function(x) rep(x,2)*rep(c(u,d),each=length(x)) 

next.matrix<-function(x) { 
    next.period.col<-next.period(x[,ncol(x)]) 
    cbind(rbind(x,x),next.period.col) 
} 

lattice.paths<-t(S0) 
for (i in 1:(n-1)) lattice.paths<-next.matrix(lattice.paths) 

     next.period.col next.period.col 
[1,] 100    110    121 
[2,] 100    90    99 
[3,] 100    110    99 
[4,] 100    90    81 
2

또 다른 아이디어는 expand.grid를 사용하여, 처음에는 "발판"을 구축하고, 다음을 채우는 것입니다.

#all possible paths of times (either 1.1. or 0.9) each previous value 
    aa <- expand.grid(1, c(1.1,0.9), c(1.1,0.9), c(1.1,0.9), c(1.1,0.9)) 

    aa[,1] <- aa[,1] * 100 # start with 100 

    for(i in 2:ncol(aa)) # fill by multiplying value of previous column 
    { 
     aa[,i] <- aa[,i] * aa[,i-1] 
    } 

    aa 
    #Var1 Var2 Var3 Var4 Var5 
    #1 100 110 121 133.1 146.41 
    #2 100 90 99 108.9 119.79 
    #3 100 110 99 108.9 119.79 
    #4 100 90 81 89.1 98.01 
    #5 100 110 121 108.9 119.79 
    #6 100 90 99 89.1 98.01 
    #7 100 110 99 89.1 98.01 
    #8 100 90 81 72.9 80.19 
    #9 100 110 121 133.1 119.79 
    #10 100 90 99 108.9 98.01 
    #11 100 110 99 108.9 98.01 
    #12 100 90 81 89.1 80.19 
    #13 100 110 121 108.9 98.01 
    #14 100 90 99 89.1 80.19 
    #15 100 110 99 89.1 80.19 
    #16 100 90 81 72.9 65.61 

더 기간 동안, expand.grid 다른 c(1.1,0.9) 필요가있다.