Я скачал исторические цены на акции в США из базы данных CRSP через веб-сайт WRDS.
Я могу импортировать файл .csv, но мой подход к тому, чтобы правильно разместить его в xts-объекте, по крайней мере неудобен. При более длительных периодах времени и большем количестве данных после разделения исходного кадра данных в соответствии с каждым идентификатором список кадров данных увеличивается до десятков гигабайт. Поэтому я ищу более эффективный подход, чтобы скрыть фрейм данных, состоящий из простого списка, в готовый к использованию 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)