Quantmod опускает тикеры в getSymbols

Я полный новичок в R. Я хочу загрузить исторические данные о текущих компаниях в S & P500, используя getSymbols в течение нескольких периодов. Очевидно, что некоторые компании не существовали в данный период, и R перестает загружать данные для следующих тикеров. Есть ли способ разрешить getSymbols просто опускать тикеры, если их данные не существуют? Было бы намного проще получить список S&P 500 на тот период, но, к сожалению, это не бесплатно.


person Yi Sha    schedule 11.01.2015    source источник
comment
К сожалению, это не работает. Я получаю только предупреждение без сообщения об ошибке. Понятия не имею почему. Я также пробовал tryCatch, но не смог придумать хорошей идеи, как указать условие.   -  person Yi Sha    schedule 12.01.2015
comment
Пожалуйста, укажите свой код, который не работает.   -  person nrussell    schedule 12.01.2015
comment
›Try (getSymbols (SiP, from = 2001-01-01, to = 2007-01-01, env = WoW), silent = TRUE)   -  person Yi Sha    schedule 12.01.2015
comment
Что такое SiP? Это недействительный тикер.   -  person nrussell    schedule 12.01.2015
comment
Так я назвал свой список с тикерами.   -  person Yi Sha    schedule 12.01.2015
comment
Он состоит из тикеров каждой компании в текущем S & P500. Сокращенная версия: SiP = c ('AES', 'GAS', 'AEE', 'AEP', 'CNP', 'CMS', 'ED', 'D', 'DTE', 'DUK', 'EIX ',' ETR ',' EXC ',' FE ',' TEG ',' NEE ',' NI ',' NU ',' NRG ',' PCG ',' POM ',' PNW ',' PPL ', PEG, SCG, SRE, SO, TE, WEC, XEL, T, CTL, FTR, LVLT, VZ, WIN ',' AP ',' ARG ',' AA ',' ATI ',' AVY ',' BLL ',' CF ',' DOW ',' D ',' EMN ',' ECL ',' FMC ', FCX, IP, IFF, LYB, MWV, MON, MOS, NEM, NUE, OI, PPG)   -  person Yi Sha    schedule 12.01.2015


Ответы (3)


Вы можете использовать try в sapply следующим образом:

library(quantmod)
WoW <- new.env()
##
sapply(SiP, function(x){
  try(
    getSymbols(
      x,
      from=as.Date("2001-01-01"),
      to=as.Date("2007-01-01"),
      env=WoW),
    silent=TRUE)
})

Ошибки будут выводиться на консоль (вы, вероятно, можете уменьшить это, если хотите), но тикеры, которые не генерируют ошибок, все равно будут выдавать данные:

R> ls(WoW)
 [1] "AA"   "AEE"  "AEP"  "AES"  "AP"   "ARG"  "ATI"  "AVY"  "BLL"  "CF"   "CMS"  "CNP"  "CTL"  "D"    "DOW"  "DTE"  "DUK"  "ECL"  "ED"   "EIX" 
[21] "EMN"  "ETR"  "EXC"  "FCX"  "FE"   "FMC"  "FTR"  "GAS"  "IFF"  "IP"   "LVLT" "MON"  "MOS"  "MWV"  "NEE"  "NEM"  "NI"   "NRG"  "NU"   "NUE" 
[41] "OI"   "PCG"  "PEG"  "PNW"  "POM"  "PPG"  "PPL"  "SCG"  "SO"   "SRE"  "T"    "TE"   "TEG"  "VZ"   "WEC"  "WIN"  "XEL" 
##
R> length(ls(WoW))
[1] 57
R> length(SiP)
[1] 59

Таким образом, похоже, что были проблемы с двумя акциями, поскольку sapply(...) успешно вернул данные по другим 57.

Отсюда можно получить доступ к объектам в WoW с помощью предпочитаемого вами метода, например

R> with(WoW, chartSeries(ARG))

введите описание изображения здесь


Данные:

SiP=c('AES','GAS','AEE','AEP','CNP', 'CMS','ED','D',
      'DTE','DUK','EIX', 'ETR','EXC','FE','TEG',
      'NEE','NI', 'NU','NRG','PCG','POM','PNW','PPL', 
      'PEG','SCG','SRE','SO','TE','WEC', 'XEL','T',
      'CTL','FTR','LVLT','VZ', 'WIN','AP','ARG',
      'AA','ATI','AVY', 'BLL','CF','DOW','D',
      'EMN','ECL', 'FMC','FCX','IP','IFF','LYB',
      'MWV', 'MON','MOS','NEM','NUE','OI','PPG') 
person nrussell    schedule 12.01.2015
comment
Добро пожаловать - когда у вас будет возможность, уделите несколько минут, чтобы прочитать некоторые ответы на этот вопрос - чем больше информации вы предоставите о своей проблеме, тем легче другим пользователям будет вам помочь. - person nrussell; 12.01.2015

Проблема заключается в том, что знаки препинания в списке тикеров, которые stockSymbols() генерируются, несмотря на то, что они были получены от Yahoo, дают результат 404 при использовании getSymbols(), потому что Yahoo не использует эти знаки препинания в URL-адресахgetSymbols(), которые пытается очистить.

Пример: stockSymbols() получает символ "AA-P", вы пытаетесь передать его в getSymbols() и получаете 404, потому что Yahoo! для этой акции использует «AA» в URL, а не «AA-P», несмотря на то, что тикер указан как «AA-P» из любого ресурса, из которого stockSymbols() получает его.

Я сделал код для очистки списка тикеров, сгенерированных stockSymbols(), чтобы getSymbols() не генерировал ошибку. При этом удаляются предпочтительные символы и символы, содержащие знаки препинания, поэтому результат возникает из-за обычных проблем с акциями.

library(quantmod)

symbols = stockSymbols()

symbols = symbols[,1]

for (i in seq_along(symbols)) {
    hyph = gregexpr(pattern = "-", symbols[i])
    per = gregexpr(pattern = "[.]", symbols[i])

    if (hyph[[1]][1] > 0 ) {
        symbols[i] = substr(symbols[i], 1, hyph[[1]][1] - 1)

    } else if (per[[1]][1] > 0 ) {
        symbols[i] = substr(symbols[i], 1, per[[1]][1] - 1)
    }
}

symbols = unique(symbols)

вот код для использования getSymbol (), чтобы получить все данные о запасах и пропустить 404

 for (i in seq_along(symbols)){
tryit <- try(getSymbols(symbols[i],from="2016-01-01", src='yahoo'))
    if(inherits(tryit, "try-error")){
        i <- i+1
    }
    else {
    stock = getSymbols(symbols[i], from="2016-01-01", src = "yahoo", auto.assign = FALSE)
    stocks[[i]] = as.data.frame(stock)  
    }
}
person Victor Burnett    schedule 14.10.2016

Вы можете попробовать пакет tidyquant, который занимается внутренней обработкой ошибок. Он также не требует циклов for или операторов tryCatch, поэтому вы сэкономите значительный объем кода. Функция tq_get() отвечает за получение цен на акции. Вы можете использовать аргумент complete_cases, чтобы настроить способ обработки ошибок.

Пример с complete_cases = TRUE: Автоматически удаляет "плохие яблоки"

library(tidyquant)

# get data with complete_cases = TRUE automatically removes bad apples
c("AAPL", "GOOG", "BAD APPLE", "NFLX") %>%
    tq_get(get = "stock.prices", complete_cases = TRUE)

#> Warning in value[[3L]](cond): Error at BAD APPLE during call to get =
#> 'stock.prices'. Removing BAD APPLE.
#> # A tibble: 7,680 × 8
#>    symbol       date  open  high   low close    volume adjusted
#>     <chr>     <date> <dbl> <dbl> <dbl> <dbl>     <dbl>    <dbl>
#> 1    AAPL 2007-01-03 86.29 86.58 81.90 83.80 309579900 10.85709
#> 2    AAPL 2007-01-04 84.05 85.95 83.82 85.66 211815100 11.09807
#> 3    AAPL 2007-01-05 85.77 86.20 84.40 85.05 208685400 11.01904
#> 4    AAPL 2007-01-08 85.96 86.53 85.28 85.47 199276700 11.07345
#> 5    AAPL 2007-01-09 86.45 92.98 85.15 92.57 837324600 11.99333
#> 6    AAPL 2007-01-10 94.75 97.80 93.45 97.00 738220000 12.56728
#> 7    AAPL 2007-01-11 95.94 96.78 95.10 95.80 360063200 12.41180
#> 8    AAPL 2007-01-12 94.59 95.06 93.23 94.62 328172600 12.25892
#> 9    AAPL 2007-01-16 95.68 97.25 95.45 97.10 311019100 12.58023
#> 10   AAPL 2007-01-17 97.56 97.60 94.82 94.95 411565000 12.30168
#> # ... with 7,670 more rows

Пример с complete_cases = FALSE: возвращает вложенный фрейм данных.

library(tidyquant)

# get data with complete_cases = FALSE returns a nested data frame
c("AAPL", "GOOG", "BAD APPLE", "NFLX") %>%
    tq_get(get = "stock.prices", complete_cases = FALSE)

#> Warning in value[[3L]](cond): Error at BAD APPLE during call to get =
#> 'stock.prices'.
#> Warning in value[[3L]](cond): Returning as nested data frame.
#> # A tibble: 4 × 2
#>      symbol         stock.prices
#>       <chr>               <list>
#> 1      AAPL <tibble [2,560 × 7]>
#> 2      GOOG <tibble [2,560 × 7]>
#> 3 BAD APPLE            <lgl [1]>
#> 4      NFLX <tibble [2,560 × 7]>

В обоих случаях пользователь получает ПРЕДУПРЕЖДЕНИЕ. Благоразумный пользователь прочитает их и попытается определить, в чем проблема. Самое главное, долго работающий скрипт не потерпит неудачу.

person Matt Dancho    schedule 05.03.2017