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

I talked with this for a while. I recently started using quantmod to analyze stock price analytics.

I have a ticker vector that looks like this:

> tickers [1] "SPY" "DIA" "IWM" "SMH" "OIH" "XLY" "XLP" "XLE" "XLI" "XLB" "XLK" "XLU" "XLV" [14] "QQQ" > str(tickers) chr [1:14] "SPY" "DIA" "IWM" "SMH" "OIH" "XLY" "XLP" "XLE" ... 

I wrote a function called myX for use in a latent call to save prices for each stock in vector tickers. It has the following code:

 myX <- function(tickers, start, end) { require(quantmod) getSymbols(tickers, from=start, to=end) } 

I call lapply on my own

Library (quantmod) lapply (tickers, myX, start = "2001-03-01", end = "2011-03-11")

 > lapply(tickers,myX,start="2001-03-01", end="2011-03-11") [[1]] [1] "SPY" [[2]] [1] "DIA" [[3]] [1] "IWM" [[4]] [1] "SMH" [[5]] [1] "OIH" [[6]] [1] "XLY" [[7]] [1] "XLP" [[8]] [1] "XLE" [[9]] [1] "XLI" [[10]] [1] "XLB" [[11]] [1] "XLK" [[12]] [1] "XLU" [[13]] [1] "XLV" [[14]] [1] "QQQ" 

It works great. Now I want to combine the closing prices for each stock into an object that looks like

 # BCSI.Close WBSN.Close NTAP.Close FFIV.Close SU.Close # 2011-01-03 30.50 20.36 57.41 134.33 38.82 # 2011-01-04 30.24 19.82 57.38 132.07 38.03 # 2011-01-05 31.36 19.90 57.87 137.29 38.40 # 2011-01-06 32.04 19.79 57.49 138.07 37.23 # 2011-01-07 31.95 19.77 57.20 138.35 37.30 # 2011-01-10 31.55 19.76 58.22 142.69 37.04 

Someone is advised to try something like the following:

ClosePrices <- do.call (merge, lapply (tickers, function (x) Cl (get (x))))

However, I have tried various combinations of this without any success. At first I tried just calling lapply with Cl (x)

 >lapply(tickers,myX,start="2001-03-01", end="2011-03-11") Cl(myX))) > lapply(tickers,myX,start="2001-03-01", end="2011-03-11") Cl(x))) Error: unexpected symbol in "lapply(tickers,myX,start="2001-03-01", end="2011-03-11") Cl" > > lapply(tickers,myX(x),start="2001-03-01", end="2011-03-11") Cl(x))) Error: unexpected symbol in "lapply(tickers,myX(x),start="2001-03-01", end="2011-03-11") Cl" > > lapply(tickers,myX(start="2001-03-01", end="2011-03-11") Cl(x) Error: unexpected symbol in "lapply(tickers,myX(start="2001-03-01", end="2011-03-11") Cl" > lapply(tickers,myX(start="2001-03-01", end="2011-03-11") Cl(x)) Error: unexpected symbol in "lapply(tickers,myX(start="2001-03-01", end="2011-03-11") Cl" > 

Any recommendations would be kindly appreciated.

+1
merge r lapply quantmod
source share
3 answers

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

The code in my original answer works. Why are you trying to use 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 
+4
source share

Try using 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 
+2
source share

In order for merge to succeed with data frames, there must be common column names. I suspected you wanted cbind , not merge .

 > 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 (and he should know) points out, merge also works for the class of objects (xts) returned by getSymbols.

+1
source share

All Articles