R 中具有多个周期的 EMA
EMA with multiple periods in R
我正在尝试计算标普 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
谢谢大家!
您可以使用 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
我正在尝试计算标普 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
谢谢大家!
您可以使用 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