【问题标题】:What are the side effects for quantmod's getSymbol?quantmod getSymbol 的副作用是什么?
【发布时间】:2012-08-09 13:33:41
【问题描述】:

我有一个包含日期和价格的数据框:

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

}

【问题讨论】:

  • portfolio 中有什么内容? current.date 是什么?您收到的确切错误消息是什么?如果您需要帮助使其可重现,请参阅stackoverflow.com/questions/5963269/…
  • 感谢您添加可重现的代码! :-)

标签: r global-variables quantmod


【解决方案1】:

blotter 包使用 FinancialInstrument 包。您可能需要定义您的乐器。我认为如果你做这样的事情它应该可以工作。

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

如果没有,也许您可​​以提供一个可重现的示例。 (我们没有你的作品集)

编辑:

为了更直接地回答您标题中的问题,getSymbols 在您使用getSymbols 加载的所有符号的.GlobalEnv 中存储了一个名为.getSymbolslist。但是,我不认为 blotter 会看它。

编辑 2:

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

【讨论】:

  • 抱歉,我没有包含定义库存的第一行。我会更新我的帖子。
  • 当你这样做的时候,继续让整个事情可重现!
  • 可能是您在current.date 上没有任何数据。您可以尝试使用Dates=NULLDates=paste0("/", current.date),但您没有提供您收到的实际错误,也没有显示您的对象中有哪些数据。
  • 谢谢,您已经多次就可重复性提出了观点。我同意,我正在努力。我有一个脚本很长,而且我不能分享它。同一脚本的精简版本与您在上面看到的类似,其中一个模拟交易没有显示相同的错误。因此,由于某种原因,在主脚本中看不到“GSPC”,尽管如果我在这一点进行调试,它显然作为 xts 对象存在。如果我设法在更短的脚本中重现它,我会更新这个问题。
  • 感谢 .GlobalEnv 的更新帮助我解决了这个问题。
【解决方案2】:

为了完整起见,要使上面的 sn-p 工作,您需要将 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")

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-13
    • 2010-11-07
    • 2017-04-15
    • 2011-07-21
    • 2021-04-27
    • 1970-01-01
    • 2010-12-21
    • 2021-01-13
    相关资源
    最近更新 更多