# How I Made A Profitable OBV Strategy Using Python

This article will explain how to implement the OBV (On Balance Volume) to the Amazon (AMZN) stock. The first part will explain the idea behind the indicator, while the second part will implement a trading strategy based on the OBV. The article is written only for illustrative purposes: **How I made a profitable OBV strategy using Python**.

**Related reading:**

**Looking for a good, robust, and profitable trading strategy? (Hundreds in that link)**- ….
**and a few trading strategies for sale** **Backtesting Python examples (plenty of examples with code and images)**

## On Balance Volume

This indicator takes the volume and closing price to predict the price trend; it uses the daily change in the closing price to add **Volume** values to the indicator. We have explained the OBV indicator earlier.

The formula is:

This is equation (1)

There are three possible scenarios for this indicator. The first scenario is when the closing price is higher than its previous value; in this case, the OBV is

The second case is when the closing price is equal to its previous value; in this case, the OBV is

Finally, when the closing price is lower than its former value; in this case, the

## How to calculate OBV? Example

The following table shows how to apply equation 1:

In green, you will find the scenario

For example, the closing price for the second day is higher than its preceding value (12 > 10); therefore, the OBV is its prior value (0) + volume (210).

On the third day, the daily closing price change is zero (12-12=0); therefore, the OBV is its previous value. On the fourth day, the daily variation in the closing price is negative (11<12); therefore, the OBV is 210-80 =130.

## OBV Python Example

We start by showing you how to download data:

## Downloading Data

In this example, we will use historical data from Amazon (**AMZN**); the initial and end times are 2021-01-01 and 2023-01-01, respectively; the library for downloading data is ** yfinance**. The Python procedure is:

We have covered how to download data in other articles:

- How to Build a Simple SMA Trading Strategy Using Python
- How To Download Data For Your Trading Strategy From Yahoo!Finance With Python

**Daily Variation in Closing Price**

This part will calculate the closing price variation:

For a pandas data frame, its procedure is to implement ** .diff()**:

In the previous picture, ** data[“Variation”]** stores the daily variation of the closing price. Meanwhile,

**prints the first five results for both variables.**

*print(data[[“Close”, “Variation”]].head())*## How to calculate On Balance Volume (OBV)

In this section, we will generate the OBV. For this example, we will use the ** pandas** method

**. This method allows us to access the value of a specific row and column.**

*.iloc*For illustration purposes, let’s see how to use ** .iloc**.

Python uses 0 to indicate the first element; therefore, the element in the first row and first column, the number one (1) highlighted in red color is obtained with **.iloc[0, 0]**; Meanwhile, the number 200, highlighted in blue located in the second row and the third column is ** .iloc[1,2]**.

Let’s continue with the estimation of the OBV; in the following image, we create ** data[“OBV”]** that contains zero values; next, we create

**that indicate the number of rows in our data, while**

*nelements***,**

*pvariation***, and**

*pvolume***represent the position of the variables Variation, Volume and OBV in number in our data frame. The previous elements are the input to implement the for-loop**

*pobv***.**

*“for i in range(nelements):”*Inside of the loop, **data.iloc[i, pvariation]** indicates that we will get the values from the variable Variation; when i=0, this means ** data.iloc[0, pvariation]**, so, you will get the first element from

**, i=1 means the second element, etc; in the same way,**

*data[“Variation”]***has a similar explanation to**

*data.iloc[i, pvolume]***. The important part is that every time that daily_change > 0, daily_change == 0, or daily_change < 0, the variable volume will be positive**

*data[“Volume”]***, zero or negative**

*data.iloc[i, pvolume]***. Finally, we calculate the new OBV value with**

*-data.iloc[i, pvolume]*

*data.iloc[i-1, pobv]***+ volume**.

**Plotting OBV**

In the following image, there is the code to plot the OBV:

Let’s see the plot:

## OBV trading strategy

The strategy to implement is:

To implement these conditions, we will make another for-loop to calculate the buy and sell signals; the following image illustrates the code:

In the previous image, the most important variable is ** signal_ **that will be 1, when

and

in the code is [** current_obv > previous_obv and current_price > previous_price**];

or ** signal_** will be -1, when

and

in the code is [** current_obv < previous_obv and current_price < previous_price**].

## Calculate Strategy Performance

In this part, we will calculate the strategy performance; the following picture illustrates the procedure:

## Plotting Equity Curve

Finally, we plot the strategy and compare it with Amazon’s performance; the following image shows its calculation:

The chart from the previous picture is:

The OBV strategy performed well during 2021 and 2022 – much better than buy and hold. However, it needs to be backtested on more stocks and longer time frames. This article is just for information purposes.