Как сохранить даты объекта зоопарка, если новый столбец вычисляется из функции?

Я получил дневную цену закрытия в виде объекта зоопарка из get.hist.quote, где сохраняются даты. Возвращает журнал рассчитывается и обрезается для удаления значений NA.

stockEBAY $ Данные переобучают даты как значение 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)")

График акций EBAY с указанием года в качестве оси x

Однако, чтобы создать изменчивость, мне пришлось создать новый фрейм данных на основе этой функции, но я не знаю, как его записать, чтобы в новом фрейме данных сохранялись исходные даты из 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)

2 ответа

Решение

Спасибо, Эндрю Густар (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")

График

Даты содержатся в атрибуте zoo объект. Вы можете добраться до них с attr(stockEBAY$LogReturns,"index"), Таким образом, вы можете настроить новый df для печати следующим образом:

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

а затем построить с помощью df$Date как ось х.

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")
Другие вопросы по тегам