格式化 quantmod GetSymbol 数据,使多个符号在一个数据帧中

Format quantmod GetSymbol data so that multiple Symbols are in one data frame

我有一些股票数据的格式如下(从其他来源获取):

 Company,Date,Close
 AXP,2011-06-03,49.28
 AXP,2011-06-04,49.28
 CAT,2011-06-03,101.1
 CAT,2011-06-04,101.1

我想做的是增加音量。如果您使用 GetSymbols 命令下载股票数据,成交量是其中的一部分。

问题是使用 GetSymbols 命令获得的数据结构完全不同。参见:

是否可以通过某种方式更改格式以便我拥有上述格式的数据?我希望结果 table 看起来像这样:

 Company,Date,Close,Volume
 AXP,2011-06-03,49.28,5000000
 AXP,2011-06-04,49.28,3500000
 CAT,2011-06-03,101.1,1000000
 CAT,2011-06-04,101.1,3000000

提前致谢!!

一种方法:

  • 创建代码向量
  • 启动一个新的空数据框,其列名与原始数据框相对应

遍历股票代码:

  • 强化由 getSymbols 创建的 xts 并提取体积列并添加新的 Company
  • rbind 代码
  • merge 原始数据框和 Company,Date 列的新数据框

代码片段假定您导入的数据是一个 dataframe 对象并命名为 dfOrig

tickers <- c('AXP','CAT')
getSymbols(c("AXP","CAT"), from = '2018-03-01')
dfNew <- data.frame(Company = character(),
                 Date=as.Date(character()),
                 Close=numeric(),
                 Volume=numeric(), 
                 stringsAsFactors=FALSE) 
for(i in 1:length(tickers)){
  dfSym <- cbind(Company=rep(tickers[i],nrow(get(tickers[i]))),fortify.zoo(get(tickers[i])[,5]))
  names(dfSym)[2:3] <- c('Date','Volume')
  dfNew <- rbind(dfNew,dfSym)
}

前几行来自dfNew

> head(dfNew)
  Company       Date  Volume
1     AXP 2018-03-01 4369800
2     AXP 2018-03-02 3584700
3     AXP 2018-03-05 2661400
4     AXP 2018-03-06 3221100
5     AXP 2018-03-07 3594900
6     AXP 2018-03-08 3760500

现在您可以通过CompanyDate合并数据帧。

> merge(dfOrig,dfNew,by = intersect(names(dfOrig), names(dfNew)))
   Company       Date  Close   Volume
1      AXP 2018-03-01  95.14  4369800
2      AXP 2018-03-02  95.60  3584700
3      AXP 2018-03-05  96.66  2661400
4      AXP 2018-03-06  96.07  3221100
5      AXP 2018-03-07  95.64  3594900
6      AXP 2018-03-08  96.59  3760500
7      AXP 2018-03-09  99.05  3044300
8      AXP 2018-03-12  97.67  4020900
9      AXP 2018-03-13  95.37  4858700
10     AXP 2018-03-14  94.53  3013800
11     AXP 2018-03-15  94.39  3213000
12     AXP 2018-03-16  95.61  5124900
13     AXP 2018-03-19  94.84  2610400
14     AXP 2018-03-20  94.95  2501600
15     AXP 2018-03-21  94.74  2124000
16     AXP 2018-03-22  91.41  4113900
17     AXP 2018-03-23  90.45  5100400
18     AXP 2018-03-26  92.62  2769800
19     AXP 2018-03-29  93.28  4914600
20     CAT 2018-03-01 150.23  9434800
21     CAT 2018-03-02 146.38  9509400
22     CAT 2018-03-05 151.12  8453000
23     CAT 2018-03-06 153.75  5795600
24     CAT 2018-03-07 151.51  5491000
25     CAT 2018-03-08 153.59  4105000
26     CAT 2018-03-09 158.25  4576700
27     CAT 2018-03-12 154.50  4880400
28     CAT 2018-03-13 153.69  4819100
29     CAT 2018-03-14 152.54  4873600
30     CAT 2018-03-15 154.57  5268800
31     CAT 2018-03-16 156.46 10897600
32     CAT 2018-03-19 152.15  5479200
33     CAT 2018-03-20 154.06  3557600
34     CAT 2018-03-21 155.80  3887400
35     CAT 2018-03-22 146.90  8225600
36     CAT 2018-03-23 144.29  6533100
37     CAT 2018-03-26 149.19  5454900
38     CAT 2018-03-27 146.99  4915300
39     CAT 2018-03-28 145.16  4933900
40     CAT 2018-03-29 147.38  4179000

您可以为此使用 tidyquant

library(tidyquant)

ticks <- c("AXP","CAT")
sd <- as.Date("2011-06-03")
ed <- as.Date("2011-06-10")

tq_get(ticks, 
       from = sd, 
       to = ed ) %>%
  select(symbol, date, close,volume) %>% 
  arrange(date)