2013-03-26 1 views
2

Я хотел бы загружать ежедневные данные из yahoo для S & P 500, DJIA и 30-летних T-Bonds, отображать данные в соответствующий часовой пояс и объединять их с моими собственными данными. У меня есть несколько вопросов.yahoo tickers, часовой пояс и слияние

  1. Моя первая проблема заключается в том, что вы получаете право голоса. С веб-сайта yahoo это похоже на тикеры:^GSPC,^DJI и^TYX. Однако^DJI терпит неудачу. Любая идея почему?

  2. Моя вторая проблема заключается в том, что я хотел бы ограничить часовой пояс GMT (я хотел бы обеспечить, чтобы все мои данные были на одних и тех же часах, GMT по-видимому, является нейтральным выбором), но я не мог его получить работать.

  3. Моя третья проблема заключается в том, что я хотел бы объединить данные yahoo с моими собственными данными, полученными другими способами и доступными в другом формате. Это также ежедневные данные.

Вот моя попытка ограничить данные часовым поясом GMT. Выполнено в верхней части моего сценария R.

Sys.setenv(TZ = "GMT") 
# > Sys.getenv("TZ") 
# [1] "GMT" 
# the TZ variable is properly set 
# but does not affect the time zone in zoo objects, why? 

Вот мой код, чтобы получить данные Yahoo:

library("tseries") 
library("xts") 

date.start <- "1999-12-31" 
date.end <- "2013-01-01" 

# tickers <- c("GSPC","TYX","DJI") 
# DJI Fails, why? 
# http://finance.yahoo.com/q?s=%5EDJI 
tickers <- c("GSPC","TYX") # proceed without DJI 

z <- zoo() 
index(z) <- as.Date(format(time(z)),tz="") 

for (i in 1:length(tickers)) 
    { 
    cat("Downloading ", i, " out of ", length(tickers) , "\n") 
    x <- try(get.hist.quote(
     instrument = paste0("^",tickers[i]) 
     , start = date.start 
     , end = date.end 
     , quote = "AdjClose" 
     , provider = "yahoo" 
     , origin = "1970-01-01" 
     , compression = "d" 
     , retclass = "zoo" 
     , quiet = FALSE) 
     , silent = FALSE) 
    print(x[1:4]) # check that it's not empty 
    colnames(x) <- tickers[i] 
    z <- try(merge(z,x), silent = TRUE) 
} 

Вот является dput (глава (Df)) моего набора данных:

df <- structure(list(A = c(-0.011489000171423, -0.00020300000323914, 
0.0430639982223511, 0.0201549995690584, 0.0372899994254112, -0.0183669999241829 
), B = c(0.00110999995376915, -0.000153000000864267, 0.0497750006616116, 
0.0337960012257099, 0.014121999964118, 0.0127800004556775), date = c(9861, 
9862, 9863, 9866, 9867, 9868)), .Names = c("A", "B", "date" 
), row.names = c("0001-01-01", "0002-01-01", "0003-01-01", "0004-01-01", 
"0005-01-01", "0006-01-01"), class = "data.frame") 

Я хотел бы объединить данные в df с данными в z. Кажется, я не могу заставить его работать.

Я новичок в R и очень открыт для вашего совета об эффективности, лучшей практике и т. Д. Спасибо.

EDIT: SOLUTIONS

  1. На первой задаче: следующие предложения GSEE, в данные Dow Jones Industrial Average может быть загружен с пакетом quantmod: Таким образом, вместо "^ DJI" бегущей строки, который больше не доступен из yahoo, используйте тикер «DJIA». Обратите внимание, что в тике «DJIA» нет каретки.

  2. О второй проблеме, Джошуа Ульрих отмечает в комментариях, что «Даты не имеют временных зон, потому что у дней нет компонента времени».

  3. О третьей проблеме: у фрейма данных есть поврежденные даты, как указано в комментариях.

Мои решения основываются на упаковке quantmod и прилагаемый к нему зоопарк/XTS пакеты:

library(quantmod) 

Вот код, который я использовал, чтобы получить соответствующие даты из моего файла CSV:

toDate <- function(x){ as.Date(as.character(x), format("%Y%m%d")) } 
dtz <- read.zoo("myData.csv" 
    , header = TRUE 
    , sep = "," 
    , FUN = toDate 
) 
dtx <- as.xts(dtz) 

Даты в файле csv хранятся в одном столбце в формате «19861231». Ключом к получению правильных дат был перенос даты в «as.character()». Часть этого кода была вдохновлена ​​от R - Stock market data from csv to xts. Я также нашел справочники zoo/xts полезными.

я затем извлечь диапазон дат из этого набора данных:

date.start <- start(dtx) 
date.end <- end(dtx) 

Я буду использовать эти даты с функцией getSymbols quantmod так, чтобы другие данные загрузить будет охватывать тот же период.

Вот код, который я использовал для получения всех трех тикеров.

tickers <- c("^GSPC","^TYX","DJIA") 
data <- new.env() # the data environment will store the data 
do.call(cbind, lapply(tickers 
    , getSymbols 
    , from = date.start 
    , to = date.end 
    , env = data # data saved inside an environment 
    ) 
) 
ls(data) # see what's inside the data environment 
data$GSPC # access a particular ticker 

Также отметим, что GSEE отметил в комментариях, что опция auto.assign = FALSE не может быть использован в сочетании с опцией окр = данные (в противном случае происходит сбой загрузки).

Большое спасибо за вашу помощь.

+0

Я думаю, что проблема с^DJX, потому что нет исторических данных для него , Вы можете проверить это на странице поставщика, http://finance.yahoo.com/q/hp?s=%5ETYX+Historical+Prices – agstudy

+0

Ваш df имеет соответствующие даты. Таким образом, вы не можете объединить его с вашими тикерами. – agstudy

+0

Даты не имеют временных зон, потому что дни не имеют компонента времени. –

ответ

5
  1. Yahoo doesn't provide historical data for ^DJI. В настоящее время похоже, что вы можете получить одни и те же данные, используя тикер «DJIA», но ваш пробег может отличаться.
  2. Это делает работы в данном случае, потому что вы имеете дело только с датами
  3. df объекта вашего предоставленное ежегодные данных, начинающиеся в 0001. году Итак, это, вероятно, не то, что вы хотели.

Вот как я бы принести и объединить эти серии (или использовать среду и сделать только один звонок в getSymbols)

library(quantmod) 
do.call(cbind, lapply(c("^GSPC", "^TYX"), getSymbols, auto.assign=FALSE)) 
+0

Здесь вы не имеете в виду по одному вызову, что это векторизованная функция? – agstudy

+0

getSymbols «векторизован» в том смысле, что в нем есть цикл for. Это то, что вы имеете в виду – GSee

+0

Я имею в виду, что здесь вы называете 'getSymobls' дважды, один раз для каждого символа. Я бы добавил некоторые объяснения, поскольку OP является новичком. Например, почему лучше использовать 'lapply' здесь (избегайте побочного эффекта for) ... слияние - это просто' cbind', ... – agstudy

Смежные вопросы