我有一个股票数据数据框,其中有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 :(得分:2)
您可以在此处使用by
按market
进行分组,并将该功能应用于每个组。
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
答案 1 :(得分:0)
首先,MACD
中的quantmod
函数需要xts
而不是data.frame
。
所以你需要做的是先data.frame
分割market
,然后将每个结果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))
}
)