You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:47:32