2013-04-11 86 views
1

我有一個數據框架的股票數據,包含100多隻股票的信息10年。我試圖在quantmod上運行這個數據的MACD函數,但不知道如何分割不同股票的計算。例如我的數據幀的一點點看起來是這樣的:應用按因子分解的函數

data<-structure(list(market = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 3L, 3L), .Label = c("AD1", "AD2", "AD3"), class = "factor"), 
date = structure(c(15623, 15624, 15625, 15628, 15623, 15624, 
15625, 15628, 15625, 15628), class = "Date"), open = c(101.52, 
101.68, 102.1, 101.99, 100.73, 100.85, 101.57, 101.01, 100.56, 
100.42), high = c(102.07, 102.39, 102.36, 102.07, 101.4, 
101.59, 101.62, 101.35, 100.56, 100.71), low = c(101.26, 
101.56, 101.63, 101.5, 100.59, 100.85, 101.07, 100.97, 100.56, 
100.41), last = c(101.78, 102.08, 101.76, 101.91, 101.08, 
101.37, 101.06, 101.21, 100.41, 100.56)), .Names = c("market", 
"date", "open", "high", "low", "last"), row.names = c(1L, 2L, 
3L, 4L, 5L, 6L, 7L, 8L, 11L, 12L), class = "data.frame", na.action = structure(9:10,.Names = c("9", 
"10"), class = "omit")) 

我如何通過這個數據幀到MACD功能的同時得到它分別計算每一個市場。感謝您的幫助。我是R新手。

+0

這是一個良好的開端:http://stackoverflow.com/questions/3505701/r-grouping-functions-sapply-vs-lapply-vs-apply-vs-tapply-vs-by- vs-aggrega – harkmug 2013-04-11 18:39:43

回答

2

您可以通過market使用by這裏組和應用功能,每個組。

library(quantmod) 
by(data,data$market,function(x) 
{ 
    ## coerece the group to an xts object 
    dat.xts <- xts(x[,-c(1:2)],x$date) 
    ## EMA ~ MACD with type 'EMA' 
    EMA(dat.xts,n=min(nrow(dat.xts),10)) 

}) 

data$market: AD1 
       [,1] 
2012-10-10  NA 
2012-10-11  NA 
2012-10-12  NA 
2012-10-15 101.8225 
--------------------------------------------------------------------------------------------------------------- 
data$market: AD2 
      [,1] 
2012-10-10  NA 
2012-10-11  NA 
2012-10-12  NA 
2012-10-15 101.04 
--------------------------------------------------------------------------------------------------------------- 
data$market: AD3 
      [,1] 
2012-10-12  NA 
2012-10-15 100.49 
+0

這將返回只是EMA而不是13日和26日移動平均線之間的差異。 – Tim 2013-04-11 20:06:03

+0

@Tim'MACD'將在內部調用'EMA'。我不明白你的觀點。 – agstudy 2013-04-11 20:16:54

0

首先,MACD函數quantmod預計xts而不是data.frame

所以,你需要做的就是首先由market分裂data.frame,然後每個結果data.frame轉化爲xts,然後應用macd功能是什麼。

LL <- split(data, data$market) 

result <- lapply(LL, 
     function(DF) { 
      XTS <- xts(DF[, -2], order.by = as.POSIXct(DF$date, format="%Y-%m-%d", tz="GMT"),tzone='GMT') 
      return(MACD(XTS$last))     
     } 
    ) 
+0

任何想法爲什麼我會越來越「錯誤在rowSums(x):'x'必須是數字」錯誤 – Tim 2013-04-11 19:58:20