Каковы побочные эффекты для getSymbol от 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()», поэтому я предполагаю, что его нужно где-то зарегистрировать. Есть ли способ зарегистрировать символ?

Очень хакерский обходной путь, вдохновленный другим ответом 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")

Есть ли лучший способ создать вышеперечисленное? У меня нет (нужно) Volume, High, Low, Close и Adjust - нужны ли они мне для промокашки?

ОБНОВЛЕНИЕ Мне удалось воспроизвести проблему, а затем понять, почему она возникла. Похоже, вы не можете объявить объекты 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")

}

person svenski    schedule 09.08.2012    source источник
comment
Что находится в portfolio? Что такое current.date? Какое точное сообщение об ошибке вы получаете? Если вам нужна помощь в воспроизведении, см. stackoverflow.com/questions/5963269/   -  person GSee    schedule 09.08.2012
comment
Спасибо за добавление воспроизводимого кода! :-)   -  person GSee    schedule 09.08.2012


Ответы (2)


Пакет blotter использует пакет FinancialInstrument. Вероятно, вам нужно определить свой инструмент. Я думаю, если вы сделаете что-то подобное, это должно сработать.

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

Если нет, возможно, вы могли бы привести воспроизводимый пример. (у нас нет вашего портфолио)

ИЗМЕНИТЬ:

Чтобы более точно ответить на вопрос в вашем заголовке, getSymbols сохраняет list с именем .getSymbols в вашем .GlobalEnv всех символов, которые вы использовали getSymbols для загрузки. Однако я не думаю, что blotter обращает на это внимание.

РЕДАКТИРОВАТЬ 2:

Сообщение об ошибке, которое вы получаете, говорит вам, что в вашем .GlobalEnv нет данных с именем "GSPC". Вы должны либо иметь объект xts в своем .GlobalEnv, либо передать объект xts в updatePortf в аргументе Prices. Опять же, я мог бы помочь лучше, если бы ваш пример был воспроизводимым (не говоря уже о том, что это сделало бы его более полезным для будущих посетителей этого сайта).

person GSee    schedule 09.08.2012
comment
Извините, я не включил первые строки, определяющие акции. Я обновлю свой пост. - person svenski; 09.08.2012
comment
Когда вы это сделаете, продолжайте и сделайте все это воспроизводимым! - person GSee; 09.08.2012
comment
Возможно, у вас нет данных о current.date. Вы можете попробовать использовать Dates=NULL или Dates=paste0("/", current.date), но вы не указали фактическую полученную ошибку или не показали, какие данные находятся в ваших объектах. - person GSee; 09.08.2012
comment
Спасибо, вы несколько раз говорили о воспроизводимости. Я согласен и стараюсь. У меня есть сценарий, в котором это происходит, он очень длинный, и я не могу им поделиться. Сокращенная версия того же скрипта похожа на то, что вы видите выше, с одной фиктивной сделкой, которая не показывает ту же ошибку. Так что по какой-то причине GSPC не отображается в основном скрипте, хотя, если я выполняю отладку в этой точке, он явно присутствует как объект xts. Я обновлю выпуск, если мне удастся воспроизвести его в более коротком сценарии. - person svenski; 09.08.2012
comment
Спасибо, обновление о .GlobalEnv помогло мне решить проблему. - person svenski; 09.08.2012
comment
Если вы закомментируете строку chart.Posn, вы можете использовать вместо нее updatePortf("p", Symbols="GSPC", Dates = trade.date, Prices=GSPC). Однако chart.Posn требует, чтобы данные были в .GlobalEnv, что вы можете назвать отсутствующей функцией или ошибкой в ​​​​зависимости от вашего настроения. ;-) - person GSee; 09.08.2012

Просто для полноты картины, чтобы приведенный выше фрагмент работал, вам нужно назначить 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")

}
person svenski    schedule 09.08.2012