我有一个名为EWMA_SD252
3561 obs的数据框。 102个变量(自2000年以来100股的每日波动率),这是一个样本:
Data IBOV ABEV3 AEDU3 ALLL3
3000 2012-02-09 16.88756 15.00696 33.46089 25.04788
3001 2012-02-10 18.72925 14.55346 32.72209 24.93913
3002 2012-02-13 20.87183 15.25370 31.91537 24.28962
3003 2012-02-14 20.60184 14.86653 31.04094 28.18687
3004 2012-02-15 20.07140 14.56653 37.45965 33.47379
3005 2012-02-16 19.99611 16.80995 37.36497 32.46208
3006 2012-02-17 19.39035 17.31730 38.85145 31.50452
我想要做的是使用单个命令,使用日期参考来分配特定股票的区间,并绘制相同区间的图表,到目前为止,我能够做到子集部分,但现在我是坚持绘制图表,这是我到目前为止的代码:
获取日期间隔和股票名称:
datas = function(x,y,z){
intervalo_datas(as.Date(x,"%d/%m/%Y"),as.Date(y,"%d/%m/%Y"),z)
}
子集数据:
intervalo_datas <- function(x,y,z){
cbind(as.data.frame(EWMA_SD252[,1]),as.data.frame(EWMA_SD252[,z]))[EWMA_SD252$Data >= x & EWMA_SD252$Data <= y,]
}
现在我被卡住了,是否可以使用函数来获取ABEV3 data.frame并使用日期在X中绘制图表并使用y中的波动率绘制图表,仅使用下面的命令?
ABEV3 =数据(&#34; 09/02 / 2012&#34;,&#34; 17/02 / 2012&#34;,&#34; ABEV3&#34;)
答案 0 :(得分:3)
我认为你应该使用xts
包。它很合适:
所以我会使用你的数据创建一个xts对象。然后我将子集/绘图包装在一个函数中,就像你试图做的那样。
library(xts)
dat_ts <- xts(dat[,-1],as.Date(dat$Data))
plot_data <-
function(start,end,stock)
plot(dat_ts[paste(start,end,sep='/'),stock])
您可以这样称呼它:
plot_data('2012-02-09','2012-02-14','IBOV')
答案 1 :(得分:1)
(我假设您的EWMA_SD252
data.frame&#39; Data
列已经Date
类。如果它尚未转换它。)
看起来您试图在给定的日期间隔内绘制data.frame的特定列。如果您使用比x
,y
和z
更具描述性的变量名称,那么其他人将更容易阅读您的代码(以及您在6个月内也是如此!) date0
,date1
,column
。
让我们改写你的功能。如果EWMA_SD252
已经是data.frame,那么您不需要将cbind
个列列入data.frame。提供数据参数也可以使事情更加灵活。您的所有datas
函数都会转换为Dates
并调用intervalo_datas
,因此我们也应将其包装起来。
intervalo_datas <- function(date0, date1, column_name, data = EWMA_SD252) {
if (!is.Date(date0)) date0 <- as.Date(date0, "%d/%m/%Y")
if (!is.Date(date1)) date1 <- as.Date(date1,"%d/%m/%Y")
cols <- c(1, which(names(data) == column_name))
return(EWMA_SD252[EWMA_SD252$Data >= x & EWMA_SD252$Data <= y, cols])
}
现在你应该能够以这种方式获得一个子集
ABEV3 = intervalo_datas("09/02/2012", "17/02/2012", "ABEV3")
并且这样的情节。
plot(ABEV3[, 1], ABEV3[, 2])
如果您还希望子集化功能也可以绘制,只需在返回行之前添加绘图命令(但首先定义子集!)。使用像xts
之类的东西作为agstudy推荐会简化事情并在轴标签上更好地处理日期。
答案 2 :(得分:1)
您可以使用ggplot2和reshape2来创建一个自动绘制任意数量的股票的函数:
plot_stocks <- function(data, date1, date2, stocks){
require(ggplot2)
require(reshape2)
date1 <- as.Date(date1, "%d/%m/%Y")
date2 <- as.Date(date2, "%d/%m/%Y")
data <- data[data$Data > date1 & data$Data < date2,c("Data", stocks)]
data <- melt(data, id="Data")
names(data) <- c("Data", "Stock", "Value")
ggplot(data, aes(Data, Value, color=Stock)) + geom_line()
}
绘制一只股票&#34; ABEV3&#34;:
plot_stocks(EWMA_SD252, "09/02/2012", "17/02/2012", "ABEV3")
绘制三只股票:
plot_stocks(EWMA_SD252, "09/02/2012", "17/02/2012", c("IBOV", "ABEV3", "AEDU3"))
您可以进一步个性化添加其他地理位置的功能,例如geom_smooth
等。