yahoo tickers, fus orar și fuziune (Programare, R, Yahoo, Xts)

PatrickT a intrebat.

Aș dori să descarc date zilnice de la yahoo pentru S&P 500, DJIA și obligațiuni T pe 30 de ani, să le adaptez la fusul orar corespunzător și să le îmbin cu propriile mele date. Am câteva întrebări.

  1. Prima mea problemă este obținerea corectă a indicatorilor. De pe site-ul Yahoo, se pare că indicatorii sunt: ^GSPC, ^DJI și ^TYX. Cu toate acestea, ^DJI nu reușește. Aveți vreo idee de ce?

  2. A doua mea problemă este că aș dori să limitez fusul orar la GMT (aș dori să mă asigur că toate datele mele sunt la același ceas, GMT pare o alegere neutră), dar nu am reușit să o fac să funcționeze.

  3. A treia problemă este că aș dori să îmbin datele yahoo cu propriile mele date, obținute prin alte mijloace și disponibile într-un format diferit. Este vorba, de asemenea, de date zilnice.

Iată încercarea mea de a constrânge datele la fusul orar GMT. Executată în partea de sus a scriptului meu 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?

Iată codul meu pentru a obține datele 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) , "
")
     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 )
}

Aici este dput(head(df)) din setul meu de date:

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")

Aș dori să îmbin datele din df cu datele din z. Nu reușesc să fac să funcționeze.

Sunt nou în R și sunt foarte deschis la sfaturile dvs. cu privire la eficiență, cele mai bune practici, etc.. Vă mulțumesc.

MODIFICARE: SOLUȚII

  1. Cu privire la prima problemă: urmând sugestiile lui GSee, datele Dow Jones Industrial Average pot fi descărcate cu pachetul Quantmod: astfel, în loc de tickerul „^DJI”, care nu mai este disponibil de la Yahoo, utilizați tickerul „DJIA”. Rețineți că în tickerul „DJIA” nu există niciun semn de atenție.

  2. În ceea ce privește cea de-a doua problemă, Joshua Ulrich subliniază în comentarii că „Datele nu au fus orar, deoarece zilele nu au o componentă de timp”.

  3. Cu privire la a treia problemă: Cadrul de date pare să aibă datele corupte, așa cum a subliniat agstudy în comentarii.

Soluțiile mele se bazează pe pachetul Quantmod și pe pachetele zoo/xts atașate:

library(quantmod)

Iată codul pe care l-am folosit pentru a obține datele corecte din fișierul meu 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)

Datele din fișierul csv au fost stocate într-o singură coloană în formatul „19861231”. Cheia pentru a obține datele corecte a fost să înfășorăm data în „as.character()”. O parte din acest cod a fost inspirat din R – Stock market data from csv to xts. De asemenea, manualele zoo/xts mi s-au părut utile.

Apoi am extras intervalul de date din acest set de date:

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

Voi folosi aceste date cu funcția getSymbols a Quantmod, astfel încât celelalte date pe care le descarc să acopere aceeași perioadă.

Iată codul pe care l-am folosit pentru a obține toți cei trei tickeri.

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

De asemenea, rețineți, așa cum a subliniat GSee în comentarii, că opțiunea auto.assign=FALSE nu poate fi utilizată împreună cu opțiunea env=data (în caz contrar, descărcarea eșuează).

Un mare mulțumesc pentru ajutor.

Comentarii

  • Cred că problema cu ^DJX pentru că nu există date istorice pentru el. Puteți verifica acest lucru în pagina furnizorului , finance.yahoo.com/q/hp?s=%5ETYX+Historical+Prices –  > Por agstudy.
  • df-ul dvs. are date coroborate. Deci nu îl poți îmbina cu tickerii tăi. –  > Por agstudy.
  • Datele nu au fus orar pentru că zilele nu au o componentă de timp. –  > Por Joshua Ulrich.
  • Mulțumesc! @agstudy: Am verificat pe site-ul yahoo, tickerul DJI merge înapoi până în 1992. Vezi: finance.yahoo.com/q/hp?s=%5EDJI+Historical+Prices –  > Por PatrickT.
  • @agstudy: date corupte, ai dreptate, nu mă mir că mă chinuiam. Datele provin dintr-un set de date Stata, așa că, evident, am făcut ceva greșit în timpul conversiei. –  > Por PatrickT.
1 răspunsuri
GSee
  1. Yahoo nu furnizează date istorice pentru ^DJI. În prezent, se pare că puteți obține aceleași date utilizând tickerul „DJIA”, dar kilometrajul dvs. poate varia.
  2. Acesta face funcționează în acest caz, deoarece aveți de-a face doar cu datele
  3. df obiectul pe care l-ați furnizat sunt date anuale care încep în anul 0001. Așadar, probabil că nu este ceea ce v-ați dorit.

Iată cum aș prelua și unifica aceste serii (sau aș folosi un mediu și aș efectua un singur apel către getSymbols)

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

Comentarii

  • Aici nu cumva vrei să spui prin un singur apel că este o funcție vectorizată? –  > Por agstudy.
  • getSymbols este „vectorizată” în sensul că are o buclă for în interiorul ei. La asta vă referiți –  > Por GSee.
  • Vreau să spun că aici se apelează getSymobls de două ori , o dată pentru fiecare simbol. Aș adăuga câteva explicații, deoarece OP este începător. De exemplu, de ce este mai bine să folosiți lapply aici ( evitați efectul secundar al for) … fuziunea este doar un cbind,… –  > Por agstudy.
  • Mulțumesc Gsee și agstudy. Nu sunt legat de un anumit pachet și funcție, așa că voi citi despre Quantmod. Iată întrebările care îmi vin în minte: datele sunt de la yahoo? (nu precizează sursa în linia de cod pe care ai scris-o). Sugestia ta de a crea un mediu, cum funcționează asta? în special, cum accesezi datele după ce sunt salvate în interiorul unui mediu? Mulțumesc! –  > Por PatrickT.
  • Da, yahoo este implicit. Începeți la quantmod.com. De asemenea, citiți ?getSymbols. de ex. myenv <- new.env(); getSymbols("SPY", src="yahoo", env=myenv); get("SPY", pos=myenv) sau myenv$SPY. A se vedea, de asemenea, ?environment. S-ar putea să vă intereseze și lista r-sig-finance –  > Por GSee.

Tags:, ,