2013-07-10 74 views
1

我試圖找到債券收益率與初始短期利率之間的線性關係。我每年使用48期和13年期債券。我的代碼如下:Ras中的Vasicek債券價格/收益率模擬

## 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),爲什麼我必須運行for循環從1到m + 1而不是2到m + 1?

  2. 我的債券價格接近確切的解決方案,但不夠接近,當我從10,000次模擬到20k或30k模擬時,精度不會線性增加。是什麼賦予了?

回答

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次試驗。

+0

我想我不清楚問題1號。我的查詢是關於矩陣r而不是矩陣r0。有問題的for循環是代碼後半部分的循環。 – user2566834

+0

謝謝你的幫助。真的很感激它。 – user2566834