R:将 CRSP 数据导入并转换为 xts 对象
R: import and converting CRSP data into a xts-object
我已经通过 WRDS 网站从 CRSP 数据库下载了历史美国股票价格。
我可以导入 .csv 文件,但我将其正确放入 xts 对象的方法至少不方便。随着时间周期越来越长,数据越来越多,将原始数据帧按每个ID拆分后,数据帧列表达到几十G。因此,我正在寻找一种更有效的方法来将由一个简单列表组成的数据框转换为随时可用的 xts 对象。
导入后的数据框结构:(股票依次排列)
> 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)
您需要使用方向为宽的reshape函数。
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")
您可能会发现更容易理解 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 转换为动物园对象。
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
如果要将z
转换为xts对象,可以调用as.xts(z)
。
我已经通过 WRDS 网站从 CRSP 数据库下载了历史美国股票价格。
我可以导入 .csv 文件,但我将其正确放入 xts 对象的方法至少不方便。随着时间周期越来越长,数据越来越多,将原始数据帧按每个ID拆分后,数据帧列表达到几十G。因此,我正在寻找一种更有效的方法来将由一个简单列表组成的数据框转换为随时可用的 xts 对象。
导入后的数据框结构:(股票依次排列)
> 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)
您需要使用方向为宽的reshape函数。
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")
您可能会发现更容易理解 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 转换为动物园对象。
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
如果要将z
转换为xts对象,可以调用as.xts(z)
。