无法使用R在termstrc包中创建couponbonds对象

时间:2014-11-08 05:42:44

标签: r

我正在尝试使用R package termstrc来估计术语结构。要做到这一点,我必须准备数据作为包所需的couponbonds类。我使用了一些假数据来防止真实数据的潜在问题。虽然我尝试了很多,但它仍然没有奏效。 知道出了什么问题吗?

工作的官方演示数据的结构

data("govbonds")
str(govbonds)

List of 3
$ GERMANY:List of 8
..$ ISIN        : chr [1:52] "DE0001141414" "DE0001137131" "DE0001141422" "DE0001137149" ...
..$ MATURITYDATE: Date[1:52], format: "2008-02-15" "2008-03-14" "2008-04-11" ...
..$ ISSUEDATE   : Date[1:52], format: "2002-08-14" "2006-03-08" "2003-04-11" ...
..$ COUPONRATE  : num [1:52] 0.0425 0.03 0.03 0.0325 0.0413 ...
..$ PRICE       : num [1:52] 100 99.9 99.8 99.8 100.1 ...
..$ ACCRUED     : num [1:52] 4.09 2.66 2.43 2.07 2.39 ...
..$ CASHFLOWS   :List of 3
.. ..$ ISIN: chr [1:384] "DE0001141414" "DE0001137131" "DE0001141422" "DE0001137149" ...
.. ..$ CF  : num [1:384] 104 103 103 103 104 ...
.. ..$ DATE: Date[1:384], format: "2008-02-15" "2008-03-14" "2008-04-11" ...
..$ TODAY       : Date[1:1], format: "2008-01-30"
#another two are omitted here
- attr(*, "class")= chr "couponbonds"
> ns_res <- estim_nss(govbonds, c("GERMANY"), method = "ns",tauconstr=list(c(0.2, 5, 0.1)))
[1] "Searching startparameters for  GERMANY"
beta0     beta1     beta2      tau1 
5.008476 -1.092510 -3.209695  2.400100

我准备假数据的代码

bond=list()
bond$CHINA=list()
n=30*12#suppose I have n bond
enddate=as.Date('2014/11/7')
isin=sprintf('DE%010d',1:n)#some fake ISIN
bond$CHINA$ISIN=isin
bond$CHINA$MATURITYDATE=enddate+(1:n)*30
bond$CHINA$ISSUEDATE=rep(enddate,n)
bond$CHINA$COUPONRATE=rep(5/100,n)
bond$CHINA$PRICE=rep(100,n)
bond$CHINA$ACCRUED=rep(0,n)
bond$CHINA$CASHFLOWS=list()
bond$CHINA$CASHFLOWS$ISIN=isin
bond$CHINA$CASHFLOWS$CF=100+(1:n)*5/12
bond$CHINA$CASHFLOWS$DATE=enddate+(1:n)*30
bond$CHINA$TODAY=enddate
class(bond)='couponbonds'
ns_res <- estim_nss(bond, c("CHINA"), method = "ns",tauconstr=list(c(0.2, 5, 0.1)))

输出

Error in `colnames<-`(`*tmp*`, value = c("DE0000000001", "DE0000000002",  : 
attempt to set 'colnames' on an object with less than two dimensions

1 个答案:

答案 0 :(得分:1)

最后通过向CASHFLOW$CF添加一个金额为零的现金流来解决问题。 换句话说,至少有一个债券应至少有两个现金流。 然后您可能会遇到uniroot函数导致的其他错误。请确保仅在TODAY之后包含现金流。 termstrc不会使用TODAY为您过滤现金流。