Как сохранить даты объекта зоопарка, если новый столбец вычисляется из функции?
Я получил дневную цену закрытия в виде объекта зоопарка из 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")
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")