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
›пробвай(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

Така че изглежда, че е имало проблеми с 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') 
person nrussell    schedule 12.01.2015
comment
Много сте добре дошли - когато имате възможност, моля, отделете няколко минути, за да прочетете някои от отговорите на този въпрос - колкото повече информация можете да предоставите за проблема си, толкова по-лесно ще бъде за другите потребители да ви помогнат. - person nrussell; 12.01.2015

Проблемът е, че препинателните знаци в списъка с тикери, генерирани от stockSymbols(), въпреки че са от Yahoo, дават 404 от използването на getSymbols(), защото yahoo не използва тези препинателни знаци в URL адреситеgetSymbols(), които се опитват да изтрият.

Пример: 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(), за да получите всички данни за акциите и да пропуснете 404s

 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