1

我有 11 条不同收益率曲线的每日值,即同一时间段内 11 个收益率到期日(1 年、2 年、3 年、4 年、5 年、7 年、10 年、15 年、20 年、25 年、30 年)的时间序列。某些日子的某些收益率缺失(NA),我想在知道同一天其他收益率的值的情况下推断它们的值。这应该通过对给定日期的可用收益率进行第一次线性插值来完成,然后使用到期期限(1 年、2 年等)作为权重,对同一天的缺失收益率进行连续外推。例如,我有以下数据集,我想根据同一天所有可用收益率的插值来推断 5 年收益率的每日价值:

Date      1     2     3     4  5  7     10    15    20    25 30
7/4/2007  9.642 9.278 8.899 NA NA 8.399 8.241 8.183 8.117 NA NA
7/5/2007  9.669 9.302 8.931 NA NA 8.44  8.287 8.231 8.118 NA NA
7/6/2007  9.698 9.331 8.961 NA NA 8.437 8.295 8.243 8.13  NA NA
7/9/2007  9.678 9.306 8.941 NA NA 8.409 8.269 8.214 8.092 NA NA
7/10/2007 9.65  9.283 8.915 NA NA 8.385 8.243 8.185 8.065 NA NA
7/11/2007 9.7   9.342 8.976 NA NA 8.445 8.306 8.249 8.138 NA NA
7/12/2007 9.703 9.348 8.975 NA NA 8.448 8.303 8.245 8.152 NA NA
7/13/2007 9.69  9.334 8.965 NA NA 8.439 8.294 8.24  8.145 NA NA
7/16/2007 9.683 9.325 8.964 NA NA 8.442 8.299 8.244 8.158 NA NA
7/17/2007 9.712 9.359 8.987 NA NA 8.481 8.33  8.277 8.192 NA NA
7/18/2007 9.746 9.394 9.018 NA NA 8.509 8.363 8.311 8.22  NA NA
...

有人对如何做有建议吗?谢谢。

4

1 回答 1

1

这是根据您拥有的可用信息为每个模型构建线性模型Date并使用它来预测/估计第 5 年的值的方法之一。

逐步运行该过程以查看其工作原理。检查估计以确保它们有意义。

dt = read.table(text=
"Date      1     2     3     4  5  7     10    15    20    25 30
7/4/2007  9.642 9.278 8.899 NA NA 8.399 8.241 8.183 8.117 NA NA
7/5/2007  9.669 9.302 8.931 NA NA 8.44  8.287 8.231 8.118 NA NA
7/6/2007  9.698 9.331 8.961 NA NA 8.437 8.295 8.243 8.13  NA NA
7/9/2007  9.678 9.306 8.941 NA NA 8.409 8.269 8.214 8.092 NA NA
7/10/2007 9.65  9.283 8.915 NA NA 8.385 8.243 8.185 8.065 NA NA
7/11/2007 9.7   9.342 8.976 NA NA 8.445 8.306 8.249 8.138 NA NA
7/12/2007 9.703 9.348 8.975 NA NA 8.448 8.303 8.245 8.152 NA NA
7/13/2007 9.69  9.334 8.965 NA NA 8.439 8.294 8.24  8.145 NA NA
7/16/2007 9.683 9.325 8.964 NA NA 8.442 8.299 8.244 8.158 NA NA
7/17/2007 9.712 9.359 8.987 NA NA 8.481 8.33  8.277 8.192 NA NA
7/18/2007 9.746 9.394 9.018 NA NA 8.509 8.363 8.311 8.22  NA NA", header=T)


library(dplyr)
library(tidyr)


dt %>%
  gather(time, value, -Date) %>%                               # reshape dataset
  filter(!is.na(value)) %>%                                    # ignore NA values
  mutate(time = as.numeric(gsub("X","",time))) %>%             # get rid of the X created by importing data
  group_by(Date) %>%                                           # for each date
  do({model = lm(value~time, data=.)                              # build a linear model
      data.frame(pred = predict(model, data.frame(time=5)))})     # use model to predict at time = 5


# Source: local data frame [11 x 2]
# Groups: Date [11]
# 
#          Date     pred
#        (fctr)    (dbl)
# 1  7/10/2007 8.920932
# 2  7/11/2007 8.979601
# 3  7/12/2007 8.981383
# 4  7/13/2007 8.970571
# 5  7/16/2007 8.968542
# 6  7/17/2007 8.999584
# 7  7/18/2007 9.032026
# 8   7/4/2007 8.917645
# 9   7/5/2007 8.950605
# 10  7/6/2007 8.970669
# 11  7/9/2007 8.946661

我并不是说线性模型是最合适的,因为我没有花时间检查它。但是,您可以使用二次模型而不是线性模型,这可能会给您更好的估计。

如果您想检查模型输出并获取有关您为每个模型构建和使用的模型的信息,Date您可以执行以下操作:

library(dplyr)
library(tidyr)
library(broom)


dt %>%
  gather(time, value, -Date) %>%                               # reshape dataset
  filter(!is.na(value)) %>%                                    # ignore NA values
  mutate(time = as.numeric(gsub("X","",time))) %>%             # get rid of the X created by importing data
  group_by(Date) %>%                                           # for each date
  do({model = lm(value~time, data=.)                              # build a linear model
      tidy(model)})                                               # check model output


# Source: local data frame [22 x 6]
# Groups: Date [11]
# 
#         Date        term    estimate  std.error statistic      p.value
#       (fctr)       (chr)       (dbl)      (dbl)     (dbl)        (dbl)
# 1  7/10/2007 (Intercept)  9.29495818 0.19895389 46.719158 8.485928e-08
# 2  7/10/2007        time -0.07480530 0.01875160 -3.989275 1.043399e-02
# 3  7/11/2007 (Intercept)  9.34942937 0.19823019 47.164509 8.093526e-08
# 4  7/11/2007        time -0.07396561 0.01868339 -3.958897 1.075469e-02
# 5  7/12/2007 (Intercept)  9.35001022 0.20037595 46.662337 8.537618e-08
# 6  7/12/2007        time -0.07372537 0.01888563 -3.903781 1.136592e-02
# 7  7/13/2007 (Intercept)  9.33730855 0.19974786 46.745476 8.462114e-08
# 8  7/13/2007        time -0.07334758 0.01882643 -3.895989 1.145551e-02
# 9  7/16/2007 (Intercept)  9.33045446 0.19856561 46.989276 8.245272e-08
# 10 7/16/2007        time -0.07238243 0.01871501 -3.867615 1.178869e-02
# ..       ...         ...         ...        ...       ...          ...
于 2015-09-14T15:55:21.607 回答