How to code a moving average indicator in Python

This is notes from the Udemy Course
Algorithmic Trading & Quantitative Analysis Using Python

You can scroll left and right using the left-right arrows on your keyboard.

 
In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
In [2]:
df = pd.read_csv('AAPL.csv')
In [3]:
df.head()
Out[3]:
  Date Open High Low Close Adj Close Volume
0 1980-12-12 0.128348 0.128906 0.128348 0.128348 0.100922 469033600.0
1 1980-12-15 0.122210 0.122210 0.121652 0.121652 0.095657 175884800.0
2 1980-12-16 0.113281 0.113281 0.112723 0.112723 0.088636 105728000.0
3 1980-12-17 0.115513 0.116071 0.115513 0.115513 0.090830 86441600.0
4 1980-12-18 0.118862 0.119420 0.118862 0.118862 0.093463 73449600.0
In [4]:
# Get percentage change of closing price from the day before
df['Percent Change'] = df['Close'].pct_change()
In [5]:
df.head()
Out[5]:
  Date Open High Low Close Adj Close Volume Percent Change
0 1980-12-12 0.128348 0.128906 0.128348 0.128348 0.100922 469033600.0 NaN
1 1980-12-15 0.122210 0.122210 0.121652 0.121652 0.095657 175884800.0 -0.052171
2 1980-12-16 0.113281 0.113281 0.112723 0.112723 0.088636 105728000.0 -0.073398
3 1980-12-17 0.115513 0.116071 0.115513 0.115513 0.090830 86441600.0 0.024751
4 1980-12-18 0.118862 0.119420 0.118862 0.118862 0.093463 73449600.0 0.028992
In [6]:
# Get rolling mean of closing price for the past 20 days
df['MA'] = df['Close'].rolling(window=20).mean()
In [7]:
df.head(30)
Out[7]:
  Date Open High Low Close Adj Close Volume Percent Change MA
0 1980-12-12 0.128348 0.128906 0.128348 0.128348 0.100922 469033600.0 NaN NaN
1 1980-12-15 0.122210 0.122210 0.121652 0.121652 0.095657 175884800.0 -0.052171 NaN
2 1980-12-16 0.113281 0.113281 0.112723 0.112723 0.088636 105728000.0 -0.073398 NaN
3 1980-12-17 0.115513 0.116071 0.115513 0.115513 0.090830 86441600.0 0.024751 NaN
4 1980-12-18 0.118862 0.119420 0.118862 0.118862 0.093463 73449600.0 0.028992 NaN
5 1980-12-19 0.126116 0.126674 0.126116 0.126116 0.099167 48630400.0 0.061029 NaN
6 1980-12-22 0.132254 0.132813 0.132254 0.132254 0.103993 37363200.0 0.048669 NaN
7 1980-12-23 0.137835 0.138393 0.137835 0.137835 0.108382 46950400.0 0.042199 NaN
8 1980-12-24 0.145089 0.145647 0.145089 0.145089 0.114086 48003200.0 0.052628 NaN
9 1980-12-26 0.158482 0.159040 0.158482 0.158482 0.124617 55574400.0 0.092309 NaN
10 1980-12-29 0.160714 0.161272 0.160714 0.160714 0.126372 93161600.0 0.014084 NaN
11 1980-12-30 0.157366 0.157366 0.156808 0.156808 0.123300 68880000.0 -0.024304 NaN
12 1980-12-31 0.152902 0.152902 0.152344 0.152344 0.119790 35750400.0 -0.028468 NaN
13 1981-01-02 0.154018 0.155134 0.154018 0.154018 0.121107 21660800.0 0.010988 NaN
14 1981-01-05 0.151228 0.151228 0.150670 0.150670 0.118474 35728000.0 -0.021738 NaN
15 1981-01-06 0.144531 0.144531 0.143973 0.143973 0.113208 45158400.0 -0.044448 NaN
16 1981-01-07 0.138393 0.138393 0.137835 0.137835 0.108382 55686400.0 -0.042633 NaN
17 1981-01-08 0.135603 0.135603 0.135045 0.135045 0.106188 39827200.0 -0.020242 NaN
18 1981-01-09 0.142299 0.142857 0.142299 0.142299 0.111892 21504000.0 0.053715 NaN
19 1981-01-12 0.142299 0.142299 0.141183 0.141183 0.111014 23699200.0 -0.007843 0.138588
20 1981-01-13 0.136719 0.136719 0.136161 0.136161 0.107065 23049600.0 -0.035571 0.138979
21 1981-01-14 0.136719 0.137277 0.136719 0.136719 0.107504 14291200.0 0.004098 0.139732
22 1981-01-15 0.139509 0.140625 0.139509 0.139509 0.109698 14067200.0 0.020407 0.141071
23 1981-01-16 0.138951 0.138951 0.138393 0.138393 0.108820 13395200.0 -0.007999 0.142215
24 1981-01-19 0.146763 0.147321 0.146763 0.146763 0.115402 41574400.0 0.060480 0.143610
25 1981-01-20 0.142857 0.142857 0.142299 0.142299 0.111892 30083200.0 -0.030416 0.144420
26 1981-01-21 0.145089 0.146205 0.145089 0.145089 0.114086 15904000.0 0.019607 0.145061
27 1981-01-22 0.146763 0.147879 0.146763 0.146763 0.115402 35548800.0 0.011538 0.145508
28 1981-01-23 0.146763 0.147321 0.146205 0.146205 0.114963 11222400.0 -0.003802 0.145564
29 1981-01-26 0.144531 0.144531 0.143973 0.143973 0.113208 24640000.0 -0.015266 0.144838
In [8]:
df.dropna()
Out[8]:
  Date Open High Low Close Adj Close Volume Percent Change MA
19 1981-01-12 0.142299 0.142299 0.141183 0.141183 0.111014 23699200.0 -0.007843 0.138588
20 1981-01-13 0.136719 0.136719 0.136161 0.136161 0.107065 23049600.0 -0.035571 0.138979
21 1981-01-14 0.136719 0.137277 0.136719 0.136719 0.107504 14291200.0 0.004098 0.139732
22 1981-01-15 0.139509 0.140625 0.139509 0.139509 0.109698 14067200.0 0.020407 0.141071
23 1981-01-16 0.138951 0.138951 0.138393 0.138393 0.108820 13395200.0 -0.007999 0.142215
10157 2021-03-26 120.349998 121.480003 118.919998 121.209999 121.209999 93958900.0 0.005141 121.979999
10158 2021-03-29 121.650002 122.580002 120.730003 121.389999 121.389999 80819200.0 0.001485 121.659999
10159 2021-03-30 120.110001 120.400002 118.860001 119.900002 119.900002 85671900.0 -0.012274 121.398999
10160 2021-03-31 121.650002 123.519997 121.150002 122.150002 122.150002 118323800.0 0.018766 121.403499
10161 2021-04-01 123.660004 124.180000 122.489998 123.000000 123.000000 74957400.0 0.006959 121.546999

10123 rows × 9 columns

Plot closing price and MA for last 200 days

In [9]:
ax = df.iloc[-200:, :].plot(kind="line", x='Date', y='Close', figsize=(19, 20))
df.iloc[-200:, :].plot(kind="line", x='Date', y='MA', ax=ax)

ax.set_title('Closing and MA for last 200 days')
Out[9]:
Text(0.5, 1.0, 'Closing and MA for last 200 days')
 

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *