python-pour-finance/06-Pandas-avec-Time-Series/.ipynb_checkpoints/Rolling et Expanding-checkp...

672 lines
332 KiB
Plaintext
Raw Permalink Normal View History

2023-08-21 15:12:19 +00:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"___\n",
"\n",
"<a href='http://www.pieriandata.com'> <img src='../Pierian_Data_Logo.png' /></a>\n",
"___\n",
"<center>*Copyright Pierian Data 2017*</center>\n",
"<center>*For more information, visit us at www.pieriandata.com*</center>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Rolling and Expanding\n",
"\n",
"A very common process with time series is to create data based off of a rolling mean. Let's show you how to do this easily with pandas!"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Best way to read in data with time series index!\n",
"df = pd.read_csv('time_data/walmart_stock.csv',index_col='Date',parse_dates=True)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Volume</th>\n",
" <th>Adj Close</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-01-03</th>\n",
" <td>59.970001</td>\n",
" <td>61.060001</td>\n",
" <td>59.869999</td>\n",
" <td>60.330002</td>\n",
" <td>12668800</td>\n",
" <td>52.619235</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-04</th>\n",
" <td>60.209999</td>\n",
" <td>60.349998</td>\n",
" <td>59.470001</td>\n",
" <td>59.709999</td>\n",
" <td>9593300</td>\n",
" <td>52.078475</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-05</th>\n",
" <td>59.349998</td>\n",
" <td>59.619999</td>\n",
" <td>58.369999</td>\n",
" <td>59.419998</td>\n",
" <td>12768200</td>\n",
" <td>51.825539</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-06</th>\n",
" <td>59.419998</td>\n",
" <td>59.450001</td>\n",
" <td>58.869999</td>\n",
" <td>59.000000</td>\n",
" <td>8069400</td>\n",
" <td>51.459220</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-09</th>\n",
" <td>59.029999</td>\n",
" <td>59.549999</td>\n",
" <td>58.919998</td>\n",
" <td>59.180000</td>\n",
" <td>6679300</td>\n",
" <td>51.616215</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Open High Low Close Volume Adj Close\n",
"Date \n",
"2012-01-03 59.970001 61.060001 59.869999 60.330002 12668800 52.619235\n",
"2012-01-04 60.209999 60.349998 59.470001 59.709999 9593300 52.078475\n",
"2012-01-05 59.349998 59.619999 58.369999 59.419998 12768200 51.825539\n",
"2012-01-06 59.419998 59.450001 58.869999 59.000000 8069400 51.459220\n",
"2012-01-09 59.029999 59.549999 58.919998 59.180000 6679300 51.616215"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df.head()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x168a615ada0>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nSDHpBzUIBaBlYm09zB4
"text/plain": [
"<matplotlib.figure.Figure at 0x168a4812550>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['Open'].plot(figsize=(16,6))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's add in a rolling mean! This rolling method provides row entries, where every entry is then representative of the window. "
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style>\n",
" .dataframe thead tr:only-child th {\n",
" text-align: right;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: left;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Volume</th>\n",
" <th>Adj Close</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-01-03</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-04</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-05</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-06</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-09</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-10</th>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-11</th>\n",
" <td>59.495714</td>\n",
" <td>59.895714</td>\n",
" <td>59.074285</td>\n",
" <td>59.440000</td>\n",
" <td>9.007414e+06</td>\n",
" <td>51.842984</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-12</th>\n",
" <td>59.469999</td>\n",
" <td>59.744285</td>\n",
" <td>59.007143</td>\n",
" <td>59.321429</td>\n",
" <td>8.231357e+06</td>\n",
" <td>51.739567</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-13</th>\n",
" <td>59.322857</td>\n",
" <td>59.638571</td>\n",
" <td>58.941428</td>\n",
" <td>59.297143</td>\n",
" <td>7.965071e+06</td>\n",
" <td>51.718386</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-17</th>\n",
" <td>59.397143</td>\n",
" <td>59.708571</td>\n",
" <td>59.105714</td>\n",
" <td>59.358572</td>\n",
" <td>7.355329e+06</td>\n",
" <td>51.771963</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-18</th>\n",
" <td>59.450000</td>\n",
" <td>59.791428</td>\n",
" <td>59.217143</td>\n",
" <td>59.502857</td>\n",
" <td>7.047043e+06</td>\n",
" <td>51.897808</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-19</th>\n",
" <td>59.578572</td>\n",
" <td>59.960000</td>\n",
" <td>59.335715</td>\n",
" <td>59.707143</td>\n",
" <td>7.412086e+06</td>\n",
" <td>52.075984</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-20</th>\n",
" <td>59.767143</td>\n",
" <td>60.180000</td>\n",
" <td>59.577143</td>\n",
" <td>59.988571</td>\n",
" <td>7.908014e+06</td>\n",
" <td>52.321443</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-23</th>\n",
" <td>60.017143</td>\n",
" <td>60.387143</td>\n",
" <td>59.787143</td>\n",
" <td>60.204285</td>\n",
" <td>8.017800e+06</td>\n",
" <td>52.509586</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-24</th>\n",
" <td>60.154286</td>\n",
" <td>60.672857</td>\n",
" <td>59.979999</td>\n",
" <td>60.474285</td>\n",
" <td>8.035857e+06</td>\n",
" <td>52.745077</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-25</th>\n",
" <td>60.440000</td>\n",
" <td>60.958572</td>\n",
" <td>60.270000</td>\n",
" <td>60.749999</td>\n",
" <td>7.776786e+06</td>\n",
" <td>52.985553</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-26</th>\n",
" <td>60.715714</td>\n",
" <td>61.205714</td>\n",
" <td>60.448571</td>\n",
" <td>60.910000</td>\n",
" <td>7.624814e+06</td>\n",
" <td>53.125103</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-27</th>\n",
" <td>60.868572</td>\n",
" <td>61.361429</td>\n",
" <td>60.575714</td>\n",
" <td>61.010000</td>\n",
" <td>7.678514e+06</td>\n",
" <td>53.212323</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-30</th>\n",
" <td>60.945715</td>\n",
" <td>61.445714</td>\n",
" <td>60.661428</td>\n",
" <td>61.108571</td>\n",
" <td>7.450271e+06</td>\n",
" <td>53.298295</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-01-31</th>\n",
" <td>61.057143</td>\n",
" <td>61.491429</td>\n",
" <td>60.648571</td>\n",
" <td>61.158571</td>\n",
" <td>7.362086e+06</td>\n",
" <td>53.341905</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Open High Low Close Volume \\\n",
"Date \n",
"2012-01-03 NaN NaN NaN NaN NaN \n",
"2012-01-04 NaN NaN NaN NaN NaN \n",
"2012-01-05 NaN NaN NaN NaN NaN \n",
"2012-01-06 NaN NaN NaN NaN NaN \n",
"2012-01-09 NaN NaN NaN NaN NaN \n",
"2012-01-10 NaN NaN NaN NaN NaN \n",
"2012-01-11 59.495714 59.895714 59.074285 59.440000 9.007414e+06 \n",
"2012-01-12 59.469999 59.744285 59.007143 59.321429 8.231357e+06 \n",
"2012-01-13 59.322857 59.638571 58.941428 59.297143 7.965071e+06 \n",
"2012-01-17 59.397143 59.708571 59.105714 59.358572 7.355329e+06 \n",
"2012-01-18 59.450000 59.791428 59.217143 59.502857 7.047043e+06 \n",
"2012-01-19 59.578572 59.960000 59.335715 59.707143 7.412086e+06 \n",
"2012-01-20 59.767143 60.180000 59.577143 59.988571 7.908014e+06 \n",
"2012-01-23 60.017143 60.387143 59.787143 60.204285 8.017800e+06 \n",
"2012-01-24 60.154286 60.672857 59.979999 60.474285 8.035857e+06 \n",
"2012-01-25 60.440000 60.958572 60.270000 60.749999 7.776786e+06 \n",
"2012-01-26 60.715714 61.205714 60.448571 60.910000 7.624814e+06 \n",
"2012-01-27 60.868572 61.361429 60.575714 61.010000 7.678514e+06 \n",
"2012-01-30 60.945715 61.445714 60.661428 61.108571 7.450271e+06 \n",
"2012-01-31 61.057143 61.491429 60.648571 61.158571 7.362086e+06 \n",
"\n",
" Adj Close \n",
"Date \n",
"2012-01-03 NaN \n",
"2012-01-04 NaN \n",
"2012-01-05 NaN \n",
"2012-01-06 NaN \n",
"2012-01-09 NaN \n",
"2012-01-10 NaN \n",
"2012-01-11 51.842984 \n",
"2012-01-12 51.739567 \n",
"2012-01-13 51.718386 \n",
"2012-01-17 51.771963 \n",
"2012-01-18 51.897808 \n",
"2012-01-19 52.075984 \n",
"2012-01-20 52.321443 \n",
"2012-01-23 52.509586 \n",
"2012-01-24 52.745077 \n",
"2012-01-25 52.985553 \n",
"2012-01-26 53.125103 \n",
"2012-01-27 53.212323 \n",
"2012-01-30 53.298295 \n",
"2012-01-31 53.341905 "
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# 7 day rolling mean\n",
"df.rolling(7).mean().head(20)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x168a683d2b0>"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\niFAhRJwQ4hchxC7jZ4d
"text/plain": [
"<matplotlib.figure.Figure at 0x168a68219e8>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['Open'].plot()\n",
"df.rolling(window=30).mean()['Close'].plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Easiest way to add a legend is to make this rolling value a new column, then pandas does it automatically!"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x168a66469e8>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nz/c1Go2e6cd6vR673d6
"text/plain": [
"<matplotlib.figure.Figure at 0x168a66b20f0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['Close: 30 Day Mean'] = df['Close'].rolling(window=30).mean()\n",
"df[['Close','Close: 30 Day Mean']].plot(figsize=(16,6))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## expanding\n",
"\n",
"Now what if you want to take into account everything from the start of the time series as a rolling value? For instance, not just take into account a period of 7 days, or monthly rolling average, but instead, take into everything since the beginning of the time series, continuously:"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x168a67c4c50>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nUVlWspaVZSo/LZEpvYi
"text/plain": [
"<matplotlib.figure.Figure at 0x168a6792080>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Optional specify a minimum number of periods\n",
"df['Close'].expanding(min_periods=1).mean().plot(figsize=(16,6))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Bollinger Bands\n",
"\n",
"We will talk a lot more about financial analysis plots and technical indicators, but here is one worth mentioning!\n",
"\n",
"More info : http://www.investopedia.com/terms/b/bollingerbands.asp\n",
"\n",
"*Developed by John Bollinger, Bollinger Bands® are volatility bands placed above and below a moving average. Volatility is based on the standard deviation, which changes as volatility increases and decreases. The bands automatically widen when volatility increases and narrow when volatility decreases. This dynamic nature of Bollinger Bands also means they can be used on different securities with the standard settings. For signals, Bollinger Bands can be used to identify Tops and Bottoms or to determine the strength of the trend.*\n",
"\n",
"*Bollinger Bands reflect direction with the 20-period SMA and volatility with the upper/lower bands. As such, they can be used to determine if prices are relatively high or low. According to Bollinger, the bands should contain 88-89% of price action, which makes a move outside the bands significant. Technically, prices are relatively high when above the upper band and relatively low when below the lower band. However, relatively high should not be regarded as bearish or as a sell signal. Likewise, relatively low should not be considered bullish or as a buy signal. Prices are high or low for a reason. As with other indicators, Bollinger Bands are not meant to be used as a stand alone tool. *"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x168a67c92b0>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nlb9t27YcO3aMIUOG8M4
"text/plain": [
"<matplotlib.figure.Figure at 0x168a67c4710>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"df['Close: 30 Day Mean'] = df['Close'].rolling(window=20).mean()\n",
"df['Upper'] = df['Close: 30 Day Mean'] + 2*df['Close'].rolling(window=20).std()\n",
"df['Lower'] = df['Close: 30 Day Mean'] - 2*df['Close'].rolling(window=20).std()\n",
"df[['Close','Close: 30 Day Mean','Upper','Lower']].plot(figsize=(16,6))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For expanding operations, it doesn't help very much to visualize this against the daily data, but instead its a good way to get an idea of the \"stability\" of a stock. This idea of stability and volatility is something we are going to be exploring heavily in the next project, so let's jump straight into it!"
]
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 1
}