2014-05-21 25 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