0

我正在尝试计算具有不同基础时期的标准普尔 500 指数的多个 EMA。

#get stock data
library(quantmod)
getSymbols("^GSPC", src="yahoo", from="2020-01-01", to="2020-09-30")
SP500 <- GSPC[,"GSPC.Close"]

我知道如何手动完成,但这不是令人满意的解决方案。

#Calculate different EMA with different periods
EMA1 <- EMA(SP500, n=1, wilder=F)
EMA2 <- EMA(SP500, n=2, wilder=F)
EMA3 <- EMA(SP500, n=3, wilder=F)
data.frame(SP500, EMA1, EMA2, EMA3)

           GSPC.Close     EMA    EMA.1    EMA.2
2020-01-02    3257.85 3257.85       NA       NA
2020-01-03    3234.85 3234.85 3246.350       NA
2020-01-06    3246.28 3246.28 3246.303 3246.327
2020-01-07    3237.18 3237.18 3240.221 3241.753
2020-01-08    3253.05 3253.05 3248.774 3247.402

是否可以在为每个新 EMA 创建新列时计算 n?那怎么可能呢?

此外,您将如何为这些列创建正确的标签?在上面的示例中,EMA.1 对应于“EMA2”等等,这可能会造成混淆。手动我会这样做:

EMA1 <- EMA(SP500, n=1, wilder=F)
EMA2 <- EMA(SP500, n=2, wilder=F)
EMA3 <- EMA(SP500, n=3, wilder=F)
mydata <- data.frame(SP500, EMA1, EMA2, EMA3)
colnames(mydata) <- c("GSPC Close","EMA1","EMA2","EMA3")
mydata
 
           GSPC Close    EMA1     EMA2     EMA3
2020-01-02    3257.85 3257.85       NA       NA
2020-01-03    3234.85 3234.85 3246.350       NA
2020-01-06    3246.28 3246.28 3246.303 3246.327
2020-01-07    3237.18 3237.18 3240.221 3241.753

感谢大家!

4

1 回答 1

0

您可以使用 for 循环并合并循环中的所有内容。优点是您合并 xts 对象。之后,您可以根据需要将其转换为 data.frame。

n = c(1:3, 5) # choose the number of EMA periods

for(i in n) {
  var <- EMA(SP500$GSPC.Close, n = i, wilder = FALSE) # create the EMA
  var <- setNames(var, paste0("EMA", i)) # rename the variable
  SP500 <- merge(SP500, var) # merge with original
}

head(SP500) # SP500 is still an xts object

           GSPC.Close    EMA1     EMA2     EMA3     EMA5
2020-01-02    3257.85 3257.85       NA       NA       NA
2020-01-03    3234.85 3234.85 3246.350       NA       NA
2020-01-06    3246.28 3246.28 3246.303 3246.327       NA
2020-01-07    3237.18 3237.18 3240.221 3241.753       NA
2020-01-08    3253.05 3253.05 3248.774 3247.402 3245.842
2020-01-09    3274.70 3274.70 3266.058 3261.051 3255.461
于 2020-11-18T09:37:14.440 回答