程式
R中的OBV指標計算
以下是有關 OBV 計算的一些參考資料:
- http://ta.mql4.com/indicators/volumes/on_balance_volume
- http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:on_balance_volume_obv
- 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")