R中二项式树中的双for循环

double for loop in Binomial Tree in R

我想建立一个二叉树利率模型。利率是路径依赖的。我希望在所有场景 (2^N) 的每一步都有 return 利率(折扣因子和收益)。我想要 return 每个利率的原因是我想使用利率来计算折扣因子。我知道如何以复杂的方式做到这一点。在这里我想使用双循环(或更简单的东西)来获得结果。

w 用于表示所有场景的“0”或“1”虚拟变量矩阵。
r 是利率。如果有头(1),则r1=r0+u=r0+0.005;如果有 tail(0),则 r1=r0-d。 D 是折扣系数。 D1=1/(1+r0), D2=D1/(1+r1)... P 是收益。

在这种情况下,周期N是10。因此,我可以逐步计算。但是,如果 N 越来越大,我就无法使用我的方法。我想要一个简单的方法来计算这个。谢谢。

#Real Price
N <- 10
r0 <- 0.06
K <- 0.05
u <- 0.005
d <- 0.004
q <- 0.5

w <- expand.grid(rep(list(0:1),N))
r <- D <- P <- matrix(0,0,nrow=2^N,ncol=N)

for(i in 1:dim(w)[1])
{
  r[i,1] <- r0 + u*w[i,1] - d*(1-w[i,1])  
  r[i,2] <- r[i,1] + u*w[i,2] - d*(1-w[i,2])
  r[i,3] <- r[i,2]+u*w[i,3]-d*(1-w[i,3])
  r[i,4] <- r[i,3]+u*w[i,4]-d*(1-w[i,4])
  r[i,5] <- r[i,4]+u*w[i,5]-d*(1-w[i,5])
  r[i,6] <- r[i,5]+u*w[i,6]-d*(1-w[i,6])
  r[i,7] <- r[i,6]+u*w[i,7]-d*(1-w[i,7])
  r[i,8] <- r[i,7]+u*w[i,8]-d*(1-w[i,8])
  r[i,9] <- r[i,8]+u*w[i,9]-d*(1-w[i,9])
  r[i,10] <- r[i,9]*+u*w[i,10]-d*(1-w[i,10])

  D[i,1] <- 1/(1+r0)
  D[i,2] <- D[i,1]/(1+r[i,1])
  D[i,3] <- D[i,2]/(1+r[i,2])
  D[i,4] <- D[i,3]/(1+r[i,3])
  D[i,5] <- D[i,4]/(1+r[i,4])
  D[i,6] <- D[i,5]/(1+r[i,5])
  D[i,7] <- D[i,6]/(1+r[i,6])
  D[i,8] <- D[i,7]/(1+r[i,7])
  D[i,9] <- D[i,8]/(1+r[i,8])
  D[i,10] <- D[i,9]/(1+r[i,9])

  P[i,1] <- D[i,1]*pmax(K-r0,0)*(0.5^N)
  P[i,2] <- D[i,2]*pmax(K-r[i,1],0)*(0.5^N)
  P[i,3] <- D[i,3]*pmax(K-r[i,2],0)*(0.5^N)
  P[i,4] <- D[i,4]*pmax(K-r[i,3],0)*(0.5^N)
  P[i,5] <- D[i,5]*pmax(K-r[i,4],0)*(0.5^N)
  P[i,6] <- D[i,6]*pmax(K-r[i,5],0)*(0.5^N)
  P[i,7] <- D[i,7]*pmax(K-r[i,6],0)*(0.5^N)
  P[i,8] <- D[i,8]*pmax(K-r[i,7],0)*(0.5^N)
  P[i,9] <- D[i,9]*pmax(K-r[i,8],0)*(0.5^N)
  P[i,10] <- D[i,10]*pmax(K-r[i,9],0)*(0.5^N)
}
true.price <- sum(P)
#> true.price
# > true.price
# [1] 0.00292045

您可以只使用嵌套循环,在 i 循环中遍历 2:(ncol(w))

for(i in 1:nrow(w)) {
  r[i, 1] <-  r0 + u*w[i, 1] - d*(1-w[i, 1])  
  D[i, 1] <- 1/(1+r0)
  P[i, 1] <- D[i, 1]*pmax(K-r0, 0)*(0.5^N)

  for (j in 2:(ncol(w))) {
    r[i,j] <- r[i, j-1] + u*w[i, j] - d*(1-w[i, j])    
    D[i,j] <- D[i, j-1]/(1+r[i, j-1])
    P[i,j] <- D[i, j]*pmax(K-r[i, j-1], 0)*(0.5^N)
  }
}

true.price <- sum(P)