你正在做一些奇怪的事情:
paste("Q",i,"$",tick[i])
[1] "Q 2 $ MSFT"
被传递给EMA
(即使在将字符串传递给之后na.locf
),并且EMA
需要一个 xts 对象。
这实现了你想要的,整理了一下:
library(quantmod)
tick <- c("AAPL","MSFT","NQ")
getSymbols(tick)
for (i in 1:3) {
sym <- tick[i]
x <- get(sym, envir = .GlobalEnv)
x <- merge(x, EMA(Cl(x), 10))
assign(x = sym, value = x, envir = .GlobalEnv)
}
tail(AAPL)
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted EMA
# 2018-01-05 173.44 175.37 173.05 175.00 23660000 175.00 172.6937
# 2018-01-08 174.35 175.61 173.93 174.35 20567800 174.35 172.9948
# 2018-01-09 174.55 175.06 173.41 174.33 21584000 174.33 173.2376
# 2018-01-10 173.16 174.30 173.00 174.29 23959900 174.29 173.4289
# 2018-01-11 174.59 175.49 174.49 175.28 18667700 175.28 173.7655
# 2018-01-12 176.18 177.36 175.65 177.09 25226000 177.09 174.3700
您可能需要重新考虑如何处理数据,而不是单独命名对象 Q1、Q1、Q3(或符号名称而不是变量名称,在我上面的示例中)。下面的示例应该更清楚地说明这一点。
将每个符号数据放入列表中可能更容易,每个元素都包含特定符号的数据。然后,您可以轻松地在您的一批符号(可能会变得非常大)中应用操作。
r <- lapply(X = tick, FUN = function(sym) {
x <- get(sym, envir = .GlobalEnv)
x <- merge(x, EMA(Cl(x), 10))
x
})
lapply(r, tail, n = 1)
# [[1]]
# AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted EMA EMA.1
# 2018-01-12 176.18 177.36 175.65 177.09 25226000 177.09 174.37 174.37
#
# [[2]]
# MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted EMA EMA.1
# 2018-01-12 88.67 89.78 88.45 89.6 24236500 89.6 87.72638 87.72638
#
# [[3]]
# NQ.Open NQ.High NQ.Low NQ.Close NQ.Volume NQ.Adjusted EMA EMA.1
# 2018-01-12 4.03 4.03 3.88 3.89 1034400 3.89 3.988761 3.988761