getSymbols and using lapply, Cl, and merge to extract close prices

怎甘沉沦 提交于 2019-11-28 00:35:24

As I said in my reply on R-help, getSymbols is vectorized, so there's no need to loop over tickers. You don't need your myX function and the lapply call is completely unnecessary / redundant.

The code in my original answer works. Why are you trying other combinations?

tickers <- c("SPY","DIA","IWM","SMH","OIH","XLY",
             "XLP","XLE","XLI","XLB","XLK","XLU")
getSymbols(tickers, from="2001-03-01", to="2011-03-11")
ClosePrices <- do.call(merge, lapply(tickers, function(x) Cl(get(x))))
head(ClosePrices)
#            SPY.Close DIA.Close IWM.Close SMH.Close OIH.Close XLY.Close
# 2001-03-01    124.60    104.68     94.80     44.60     87.45     26.10
# 2001-03-02    123.61    104.80     95.05     45.34     91.20     26.30
# 2001-03-05    124.74    105.57     94.70     47.01     92.86     26.02
# 2001-03-06    126.08    106.15     96.10     49.59     94.34     26.68
# 2001-03-07    126.98    107.45     96.60     49.20     97.36     27.34
# 2001-03-08    127.12    108.61     95.80     49.20     97.59     27.78
#            XLP.Close XLE.Close XLI.Close XLB.Close XLK.Close XLU.Close
# 2001-03-01     26.39     32.10     29.28     21.14     28.80     31.62
# 2001-03-02     26.64     32.83     29.45     21.64     27.80     31.70
# 2001-03-05     26.54     33.01     29.82     22.03     28.40     31.64
# 2001-03-06     26.00     33.18     30.25     21.98     29.60     31.60
# 2001-03-07     25.83     33.89     30.61     22.63     29.64     31.45
# 2001-03-08     26.05     34.23     30.80     22.71     29.05     32.04
Jeff R

Try using the env= arg and eapply

> mystocks <- new.env(hash=TRUE)

> getSymbols(c("AAPL","GOOG","YHOO"), env=mystocks)
<environment: 0x1023d1240>

> head( do.call(cbind,eapply(mystocks, Cl)) )
           AAPL.Close YHOO.Close GOOG.Close
2007-01-03      83.80      25.61     467.59
2007-01-04      85.66      26.85     483.26
2007-01-05      85.05      27.74     487.19
2007-01-08      85.47      27.92     483.58
2007-01-09      92.57      27.58     485.50
2007-01-10      97.00      28.70     489.46

In order for merge to succeed with dataframes, there need to be column names in common. I suspected you wanted cbind rather than mergeanyway.

> ClosePrices <- do.call(cbind, lapply(tickers,  function(x) Cl(get(x))))
> head(ClosePrices)
           SPY.Close DIA.Close QQQ.Close
2001-03-01    124.60    104.68     48.80
2001-03-02    123.61    104.80     46.70
2001-03-05    124.74    105.57     47.55
2001-03-06    126.08    106.15     49.40
2001-03-07    126.98    107.45     49.42
2001-03-08    127.12    108.61     48.50

But as Joshua points out (and he should know) merge also works for the class of objects (xts) returned by getSymbols.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!