2012-06-21 13 views
6

Chciałbym wykres SPX za pomocą quantmod :: chart_Series() i poniżej narysuj zmiany PKB i 12 miesięcy SMA zmian PKB. Bez względu na to, jak próbuję to zrobić (jakie kombinacje używam) pojawiają się błędy lub quantmod :: chart_Series() wyświetla tylko częściowy wykres.bug quantmod :: chart_Series()?

require(quantmod) 

FRED.symbols <- c("GDPC96") 

getSymbols(FRED.symbols, src="FRED") 
SPX <- getSymbols("^GSPC", auto.assign=FALSE, from="1900-01-01") 

subset="2000/" 

chart_Series(SPX, subset=subset) 
add_TA(GDPC96) 
add_TA(ROC(GDPC96, type="discrete")) 
add_TA(SMA(ROC(GDPC96, type="discrete"), n=4), on=3, col="blue") 

EDIT: Faktycznie, wydaje mi się, że jest to quantmod :: chart_series() problem przy użyciu danych kwartalnych:

subset <- "2000/" 
chart_Series(to.quarterly(SPX, drop.time=TRUE), subset=subset) 
add_TA(SMA(Cl(to.quarterly(SPX, drop.time=TRUE)))) 

> subset <- "2000/" 
> chart_Series(to.quarterly(SPX, drop.time=TRUE), subset=subset) 
> add_TA(SMA(Cl(to.quarterly(SPX, drop.time=TRUE)))) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 

To przynosi SPX działka na panelu głównym, ale pozostawia pusty drugi i trzeci panel. Potem próbowałem się bawić z konieczności sam indeks danych, same długości itd

chart_Series(head(to.quarterly(SPX, drop.time="TRUE"), -1), subset=subset) 
add_TA(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)) 
add_TA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete")) 
add_TA(SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4), on=3, col="blue") 

i rezultat błędów całego:

> chart_Series(head(to.quarterly(SPX, drop.time="TRUE"), -1), subset=subset) 
> add_TA(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 
> add_TA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete")) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 
> add_TA(SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4), on=3, col="blue") 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 

Korzystanie

tail(to.quarterly(SPX, drop.time="TRUE")) 
tail(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)) 
tail(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete")) 
tail(SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4)) 

dput(to.quarterly(SPX, drop.time="TRUE")) 
dput(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)) 
dput(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete")) 
dput(SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4)) 

wszystko wygląda dobrze Dla mnie.

My sessionInfo():

> sessionInfo() 
R version 2.15.0 (2012-03-30) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8   LC_NUMERIC=C     
[3] LC_TIME=en_US.UTF-8   LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8  LC_MESSAGES=en_US.UTF-8  
[7] LC_PAPER=en_US.UTF-8   LC_NAME=en_US.UTF-8   
[9] LC_ADDRESS=en_US.UTF-8  LC_TELEPHONE=en_US.UTF-8  
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] quantmod_0.3-18 TTR_0.21-0  xts_0.8-7  zoo_1.7-7  
[5] Defaults_1.1-1 rj_1.1.0-4  

loaded via a namespace (and not attached): 
[1] grid_2.15.0 lattice_0.20-0 tools_2.15.0 

jakieś pomysły co może być rozwiązaniem dla tych problemów?

EDYCJA: Wydaje się, że jest to błąd quantmod :: chart_Series(). Jeśli to zrobię:

subset <- "1990/" 
test <- cbind(head(to.quarterly(SPX, drop.time="TRUE"), -1)[subset], 
      to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE)[subset], 
      ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE),  type="discrete")[subset], 
      SMA(ROC(to.quarterly(GDPC96, drop.time="TRUE", OHLC=FALSE), type="discrete"), n=4)[subset]) 

test$test <- 1 

subset <- "2000/" 
chart_Series(OHLC(test), subset=subset) 
add_TA(test$test) 
add_TA(test$GDPC96) 

> test$test <- 1 
> subset <- "2000/" 
> chart_Series(OHLC(test), subset=subset) 
> add_TA(test$test) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 
> add_TA(test$GDPC96) 
Error in xy.coords(x, y) : 'x' and 'y' lengths differ 
In addition: Warning messages: 
1: In as_numeric(H) : NAs introduced by coercion 
2: In as_numeric(H) : NAs introduced by coercion 
3: In as_numeric(H) : NAs introduced by coercion 
> traceback() 
14: stop("'x' and 'y' lengths differ") at chart_Series.R#510 
13: xy.coords(x, y) at chart_Series.R#510 
12: plot.xy(xy.coords(x, y), type = type, ...) at chart_Series.R#510 
11: lines.default(ta.x, as.numeric(ta.y[, i]), col = col, ...) at chart_Series.R#510 
10: lines(ta.x, as.numeric(ta.y[, i]), col = col, ...) at chart_Series.R#510 
9: plot_ta(x = current.chob(), ta = get("x"), on = NA, taType = NULL, 
     col = 1) at replot.R#238 
8: eval(expr, envir, enclos) at replot.R#238 
7: eval(aob, env) at replot.R#238 
6: FUN(X[[12L]], ...) at replot.R#230 
5: lapply(x$Env$actions, function(aob) { 
     if (attr(aob, "frame") > 0) { 
      x$set_frame(attr(aob, "frame"), attr(aob, "clip")) 
      env <- attr(aob, "env") 
      if (is.list(env)) { 
       env <- unlist(lapply(env, function(x) eapply(x, eval)), 
        recursive = FALSE) 
      } 
      eval(aob, env) 
     } 
    }) at replot.R#230 
4: plot.replot(x, ...) 
3: plot(x, ...) 
2: print.replot(<environment>) 
1: print(<environment>) 

Jakieś pomysły, jak to naprawić?

Odpowiedz

3

Właśnie napisałem długą "odpowiedź" potwierdzającą twoje problemy, nawet po masowym przesyłaniu danych, a nawet przy użyciu starszej funkcji chartSeries. Wtedy zdałem sobie sprawę, że add_TA() jest prawdopodobnie niewłaściwą funkcją. Podejście to działa:

par(mfrow=c(2,1)) 
chart_Series(SPX) 
chart_Series(GDPC96) 

(Zobacz R/quantmod: multiple charts all using the same y-axis alternatywnego podejścia używając komendy layout.)

Albo z podzbioru.

par(mfrow=c(2,1)) 
chart_Series(SPX,subset="2000/") 
chart_Series(GDPC96,subset="2000/") 

(NB dwa zestawy danych kończy się w innym miejscu , więc nie całkiem wyrównujemy.)

Nawiasem mówiąc, jest jeden określony błąd w chart_Series z danymi kwartalnymi: etykiety osi X lo OK jak "% n% b% n2010".

q.SPX=to.quarterly(SPX) 
chart_Series(q.SPX) 
+2

Przyjemna praca.Odp: błąd formatowania etykiety osi, problem polega na tym, że 'zoo ::: format.yearqtr' nie obsługuje'% n' _conversion specification_. 'chart_Series' używa' xts ::: axTicksByTime', który używa ogólnego 'formatu'. Ponieważ 'to.quarterly' nadał indeksowi klasę' yearqtr', 'format' wywołuje' format.yearqtr' z łańcuchem zawierającym '% n' (ale różni się w zależności od twojego systemu operacyjnego). Jedną, co prawda nie wspaniale, sposobem obejścia tego na poziomie użytkownika jest zmiana klasy indeksu: 'indexClass (q.SPX) <-" Date "; chart_Series (q.SPX) ' – GSee

5

Miałem podobny błąd kilka dni temu. Okazało się, że problem był w add_TA z linii:

ta.x <- as.numeric(na.approx(ta.adj[, 1])) 

na.approx korzysta ok z reguły domyślnie = 1, co pozostawia końcowe NAS na liście jeśli ostatni znacznik czasu w oryginalnych danych jest przed ostatnią znacznik czasu w danych TA. Zmiana tej linii, aby ustawić regułę = 2, naprawiła problem.

ta.x <- as.numeric(na.approx(ta.adj[, 1], rule=2)) 
+0

Zastosowany do SVN w [r581] (https://r-forge.r-project.org/scm/viewvc.php/pkg/R/chart_Series.R?view=markup&revision=581&root= quantmod). Dzięki @ Michael741. –

+0

Witaj w SO, Maddogg! :) – GSee

+0

+1, Niestety, nadal nie działa z pierwszym przykładem Samo, gdzie SPX jest wyższa częstotliwość niż GDPC96. Jednak konwersja "do" na kwartał "jest dość prosta. Ponadto, poprawiony kod nadal generuje wiele ostrzeżeń z "as_numeric (H)", który pochodzi z funkcji 'pars.side', która jest lokalna dla' .parseISO8601'. (Tak, tak, wiem, to tylko ostrzeżenia) – GSee