将CRSP每日股票收益转换为R中的Zoo对象

时间:2017-07-27 17:47:17

标签: r finance zoo accounting

注意:我自己找到了一个解决方案,并会在这篇帖子下面给出答案。因为花了我一段时间才弄明白,这对其他人保留了这一点,这似乎是会计和金融研究中的常见任务。

假设我目前有一个数据框,其中包含按日期为一组不同公司的每日股票回报,并且数据的结构使得一列包含公司标识符(股票代码),第二列包含日期,以及第三列包含返回。 (这是从CRSP获取的格式。)如何将这些数据转换为zoo中的R对象?

可重现的代码,用于获取需要转换为zoo对象的数据框:

Z.date <- c(as.Date(12501:12505), as.Date(12501:12506), as.Date(12501:12505))
Z.firm <- c(rep("A", 5), rep("B", 6), rep("C", 5))
set.seed(50)
Z.returns <- c(rnorm(5), rnorm(6), rnorm(5))
df <- data.frame(Z.date, Z.firm, Z.returns)

哪个收益率:

       Z.date Z.firm   Z.returns
1  2004-03-24      A  0.54966989
2  2004-03-25      A -0.84160374
3  2004-03-26      A  0.03299794
4  2004-03-27      A  0.52414971
5  2004-03-28      A -1.72760411
6  2004-03-24      B -0.27786453
7  2004-03-25      B  0.36082844
8  2004-03-26      B -0.59091244
9  2004-03-27      B  0.97559055
10 2004-03-28      B -1.44574995
11 2004-03-29      B  0.29520677
12 2004-03-24      C  0.55475223
13 2004-03-25      C -0.49863554
14 2004-03-26      C  0.19573384
15 2004-03-27      C -0.45554055
16 2004-03-28      C -0.36285547

所需的zoo对象应如下所示:

              A            B            C
2004-03-24     0.54966989  -0.27786453   0.55475223
2004-03-25    -0.84160374   0.36082844  -0.49863554
2004-03-26     0.03299794  -0.59091244   0.19573384
2004-03-27     0.52414971   0.97559055  -0.45554055
2004-03-28    -1.72760411  -1.44574995  -0.36285547
2004-03-29     NA           0.29520677   NA

2 个答案:

答案 0 :(得分:2)

read.zoosplit参数一起使用:

read.zoo(df, split = "Z.firm")

给出这个"zoo"对象:

                     A          B          C
2004-03-24  0.54966989 -0.2778645  0.5547522
2004-03-25 -0.84160374  0.3608284 -0.4986355
2004-03-26  0.03299794 -0.5909124  0.1957338
2004-03-27  0.52414971  0.9755906 -0.4555405
2004-03-28 -1.72760411 -1.4457499 -0.3628555
2004-03-29          NA  0.2952068         NA

答案 1 :(得分:0)

简单的解决方案。使用tidyr包翻转数据框,然后将其转换为zoo对象。

library(zoo)
library(tidyr)

wide_df <- tidyr::spread(df, key = Z.firm, value = Z.returns) # flip using tidyr's spread()
df.zoo <- zoo(wide_df, order.by = wide_df$Z.date) # convert to zoo, ordering by date
df.zoo <- df.zoo[, colnames(df.zoo) != "Z.date"] # get rid of the superfluous date column

这会产生:

           A           B          C         
2004-03-24  0.54966989 -0.2778645  0.5547522
2004-03-25 -0.84160374  0.3608284 -0.4986355
2004-03-26  0.03299794 -0.5909124  0.1957338
2004-03-27  0.52414971  0.9755906 -0.4555405
2004-03-28 -1.72760411 -1.4457499 -0.3628555
2004-03-29 <NA>         0.2952068 <NA>