0

我从保留日期的 get.hist.quote 以动物园对象的形式获得了每日收盘价。计算和修剪日志返回以删除 NA 值。

stockEBAY$Data 将日期重新训练为 x 值,以便以后使用 autoplot.zoo 进行绘图 stockEBAY$LogReturns 将日期重新训练为 x 值,以便以后使用 autoplot.zoo 进行绘图

library("tseries")
library("zoo")
library("ggplot2")
AnalyzeStock <- function(ticker){
  DailyClosingPrice <- get.hist.quote(ticker,quote="Close",quiet=TRUE)  
  logreturns <- log(lag(DailyClosingPrice))-log(DailyClosingPrice)
  logreturns <- na.trim(logreturns, sides = "both")
  list(Data=DailyClosingPrice, LogReturns=logreturns)
}
stockEBAY <- AnalyzeStock("EBAY")
autoplot.zoo(stockEBAY$Data) + 
  xlab("Year") + ylab("Closing Price (U.S. Dollars)")

保留年份作为 x 轴的 EBAY 股票图

但是要创建波动性,我必须基于该函数创建一个新的数据框,但我不知道如何编写它,以便将来自 stockEBAY$LogReturns 的原始日期保留在新数据框中。

Vol <- function(d, logreturns)
{
  var = 0
  lam = 0
  varlist <- c()
  for (r in logreturns) {
    lam = lam*(1 - 1/d) + 1
    var = (1 - 1/lam)*var + (1/lam)*r^2
    varlist <- c(varlist, var)
  }
  sqrt(varlist)
}
#retrieve volatility for decays 10, 30, and 100
vol10 <- Vol(10,stockEBAY$LogReturns)
vol30 <- Vol(30,stockEBAY$LogReturns)
vol100 <- Vol(100,stockEBAY$LogReturns)
plot(vol10,type="l",xlab="Year",ylab="Volatility")
lines(vol30,type="l", col="red")
lines(vol100,type="l",col="blue")

覆盖波动率图,但日期没有保留为 x 轴,而是现在是索引,这弄乱了图表

vol10、vol30、vol100 都以 x 轴为索引,但缺少原始日期。

我希望 vol10、vol30 和 vol100 的新数据帧都保留来自 stockEBAY$LogReturns 的原始日期。

或者,是否有可能将新的波动率列附加到原始 stockEBAY$LogReturns 数据框?

我需要一种方法来更简洁地从函数中求解波动率列,并将原始动物园对象的日期保留到新的数据框中,以便以后进行绘图叠加。

只要我可以绘制并叠加 3 个波动率列,以便将 x 轴保留为日期,而不是索引,这就是目标。

谢谢

编辑:动物园对象令人沮丧,....这不好用

> stockEBAY$LogReturns$vol10 <- Vol(10,stockEBAY$LogReturns)
Error in NextMethod("[<-") : 
  number of items to replace is not a multiple of replacement length
In addition: Warning messages:
1: In doTryCatch(return(expr), name, parentenv, handler) :
  invalid graphics state
2: In doTryCatch(return(expr), name, parentenv, handler) :
  invalid graphics state
> stockEBAY$LogReturns$vol30 <- Vol(30,stockEBAY$LogReturns)
Error: all(sapply(args, function(x) is.zoo(x) || !is.plain(x) || (is.plain(x) &&  .... is not TRUE
> stockEBAY$LogReturns$vol100 <- Vol(100,stockEBAY$LogReturns)
Error: all(sapply(args, function(x) is.zoo(x) || !is.plain(x) || (is.plain(x) &&  .... is not TRUE
> autoplot.zoo(stockEBAY$LogReturns$vol10)
4

2 回答 2

1

谢谢 Andrew Gustar 的入门代码,我得到了这个来输出我想要的图形,但是如果其他人有更好的编码方法,我会全力以赴

stockEBAY$LogReturns$vol10 <- Vol(10,stockEBAY$LogReturns$Close)
stockEBAY$LogReturns$vol30 <- Vol(30,stockEBAY$LogReturns$Close)
stockEBAY$LogReturns$vol100 <- Vol(100,stockEBAY$LogReturns$Close)
plot(stockEBAY$LogReturns$vol10,type="l",xlab="Year",ylab="Volatility", ylim = c(0,0.35))
par(new=TRUE)
plot(stockEBAY$LogReturns$vol30,type="l",xlab="Year",ylab="Volatility", ylim = c(0,0.35),  col="red")
par(new=TRUE)
plot(stockEBAY$LogReturns$vol100,type="l",xlab="Year",ylab="Volatility", ylim = c(0,0.35),  col="blue")

图表

于 2017-04-19T17:18:44.420 回答
0

日期保存在zoo对象的属性中。您可以使用 attr(stockEBAY$LogReturns,"index"). 因此,您可以设置一个新的 df 用于绘图,如下所示...

df <- data.frame(Date=as.Date(attr(stockEBAY$LogReturns,"index")),
                 vol10=vol10,
                 vol30=vol30,
                 vol100=vol100)

然后使用df$Date作为 x 轴进行绘图。

plot(x=df$Date,y=df$vol10,type="l",xlab="Year",ylab="Volatility")
lines(df$Date,df$vol30,type="l", col="red")
lines(df$Date,df$vol100,type="l", col="blue")
于 2017-04-19T17:09:21.297 回答