2014-05-21 31 views
1

我有一个数据帧,名为EWMA_SD252 3561 obs。 102个变量(自2000年以来的100只股票的每日波动率),这里是一个示例:使用函数绘制在R

 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 = DATAS( “09/02/2012”, “17/02/2012”, “ABEV3”)

回答

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() 
} 

绘制一只股票“ABEV3”:

plot_stocks(EWMA_SD252, "09/02/2012", "17/02/2012", "ABEV3") 

enter image description here

绘制三只股票:

plot_stocks(EWMA_SD252, "09/02/2012", "17/02/2012", c("IBOV", "ABEV3", "AEDU3")) 

enter image description here

您可以进一步个性化功能加入其他geoms,像geom_smooth

1

(我假设你EWMA_SD252 data.frame的Data列已经是Date class。如果它尚未转换它。)

它看起来像你试图绘制一个给定的日期间隔data.frame的特定列。如果您使用的变量名称比xyz(例如,)更具描述性,那么其他人就会更容易阅读您的代码(并且您也在6个月内!)。 date0date1column

让我们重写你的函数。如果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]) 

如果你想在子集功能也情节,只是返回行之前添加绘图命令(但首先定义子!)。按照agstudy的建议,使用xts之类的东西可以简化事情并更好地处理轴标签上的日期。

3

我认为你应该使用xts包。它适用于:

  • manipluating时间序列专门金融时间序列
  • 子集的时间序列
  • 绘制时间序列

所以我想创建一个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') 

enter image description here