quantmod的getSymbol有什么副作用?

时间:2012-08-09 13:33:42

标签: r global-variables quantmod

我的数据框的日期和价格为:

>df
Price  Date
1.25   2012-01-05
...

我创建了一种货币和股票:

currency("USD")
stock("GSPC", "USD")
然后我创建一个xts对象:

GSPC <- xts(df$Price, df$Date)
colnames(GSPC) <- "Close"

预期用途是创建一个吸墨纸组合 - 这是有效的。但是当我试着

updatePortf(portfolio, Symbols="GSPC", Dates = current.date)

我收到以下错误:

Error in get(Symbol, pos = env) : object 'GSPC' not found

GSPC没有出现在“showSymbols()”中,因此我认为它需要在某处注册。有没有办法注册符号?

一个非常hacky的解决方法,受另一个stackoverflow答案的启发是:

GSPC$GSPC.High <- GSPC$Open
GSPC$GSPC.Low <- GSPC$Open
GSPC$GSPC.Close <- GSPC$Open
GSPC$GSPC.Volume <- GSPC$Open
GSPC$GSPC.Adjusted <- GSPC$Open

write.zoo(GSPC, file="GSPC.csv", sep=",")
setSymbolLookup(GSPC=list(src="csv",format="%Y-%m-%d"))

getSymbols("GSPC")

有没有更好的方法来创建上述内容?我没有(需要)音量,高,低,接近和调整 - 我还需要它们用于吸墨纸吗?

更新 我设法重现了这个问题然后理解它为什么。看起来你无法在本地函数环境中声明xts对象。这是一个可重现的脚本:

library(xts)
library(FinancialInstrument)
library(blotter)
library(lubridate)
rm(list=ls(envir=.blotter),envir=.blotter)

runme <- function() {
  currency("USD")
  stock("GSPC", "USD")

  dates <-ymd("2012-03-02") + seq(0,9) * ddays(1)
  prices <- abs(rnorm(10))

  GSPC <- xts(prices, dates)
  colnames(GSPC) <- "Close"

  # Initialise
  initPortf("p", symbols="GSPC", initDate=ymd("2012-01-01"), currency="USD")
  initAcct("a", portfolios="p", initDate=ymd("2012-01-01"), initEq=2e6, currency="USD")

  trade.date <- ymd("2012-03-04")
  addTxn("p", "GSPC", trade.date, 1, GSPC[trade.date])

  updatePortf("p", Symbols="GSPC", Dates = trade.date)
  updateAcct("a", Dates = trade.date)

  updateEndEq("a", Dates = trade.date)

  chart.Posn("p")

}

2 个答案:

答案 0 :(得分:2)

blotter 包使用 FinancialInstrument 包。您可能需要定义仪器。我想如果你做这样的事情它应该有效。

synthetic("GSPC", currency("USD"))

如果没有,也许你可以提供一个可重复的例子。 (我们没有您的投资组合)

修改

要更直接地回答标题中的问题,getSymbolslist所有使用过的符号.getSymbols中存储名为.GlobalEnv的{​​{1}} getSymbols载入。但是,我不认为吸墨纸看它。

编辑2:

您收到的错误消息告诉您.GlobalEnv中没有名为“GSPC”的数据。您必须在xts中拥有.GlobalEnv对象,或在xts参数中将updatePortf对象传递给Prices。同样,如果您的示例可以重现,我可以提供更好的帮助(更不用说它会使它对本网站的未来访问者更有用)。

答案 1 :(得分:1)

为了完整起见,要使代码段工作在上面,您需要将GSPC分配给.GlobalEnv:

assign("GSPC", GSPC, envir=.GlobalEnv)

完整的脚本是:

library(xts)
library(FinancialInstrument)
library(blotter)
library(lubridate)
rm(list=ls(envir=.blotter),envir=.blotter)

runme <- function() {
  currency("USD")
  stock("GSPC", "USD")

  dates <-ymd("2012-03-02") + seq(0,9) * ddays(1)
  prices <- abs(rnorm(10))

  GSPC <- xts(prices, dates)
  colnames(GSPC) <- "Close"
  assign("GSPC", GSPC, envir=.GlobalEnv)

  # Initialise
  initPortf("p", symbols="GSPC", initDate=ymd("2012-01-01"), currency="USD")
  initAcct("a", portfolios="p", initDate=ymd("2012-01-01"), initEq=2e6, currency="USD")

  trade.date <- ymd("2012-03-04")
  addTxn("p", "GSPC", trade.date, 1, GSPC[trade.date])

  updatePortf("p", Symbols="GSPC", Dates = trade.date)
  updateAcct("a", Dates = trade.date)

  updateEndEq("a", Dates = trade.date)

  chart.Posn("p")

}