1

我试图找到债券收益率和初始短期利率之间的线性关系。我每年使用 48 个期间和 13 年期债券。我的代码如下:

## generate initial short rate matrix
totalcases<-71
r0 <-matrix(nrow=totalcases,ncol=1)
for (i in 1:totalcases){
  if (-.21+i/100 < -.07 ){
    r0[i,1]<- -.21+i/100
  }
  else if (r0[i-1,1] >= .02 ){
    r0[i,1]<- r0[i-1,1]+1/100
  }
  else {
    r0[i,1]<- r0[i-1,1]+.25/100
  }

}

## simulate short rate paths

gamma <- 0.05
sigma <- 0.0135
alpha <- 0.05
lambda <- 0.00

n <- 30000   # MC simulation trials
Time <- 13    # Maturity of the Bond
int <-48 #no of subintervals per year
dt <- 1/int  # difference in time between each subinterval
m <- Time*int   # total subintervals


set.seed(0)
z<-matrix(rnorm(n*m,mean=0,sd=1),nrow=n,ncol=m)

r <- matrix(nrow=n,ncol=m+1)

Yield <-matrix(nrow=totalcases,ncol=1)

for(l in 1:totalcases){

  r[,1]<- r0[l,1]

  for (j in 1:m+1){
    r[,j]<-r[,j-1]*exp(-alpha*dt)+(gamma-(lambda*sigma/alpha))*(1-exp(-alpha*dt))+sigma * sqrt((1 - exp(-2 * alpha *dt)) / (2 * alpha)) *z[,j-1]

  }

  k<-apply(r,1,sum)
  k<-k*dt
  Price<-exp(-k)
  ExptdPrice<-mean(Price)
  Yield[l,1]<- -log(ExptdPrice) / Time

}

我有两个问题:

  1. 在 for 循环中,如果我从 2 循环到 m+1,那么我的 r 矩阵除了第一行之外的所有行都是 NA,但是当我从 1 循环到 m+1 时,矩阵就可以了。鉴于我的第一列是固定的(所有行都有一个固定值 r0),为什么我必须从 1 到 m+1 而不是从 2 到 m+1 运行 for 循环?

  2. 当我从 10,000 次模拟到 20,000 或 30,000 次模拟时,我的债券价格接近精确解决方案,但不够接近,并且准确性不会线性增加。是什么赋予了?

4

1 回答 1

0
  1. 您对构造矩阵的调用没有给它任何初始值,因此它以全部 NA 开始。如果您有一个初始值,请使用 显式分配它r0[1] <- <initial_value>,或将其包含在matrix调用中:matrix(<initial_value>, nrow=71, ncol=1). 虽然由于您只有 1 列,但您不妨将其设为向量。1:n+1 被解析为 (1:n)+1,而不是 1:(n+1)。

  2. 模拟的精度通常与试验次数的平方成正比。如果你想要双倍的准确率,你需要 4 次试验。

于 2013-07-10T04:27:16.840 回答