Più grafici di serie temporali per diversi titoli in R restituiscono un errore
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
I messaggi di errore nel codice originale sono causati dal fatto che non è presente alcuna colonna chiamata variable
nei dati a cui viene passato qplot()
. Inoltre, per produrre il grafico desiderato, dobbiamo estrarre le date dagli xts
oggetti generati da in quantmod
modo 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
xts
oggetti 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' stocks
oggetto 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 Date
e Close
come variabili xey e facet_grid()
con Symbol
per 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 ggeasy
pacchetto 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
.
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")
