R:将CRSP数据导入并转换为xts对象

时间:2017-07-19 06:57:06

标签: r xts data-import wrds

我已经通过WRDS网站从CRSP数据库下载了历史美国股票价格。

我可以导入.csv文件,但我的方法是将它正确地放入xts-object中至少是不方便的。在较长的时间段和更多的数据之后,根据每个ID分割原始数据帧后,数据帧列表最多可达数十千兆字节。因此,我正在寻找一种更有效的方法来将数据帧(包括一个简单的列表)转换为准备使用的xts-object。

导入后数据框的结构:(股票一个在另一个下面列出)

> head(dataf)
  ï..Names.Date PERMNO Price.adjusted
1    31/01/2014  10104          36.90
2    28/02/2014  10104          39.11
3    31/03/2014  10104          40.91

xts-object中的所需格式:

> dat[1:3,1:19]
         X10104 X10107 X11308 X11587 X11628 X11850 X12060 X12072 X12400 
Jan 2014  36.90  37.84  37.82 267.18  18.35  92.16  25.13  17.74  53.53  
Feb 2014  39.11  38.31  38.20 289.43  19.73  96.27  25.47  18.43  53.68  
Mar 2014  40.91  40.99  38.66 306.14  20.20  97.68  25.89  18.25  52.54  

我的方法:

#read CSV into a data frame
dataf <- read.csv(file = "us-data14-16.csv", header = TRUE, sep = ";", fill = TRUE)

#data preprocessing, deletes objects with price = 0
dataf <- dataf[dataf[, 3] != 0, ]

#split list according to ticker in a list of data frames
dataf <- split(dataf, f= dataf[,2])

#get identifier
id <- names(dataf)

#convert data frames into xts objects
datax <- lapply(dataf, function(x) xts(x$Price.adjusted, as.yearmon(x[,1], "%d/%m/%Y")))

#set column name according to ticker (loop through every element in the list)
sapply(seq_along(datax), function(x) colnames(datax[[x]]) <<- id[x])

#merge list of xts objects in one xts object
dat <- do.call(merge, datax)

2 个答案:

答案 0 :(得分:1)

您需要使用方向为宽的重塑功能。

df = data.frame(Names.Date= rep(seq(1:10), 10), PERMNO=sort(rep(seq(from= 101, to=110), 10)), Price.adjusted=rnorm(100))
reshape(df, idvar = "Names.Date", timevar = "PERMNO", direction = "wide")

答案 1 :(得分:1)

您可能会发现理解read.zoo及其split参数更容易。 reshape函数很难记住如何使用。  首先,从一个动物园小插曲中获取一些示例数据。

dataf <- structure(list(V1 = c("13/10/2010", "13/10/2010", "13/10/2010", 
"14/10/2010", "14/10/2010", "14/10/2010", "15/10/2010", "15/10/2010", 
"15/10/2010"), V2 = c("A", "B", "C", "A", "B", "C", "A", "B", "C"),
 V3 = c(23L, 12L, 124L, 43L, 54L, 65L, 43L, NA, 65L)),
.Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c(NA, -9L))

然后使用read.zoo将data.frame转换为zoo对象。

z <- read.zoo(dataf, format = "%d/%m/%Y", split = 2)
z
#             A  B   C
# 2010-10-13 23 12 124
# 2010-10-14 43 54  65
# 2010-10-15 43 NA  65

如果您想将as.xts(z)转换为xts对象,可以致电z