如何在R语言列表中通过TTR包MACD函数获取macd与signal双列结果
解决TTR包MACD函数在列表中同时获取两列结果的问题
嘿,我之前也踩过这个小坑!TTR包的MACD()函数返回的是包含macd和signal两列的xts/zoo对象,但你直接赋值给DATA[[1]]$Macd时,R会自动把这个多列对象转成一维向量,只保留第一列(也就是macd列),所以才看不到signal列。
这里有几个实用方法帮你同时拿到两列结果:
方法1:用cbind直接合并(最快捷)
直接把MACD计算结果和原数据框合并,会自动将两列都添加进去:
library(TTR) # 给AAPL股票添加macd和signal列 DATA[[1]] <- cbind(DATA[[1]], MACD(DATA[[1]]$Close, nFast=12, nSlow=26, nSig=9, maType = "EMA"))
执行后,DATA[[1]]里会多出macd和signal两个列,和你单独赋值给变量时的列名完全一致。
方法2:单独提取列赋值(支持自定义列名)
如果想给列起自定义名称(比如把signal改成Signal),可以先把结果存到临时变量,再分别赋值:
# 先计算MACD结果存到临时变量 macd_temp <- MACD(DATA[[1]]$Close, nFast=12, nSlow=26, nSig=9, maType = "EMA") # 分别赋值给自定义列 DATA[[1]]$Macd <- macd_temp[, "macd"] DATA[[1]]$Signal <- macd_temp[, "signal"]
方法3:批量处理列表中所有股票
要是你的DATA列表里有多个股票数据,用lapply循环处理效率更高:
DATA <- lapply(DATA, function(stock_df) { # 对单只股票计算MACD macd_res <- MACD(stock_df$Close, nFast=12, nSlow=26, nSig=9, maType = "EMA") # 合并原数据与MACD结果 cbind(stock_df, macd_res) })
这样一次就能给所有股票都加上macd和signal列啦!
为什么之前只得到一列?
简单来说,$Macd是在给单个列赋值,R会自动把多列的xts/zoo对象强制转换成一维向量,默认只取第一列,所以signal列就被丢掉了。用上面的方法就能完美避免这个问题~
内容的提问来源于stack exchange,提问作者Prateek Daniels
相关产品推荐
相关产品推荐

