将 CRSP Daily Stock Returns 转换为 R 中的 Zoo 对象
Converting CRSP Daily Stock Returns into Zoo Object in R
注意:我自己找到了一个解决方案,将把它放在这个post下面的答案中。为其他人保留这个,因为我花了一段时间才弄清楚,这似乎是会计和金融研究中的常见任务。
假设我目前有一个数据框,其中按日期包含一组不同公司的每日股票 returns,并且数据的结构使得一列包含公司标识符(代码),第二列列包含日期,第三列包含 return。 (这是从 CRSP 获得的格式。)如何将这些数据转换为 R
中的 zoo
对象?
获取需要转换为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
简单的解决方案。使用 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>
将 read.zoo
与 split
参数一起使用:
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
注意:我自己找到了一个解决方案,将把它放在这个post下面的答案中。为其他人保留这个,因为我花了一段时间才弄清楚,这似乎是会计和金融研究中的常见任务。
假设我目前有一个数据框,其中按日期包含一组不同公司的每日股票 returns,并且数据的结构使得一列包含公司标识符(代码),第二列列包含日期,第三列包含 return。 (这是从 CRSP 获得的格式。)如何将这些数据转换为 R
中的 zoo
对象?
获取需要转换为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
简单的解决方案。使用 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>
将 read.zoo
与 split
参数一起使用:
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