为何TTR包指标存入dataframe后,指定列名未按预期显示?
问题:TTR指标整合函数列名不符合预期
编写了一个整合TTR包所有指标的函数,但将指标存入dataframe时,部分指标列名未按指定名称显示,例如TTR::chaikinVolatility列名为"EMA"而非"chaikinVolatility",DPO列名显示为"Close"、EMA列名显示为"EMA.1"等异常。
完整函数代码
get_all_indicators <- function(p, n= 10){ CLOSE <- quantmod::Cl(p) OHLC <- quantmod::OHLC(p) HLC <- quantmod::HLC(p) HL <- quantmod::HL(p) VOLUME <- quantmod::Vo(p) data.frame( ADX = TTR::ADX(HLC = HLC, n = n), ALMA = TTR::ALMA(OHLC, n = n), aroon = TTR::aroon(HL = HL, n = n), ATR = TTR::ATR(HLC = HLC, n = n), BBands = TTR::BBands(HLC = HLC, n = n), CCI = TTR::CCI(HLC = HLC, n = n), chaikinAD = TTR::chaikinAD(HLC = HLC, volume = VOLUME), chaikinVolatility = TTR::chaikinVolatility(HL = HL, n = n), # why colname 'EMA' not chaikinVolatility ? CLV = TTR::CLV(HLC = HLC), CMF = TTR::CMF(HLC = HLC, n = n, volume = VOLUME), CMO = TTR::CMO(x = CLOSE, n = n), CTI = TTR::CTI(price = CLOSE, n = n), DEMA = TTR::DEMA(x = CLOSE,n = n), DonchianChannel = TTR::DonchianChannel(HL = HL,n = n), DPO = TTR::DPO(x = CLOSE, n = n), #---------------------- why colname 'close' not DPO ? DVI = TTR::DVI(price = CLOSE, n = n), EMA = TTR::EMA(x = CLOSE, n = n), #---------------------- colname 'EMA.1' not EMA EVWMA = TTR::EVWMA(price = CLOSE, n = n, volume = VOLUME), HMA = TTR::HMA(CLOSE, n = n), keltnerChannels = TTR::keltnerChannels(HLC = HLC, n = n), KST = TTR::KST(CLOSE, n = n), MACD = TTR::MACD(x = CLOSE,nFast = n, nSlow = n*2), MFI = TTR::MFI(HLC = HLC, n = n, volume = VOLUME), momentum = TTR::momentum(CLOSE, n = n), #-------------------why colname "Close.1" not momentum? OBV = TTR::OBV(CLOSE,volume = VOLUME), PBands =TTR::PBands(CLOSE, n = n), ROC = TTR::ROC(OHLC, n = n), RSI = TTR::RSI(CLOSE, n), SAR = TTR::SAR(HL = HL), SMA = TTR::SMA(x = CLOSE, n = n), SMI = TTR::SMI(HLC = HLC, n = n, nFast = n, nSlow = n*2), SNR = TTR::SNR(HLC = HLC, n = n), #-------------------why colname "Close.2" not SNR? stoch = TTR::stoch(HLC = HLC, nFastK = n, nFastD = n, nSlowD = n*2), TDI = TTR::TDI(CLOSE,n = n), TR = TTR::TR(HLC = HLC), TRIX = TTR::TRIX(price = CLOSE, n = n), VHF = TTR::VHF(price = CLOSE, n = n), volatility = TTR::volatility(OHLC = OHLC, n = n), williamsAD = TTR::williamsAD(HLC = HLC), WPR = TTR::WPR(HLC = HLC, n = n) #-------------------why colname "Close.3" not WPR? ) }
测试代码
library(xts) library(quantmod) library(TTR) n <- 10000 # make some fake praces prices <- cumsum(rnorm(n,sd = 0.01)) |> round(2) |> cbind(price = _, volume = sample(1:1000,n,T)) |> xts(Sys.time()-n:1) |> to.minutes(name = "my_prices") +10000 colnames(prices) <- gsub("^my_prices\\.", "", colnames(prices)) # head(prices) # chart_Series(prices) gai <- get_all_indicators(p = prices) colnames(gai)
执行后列名输出
colnames(gai) [1] "ADX.DIp" "ADX.DIn" "ADX.DX" "ADX.ADX" [5] "ALMA.Open" "ALMA.High" "ALMA.Low" "ALMA.Close" [9] "aroon.aroonUp" "aroon.aroonDn" "aroon.oscillator" "ATR.tr" [13] "ATR.atr" "ATR.trueHigh" "ATR.trueLow" "BBands.dn" [17] "BBands.mavg" "BBands.up" "BBands.pctB" "cci" [21] "chaikinAD" "EMA" "clv" "CMF" [25] "cmo" "cti" "DEMA" "DonchianChannel.high" [29] "DonchianChannel.mid" "DonchianChannel.low" "Close" "DVI.dvi.mag" [33] "DVI.dvi.str" "DVI.dvi" "EMA.1" "EVWMA" [37] "HMA" "keltnerChannels.dn" "keltnerChannels.mavg" "keltnerChannels.up" [41] "KST.kst" "KST.signal" "MACD.macd" "MACD.signal" [45] "mfi" "Close.1" "obv" "PBands.dn" [49] "PBands.center" "PBands.up" "ROC.Open" "ROC.High" [53] "ROC.Low" "ROC.Close" "rsi" "sar" [57] "SMA" "SMI.SMI" "SMI.signal" "Close.2" [61] "stoch.fastK" "stoch.fastD" "stoch.slowD" "TDI.tdi" [65] "TDI.di" "TR.tr" "TR.trueHigh" "TR.trueLow" [69] "TRIX.TRIX" "TRIX.signal" "VHF" "volatility" [73] "williamsAD" "Close.3"
原因分析
- 单列TTR函数自带固定列名:部分TTR函数返回的单列对象本身带有预设列名,比如
chaikinVolatility返回列名为"EMA",DPO、momentum、SNR、WPR返回列名为"Close"。直接放入data.frame()时会保留这些原列名,不会自动替换为你指定的参数名。 - 重复列名自动重命名:比如
EMA函数返回的列名也是"EMA",但之前chaikinVolatility已经引入了同名列,data.frame()会自动给后续重复列名加上.1后缀避免冲突,就出现了"EMA.1"。 - 多列函数的列名拼接规则:像
ADX、aroon这类返回多列的函数,data.frame()会将你指定的参数名和原列名用.拼接(如ADX.DIp),这部分是正常逻辑,但单列函数的列名会直接覆盖预期名称。
解决方案
手动修改单列TTR函数返回结果的列名,用setNames()函数将原列名替换为自定义名称,确保存入data.frame()时使用指定名称。
修复后的函数代码:
get_all_indicators <- function(p, n= 10){ CLOSE <- quantmod::Cl(p) OHLC <- quantmod::OHLC(p) HLC <- quantmod::HLC(p) HL <- quantmod::HL(p) VOLUME <- quantmod::Vo(p) data.frame( ADX = TTR::ADX(HLC = HLC, n = n), ALMA = TTR::ALMA(OHLC, n = n), aroon = TTR::aroon(HL = HL, n = n), ATR = TTR::ATR(HLC = HLC, n = n), BBands = TTR::BBands(HLC = HLC, n = n), CCI = TTR::CCI(HLC = HLC, n = n), chaikinAD = TTR::chaikinAD(HLC = HLC, volume = VOLUME), # 重命名chaikinVolatility的列 chaikinVolatility = setNames(TTR::chaikinVolatility(HL = HL, n = n), "chaikinVolatility"), CLV = TTR::CLV(HLC = HLC), CMF = TTR::CMF(HLC = HLC, n = n, volume = VOLUME), CMO = TTR::CMO(x = CLOSE, n = n), CTI = TTR::CTI(price = CLOSE, n = n), DEMA = TTR::DEMA(x = CLOSE,n = n), DonchianChannel = TTR::DonchianChannel(HL = HL,n = n), # 重命名DPO的列 DPO = setNames(TTR::DPO(x = CLOSE, n = n), "DPO"), DVI = TTR::DVI(price = CLOSE, n = n), EMA = TTR::EMA(x = CLOSE, n = n), EVWMA = TTR::EVWMA(price = CLOSE, n = n, volume = VOLUME), HMA = TTR::HMA(CLOSE, n = n), keltnerChannels = TTR::keltnerChannels(HLC = HLC, n = n), KST = TTR::KST(CLOSE, n = n), MACD = TTR::MACD(x = CLOSE,nFast = n, nSlow = n*2), MFI = TTR::MFI(HLC = HLC, n = n, volume = VOLUME), # 重命名momentum的列 momentum = setNames(TTR::momentum(CLOSE, n = n), "momentum"), OBV = TTR::OBV(CLOSE,volume = VOLUME), PBands = TTR::PBands(CLOSE, n = n), ROC = TTR::ROC(OHLC, n = n), RSI = TTR::RSI(CLOSE, n), SAR = TTR::SAR(HL = HL), SMA = TTR::SMA(x = CLOSE, n = n), SMI = TTR::SMI(HLC = HLC, n = n, nFast = n, nSlow = n*2), # 重命名SNR的列 SNR = setNames(TTR::SNR(HLC = HLC, n = n), "SNR"), stoch = TTR::stoch(HLC = HLC, nFastK = n, nFastD = n, nSlowD = n*2), TDI = TTR::TDI(CLOSE,n = n), TR = TTR::TR(HLC = HLC), TRIX = TTR::TRIX(price = CLOSE, n = n), VHF = TTR::VHF(price = CLOSE, n = n), volatility = TTR::volatility(OHLC = OHLC, n = n), williamsAD = TTR::williamsAD(HLC = HLC), # 重命名WPR的列 WPR = setNames(TTR::WPR(HLC = HLC, n = n), "WPR") ) }
修改后执行测试代码,列名将完全符合预期,不会再出现原列名保留、重复列名自动重命名的问题。
内容的提问来源于stack exchange,提问作者mr.T
相关产品推荐
相关产品推荐

