2012-06-21 15 views
6

Vorrei classificare SPX usando quantmod :: chart_Series() e qui sotto disegnare le variazioni nel PIL e nella SMA a 12 mesi delle variazioni del PIL. Non importa come provo a farlo (quali combinazioni uso) e gli errori si verificano o quantmod :: chart_Series() mostra solo una trama parziale.quantmod :: chart_Series() bug?

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: In realtà, mi sembra che questo sia un quantmod :: chart_series() problema quando si utilizza dati trimestrali:

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 

Ciò produce trama SPX sul pannello principale, ma lascia vuota secondo e terzo pannello. poi ho cercato di giocare con avere lo stesso indice su dati, stesse lunghezze ecc

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

e il risultato è errori in tutto:

> 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 

Utilizzando

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

tutto sembra buona per me.

mio 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 

Tutte le idee che potrebbero essere la soluzione per questi problemi?

EDIT: Questo sembra essere un bug quantmod :: chart_Series(). Se faccio questo:

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

Qualche idea su come ottenere questo riparato?

risposta

3

Ho appena scritto una lunga "risposta" che conferma i vostri problemi, anche dopo alcuni dati massaggianti, e anche utilizzando la precedente funzione chartSeries. Poi ho capito che add_TA() è forse la funzione sbagliata. Questo approccio funziona:

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

(Cfr R/quantmod: multiple charts all using the same y-axis per un approccio alternativo utilizzando il comando layout.)

O con il sottoinsieme:.

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

(NB i due insiemi di dati finiscono in luogo diverso , quindi non allineare.)

Per inciso, c'è un errore definito in chart_Series con dati trimestrali: le etichette dell'asse x lo ok come "% n% b% n2010".

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

Bel lavoro.Ri: il bug di formattazione dell'etichetta dell'asse, il problema è che 'zoo ::: format.yearqtr' non supporta'% n' _conversion specification_. 'chart_Series' usa' xts ::: axTicksByTime' che usa il 'formato' generico. Poiché 'to.quarterly' ha dato all'indice una classe di' yearqtr', 'format' invia' format.yearqtr' con una stringa che include '% n' (ma è diverso a seconda del sistema operativo). Uno, certamente non eccezionale, è un modo per ovviare a questo a livello di utente è quello di cambiare la classe di indice: 'indexClass (q.SPX) <-" Date "; chart_Series (q.SPX) ' – GSee

5

Ho avuto un errore simile diversi giorni fa. Ho scoperto che il problema era in add_TA con la linea:

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

na.approx utilizza circa con la regola = 1 per impostazione predefinita, che lascia AN finali nella lista se l'ultimo timestamp nei dati originale è prima che l'ultimo timestamp nei dati TA. La modifica di questa riga per impostare rule = 2 ha risolto il problema.

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

Applicato a SVN in [r581] (https://r-forge.r-project.org/scm/viewvc.php/pkg/R/chart_Series.R?view=markup&revision=581&root= quantmod). Grazie @ Michael741. –

+0

Benvenuti in SO, Maddogg! :) – GSee

+0

+1, Sfortunatamente, non funziona ancora con il primo esempio di @ Samo dove SPX è più frequente di GDPC96. Tuttavia, la conversione di entrambi in "approssimativamente" è una soluzione abbastanza semplice. Inoltre, il codice patchato genera ancora molti avvisi da 'as_numeric (H)' che proviene da una funzione 'parse.side' locale a' .parseISO8601'. (sì, sì, lo so, sono solo avvertimenti) – GSee