我试图找到债券收益率和初始短期利率之间的线性关系。我每年使用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
}
我有两个问题:
在for循环中,如果我从2循环到m + 1,那么我的r矩阵除了第一个之外的所有行都是NA,但是当我从1循环到m + 1时,矩阵很好。鉴于我的第一列是固定的(所有行都有一个固定值r0)为什么我必须运行for循环从1到m + 1而不是2到m + 1?
我的债券价格接近于确切的解决方案但不够接近,当我从10,000次模拟到20k或30k模拟时,精度不会线性增加。是什么给了?
答案 0 :(得分:0)
您构建矩阵的调用并未给出任何初始值,因此它以所有NA开始。如果您有初始值,请使用 1:n + 1被解析为(1:n)+1,而不是1:(n + 1)。r0[1] <- <initial_value>
明确指定,或将其包含在matrix
调用中:matrix(<initial_value>, nrow=71, ncol=1)
。虽然因为你只有1列,你也可以把它作为一个向量。
模拟的精度通常与试验次数的平方成正比。如果你想要两倍的准确度,你需要4倍的试验。