Aprenda a Calcular o OBV — On Balance Volume

Por Helio Quintanilha Jr
Em 20/01/2021

No post de hoje vamos dar continuidade ao nosso aprendizado de indicadores. O OBV, ou On Balance Volume, é um indicador simples proveniente da análise técnica que tem como função relacionar o preço de um determinado ativo com o seu volume.

Esse indicador é bastante usado por traders que tem como objetivo seguir os passos dos grandes investidores. Se você está começando a entender e montar suas estratégias ou simplesmente quer aprender mais sobre esse indicador, você está no lugar certo!

Entendendo o indicador OBV

Você já deve ter ouvido expressões como: um ativo subiu sem volume ou caiu com volume. Como se aproveitar dessas situações para buscar divergências entre o volume e o preço de um ativo? É aí que entra o OBV.

O OBV pode ser entendido como um saldo do volume. Dessa forma, toda vez que um ativo se valoriza, adicionamos o volume negociado naquele período. Analogamente, se o ativo se desvalorizar, subtraímos o volume.

Em outras palavras, um aumento do OBV indica que há mais dinheiro no ativo, enquanto uma diminuição do OBV sugere que há menos dinheiro no ativo.

Matematicamente:

OBVi=OBVi1+{+Vise Pi>Pi10se Pi=Pi1Vise Pi<Pi1OBV_{i} = OBV_{i-1} + \left\{ \begin{array}{ll} +V_{i} &\text{se } P_{i} > P_{i-1} \\ 0 &\text{se } P_{i} = P_{i-1} \\ -V_{i} &\text{se } P_{i} < P_{i-1} \end{array} \right.

Onde ViV_{i} é o volume financeiro no ponto ii, PiP_{i} é o preço de fechamento no mesmo ponto e Pi1P_{i-1} é o preço de fechamento anterior.

É importante notar pela fórmula acima que o OBV é cumulativo. Ou seja, o valor numérico do indicador é fortemente dependente da escolha do ponto de partida da análise.

A seguir, vamos entender como podemos identificar divergências entre preço e OBV.

Mãos à obra: importando as bilibiotecas

O primeiro passo é sempre importar as bibliotecas de interesse. Caso ainda tenha dúvidas sobre essa etapa, informações mais detalhadas podem ser vistas no primeiro post dessa série.

# %%capture means we suppress the output
%%capture

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
!pip install yfinance
import yfinance as yf

Baixando dados para análise

O indicador OBV aplica-se em cima de um determinado ativo. Nesse exemplo, escolhemos a Petrobras para mostrarmos o conceito na prática. Contudo, você pode facilmente alterar o código e utilizar qualquer outro papel.

Como dito anteriormente, o OBV é dependente do intervalo de tempo de estudo. Nesse exemplo, vamos analisar o período entre o final de 2020 e o início de 2021.

stock = yf.download('PETR4.SA', start='2020-12-14', end='2021-01-16')[["Adj Close", "Volume"]]
stock.head()
[*********************100%***********************] 1 of 1 completed
Adj Close Volume
Date
2020-12-14 27.620001 53159500
2020-12-15 27.850000 47208200
2020-12-16 28.190001 59399200
2020-12-17 28.240000 39297700
2020-12-18 28.250000 27351400

Calculando a variação do preço do ativo em cada dia

Para calcular o OBV, primeiramente criaremos uma coluna Variation, da mesma forma que fizemos no cálculo do IFR.

stock['Variation'] = stock['Adj Close'].diff()
stock = stock[1:] # remove first row once it does not have a variation
stock.head()
Adj Close Volume Variation
Date
2020-12-15 27.850000 47208200 0.230000
2020-12-16 28.190001 59399200 0.340000
2020-12-17 28.240000 39297700 0.049999
2020-12-18 28.250000 27351400 0.010000
2020-12-21 27.020000 99988800 -1.230000

Estamos interessados apenas no sinal da variação:

  • Se o valor for positivo, iremos somar o volume desse dia ao OBV;
  • Se for negativo, iremos subtrair o volume desse dia do OBV.
  • Quando esse valor for 0, não precisamos fazer nada. Simples, não?

Para facilitar o uso do dataframe, vamos criar uma coluna OBV Change onde alocaremos +stock["Volume"] se Variation for > 0, -stock["Volume"] se < 0 e 0 se Variation for = 0.

Finalmente, só precisamos realizar uma soma acumulada dessa coluna para obtermos o OBV da Petrobras no período de tempo escolhido.

stock['OBV Change'] = np.where(
    stock['Variation'] > 0, 
    stock['Volume'], 
    np.where(stock['Variation'] < 0, -stock['Volume'], 0)
)

stock['OBV'] = stock['OBV Change'].cumsum() 

stock.head()
Adj Close Volume Variation OBV Change OBV
Date
2020-12-15 27.850000 47208200 0.230000 47208200 47208200
2020-12-16 28.190001 59399200 0.340000 59399200 106607400
2020-12-17 28.240000 39297700 0.049999 39297700 145905100
2020-12-18 28.250000 27351400 0.010000 27351400 173256500
2020-12-21 27.020000 99988800 -1.230000 -99988800 73267700

Plotando o gráfico do OBV

Com o valor do OBV calculado, podemos plotar um gráfico comparando o fechamento do ativo com o indicador. Além disso, traçaremos uma linha horizontal a partir do primeiro pregão de 2021 (04/01), onde observamos uma aceleração mais aguda dos preços.

# Plot the value alongside the stock price
fig, (ax1, ax2) = plt.subplots(
    nrows=2,
    sharex=True, 
    figsize=(12,8), 
    gridspec_kw={'height_ratios': [3, 1]})

# Get index of value where we are going to plot a horizontal line
index = stock.index.get_loc("2021-01-04")

# Plot price data
ax1.plot(stock.index, stock['Adj Close'], label='Fechamento PETR4')
ax1.legend()
ax1.axhline(y=stock["Adj Close"][index], color='red', linestyle='--')

# Plot OBV
ax2.plot(stock.index, stock['OBV'], label='OBV', color="#033660")
ax2.axhline(y=stock["OBV"][index], color='red', linestyle='--')
ax2.legend()
<matplotlib.legend.Legend at 0x7fbddad60410>

Analisando o resultado

Esse exemplo foi escolhido propositalmente para podermos entender melhor o funcionamento do indicador. Lembre-se que a idéia principal do OBV é buscar divergências entre ele e o preço do ativo. O valor do ativo no início de 2021 estava em torno de R$ 29 com um OBV abaixo de 4e8, ou quatrocentos milhões (o valor exato não é importante).

Nessa data, o ativo iniciou uma pernada de alta juntamente com um forte aumento do volume. Contudo, o papel começou a perder força por volta do dia 10/01 e rapidamente se desvalorizou até abaixo de R$ 29.

Um trader sem conhecimento do OBV, poderia ter ficado preocupado. Porém, como o OBV nos mostra nesse caso, embora o papel tenha recuado e voltado para o valor do final de 2020, o seu OBV está mais alto (acima de 4e8). Isso mostra que há mais dinheiro no papel do que antes, sugerindo que a movimentação é apenas um descanso para voltar a subir.

Para concluir, lembre-se: não existe fórmula mágica. Nunca se apegue a apenas uma estratégia. Quanto mais estratégias você aprender e testar, mais chances você terá de entender qual é a que pode funcionar melhor com o seu ativo de interesse.