我有多只股票的时间序列数据。我想在R.
我尝试了一个现有的答案在这个网站,但我得到了一个错误。这是我的代码:
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
})我从一个退出的答案(来自here)中尝试了下面的内容
qplot(symbols, value, data = as.data.frame(stocks), geom = "line", group = variable) +
facet_grid(variable ~ ., scale = "free_y")我得到了以下错误:
错误:至少一个层必须包含所有的面元变量:variable。
variable
variable我希望有以下类似的情节:

发布于 2020-08-24 11:02:42
原始代码中的错误消息是由于在传递给variable的数据中没有名为qplot()的列造成的。此外,为了生成所需的图表,我们需要从由xts生成的quantmod对象中提取数据,以便将它们用作图表中的x轴变量。
通过一些调整将股票数据中的适当变量放入qplot()规范中,我们可以生成所需的图表。
我们将代码修改为如下所示的股票列表:
data.frame
xts对象转换为类型为xts列的对象,以消除代码符号,这样我们就可以在随后的步骤中将rbind()转换为单个数据帧,将rownames()提取到数据帧列中。
在进行了这些更改之后,stocks对象包含一个数据帧列表,每个股票代码为一个。
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
})接下来,我们将do.call()与rbind() to combine the data into a single data frame that we'll use with qplot()`结合使用。
stocksDf <- do.call(rbind,stocks)最后,我们使用qplot()和Date和Close作为x和y变量,使用facet_grid()和Symbol生成方面。
qplot(Date, Close, data = stocksDf, geom = "line", group = Symbol) +
facet_grid(Symbol ~ ., scale = "free_y")...and初始输出:

生成图表后,我们将进行一些调整,以清理x轴标签。在默认的图表中,由于有251个不同的字符值,所以它们是不可理解的,我们需要重新调整轴来打印更少的标签。
首先,我们使用as.Date()转换基于字符的日期.其次,我们使用ggeasy包来调整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")...and修订后的产出:

注意:表示调整后的收盘价,只需将qplot()函数中的y变量更改为Adjusted即可。
发布于 2020-08-25 15:18:28
虽然Len Greski's answer有一个很好的解释和解决方案,但我认为我应该提供一个更“标准”的方法。也许有些用户会发现它更简单。
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")

https://stackoverflow.com/questions/63558161
复制相似问题