3 votos

Cálculo del indicador OBV en R

Aquí hay algunas referencias sobre los cálculos del VOB:

  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

Cuando navego al código fuente de la función OBV en el paquete TTR, veo esto:

"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 )
}

Veo que el caso de igualdad (quiero decir que el caso se produce cuando el cierre de hoy es igual al de ayer) en las páginas web de referencia no existe en la implementación de la función OBV.

¿Es un error o una aceptación del paquete? Si es un error, ¿dónde puedo informar del problema?

2voto

lanrat Puntos 367

Sí, la función no considera los casos en que el precio es plano. La solución es muy sencilla. Mira la función OBV2 a continuación. Las series de OBV y OBV2 están muy correlacionadas, pero la definición estricta sería mayor (menor) dependiendo de la evolución del mercado. En el caso de QQQ esa diferencia es de alrededor del 50% 1 . Puedes encontrar al mantenedor aquí: 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")

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X