使用quantmod库访问R中的环境对象

时间:2014-04-11 13:51:43

标签: r environment quantmod

我在R方面有一些经验,但到目前为止从未使用过我自己的环境。在过去的几个月里,我不得不经常使用自己的环境,我对它有一些疑问。

  • 使用环境的主要原因是"数据容器"是 因为它比其他人快得多,对吗?例如,使用 quantmod为什么我们要使用OH加载OHLC对象 getSymbols

拥有来自getSymbols的新环境,即

tick = c( "VNO" , "VMC" , "WMT" , "WAG") 
data.env <- new.env()    start<-as.Date("2013-01-01")   
getSymbols(tick,env=data.env,src="yahoo",from=start)

我们如何有效地访问data.env中的成员,例如如果我们想检查data.env中的所有成员是否是OHLC对象,我们可以执行以下操作:is.OHLC(data[[all elements]])吗?

此外,对于上述数据示例,我如何计算此类投资组合的风险价值。我的想法是来自VaR库的函数PerformanceAnalyticsVaR的帮助页面作为参数说明:&#34;资产的xts,vector,matrix,dataframe,timeSeries或zoo对象返回&#34;。为此,我想使用dailyReturn来获取返回值,然后可以将其用于函数VaR。但是dailyReturn需要OHLC对象作为参数。因此,只要我知道如何将VaR中的元素转换为OHLC矩阵,我就可以计算data.env

2 个答案:

答案 0 :(得分:2)

  

使用环境的主要原因是&#34;数据容器&#34;是   因为它比其他人快得多,对吧?

不,我认为主要原因是要保持清洁,避免覆盖全球环境中的对象。 (此外,要将所有&#34;新&#34;对象作为&#34;捆绑&#34;而不是几个单独的对象。为此,列表也可用,但请参阅下面列表之间的差异和环境。)通过调用getSymbols,可以创建四个新对象:

"VMC" "VNO" "WAG" "WMT"

如果在全局环境(aka工作区)中创建了这些对象,则将覆盖任何具有相同名称的预先存在的对象。 (当您使用load时会发生这种情况...例如,您在工作区中有x并且还保存在名为&#34; x.rda&#34;的文件中。{{1}之后您工作区中先前版本的load("x.rda")将丢失。)

环境与普通的R对象不同 - 因为您可以使用指向同一环境的不同名称。例如,如果x是R中的任何类型的对象,则分配x会创建x的副本。不适用于环境:

y <- x

这里当我们分配> ls(data.env) [1] "VMC" "VNO" "WAG" "WMT" > yummy <- data.env > yummy$x <- "bingo" > ls(data.env) [1] "VMC" "VNO" "WAG" "WMT" "x" > data.env$x [1] "bingo" > data.env$x <- "Florida" > yummy$x [1] "Florida" > with(yummy, rm(x)) > ls(data.env) [1] "VMC" "VNO" "WAG" "WMT" 时,我们不创建data.env的副本,而只是创建另一个指向同一对象的指针。因此,当我们在yummy <- data.env中执行某些操作时,同样会在yummy中发生。

  

我们如何有效地访问data.env中的成员,例如如果我们想   检查data.env中的所有成员是否都是OHLC对象,我们可以做些什么   喜欢:is.OHLC(数据[[所有元素]])?

如上所述,data.env就是答案, - 如果您愿意,可以使用eapply将结果列表转换为avector:

unlist

最后,您可以直接将对象提取到工作区,如下所示:

unlist(eapply(data.env, is.OHLC))

对于大多数用途来说,这可能并不慢,但缺点是你不能轻易地同时访问这四个新对象(例如,删除它们,或getSymbols(tick,env=.GlobalEnv,src="yahoo",from=start) 某些东西) 。在你这样做之前,你必须确保你的工作区中没有任何值得的东西,因为可能一切都可以被覆盖。

答案 1 :(得分:1)

正如Roman所建议的,检查数据环境中某个对象是否是OHLC对象的最简单方法是使用eapply,如下所示:

eapply(data.env,is.OHLC)

返回数据环境中对象的列表,如果是OHLC对象则返回逻辑值。如果您想要查看更紧凑的表单,可以在表达式周围包裹"str"。例如,要查看当前数据环境中的哪些对象是OHLC对象,我可以执行以下操作:

> str(eapply(data,is.OHLC))
List of 9
 $ VXZlong        : logi TRUE
 $ prices         : logi FALSE
 $ XIVlong        : logi TRUE
 $ dates          : logi FALSE
 $ VXXlong        : logi TRUE
 $ weight         : logi FALSE
 $ ZIVlong        : logi TRUE
 $ symbolnames    : logi FALSE
 $ execution.price: logi FALSE