首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中几只股票的多个时间序列图返回一个错误

R中几只股票的多个时间序列图返回一个错误
EN

Stack Overflow用户
提问于 2020-08-24 09:22:55
回答 2查看 693关注 0票数 1

我有多只股票的时间序列数据。我想在R.

我尝试了一个现有的答案在这个网站,但我得到了一个错误。这是我的代码:

代码语言:javascript
复制
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)中尝试了下面的内容

代码语言:javascript
复制
qplot(symbols, value, data = as.data.frame(stocks), geom = "line", group = variable) +
  facet_grid(variable ~ ., scale = "free_y")

我得到了以下错误:

错误:至少一个层必须包含所有的面元变量:variable

variable

  • Layer 1缺少
  • 绘图缺少variable

我希望有以下类似的情节:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-24 11:02:42

原始代码中的错误消息是由于在传递给variable的数据中没有名为qplot()的列造成的。此外,为了生成所需的图表,我们需要从由xts生成的quantmod对象中提取数据,以便将它们用作图表中的x轴变量。

通过一些调整将股票数据中的适当变量放入qplot()规范中,我们可以生成所需的图表。

我们将代码修改为如下所示的股票列表:

data.frame

  • Rename

  • xts对象转换为类型为xts列的对象,以消除代码符号,这样我们就可以在随后的步骤中将rbind()转换为单个数据帧,将rownames()提取到数据帧列

中。

在进行了这些更改之后,stocks对象包含一个数据帧列表,每个股票代码为一个。

代码语言:javascript
复制
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()`结合使用。

代码语言:javascript
复制
stocksDf <- do.call(rbind,stocks)

最后,我们使用qplot()DateClose作为x和y变量,使用facet_grid()Symbol生成方面。

代码语言:javascript
复制
qplot(Date, Close, data = stocksDf, geom = "line", group = Symbol) +
     facet_grid(Symbol ~ ., scale = "free_y")

...and初始输出:

生成图表后,我们将进行一些调整,以清理x轴标签。在默认的图表中,由于有251个不同的字符值,所以它们是不可理解的,我们需要重新调整轴来打印更少的标签。

首先,我们使用as.Date()转换基于字符的日期.其次,我们使用ggeasy包来调整x轴上的内容。

代码语言:javascript
复制
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即可。

票数 1
EN

Stack Overflow用户

发布于 2020-08-25 15:18:28

虽然Len Greski's answer有一个很好的解释和解决方案,但我认为我应该提供一个更“标准”的方法。也许有些用户会发现它更简单。

代码语言:javascript
复制
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")

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63558161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档