## Investing with Python: Price Channels

Python streamlines tasks requiring multiple steps in a single block of code. For this reason, it is a great tool for querying and performing analysis on stock ticker data.

Last post, we outlined steps for calculating Bollinger Bands.

In this post, we introduce a new technical indicator,  Price Channels.

Price Channels

Price Channels are lines set above and below the price of a security. The upper channel is set at the x-period high and the lower channel is set at the x-period low. For a 20-day Price Channel, the upper channel would equal the 20-day high and the lower channel would equal the 20-day low.

Price Channels can be used to identify upward thrusts that signal the start of an uptrend or downward plunges that signal the start of a downtrend. Price Channels can also be used to identify overbought or oversold levels within a bigger downtrend or uptrend.

Price Channels are calculated as follows:

```Upper Channel: 20-day high
Lower Channel: 20-day low```

Let’s use Python to compute Price Channels.

1. Import modules.

``````import pandas as pd
import pandas.io.data as web
import matplotlib.pyplot as plt
%matplotlib inline
``````

2. Define function for querying the daily high.

``````def get_high(stock, start, end):
return web.get_data_yahoo(stock, start, end)['High']``````

3. Define function for querying the daily low.

``````def get_low(stock, start, end):
return web.get_data_yahoo(stock, start, end)['Low']
``````

4. Define function for querying daily close.

``````def get_close(stock, start, end):

5. Query daily high, daily low, and daily close for ‘FB’ during 2016.

``````x = pd.DataFrame(get_high('FB', '1/1/2016', '12/31/2016'))
x['Low'] = pd.DataFrame(get_low('FB', '1/1/2016', '12/31/2016'))
x['Close'] = pd.DataFrame(get_close('FB', '1/1/2016', '12/31/2016'))
``````

6. Compute 4 week high and 4 week low using rolling max/min. Add 50 day simple moving average for good measure.

``````x['4WH'] = pd.rolling_max(x['High'], 20)
x['4WL'] = pd.rolling_min(x['Low'], 20)
x['50 sma'] = pd.rolling_mean(x['Close'], 50)
``````

7. Plot 4WH, 4WL, 50 sma, and daily close.

``````x.plot(y=['4WH', '4WL', '50 sma', 'Close'])
``````

There you have it! We created our Price Channels. Here’s the full code:

``````import pandas as pd
import pandas.io.data as web
import matplotlib.pyplot as plt
%matplotlib inline

def get_high(stock, start, end):
return web.get_data_yahoo(stock, start, end)['High']
def get_low(stock, start, end):
return web.get_data_yahoo(stock, start, end)['Low']
def get_close(stock, start, end):

x = pd.DataFrame(get_high('FB', '1/1/2016', '12/31/2016'))
x['Low'] = pd.DataFrame(get_low('FB', '1/1/2016', '12/31/2016'))
x['Close'] = pd.DataFrame(get_close('FB', '1/1/2016', '12/31/2016'))

x['4WH'] = pd.rolling_max(x['High'], 20)
x['4WL'] = pd.rolling_min(x['Low'], 20)
x['50 sma'] = pd.rolling_mean(x['Close'], 50)

x.plot(y=['4WH', '4WL', '50 sma', 'Close'])
``````

In celebration of completing this tutorial, let’s watch Ed Seykota sing ‘The Whipsaw Song’.