Квантмод опуская тикеры в getSymbols

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

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

Похоже, что были проблемы с 2 акциями, так как 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') 

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

Пример:stockSymbols() получает символ "AA-P", вы пытаетесь передать это в getSymbols() и вы получите 404'd, потому что 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)  
    }
}

Вы можете попробовать tidyquant пакет, который заботится о внутренней обработке ошибок. Это также не требует for-loop или 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]>

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

Другие вопросы по тегам