2

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

我可以导入 .csv 文件,但我将其正确放入 xts 对象的方法至少不方便。随着时间段越长,数据越多,原始数据帧按照每个ID拆分后,数据帧列表可达几十G。因此,我正在寻找一种更有效的方法来将由一个简单列表组成的数据框转换为现成的 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 对象中的所需格式:

> 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)
4

2 回答 2

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")
于 2017-07-19T07:36:11.160 回答
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)如果要转换z为 xts 对象,可以调用。

于 2017-07-20T04:33:00.417 回答