Più grafici di serie temporali per diversi titoli in R restituiscono un errore

Aug 24 2020

Ho una serie temporale di dati con più azioni. Vorrei tracciarli in una trama in R.

Ho provato una risposta esistente in questo sito ma ho ricevuto un errore. Ecco il mio codice:

library(quantmod)
library(TSclust)
library(ggplot2)
# download financial data

symbols = c('ASX', 'AZN', 'BP', 'AAPL')
start = as.Date("2014-01-01")
until = as.Date("2014-12-31")

stocks = lapply(symbols, function(symbol) {
    Close = getSymbols(symbol,src='yahoo', from = start, to = until, auto.assign = FALSE)[, 6]
   names(adjust) = symbol
    adjust
  })

Ho provato quanto segue da una risposta in uscita (da qui )

qplot(symbols, value, data = as.data.frame(stocks), geom = "line", group = variable) +
  facet_grid(variable ~ ., scale = "free_y")

Ho ricevuto il seguente errore:

Errore: almeno uno strato deve contenere tutte le variabili sfaccettature: variable.

  • La trama è mancante variable
  • Manca lo strato 1 variable

Vorrei avere una trama simile alla seguente:

Risposte

3 LenGreski Aug 24 2020 at 11:02

I messaggi di errore nel codice originale sono causati dal fatto che non è presente alcuna colonna chiamata variablenei dati a cui viene passato qplot(). Inoltre, per produrre il grafico desiderato, dobbiamo estrarre le date dagli xtsoggetti generati da in quantmodmodo da poterle utilizzare come variabile dell'asse x nel grafico.

Con alcuni aggiustamenti per inserire le variabili appropriate dai dati di borsa nelle qplot()specifiche, possiamo produrre il grafico richiesto.

Modifichiamo il codice per leggere l'elenco delle azioni come segue:

  • Converti gli xtsoggetti in oggetti di tipodata.frame
  • Rinomina le colonne per eliminare i simboli ticker in modo da poterlo inserire rbind()in un unico frame di dati in un passaggio successivo
  • Estrai il rownames()in una colonna di frame di dati

Dopo aver apportato queste modifiche, l' stocksoggetto contiene un elenco di frame di dati, uno per ticker di borsa.

symbols = c('ASX', 'AZN', 'BP', 'AAPL')
start = as.Date("2014-01-01")
until = as.Date("2014-12-31")

stocks = lapply(symbols, function(symbol) {
     aStock = as.data.frame(getSymbols(symbol,src='yahoo', from = start, to = until, 
                         auto.assign = FALSE))
     colnames(aStock) <- c("Open","High","Low","Close","Volume","Adjusted")
     aStock$Symbol <- symbol aStock$Date <- rownames(aStock)
     aStock
})

Successivamente, usiamo do.call()con rbind() to combine the data into a single data frame that we'll use with qplot () `.

stocksDf <- do.call(rbind,stocks)

Infine, usiamo qplot()con Datee Closecome variabili xey e facet_grid()con Symbolper generare le sfaccettature.

qplot(Date, Close, data = stocksDf, geom = "line", group = Symbol) +
     facet_grid(Symbol ~ ., scale = "free_y")

... e l'uscita iniziale:

Dopo aver generato il grafico, apporteremo alcune modifiche per pulire le etichette dell'asse x. Sul grafico predefinito sono incomprensibili perché ci sono 251 valori di caratteri diversi e dobbiamo ridimensionare l'asse per stampare meno etichette.

Innanzitutto, convertiamo le date basate sui caratteri con as.Date(). In secondo luogo, utilizziamo il ggeasypacchetto per regolare il contenuto sull'asse x.

stocks = lapply(symbols, function(symbol) {
     aStock = as.data.frame(getSymbols(symbol,src='yahoo', from = start, to = until, 
                         auto.assign = FALSE))
     colnames(aStock) <- c("Open","High","Low","Close","Volume","Adjusted")
     aStock$Symbol <- symbol aStock$Date <- as.Date(rownames(aStock),"%Y-%m-%d")
     aStock
})
stocksDf <- do.call(rbind,stocks)
library(ggeasy)
qplot(Date, Close, data = stocksDf, geom = "line", group = Symbol) +
     facet_grid(Symbol ~ ., scale = "free_y") +
     scale_x_date(date_breaks = "14 days") +
     easy_rotate_x_labels(angle = 45, side = "right")

... e l'output rivisto:

NOTA: per rappresentare graficamente il prezzo di chiusura rettificato, è sufficiente modificare la variabile y nella qplot()funzione in Adjusted.

4 JoshuaUlrich Aug 25 2020 at 15:18

Sebbene la risposta di Len Greski abbia un'ottima spiegazione e soluzione, ho pensato di fornire una risposta con un approccio più "standard". Forse alcuni utenti lo troveranno più semplice.

library(quantmod)
library(ggplot2)

symbols <- c("ASX", "AZN", "BP", "AAPL")
start <- as.Date("2014-01-01")
until <- as.Date("2014-12-31")

# import data into an environment
e <- new.env()
getSymbols(symbols, src = "yahoo", from = start, to = until, env = e)

# extract the adjusted close and merge into one xts object
stocks <- do.call(merge, lapply(e, Ad))

# Remove the ".Adjusted" suffix from each symbol column name
colnames(stocks) <- gsub(".Adjusted", "", colnames(stocks), fixed = TRUE)

# convert the xts object to a long data frame
stocks_df <- fortify(stocks, melt = TRUE)

# plot the data
qplot(Index, Value, data = stocks_df, geom = "line", group = Series) +
     facet_grid(Series ~ ., scale = "free_y")