程式

R中的OBV指標計算

  • December 10, 2016

以下是有關 OBV 計算的一些參考資料:

  1. http://ta.mql4.com/indicators/volumes/on_balance_volume
  2. http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:on_balance_volume_obv
  3. http://en.wikipedia.org/wiki/On-balance_volume

當我導航到 TTR 包中 OBV 函式的原始碼時,我看到:

"OBV" <-
function(price, volume) {
   # On Balance Volume
   price <- try.xts(price, error=as.matrix)
   volume <- try.xts(volume, error=as.matrix)

   if(!(is.xts(price) && is.xts(volume))) {
       price <- as.vector(price)
       volume <- as.vector(volume)
   }
   obv <- c( volume[1], ifelse( ROC(price) > 0, volume, -volume )[-1] )
   obv <- cumsum( obv )
   if(is.xts(obv)) {
       obv <- xts(obv,index(price))
       colnames(obv) <- 'obv'
   }
   reclass( obv, price )
}

我看到OBV函式實現中不存在參考網頁中的相等情況(我的意思是今天的收盤價等於昨天的收盤價時發生的情況)。

是錯誤還是對軟體包的接受?如果是錯誤,我可以在哪里報告問題?

是的,該功能不考慮價格持平的情況。解決方案非常簡單。看看下面的 OBV2 函式。OBV 和 OBV2 的系列高度相關,但根據市場演變,嚴格定義會更高(更小)。在 QQQ 情況下,差異約為 50% 1。你可以在這裡找到維護者:http: //cran.r-project.org/web/packages/TTR/index.html

   OBV2 <-  function(price, volume) { #
   # On Balance Volume 2
   price <- try.xts(price, error=as.matrix)
   volume <- try.xts(volume, error=as.matrix)

   if(!(is.xts(price) && is.xts(volume))) {
      price <- as.vector(price)
     volume <- as.vector(volume)
  }
  obv <- c( volume[1], ifelse(ROC(price) > 0, volume, -volume)[-1] )
  obv[ROC(price)==0]<-0
  obv <- cumsum( obv )
  if(is.xts(obv)) {
    obv <- xts(obv,index(price))
    colnames(obv) <- 'obv2'
  }
  reclass( obv, price )
  }

  require("quantmod")  

  getSymbols('QQQ', src='yahoo',from='2012-01-01')
  chartSeries(QQQ,TA = NULL)
  addOBV()
  sobv=OBV(QQQ[,4],QQQ[,5])
  #addTA(sobv,on=3)
  head(cbind(QQQ,sobv))
  table(ROC(QQQ[,4])==0)

  sobv2=OBV2(QQQ[,4],QQQ[,5])
  addTA(sobv2,on=2,col="red")
  cor(sobv,sobv2)
  tail(cbind(sobv,sobv2,sobv2/sobv-1))
  chartSeries(sobv2,TA = NULL)
  addTA(sobv,on=1,col="red")

引用自:https://quant.stackexchange.com/questions/17478