Как построить временные ряды S&P 500 и Sotheby's на одном графике?

Я загружаю с пакетом Quantmod временные ряды S&P 500 и акции Sotheby's:

library(zoo)
library(tseries)
library(quantmod)
library(ggplot2)

env1 = new.env()
getSymbols("^GSPC", env = env1, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-05-29"))
GSPC = env1$GSPC
gspc.df = data.frame(date=time(GSPC), coredata(GSPC))

env2 = new.env()
getSymbols("BID", env = env2, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-05-29"))
BID = env2$BID
sothebys.df = data.frame(date=time(BID), coredata(BID))

Моя цель - объединить или объединить скорректированные цены вместе и построить их с помощью ggplot. Однако у меня проблемы с фреймом df:

t = as.Date(0:9128, origin="1988-06-01")  
y1 = gspc.df$GSPC.Adjusted
y2 = sothebys.df$BID.Adjusted
df = data.frame(t=t, values=c(y2,y1), type=rep(c("Bytes", "Changes"), each=9129))

g = ggplot(data=df, aes(x=t, y=values)) +
  geom_line() +
  facet_grid(type ~ ., scales="free") +
  scale_y_continuous(trans="log10") +
  ylab("Log values")
g

Когда я пытаюсь выполнить строку df = data ..., я получаю сообщение об ошибке, касающееся количества строк. Как я могу объединить или объединить данные, чтобы использовать их для объединенного ggplot?

РЕДАКТИРОВАТЬ

График работает нормально. На последнем этапе я включил в график полосы спада. Следующий код создает столбцы рецессии, включая нормализованное время:

recessions.df = read.table(textConnection(
  "Peak, Trough
  1857-06-01, 1858-12-01
  1860-10-01, 1861-06-01
  1865-04-01, 1867-12-01
  1869-06-01, 1870-12-01
  1873-10-01, 1879-03-01
  1882-03-01, 1885-05-01
  1887-03-01, 1888-04-01
  1890-07-01, 1891-05-01
  1893-01-01, 1894-06-01
  1895-12-01, 1897-06-01
  1899-06-01, 1900-12-01
  1902-09-01, 1904-08-01
  1907-05-01, 1908-06-01
  1910-01-01, 1912-01-01
  1913-01-01, 1914-12-01
  1918-08-01, 1919-03-01
  1920-01-01, 1921-07-01
  1923-05-01, 1924-07-01
  1926-10-01, 1927-11-01
  1929-08-01, 1933-03-01
  1937-05-01, 1938-06-01
  1945-02-01, 1945-10-01
  1948-11-01, 1949-10-01
  1953-07-01, 1954-05-01
  1957-08-01, 1958-04-01
  1960-04-01, 1961-02-01
  1969-12-01, 1970-11-01
  1973-11-01, 1975-03-01
  1980-01-01, 1980-07-01
  1981-07-01, 1982-11-01
  1990-07-01, 1991-03-01
  2001-03-01, 2001-11-01
  2007-12-01, 2009-06-01"), sep=',',
colClasses=c('Date', 'Date'), header=TRUE)

recessions.trim = subset(recessions.df, Peak >= min(gspc.df$date))
g.gspc = ggplot(data = df2) + geom_line(aes(x = Date, y = GSPC, colour = "blue")) + geom_line(aes(x = Date, y = Sothebys, colour = "red")) + theme_bw()
g.gspc = g.gspc + geom_rect(data=recessions.trim, aes(xmin=Peak, xmax=Trough, ymin=-Inf, ymax=+Inf), fill='pink', alpha=0.4)
plot(g.gspc)

Нормализованная акция SP500 и Sothebys, включая бары рецессии

Большое спасибо за вашу помощь / обучение. Я новичок в программировании и R, спасибо за помощь в улучшении :)

Кстати, если у кого-то есть идея по дальнейшему улучшению этого решения, прокомментируйте! Спасибо


person Chris    schedule 30.05.2013    source источник
comment
Добро пожаловать в stackoverflow. Точная ошибка может указывать на проблему напрямую, без необходимости воспроизводить ваш пример. Не могли бы вы отредактировать свой пост, чтобы включить точное сообщение об ошибке?   -  person dlaehnemann    schedule 30.05.2013
comment
Кроме того, этот недавний пост может помочь вам в том, что вы пытаетесь сделать. Если я не ошибаюсь, он даже использует те же наборы данных: stackoverflow.com/questions/16703204/   -  person dlaehnemann    schedule 30.05.2013
comment
Уважаемый Thunk, точное сообщение об ошибке на немецком языке. Моя проблема именно в этой строке: df = data.frame (t = t, values ​​= c (y2, y1), type = rep (c (Bytes, Changes), each = 9129))   -  person Chris    schedule 30.05.2013
comment
Fehler в data.frame (t = t, values ​​= c (y2, y1), type = rep (c (Bytes, Changes),: Argumente implizieren unterschiedliche Anzahl Zeilen: 9129, 12594, 18258) В основном это говорит о разном количестве строк : 9129 ...   -  person Chris    schedule 30.05.2013


Ответы (1)


Данные Sotheby's имеют немного меньше наблюдений, чем данные S&P. Если вы удалите из S&P даты, которых нет на Sotheby's, то все заработает нормально. Вы также делали некоторые странные вещи при определении своего фрейма данных, поэтому я исправил это.

library(zoo)
library(tseries)
library(quantmod)
library(ggplot2)

# import 
env1 = new.env()
getSymbols("^GSPC", env = env1, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-05-29"))
GSPC = env1$GSPC
gspc.df = data.frame(date=time(GSPC), coredata(GSPC))

env2 = new.env()
getSymbols("BID", env = env2, src ="yahoo", from = as.Date("1988-06-01"),to = as.Date("2013-05-29"))
BID = env2$BID
sothebys.df = data.frame(date=time(BID), coredata(BID))

# find which dates are in GSPC but not in Sotheby's
bad.dates <- sothebys.df$date[-which(gspc.df$date %in% sothebys.df$date)]

# remove the 'bad dates' from the dataframe so that both stocks have representative observations
# from each date
gspc.df <- gspc.df[-which(gspc.df$date %in% bad.dates),]

# verify the lengths
length(gspc.df) == length(sothebys.df)

# build the dataframe with dates and stock prices to be used in graphing
df = data.frame(Date = gspc.df$date,
                GSPC = gspc.df$GSPC.Adjusted,
                Sothebys = sothebys.df$BID.Adjusted)

# plot prices over time
ggplot(data = df, aes(x = Date)) + geom_line(aes(y = GSPC), colour = "blue") +
                                   geom_line(aes(y = Sothebys), colour = "red")

Вам определенно следует подумать о том, чтобы смотреть только на ежедневные изменения цен, что является обычной практикой при сравнении акций. Разница в объеме торгов между индексом и конкретным ценным бумагом настолько велика, что вы не сможете многому научиться, глядя на запрошенный вами график. Иногда я использую приведенную ниже функцию нормализации. Он не идеален для этой ситуации (он масштабирует все в диапазоне от 0 до 1), но я оставлю вам возможность должным образом стандартизировать ваши данные. А пока следующий код даст вам хорошее представление о том, как они сравниваются:

NormalizeVector <- function(x) {
  NormCalc <- function(x) {
    (x - min(x, na.rm=TRUE))/(max(x,na.rm=TRUE) - min(x, na.rm=TRUE))
  }
  if (class(x) %in% c("integer", "numeric")) {
    norm.val <- NormCalc(x)
  }
  else norm.val <- x
  return(norm.val)
}

df2 = as.data.frame(lapply(df, NormalizeVector))

# plot normalized prices over time
ggplot(data = df2, aes(x = Date)) + geom_line(aes(y = GSPC), colour = "blue") +
                                   geom_line(aes(y = Sothebys), colour = "red")

stockplots

person zap2008    schedule 31.05.2013
comment
Большое спасибо за развернутый ответ, zap2008! У меня было время быстро прочитать его, но оно идеально соответствует тому, что я пытаюсь сделать! Я вернусь к вам, когда у меня будет время проверить внесенные вами изменения. - person Chris; 31.05.2013
comment
Уважаемый zap2008, отличия в кодировке проверил. Строка bad.dates великолепна. Я просто понятия не имел, как это кодировать. Кроме того, большое спасибо за то, что поделились со мной кодом вектора нормализации. - person Chris; 31.05.2013
comment
Уважаемый zap, наконец, я пытаюсь добавить полосы спада к вашему нормализованному графику. Я был бы очень рад, если вы еще посмотрите. Удачной пятницы / выходных, Крис - person Chris; 31.05.2013
comment
похоже, вы догадались об этом самостоятельно. - person zap2008; 31.05.2013