4

例如,如果我有一个看起来像这样的格子:

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

晶格从 100 开始,要么以 1.1 的因子上升,要么以 0.9 的因子下降。这个格子有 3 个上升或下降的周期。很明显,这个矩阵可以填充更多周期。

矩阵形式的格子如下所示:

     [,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

我在 R 中工作。生成格矩阵的代码如下:

#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

我已经为这段代码苦苦挣扎了好几个小时,所以任何帮助都将不胜感激!提前致谢!:)

4

3 回答 3

5

每条长度路径n对应于一系列上下运动:您只需枚举所有这些序列。如果你已经有长度的序列n-1,作为一个矩阵u,长度的序列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
于 2013-10-06T16:04:07.917 回答
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
于 2013-10-06T16:10:08.747 回答
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).

于 2013-10-06T16:35:10.457 回答