【问题标题】:getSymbols and using lapply, Cl, and merge to extract close pricesgetSymbols 并使用 lapply、Cl 和 merge 提取收盘价
【发布时间】:2011-07-31 06:47:22
【问题描述】:

我已经搞砸了一段时间了。我最近开始使用 quantmod 包对股票价格进行分析。

我有一个代码向量,如下所示:

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

效果很好。现在我想将每只股票的收盘价合并成一个看起来像的对象

#            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

但是,我尝试了各种组合,但没有成功。首先我试着用 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"
>

任何指导将不胜感激。

【问题讨论】:

  • 如果您要交叉发帖,请至少提供一个指向your other posts 的链接。

标签: r merge quantmod lapply


【解决方案1】:

正如我在 R-help 的回复中所说,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

【讨论】:

  • 谢谢。我不知道您可以使用 function(x) 和 get(x) 来引用以前的调用。这就是我感到困惑的原因。我认为 function(x) 是一个函数的名称,它将执行并使用代码作为输入。我不知道您可以像 JeffR 和 Dwin 那样引用以前调用的函数。我有很多关于 R 的知识要学习。非常感谢你们俩。
  • @user668624:它不是指以前的电话(我什至不确定你的意思)。 function(x) 定义传递给lapply 的函数。 lapply 循环 tickers 并将 tickers 的每个元素传递给 function(x)get(x) 返回具有x 中字符串名称的对象(来自tickers 的元素)。
  • 那么 R 怎么知道你使用什么函数来传递给 lapply? R 知道 getSymbols() 是传递给它的函数,它会在代码上循环。没有?
  • @user668624:R 知道您使用什么函数传递给lapply,因为您将它作为参数提供给lapply。在您的示例中,您将myX(称为getSymbols)传递给lapply,R 为tickers 中的每个元素评估myX。但是getSymbols 会在内部循环tickers,因此您不需要使用lapply
  • 我还是一头雾水。我通过了 myX,因为我认为 lapply 就是这样工作的。但是在你们提供的解决方案中,你们只是使用了'function(x)'。我逐字复制并粘贴了您的示例,R 知道它应该使用 getSymbols。这是因为我在调用 do.call(merge, lapply(tickers, function(x) Cl(get(x)))) 之前运行了 getSymbols 吗??
【解决方案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

【讨论】:

  • 谢谢杰夫。你们真的很了不起。我有很多关于 R 的知识……我非常感激。
  • 使用新环境有什么好处?
【解决方案3】:

为了让merge 成功使用数据框,需要有共同的列名。我怀疑你想要cbind 而不是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

但正如 Joshua 指出的(他应该知道)merge 也适用于 getSymbols 返回的对象类 (xts)。

【讨论】:

  • 很好的答案,但我不确定它是否会有所帮助。这个问题是我在 R-help 上给出的答案的后续问题(我提供了相同的答案——几乎是逐字记录)。此外,cbindmerge 对 xts 对象执行几乎相同的操作,这是 getSymbols 默认返回的。
  • 哦。 ...我认为他的代码(呃,你的代码)不起作用,否则为什么要发布这个问题?我确实看到ClosePrices &lt;- do.call(merge, lapply(tickers, function(x) Cl(get(x)))) 确实产生了相同的答案。
  • merge in xts/zoo 与merge.default 有点不同,前者按索引属性合并,后者按列合并。
  • 谢谢 Dwin!您的所有解决方案都有效。在我学习 R 的过程中,我还有很多小时、几天和几个月的时间......谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多