2011-04-07 76 views
1

我一直在搞這個一段時間。我最近開始使用quantmod軟件包對股票價格進行分析。getSymbols和使用lapply,Cl,併合並提取關閉價格

我有一個股票載體,看起來像下面這樣:

> 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" ... 

我寫了一個名爲MYX在lapply調用中使用,以節省的價格爲每一隻股票的矢量行情功能。它具有以下代碼:

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

我本身調用lapply

庫(quantmod) lapply(行情,MYX,開始= 「2001-03-01」,結束=「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" 

這工作正常。現在我想的收盤價爲每股合併成一個對象,它看起來像

#   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 

有人建議我嘗試類似如下:

ClosePrices < - do.call(合併,lapply( (x)Cl(get(x))))

但是,我嘗試了這種沒有任何成功的各種組合。首先,我嘗試只是用Cl(x)呼叫lapply

>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" 
> 

任何指導將不勝感激。

+2

如果你要跨崗位,請至少提供一個鏈接到[其他職位(http://r.789695.n4.nabble.com/pass-character-vector-in -instrument-場的GET-HIST-報價功能,td3350779.html#a3431118)。 – 2011-04-07 00:54:00

回答

4

正如我在上R-幫助答覆說,getSymbols被矢量,所以沒有需要循環tickers。您不需要您的myX功能,並且lapply呼叫是完全不必要的/冗餘的。

我原來的答案中的代碼有效。你爲什麼要嘗試其他組合?

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 
+0

謝謝。我不知道你可以使用函數(x)和get(x)來引用先前的調用。這就是我困惑的原因。我認爲函數(x)是一個函數的持有名稱,它將執行並使用代碼作爲輸入。我不知道你可以參考以前稱爲功能的方式,就像你,JeffR和Dwin所做的那樣。我有很多瞭解R的情況。非常感謝你們兩位。 – codingknob 2011-04-07 19:25:20

+0

@ user668624:它沒有引用先前的調用(我甚至不確定你的意思)。 'function(x)'定義傳遞給'lapply'的函數。 'lapply'遍歷'tickers'並將'tickers'的每個元素傳遞給'function(x)'。 'get(x)'返回帶有'x'中字符串名稱的對象('tickers'中的元素)。 – 2011-04-07 19:34:27

+0

那R怎麼知道你用什麼函數傳給lapply? R知道getSymbols()是被傳遞給它的函數,並且它是循環的。沒有? – codingknob 2011-04-07 21:20:01

1

爲了使merge成功使用數據幀,需要列名通用。無論如何,我懷疑你需要cbind而不是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 

但正如約書亞所指出的(他應該知道)merge也適用於類由getSymbols返回的對象(XTS)的。

+0

很好的答案,但我不確定這會有所幫助。這個問題是我對R-help給出的答案的後續(我提供了相同的答案 - 幾乎是逐字的)。此外,'cbind'和'merge'與xts對象幾乎完全相同,這是'getSymbols'默認返回的內容。 – 2011-04-07 01:13:33

+0

哦。 ...我認爲他的代碼(呃,你的代碼)不起作用,否則明智的原因是什麼?我確實看到'ClosePrices < - do.call(merge,lapply(tickers,function(x)Cl(get(x))))'會產生相同的答案。 – 2011-04-07 01:19:18

+0

xts/zoo中的'merge'與'merge.default'有點不同,前者由索引屬性合併,後者按列合併。 – 2011-04-07 01:25:11

2

嘗試使用ENV = ARG和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 
+0

對於「eapply」用法很有幫助 – 2011-04-07 01:50:28

+0

謝謝傑夫。你們真的很棒。我有很多需要了解的R ......我非常感謝。 – codingknob 2011-04-07 19:28:21

+0

使用新環境有什麼好處? – jtr13 2017-06-29 01:54:20